chore: dynamically loads date-fns locales
This commit is contained in:
@@ -33,23 +33,30 @@ export const RootLayout = async ({
|
||||
const headers = getHeaders()
|
||||
const cookies = parseCookies(headers)
|
||||
|
||||
const lang =
|
||||
const languageCode =
|
||||
getRequestLanguage({
|
||||
config,
|
||||
cookies,
|
||||
headers,
|
||||
}) ?? config.i18n.fallbackLanguage
|
||||
|
||||
const i18n = initI18n({ config: config.i18n, context: 'client', language: lang })
|
||||
const i18n = await initI18n({ config: config.i18n, context: 'client', language: languageCode })
|
||||
const clientConfig = await createClientConfig({ config, t: i18n.t })
|
||||
|
||||
const dir = rtlLanguages.includes(lang) ? 'RTL' : 'LTR'
|
||||
const dir = rtlLanguages.includes(languageCode) ? 'RTL' : 'LTR'
|
||||
|
||||
const languageOptions = Object.entries(i18n.translations || {}).map(
|
||||
([language, translations]) => ({
|
||||
label: translations.general.thisLanguage,
|
||||
value: language,
|
||||
}),
|
||||
const languageOptions = Object.entries(config.i18n.supportedLanguages || {}).reduce(
|
||||
(acc, [language, languageConfig]) => {
|
||||
if (Object.keys(config.i18n.supportedLanguages).includes(language)) {
|
||||
acc.push({
|
||||
label: languageConfig.translations.general.thisLanguage,
|
||||
value: language,
|
||||
})
|
||||
}
|
||||
|
||||
return acc
|
||||
},
|
||||
[],
|
||||
)
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/require-await
|
||||
@@ -71,17 +78,18 @@ export const RootLayout = async ({
|
||||
})
|
||||
|
||||
return (
|
||||
<html dir={dir} lang={lang}>
|
||||
<html dir={dir} lang={languageCode}>
|
||||
<body>
|
||||
<RootProvider
|
||||
componentMap={componentMap}
|
||||
config={clientConfig}
|
||||
dateFNSKey={i18n.dateFNSKey}
|
||||
fallbackLang={clientConfig.i18n.fallbackLanguage}
|
||||
lang={lang}
|
||||
languageCode={languageCode}
|
||||
languageOptions={languageOptions}
|
||||
// eslint-disable-next-line react/jsx-no-bind
|
||||
switchLanguageServerAction={switchLanguageServerAction}
|
||||
translations={i18n.translations[lang]}
|
||||
translations={i18n.translations}
|
||||
>
|
||||
{wrappedChildren}
|
||||
</RootProvider>
|
||||
|
||||
@@ -1,11 +1,5 @@
|
||||
import type { BuildFormStateArgs } from '@payloadcms/ui/forms/buildStateFromSchema'
|
||||
import type {
|
||||
DocumentPreferences,
|
||||
Field,
|
||||
PayloadRequest,
|
||||
SanitizedConfig,
|
||||
TypeWithID,
|
||||
} from 'payload/types'
|
||||
import type { DocumentPreferences, Field, PayloadRequest, TypeWithID } from 'payload/types'
|
||||
|
||||
import { buildStateFromSchema } from '@payloadcms/ui/forms/buildStateFromSchema'
|
||||
import { reduceFieldsToValues } from '@payloadcms/ui/utilities/reduceFieldsToValues'
|
||||
@@ -15,32 +9,21 @@ import type { FieldSchemaMap } from '../../utilities/buildFieldSchemaMap/types.j
|
||||
|
||||
import { buildFieldSchemaMap } from '../../utilities/buildFieldSchemaMap/index.js'
|
||||
|
||||
let cached: {
|
||||
promise: Promise<FieldSchemaMap> | null
|
||||
schemaMap: FieldSchemaMap | null
|
||||
} = global._payload_fieldSchemaMap
|
||||
let cached = global._payload_fieldSchemaMap
|
||||
|
||||
if (!cached) {
|
||||
// eslint-disable-next-line no-multi-assign
|
||||
cached = global._payload_fieldSchemaMap = { promise: null, schemaMap: null }
|
||||
cached = global._payload_fieldSchemaMap = null
|
||||
}
|
||||
|
||||
export const getFieldSchemaMap = async (config: SanitizedConfig): Promise<FieldSchemaMap> => {
|
||||
if (cached.schemaMap && process.env.NODE_ENV !== 'development') {
|
||||
return cached.schemaMap
|
||||
export const getFieldSchemaMap = (req: PayloadRequest): FieldSchemaMap => {
|
||||
if (cached && process.env.NODE_ENV !== 'development') {
|
||||
return cached
|
||||
}
|
||||
|
||||
if (!cached.promise) {
|
||||
cached.promise = buildFieldSchemaMap(config)
|
||||
}
|
||||
cached = buildFieldSchemaMap(req)
|
||||
|
||||
try {
|
||||
cached.schemaMap = await cached.promise
|
||||
} catch (e) {
|
||||
cached.promise = null
|
||||
throw e
|
||||
}
|
||||
|
||||
return cached.schemaMap
|
||||
return cached
|
||||
}
|
||||
|
||||
export const buildFormState = async ({ req }: { req: PayloadRequest }) => {
|
||||
@@ -76,7 +59,7 @@ export const buildFormState = async ({ req }: { req: PayloadRequest }) => {
|
||||
})
|
||||
}
|
||||
|
||||
const fieldSchemaMap = await getFieldSchemaMap(req.payload.config)
|
||||
const fieldSchemaMap = getFieldSchemaMap(req)
|
||||
|
||||
const id = collectionSlug ? reqData.id : undefined
|
||||
const schemaPathSegments = schemaPath.split('.')
|
||||
|
||||
@@ -1,37 +1,38 @@
|
||||
import type { SanitizedConfig } from 'payload/types'
|
||||
import type { PayloadRequest } from 'payload/types'
|
||||
|
||||
import type { FieldSchemaMap } from './types.js'
|
||||
|
||||
import { traverseFields } from './traverseFields.js'
|
||||
|
||||
export const buildFieldSchemaMap = async (config: SanitizedConfig): Promise<FieldSchemaMap> => {
|
||||
export const buildFieldSchemaMap = ({
|
||||
i18n,
|
||||
payload: { config },
|
||||
}: PayloadRequest): FieldSchemaMap => {
|
||||
const result: FieldSchemaMap = new Map()
|
||||
|
||||
const validRelationships = config.collections.map((c) => c.slug) || []
|
||||
|
||||
await Promise.all(
|
||||
config.collections.map(async (collection) => {
|
||||
await traverseFields({
|
||||
config,
|
||||
fields: collection.fields,
|
||||
schemaMap: result,
|
||||
schemaPath: collection.slug,
|
||||
validRelationships,
|
||||
})
|
||||
}),
|
||||
)
|
||||
config.collections.forEach((collection) => {
|
||||
traverseFields({
|
||||
config,
|
||||
fields: collection.fields,
|
||||
i18n,
|
||||
schemaMap: result,
|
||||
schemaPath: collection.slug,
|
||||
validRelationships,
|
||||
})
|
||||
})
|
||||
|
||||
await Promise.all(
|
||||
config.globals.map(async (global) => {
|
||||
await traverseFields({
|
||||
config,
|
||||
fields: global.fields,
|
||||
schemaMap: result,
|
||||
schemaPath: global.slug,
|
||||
validRelationships,
|
||||
})
|
||||
}),
|
||||
)
|
||||
config.globals.forEach((global) => {
|
||||
traverseFields({
|
||||
config,
|
||||
fields: global.fields,
|
||||
i18n,
|
||||
schemaMap: result,
|
||||
schemaPath: global.slug,
|
||||
validRelationships,
|
||||
})
|
||||
})
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import type { I18n } from '@payloadcms/translations'
|
||||
import type { Field, SanitizedConfig } from 'payload/types'
|
||||
|
||||
import { tabHasName } from 'payload/types'
|
||||
@@ -7,94 +8,95 @@ import type { FieldSchemaMap } from './types.js'
|
||||
type Args = {
|
||||
config: SanitizedConfig
|
||||
fields: Field[]
|
||||
i18n: I18n
|
||||
schemaMap: FieldSchemaMap
|
||||
schemaPath: string
|
||||
validRelationships: string[]
|
||||
}
|
||||
|
||||
export const traverseFields = async ({
|
||||
export const traverseFields = ({
|
||||
config,
|
||||
fields,
|
||||
i18n,
|
||||
schemaMap,
|
||||
schemaPath,
|
||||
validRelationships,
|
||||
}: Args): Promise<void> => {
|
||||
await Promise.all(
|
||||
fields.map(async (field) => {
|
||||
switch (field.type) {
|
||||
case 'group':
|
||||
case 'array':
|
||||
schemaMap.set(`${schemaPath}.${field.name}`, field.fields)
|
||||
}: Args) => {
|
||||
fields.map((field) => {
|
||||
switch (field.type) {
|
||||
case 'group':
|
||||
case 'array':
|
||||
schemaMap.set(`${schemaPath}.${field.name}`, field.fields)
|
||||
|
||||
await traverseFields({
|
||||
traverseFields({
|
||||
config,
|
||||
fields: field.fields,
|
||||
i18n,
|
||||
schemaMap,
|
||||
schemaPath: `${schemaPath}.${field.name}`,
|
||||
validRelationships,
|
||||
})
|
||||
break
|
||||
|
||||
case 'collapsible':
|
||||
case 'row':
|
||||
traverseFields({
|
||||
config,
|
||||
fields: field.fields,
|
||||
i18n,
|
||||
schemaMap,
|
||||
schemaPath,
|
||||
validRelationships,
|
||||
})
|
||||
break
|
||||
|
||||
case 'blocks':
|
||||
field.blocks.map((block) => {
|
||||
const blockSchemaPath = `${schemaPath}.${field.name}.${block.slug}`
|
||||
|
||||
schemaMap.set(blockSchemaPath, block.fields)
|
||||
|
||||
traverseFields({
|
||||
config,
|
||||
fields: field.fields,
|
||||
fields: block.fields,
|
||||
i18n,
|
||||
schemaMap,
|
||||
schemaPath: blockSchemaPath,
|
||||
validRelationships,
|
||||
})
|
||||
})
|
||||
break
|
||||
|
||||
case 'richText':
|
||||
if (typeof field.editor.generateSchemaMap === 'function') {
|
||||
field.editor.generateSchemaMap({
|
||||
config,
|
||||
i18n,
|
||||
schemaMap,
|
||||
schemaPath: `${schemaPath}.${field.name}`,
|
||||
validRelationships,
|
||||
})
|
||||
break
|
||||
}
|
||||
|
||||
case 'collapsible':
|
||||
case 'row':
|
||||
await traverseFields({
|
||||
config,
|
||||
fields: field.fields,
|
||||
schemaMap,
|
||||
schemaPath,
|
||||
validRelationships,
|
||||
})
|
||||
break
|
||||
break
|
||||
|
||||
case 'blocks':
|
||||
await Promise.all(
|
||||
field.blocks.map(async (block) => {
|
||||
const blockSchemaPath = `${schemaPath}.${field.name}.${block.slug}`
|
||||
case 'tabs':
|
||||
field.tabs.map((tab) => {
|
||||
const tabSchemaPath = tabHasName(tab) ? `${schemaPath}.${tab.name}` : schemaPath
|
||||
|
||||
schemaMap.set(blockSchemaPath, block.fields)
|
||||
|
||||
await traverseFields({
|
||||
config,
|
||||
fields: block.fields,
|
||||
schemaMap,
|
||||
schemaPath: blockSchemaPath,
|
||||
validRelationships,
|
||||
})
|
||||
}),
|
||||
)
|
||||
break
|
||||
|
||||
case 'richText':
|
||||
if (typeof field.editor.generateSchemaMap === 'function') {
|
||||
await field.editor.generateSchemaMap({
|
||||
config,
|
||||
schemaMap,
|
||||
schemaPath: `${schemaPath}.${field.name}`,
|
||||
})
|
||||
if (tabHasName(tab)) {
|
||||
schemaMap.set(tabSchemaPath, tab.fields)
|
||||
}
|
||||
|
||||
break
|
||||
|
||||
case 'tabs':
|
||||
await Promise.all(
|
||||
field.tabs.map(async (tab) => {
|
||||
const tabSchemaPath = tabHasName(tab) ? `${schemaPath}.${tab.name}` : schemaPath
|
||||
|
||||
if (tabHasName(tab)) {
|
||||
schemaMap.set(tabSchemaPath, tab.fields)
|
||||
}
|
||||
|
||||
await traverseFields({
|
||||
config,
|
||||
fields: tab.fields,
|
||||
schemaMap,
|
||||
schemaPath: tabSchemaPath,
|
||||
validRelationships,
|
||||
})
|
||||
}),
|
||||
)
|
||||
break
|
||||
}
|
||||
}),
|
||||
)
|
||||
traverseFields({
|
||||
config,
|
||||
fields: tab.fields,
|
||||
i18n,
|
||||
schemaMap,
|
||||
schemaPath: tabSchemaPath,
|
||||
validRelationships,
|
||||
})
|
||||
})
|
||||
break
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
@@ -71,7 +71,7 @@ export const createPayloadRequest = async ({
|
||||
headers: request.headers,
|
||||
})
|
||||
|
||||
const i18n = initI18n({
|
||||
const i18n = await initI18n({
|
||||
config: config.i18n,
|
||||
context: 'api',
|
||||
language,
|
||||
|
||||
@@ -6,13 +6,13 @@ import { cookies, headers } from 'next/headers.js'
|
||||
|
||||
import { getRequestLanguage } from './getRequestLanguage.js'
|
||||
|
||||
export const getNextI18n = ({
|
||||
export const getNextI18n = async ({
|
||||
config,
|
||||
language,
|
||||
}: {
|
||||
config: SanitizedConfig
|
||||
language?: string
|
||||
}): I18n =>
|
||||
}): Promise<I18n> =>
|
||||
initI18n({
|
||||
config: config.i18n,
|
||||
context: 'client',
|
||||
|
||||
@@ -44,7 +44,7 @@ export const initPage = async ({
|
||||
const cookies = parseCookies(headers)
|
||||
const language = getRequestLanguage({ config: payload.config, cookies, headers })
|
||||
|
||||
const i18n = initI18n({
|
||||
const i18n = await initI18n({
|
||||
config: payload.config.i18n,
|
||||
context: 'client',
|
||||
language,
|
||||
|
||||
@@ -89,7 +89,7 @@ export const getMetaBySegment: GenerateEditViewMetadata = async ({
|
||||
}
|
||||
}
|
||||
|
||||
const i18n = getNextI18n({
|
||||
const i18n = await getNextI18n({
|
||||
config,
|
||||
})
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@ export const generatePageMetadata = async ({
|
||||
}): Promise<Metadata> => {
|
||||
const config = await configPromise
|
||||
|
||||
const i18n = getNextI18n({
|
||||
const i18n = await getNextI18n({
|
||||
config,
|
||||
})
|
||||
|
||||
|
||||
@@ -49,7 +49,7 @@ export const generatePageMetadata = async ({ config: configPromise, params }: Ar
|
||||
const isGlobal = segmentOne === 'globals'
|
||||
const isCollection = segmentOne === 'collections'
|
||||
|
||||
const i18n = getNextI18n({
|
||||
const i18n = await getNextI18n({
|
||||
config,
|
||||
})
|
||||
|
||||
|
||||
@@ -85,7 +85,9 @@ export const SetStepNav: React.FC<{
|
||||
url: `${adminRoute}/collections/${collectionSlug}/${id}/versions`,
|
||||
},
|
||||
{
|
||||
label: doc?.createdAt ? formatDate(doc.createdAt, dateFormat, i18n?.language) : '',
|
||||
label: doc?.createdAt
|
||||
? formatDate({ date: doc.createdAt, i18n, pattern: dateFormat })
|
||||
: '',
|
||||
},
|
||||
]
|
||||
}
|
||||
@@ -101,7 +103,9 @@ export const SetStepNav: React.FC<{
|
||||
url: `${adminRoute}/globals/${globalConfig.slug}/versions`,
|
||||
},
|
||||
{
|
||||
label: doc?.createdAt ? formatDate(doc.createdAt, dateFormat, i18n?.language) : '',
|
||||
label: doc?.createdAt
|
||||
? formatDate({ date: doc.createdAt, i18n, pattern: dateFormat })
|
||||
: '',
|
||||
},
|
||||
]
|
||||
}
|
||||
|
||||
@@ -61,7 +61,7 @@ export const DefaultVersionView: React.FC<DefaultVersionsViewProps> = ({
|
||||
} = config
|
||||
|
||||
const formattedCreatedAt = doc?.createdAt
|
||||
? formatDate(doc.createdAt, dateFormat, i18n.language)
|
||||
? formatDate({ date: doc.createdAt, i18n, pattern: dateFormat })
|
||||
: ''
|
||||
|
||||
const originalDocFetchURL = `${serverURL}${apiRoute}/${globalSlug ? 'globals/' : ''}${
|
||||
|
||||
@@ -88,7 +88,7 @@ export const SelectComparison: React.FC<Props> = (props) => {
|
||||
setOptions((existingOptions) => [
|
||||
...existingOptions,
|
||||
...data.docs.map((doc) => ({
|
||||
label: formatDate(doc.updatedAt, dateFormat, i18n.language),
|
||||
label: formatDate({ date: doc.updatedAt, i18n, pattern: dateFormat }),
|
||||
value: doc.id,
|
||||
})),
|
||||
])
|
||||
|
||||
@@ -22,7 +22,7 @@ export const generateMetadata: GenerateEditViewMetadata = async ({
|
||||
const doc: any = {} // TODO: figure this out
|
||||
|
||||
const formattedCreatedAt = doc?.createdAt
|
||||
? formatDate(doc.createdAt, config?.admin?.dateFormat, i18n?.language)
|
||||
? formatDate({ date: doc.createdAt, i18n, pattern: config?.admin?.dateFormat })
|
||||
: ''
|
||||
|
||||
if (collectionConfig) {
|
||||
|
||||
@@ -38,7 +38,8 @@ export const CreatedAtCell: React.FC<CreatedAtCellProps> = ({
|
||||
|
||||
return (
|
||||
<Link href={to}>
|
||||
{cellData && formatDate(cellData as Date | number | string, dateFormat, i18n.language)}
|
||||
{cellData &&
|
||||
formatDate({ date: cellData as Date | number | string, i18n, pattern: dateFormat })}
|
||||
</Link>
|
||||
)
|
||||
}
|
||||
|
||||
@@ -34,9 +34,10 @@ type RichTextAdapterBase<
|
||||
}) => Map<string, React.ReactNode>
|
||||
generateSchemaMap?: (args: {
|
||||
config: SanitizedConfig
|
||||
i18n: I18n
|
||||
schemaMap: Map<string, Field[]>
|
||||
schemaPath: string
|
||||
}) => Map<string, Field[]> | Promise<Map<string, Field[]>>
|
||||
}) => Map<string, Field[]>
|
||||
outputSchema?: ({
|
||||
collectionIDFieldTypes,
|
||||
config,
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import type { Translations } from '@payloadcms/translations'
|
||||
import type { SupportedLanguages } from '@payloadcms/translations'
|
||||
|
||||
import type { Permissions } from '../../auth/index.js'
|
||||
import type { SanitizedCollectionConfig } from '../../collections/config/types.js'
|
||||
@@ -43,7 +43,7 @@ export type InitPageResult = {
|
||||
locale: Locale
|
||||
permissions: Permissions
|
||||
req: PayloadRequest
|
||||
translations: Translations
|
||||
translations: SupportedLanguages
|
||||
visibleEntities: VisibleEntities
|
||||
}
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import en from '@payloadcms/translations/languages/en'
|
||||
import { en } from '@payloadcms/translations/languages/en'
|
||||
import merge from 'deepmerge'
|
||||
|
||||
import type {
|
||||
|
||||
@@ -673,11 +673,12 @@ export type Config = {
|
||||
|
||||
export type SanitizedConfig = Omit<
|
||||
DeepRequired<Config>,
|
||||
'collections' | 'endpoint' | 'globals' | 'localization'
|
||||
'collections' | 'endpoint' | 'globals' | 'i18n' | 'localization'
|
||||
> & {
|
||||
collections: SanitizedCollectionConfig[]
|
||||
endpoints: Endpoint[]
|
||||
globals: SanitizedGlobalConfig[]
|
||||
i18n: Required<I18nOptions>
|
||||
localization: SanitizedLocalizationConfig | false
|
||||
paths: {
|
||||
config: string
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import type { TFunction } from '@payloadcms/translations'
|
||||
|
||||
import en from '@payloadcms/translations/languages/en'
|
||||
import { en } from '@payloadcms/translations/languages/en'
|
||||
import httpStatus from 'http-status'
|
||||
|
||||
import APIError from './APIError.js'
|
||||
@@ -8,7 +8,7 @@ import APIError from './APIError.js'
|
||||
class AuthenticationError extends APIError {
|
||||
constructor(t?: TFunction) {
|
||||
super(
|
||||
t ? t('error:emailOrPasswordIncorrect') : en.error.emailOrPasswordIncorrect,
|
||||
t ? t('error:emailOrPasswordIncorrect') : en.translations.error.emailOrPasswordIncorrect,
|
||||
httpStatus.UNAUTHORIZED,
|
||||
)
|
||||
}
|
||||
|
||||
@@ -1,13 +1,16 @@
|
||||
import type { TFunction } from '@payloadcms/translations'
|
||||
|
||||
import en from '@payloadcms/translations/languages/en'
|
||||
import { en } from '@payloadcms/translations/languages/en'
|
||||
import httpStatus from 'http-status'
|
||||
|
||||
import APIError from './APIError.js'
|
||||
|
||||
class ErrorDeletingFile extends APIError {
|
||||
constructor(t?: TFunction) {
|
||||
super(t ? t('error:deletingFile') : en.error.deletingFile, httpStatus.INTERNAL_SERVER_ERROR)
|
||||
super(
|
||||
t ? t('error:deletingFile') : en.translations.error.deletingFile,
|
||||
httpStatus.INTERNAL_SERVER_ERROR,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import type { TFunction } from '@payloadcms/translations'
|
||||
|
||||
import en from '@payloadcms/translations/languages/en'
|
||||
import { en } from '@payloadcms/translations/languages/en'
|
||||
import httpStatus from 'http-status'
|
||||
|
||||
import APIError from './APIError.js'
|
||||
@@ -8,7 +8,7 @@ import APIError from './APIError.js'
|
||||
class FileUploadError extends APIError {
|
||||
constructor(t?: TFunction) {
|
||||
super(
|
||||
t ? t('error:problemUploadingFile') : en.error.problemUploadingFile,
|
||||
t ? t('error:problemUploadingFile') : en.translations.error.problemUploadingFile,
|
||||
httpStatus.BAD_REQUEST,
|
||||
)
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import type { TFunction } from '@payloadcms/translations'
|
||||
|
||||
import en from '@payloadcms/translations/languages/en'
|
||||
import { en } from '@payloadcms/translations/languages/en'
|
||||
import httpStatus from 'http-status'
|
||||
|
||||
import APIError from './APIError.js'
|
||||
@@ -8,7 +8,7 @@ import APIError from './APIError.js'
|
||||
class Forbidden extends APIError {
|
||||
constructor(t?: TFunction) {
|
||||
super(
|
||||
t ? t('error:notAllowedToPerformAction') : en.error.notAllowedToPerformAction,
|
||||
t ? t('error:notAllowedToPerformAction') : en.translations.error.notAllowedToPerformAction,
|
||||
httpStatus.FORBIDDEN,
|
||||
)
|
||||
}
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
import type { TFunction } from '@payloadcms/translations'
|
||||
|
||||
import en from '@payloadcms/translations/languages/en'
|
||||
import { en } from '@payloadcms/translations/languages/en'
|
||||
import httpStatus from 'http-status'
|
||||
|
||||
import APIError from './APIError.js'
|
||||
|
||||
class LockedAuth extends APIError {
|
||||
constructor(t?: TFunction) {
|
||||
super(t ? t('error:userLocked') : en.error.userLocked, httpStatus.UNAUTHORIZED)
|
||||
super(t ? t('error:userLocked') : en.translations.error.userLocked, httpStatus.UNAUTHORIZED)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,14 +1,16 @@
|
||||
import type { TFunction } from '@payloadcms/translations'
|
||||
|
||||
import en from '@payloadcms/translations/languages/en'
|
||||
|
||||
import { en } from '@payloadcms/translations/languages/en'
|
||||
import httpStatus from 'http-status'
|
||||
|
||||
import APIError from './APIError.js'
|
||||
|
||||
class MissingFile extends APIError {
|
||||
constructor(t?: TFunction) {
|
||||
super(t ? t('error:noFilesUploaded') : en.error.noFilesUploaded, httpStatus.BAD_REQUEST)
|
||||
super(
|
||||
t ? t('error:noFilesUploaded') : en.translations.error.noFilesUploaded,
|
||||
httpStatus.BAD_REQUEST,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
import type { TFunction } from '@payloadcms/translations'
|
||||
|
||||
import en from '@payloadcms/translations/languages/en'
|
||||
import { en } from '@payloadcms/translations/languages/en'
|
||||
import httpStatus from 'http-status'
|
||||
|
||||
import APIError from './APIError.js'
|
||||
|
||||
class NotFound extends APIError {
|
||||
constructor(t?: TFunction) {
|
||||
super(t ? t('general:notFound') : en.general.notFound, httpStatus.NOT_FOUND)
|
||||
super(t ? t('general:notFound') : en.translations.general.notFound, httpStatus.NOT_FOUND)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
import type { TFunction } from '@payloadcms/translations'
|
||||
|
||||
import en from '@payloadcms/translations/languages/en'
|
||||
import { en } from '@payloadcms/translations/languages/en'
|
||||
import httpStatus from 'http-status'
|
||||
|
||||
import APIError from './APIError.js'
|
||||
|
||||
class UnauthorizedError extends APIError {
|
||||
constructor(t?: TFunction) {
|
||||
super(t ? t('error:unauthorized') : en.error.unauthorized, httpStatus.UNAUTHORIZED)
|
||||
super(t ? t('error:unauthorized') : en.translations.error.unauthorized, httpStatus.UNAUTHORIZED)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import type { TFunction } from '@payloadcms/translations'
|
||||
|
||||
import en from '@payloadcms/translations/languages/en'
|
||||
import { en } from '@payloadcms/translations/languages/en'
|
||||
import httpStatus from 'http-status'
|
||||
|
||||
import APIError from './APIError.js'
|
||||
@@ -10,8 +10,8 @@ class ValidationError extends APIError<{ field: string; message: string }[]> {
|
||||
const message = t
|
||||
? t('error:followingFieldsInvalid', { count: results.length })
|
||||
: results.length === 1
|
||||
? en.error.followingFieldsInvalid_one
|
||||
: en.error.followingFieldsInvalid_other
|
||||
? en.translations.error.followingFieldsInvalid_one
|
||||
: en.translations.error.followingFieldsInvalid_other
|
||||
|
||||
super(`${message} ${results.map((f) => f.field).join(', ')}`, httpStatus.BAD_REQUEST, results)
|
||||
}
|
||||
|
||||
@@ -2,8 +2,6 @@ import type { I18n } from '@payloadcms/translations'
|
||||
import type { SanitizedConfig } from 'payload/config'
|
||||
import type { FieldWithRichTextRequiredEditor } from 'payload/types'
|
||||
|
||||
import { initI18n } from '@payloadcms/translations'
|
||||
|
||||
import type { HTMLConverter } from '../converters/html/converter/types.js'
|
||||
import type { FeatureProviderProviderServer } from '../types.js'
|
||||
import type { ClientProps } from './feature.client.js'
|
||||
@@ -66,9 +64,7 @@ export const LinkFeature: FeatureProviderProviderServer<LinkFeatureServerProps,
|
||||
disabledCollections: props.disabledCollections,
|
||||
enabledCollections: props.enabledCollections,
|
||||
} as ExclusiveLinkCollectionsProps,
|
||||
generateSchemaMap: ({ config, props }) => {
|
||||
const i18n = initI18n({ config: config.i18n, context: 'client' })
|
||||
|
||||
generateSchemaMap: ({ config, i18n, props }) => {
|
||||
return {
|
||||
fields: transformExtraFields(
|
||||
props.fields,
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import type { Transformer } from '@lexical/markdown'
|
||||
import type { I18n } from '@payloadcms/translations'
|
||||
import type { JSONSchema4 } from 'json-schema'
|
||||
import type { Klass, LexicalEditor, LexicalNode, SerializedEditorState } from 'lexical'
|
||||
import type { SerializedLexicalNode } from 'lexical'
|
||||
@@ -178,6 +179,7 @@ export type ServerFeature<ServerProps, ClientFeatureProps> = {
|
||||
clientFeatureProps?: ClientFeatureProps
|
||||
generateComponentMap?: (args: {
|
||||
config: SanitizedConfig
|
||||
i18n: I18n
|
||||
props: ServerProps
|
||||
schemaPath: string
|
||||
}) => {
|
||||
@@ -185,12 +187,17 @@ export type ServerFeature<ServerProps, ClientFeatureProps> = {
|
||||
}
|
||||
generateSchemaMap?: (args: {
|
||||
config: SanitizedConfig
|
||||
i18n: I18n
|
||||
props: ServerProps
|
||||
schemaMap: Map<string, Field[]>
|
||||
schemaPath: string
|
||||
}) => {
|
||||
[key: string]: Field[]
|
||||
}
|
||||
}) =>
|
||||
| {
|
||||
[key: string]: Field[]
|
||||
}
|
||||
| Promise<{
|
||||
[key: string]: Field[]
|
||||
}>
|
||||
generatedTypes?: {
|
||||
modifyOutputSchema: ({
|
||||
collectionIDFieldTypes,
|
||||
|
||||
@@ -39,6 +39,7 @@ export const getGenerateComponentMap =
|
||||
) {
|
||||
const components = resolvedFeature.generateComponentMap({
|
||||
config,
|
||||
i18n,
|
||||
props: resolvedFeature.serverFeatureProps,
|
||||
schemaPath,
|
||||
})
|
||||
@@ -68,6 +69,7 @@ export const getGenerateComponentMap =
|
||||
) {
|
||||
const schemas = resolvedFeature.generateSchemaMap({
|
||||
config,
|
||||
i18n,
|
||||
props: resolvedFeature.serverFeatureProps,
|
||||
schemaMap: new Map(),
|
||||
schemaPath,
|
||||
|
||||
@@ -8,7 +8,7 @@ import { cloneDeep } from './field/lexical/utils/cloneDeep.js'
|
||||
|
||||
export const getGenerateSchemaMap =
|
||||
(args: { resolvedFeatureMap: ResolvedServerFeatureMap }): RichTextAdapter['generateSchemaMap'] =>
|
||||
({ config, schemaMap, schemaPath }) => {
|
||||
({ config, i18n, schemaMap, schemaPath }) => {
|
||||
const validRelationships = config.collections.map((c) => c.slug) || []
|
||||
|
||||
for (const [featureKey, resolvedFeature] of args.resolvedFeatureMap.entries()) {
|
||||
@@ -20,6 +20,7 @@ export const getGenerateSchemaMap =
|
||||
}
|
||||
const schemas = resolvedFeature.generateSchemaMap({
|
||||
config,
|
||||
i18n,
|
||||
props: resolvedFeature.serverFeatureProps,
|
||||
schemaMap,
|
||||
schemaPath,
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
import type { RichTextAdapter } from 'payload/types'
|
||||
|
||||
import { initI18n } from '@payloadcms/translations'
|
||||
import { sanitizeFields } from 'payload/config'
|
||||
|
||||
import type { AdapterArguments, RichTextCustomElement } from './types.js'
|
||||
@@ -12,8 +11,7 @@ import { uploadFieldsSchemaPath } from './field/elements/upload/shared.js'
|
||||
|
||||
export const getGenerateSchemaMap =
|
||||
(args: AdapterArguments): RichTextAdapter['generateSchemaMap'] =>
|
||||
({ config, schemaMap, schemaPath }) => {
|
||||
const i18n = initI18n({ config: config.i18n, context: 'client' })
|
||||
({ config, i18n, schemaMap, schemaPath }) => {
|
||||
const validRelationships = config.collections.map((c) => c.slug) || []
|
||||
|
||||
;(args?.admin?.elements || Object.values(elementTypes)).forEach((el) => {
|
||||
|
||||
@@ -56,6 +56,7 @@
|
||||
"@payloadcms/eslint-config": "workspace:*",
|
||||
"@swc/core": "^1.3.102",
|
||||
"@types/react": "18.2.74",
|
||||
"date-fns": "3.3.1",
|
||||
"typescript": "5.4.4"
|
||||
},
|
||||
"files": [
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
import ar from '../languages/ar.js'
|
||||
import type { SupportedLanguages } from '../types.js'
|
||||
|
||||
import { ar } from '../languages/ar.js'
|
||||
import az from '../languages/az.js'
|
||||
import bg from '../languages/bg.js'
|
||||
import cs from '../languages/cs.js'
|
||||
import de from '../languages/de.js'
|
||||
import en from '../languages/en.js'
|
||||
import { de } from '../languages/de.js'
|
||||
import { en } from '../languages/en.js'
|
||||
import es from '../languages/es.js'
|
||||
import fa from '../languages/fa.js'
|
||||
import fr from '../languages/fr.js'
|
||||
@@ -31,35 +33,33 @@ import zhTw from '../languages/zhTw.js'
|
||||
|
||||
export const translations = {
|
||||
ar,
|
||||
az,
|
||||
bg,
|
||||
cs,
|
||||
// az,
|
||||
// bg,
|
||||
// cs,
|
||||
de,
|
||||
en,
|
||||
es,
|
||||
fa,
|
||||
fr,
|
||||
hr,
|
||||
hu,
|
||||
it,
|
||||
ja,
|
||||
ko,
|
||||
my,
|
||||
nb,
|
||||
nl,
|
||||
pl,
|
||||
pt,
|
||||
ro,
|
||||
rs,
|
||||
'rs-latin': rsLatin,
|
||||
ru,
|
||||
sv,
|
||||
th,
|
||||
tr,
|
||||
ua,
|
||||
vi,
|
||||
zh,
|
||||
'zh-tw': zhTw,
|
||||
} as {
|
||||
[locale: string]: Record<string, Record<string, string>>
|
||||
}
|
||||
// es,
|
||||
// fa,
|
||||
// fr,
|
||||
// hr,
|
||||
// hu,
|
||||
// it,
|
||||
// ja,
|
||||
// ko,
|
||||
// my,
|
||||
// nb,
|
||||
// nl,
|
||||
// pl,
|
||||
// pt,
|
||||
// ro,
|
||||
// rs,
|
||||
// 'rs-latin': rsLatin,
|
||||
// ru,
|
||||
// sv,
|
||||
// th,
|
||||
// tr,
|
||||
// ua,
|
||||
// vi,
|
||||
// zh,
|
||||
// 'zh-tw': zhTw,
|
||||
} as SupportedLanguages
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
export { importDateFNSLocale } from '../importDateFNSLocale.js'
|
||||
export { getTranslation } from '../utilities/getTranslation.js'
|
||||
export { initI18n, matchLanguage, t } from '../utilities/init.js'
|
||||
export type * from '../types.js'
|
||||
|
||||
116
packages/translations/src/importDateFNSLocale.ts
Normal file
116
packages/translations/src/importDateFNSLocale.ts
Normal file
@@ -0,0 +1,116 @@
|
||||
import type { Locale } from 'date-fns'
|
||||
|
||||
export const importDateFNSLocale = async (locale: string): Promise<Locale> => {
|
||||
let result
|
||||
|
||||
switch (locale) {
|
||||
case 'ar':
|
||||
result = await import('date-fns/locale/ar')
|
||||
|
||||
break
|
||||
case 'az':
|
||||
result = await import('date-fns/locale/az')
|
||||
|
||||
break
|
||||
case 'bg':
|
||||
result = await import('date-fns/locale/bg')
|
||||
|
||||
break
|
||||
case 'cs':
|
||||
result = await import('date-fns/locale/cs')
|
||||
|
||||
break
|
||||
case 'de':
|
||||
result = await import('date-fns/locale/de')
|
||||
|
||||
break
|
||||
case 'en-US':
|
||||
result = await import('date-fns/locale/en-US')
|
||||
|
||||
break
|
||||
case 'es':
|
||||
result = await import('date-fns/locale/es')
|
||||
|
||||
break
|
||||
case 'fa-IR':
|
||||
result = await import('date-fns/locale/fa-IR')
|
||||
|
||||
break
|
||||
case 'fr':
|
||||
result = await import('date-fns/locale/fr')
|
||||
|
||||
break
|
||||
case 'hr':
|
||||
result = await import('date-fns/locale/hr')
|
||||
|
||||
break
|
||||
case 'hu':
|
||||
result = await import('date-fns/locale/hu')
|
||||
|
||||
break
|
||||
case 'it':
|
||||
result = await import('date-fns/locale/it')
|
||||
|
||||
break
|
||||
case 'ja':
|
||||
result = await import('date-fns/locale/ja')
|
||||
|
||||
break
|
||||
case 'ko':
|
||||
result = await import('date-fns/locale/ko')
|
||||
|
||||
break
|
||||
case 'nb':
|
||||
result = await import('date-fns/locale/nb')
|
||||
|
||||
break
|
||||
case 'nl':
|
||||
result = await import('date-fns/locale/nl')
|
||||
|
||||
break
|
||||
case 'pl':
|
||||
result = await import('date-fns/locale/pl')
|
||||
|
||||
break
|
||||
case 'pt':
|
||||
result = await import('date-fns/locale/pt')
|
||||
|
||||
break
|
||||
case 'ro':
|
||||
result = await import('date-fns/locale/ro')
|
||||
|
||||
break
|
||||
case 'ru':
|
||||
result = await import('date-fns/locale/ru')
|
||||
|
||||
break
|
||||
case 'sv':
|
||||
result = await import('date-fns/locale/sv')
|
||||
|
||||
break
|
||||
case 'th':
|
||||
result = await import('date-fns/locale/th')
|
||||
|
||||
break
|
||||
case 'tr':
|
||||
result = await import('date-fns/locale/tr')
|
||||
|
||||
break
|
||||
case 'vi':
|
||||
result = await import('date-fns/locale/vi')
|
||||
|
||||
break
|
||||
case 'zh-CN':
|
||||
result = await import('date-fns/locale/zh-CN')
|
||||
|
||||
break
|
||||
case 'zh-TW':
|
||||
result = await import('date-fns/locale/zh-TW')
|
||||
|
||||
break
|
||||
}
|
||||
|
||||
if (result.default) return result.default
|
||||
|
||||
return result as Locale
|
||||
}
|
||||
@@ -1,384 +1,389 @@
|
||||
export default {
|
||||
authentication: {
|
||||
account: 'الحساب',
|
||||
accountOfCurrentUser: 'حساب المستخدم الحالي',
|
||||
alreadyActivated: 'تمّ التّفعيل بالفعل',
|
||||
alreadyLoggedIn: 'تمّ تسجيل الدّخول بالفعل',
|
||||
apiKey: 'مفتاح API',
|
||||
backToLogin: 'العودة لتسجيل الدخول',
|
||||
beginCreateFirstUser: 'للبدء, قم بإنشاء المستخدم الأوّل.',
|
||||
changePassword: 'تغيير كلمة المرور',
|
||||
checkYourEmailForPasswordReset:
|
||||
'تحقّق من بريدك الإلكتروني بحثًا عن رابط يسمح لك بإعادة تعيين كلمة المرور الخاصّة بك بشكل آمن.',
|
||||
confirmGeneration: 'تأكيد التّوليد',
|
||||
confirmPassword: 'تأكيد كلمة المرور',
|
||||
createFirstUser: 'إنشاء المستخدم الأوّل',
|
||||
emailNotValid: 'البريد الإلكتروني غير صالح',
|
||||
emailSent: 'تمّ ارسال البريد الإلكتروني',
|
||||
enableAPIKey: 'تفعيل مفتاح API',
|
||||
failedToUnlock: 'فشل فتح القفل',
|
||||
forceUnlock: 'إجبار فتح القفل',
|
||||
forgotPassword: 'نسيت كلمة المرور',
|
||||
forgotPasswordEmailInstructions:
|
||||
'يرجى إدخال البريد الالكتروني أدناه. ستتلقّى رسالة بريد إلكتروني تحتوي على إرشادات حول كيفيّة إعادة تعيين كلمة المرور الخاصّة بك.',
|
||||
forgotPasswordQuestion: 'هل نسيت كلمة المرور؟',
|
||||
generate: 'توليد',
|
||||
generateNewAPIKey: 'توليد مفتاح API جديد',
|
||||
generatingNewAPIKeyWillInvalidate:
|
||||
'سيؤدّي إنشاء مفتاح API جديد إلى <1> إبطال </ 1> المفتاح السّابق. هل أنت متأكّد أنّك تريد المتابعة؟',
|
||||
lockUntil: 'قفل حتى',
|
||||
logBackIn: 'تسجيل الدّخول من جديد',
|
||||
logOut: 'تسجيل الخروج',
|
||||
loggedIn: 'لتسجيل الدّخول مع مستخدم آخر ، يجب عليك <0> تسجيل الخروج </0> أوّلاً.',
|
||||
loggedInChangePassword:
|
||||
'لتغيير كلمة المرور الخاصّة بك ، انتقل إلى <0>حسابك</0> وقم بتعديل كلمة المرور هناك.',
|
||||
loggedOutInactivity: 'لقد تمّ تسجيل الخروج بسبب عدم النّشاط.',
|
||||
loggedOutSuccessfully: 'لقد تمّ تسجيل خروجك بنجاح.',
|
||||
login: 'تسجيل الدخول',
|
||||
loginAttempts: 'محاولات تسجيل الدخول',
|
||||
loginUser: 'تسجيل دخول المستخدم',
|
||||
loginWithAnotherUser: 'لتسجيل الدخول مع مستخدم آخر ، يجب عليك <0> تسجيل الخروج </0> أوّلاً.',
|
||||
logout: 'تسجيل الخروج',
|
||||
logoutUser: 'تسجيل خروج المستخدم',
|
||||
newAPIKeyGenerated: 'تمّ توليد مفتاح API جديد.',
|
||||
newAccountCreated:
|
||||
'تمّ إنشاء حساب جديد لتتمكّن من الوصول إلى <a href="{{serverURL}}"> {{serverURL}} </a> الرّجاء النّقر فوق الرّابط التّالي أو لصق عنوان URL أدناه في متصفّحّك لتأكيد بريدك الإلكتروني : <a href="{{verificationURL}}"> {{verificationURL}} </a> <br> بعد التّحقّق من بريدك الإلكتروني ، ستتمكّن من تسجيل الدّخول بنجاح.',
|
||||
newPassword: 'كلمة مرور جديدة',
|
||||
resetPassword: 'إعادة تعيين كلمة المرور',
|
||||
resetPasswordExpiration: 'انتهاء صلاحيّة إعادة تعيين كلمة المرور',
|
||||
resetPasswordToken: 'رمز إعادة تعيين كلمة المرور',
|
||||
resetYourPassword: 'إعادة تعيين كلمة المرور الخاصّة بك',
|
||||
stayLoggedIn: 'ابق متّصلًا',
|
||||
successfullyUnlocked: 'تمّ فتح القفل بنجاح',
|
||||
unableToVerify: 'غير قادر على التحقق من',
|
||||
verified: 'تمّ التحقّق',
|
||||
verifiedSuccessfully: 'تمّ التحقّق بنجاح',
|
||||
verify: 'قم بالتّحقّق',
|
||||
verifyUser: 'قم بالتّحقّق من المستخدم',
|
||||
verifyYourEmail: 'قم بتأكيد بريدك الألكتروني',
|
||||
youAreInactive:
|
||||
'لم تكن نشطًا منذ فترة قصيرة وسيتمّ تسجيل خروجك قريبًا تلقائيًا من أجل أمنك. هل ترغب في البقاء مسجّلا؟',
|
||||
youAreReceivingResetPassword:
|
||||
'أنت تتلقّى هذا البريد الالكتروني لأنّك (أو لأنّ شخص آخر) طلبت إعادة تعيين كلمة المرور لحسابك. الرّجاء النّقر فوق الرّابط التّالي ، أو لصق هذا الرّابط في متصفّحك لإكمال العمليّة:',
|
||||
youDidNotRequestPassword:
|
||||
'إن لم تطلب هذا ، يرجى تجاهل هذا البريد الإلكتروني وستبقى كلمة مرورك ذاتها بدون تغيير.',
|
||||
},
|
||||
error: {
|
||||
accountAlreadyActivated: 'تم تفعيل هذا الحساب بالفعل.',
|
||||
autosaving: 'حدثت مشكلة أثناء حفظ هذا المستند تلقائيًا.',
|
||||
correctInvalidFields: 'يرجى تصحيح الحقول غير الصالحة.',
|
||||
deletingFile: 'حدث خطأ أثناء حذف الملف.',
|
||||
deletingTitle:
|
||||
'حدث خطأ أثناء حذف {{title}}. يرجى التحقق من الاتصال الخاص بك والمحاولة مرة أخرى.',
|
||||
emailOrPasswordIncorrect: 'البريد الإلكتروني أو كلمة المرور المقدمة غير صحيحة.',
|
||||
followingFieldsInvalid_one: 'الحقل التالي غير صالح:',
|
||||
followingFieldsInvalid_other: 'الحقول التالية غير صالحة:',
|
||||
incorrectCollection: 'مجموعة غير صحيحة',
|
||||
invalidFileType: 'نوع ملف غير صالح',
|
||||
invalidFileTypeValue: 'نوع ملف غير صالح: {{value}}',
|
||||
loadingDocument: 'حدثت مشكلة أثناء تحميل المستند برقم التعريف {{id}}.',
|
||||
missingEmail: 'البريد الإلكتروني مفقود.',
|
||||
missingIDOfDocument: 'معرّف المستند المراد تحديثه مفقود.',
|
||||
missingIDOfVersion: 'معرّف النسخة مفقود.',
|
||||
missingRequiredData: 'توجد بيانات مطلوبة مفقودة.',
|
||||
noFilesUploaded: 'لم يتمّ رفع أيّة ملفّات.',
|
||||
noMatchedField: 'لم يتمّ العثور على حقل مطابق لـ "{{label}}"',
|
||||
noUser: 'لا يوجد مستخدم',
|
||||
notAllowedToAccessPage: 'لا يسمح لك الوصول إلى هذه الصّفحة.',
|
||||
notAllowedToPerformAction: 'لا يسمح لك القيام بهذه العمليّة.',
|
||||
notFound: 'لم يتمّ العثور على المورد المطلوب.',
|
||||
previewing: 'حدث خطأ في اثناء معاينة هذا المستند.',
|
||||
problemUploadingFile: 'حدث خطأ اثناء رفع الملفّ.',
|
||||
tokenInvalidOrExpired: 'الرّمز إمّا غير صالح أو منتهي الصّلاحيّة.',
|
||||
unPublishingDocument: 'حدث خطأ أثناء إلغاء نشر هذا المستند.',
|
||||
unableToDeleteCount: 'يتعذّر حذف {{count}} من {{total}} {{label}}.',
|
||||
unableToUpdateCount: 'يتعذّر تحديث {{count}} من {{total}} {{label}}.',
|
||||
unauthorized: 'غير مصرّح لك ، عليك أن تقوم بتسجيل الدّخول لتتمكّن من تقديم هذا الطّلب.',
|
||||
unknown: 'حدث خطأ غير معروف.',
|
||||
unspecific: 'حدث خطأ.',
|
||||
userLocked: 'تمّ قفل هذا المستخدم نظرًا لوجود عدد كبير من محاولات تسجيل الدّخول الغير ناجحة.',
|
||||
valueMustBeUnique: 'على القيمة أن تكون فريدة',
|
||||
verificationTokenInvalid: 'رمز التحقّق غير صالح.',
|
||||
},
|
||||
fields: {
|
||||
addLabel: 'أضف {{label}}',
|
||||
addLink: 'أضف رابط',
|
||||
addNew: 'أضف جديد',
|
||||
addNewLabel: 'أضف {{label}} جديد',
|
||||
addRelationship: 'أضف علاقة',
|
||||
addUpload: 'أضف تحميل',
|
||||
block: 'وحدة محتوى',
|
||||
blockType: 'نوع وحدة المحتوى',
|
||||
blocks: 'وحدات المحتوى',
|
||||
chooseBetweenCustomTextOrDocument: 'اختر بين إدخال عنوان URL نصّي مخصّص أو الرّبط بمستند آخر.',
|
||||
chooseDocumentToLink: 'اختر مستندًا للربط',
|
||||
chooseFromExisting: 'اختر من القائمة',
|
||||
chooseLabel: 'اختر {{label}}',
|
||||
collapseAll: 'طيّ الكلّ',
|
||||
customURL: 'URL مخصّص',
|
||||
editLabelData: 'عدّل بيانات {{label}}',
|
||||
editLink: 'عدّل الرّابط',
|
||||
editRelationship: 'عدّل العلاقة',
|
||||
enterURL: 'ادخل عنوان URL',
|
||||
internalLink: 'رابط داخلي',
|
||||
itemsAndMore: '{{items}} و {{count}} أخرى',
|
||||
labelRelationship: '{{label}} علاقة',
|
||||
latitude: 'خطّ العرض',
|
||||
linkType: 'نوع الرّابط',
|
||||
linkedTo: 'تمّ الرّبط ل <0>{{label}}</0>',
|
||||
longitude: 'خطّ الطّول',
|
||||
newLabel: '{{label}} جديد',
|
||||
openInNewTab: 'الفتح في علامة تبويب جديدة',
|
||||
passwordsDoNotMatch: 'كلمة المرور غير مطابقة.',
|
||||
relatedDocument: 'مستند مربوط',
|
||||
relationTo: 'ربط ل',
|
||||
removeRelationship: 'حذف العلاقة',
|
||||
removeUpload: 'حذف المحتوى المرفوع',
|
||||
saveChanges: 'حفظ التّغييرات',
|
||||
searchForBlock: 'ابحث عن وحدة محتوى',
|
||||
selectExistingLabel: 'اختيار {{label}} من القائمة',
|
||||
selectFieldsToEdit: 'حدّد الحقول اللتي تريد تعديلها',
|
||||
showAll: 'إظهار الكلّ',
|
||||
swapRelationship: 'تبديل العلاقة',
|
||||
swapUpload: 'تبديل المحتوى المرفوع',
|
||||
textToDisplay: 'النصّ الذي تريد إظهاره',
|
||||
toggleBlock: 'Toggle block',
|
||||
uploadNewLabel: 'رفع {{label}} جديد',
|
||||
},
|
||||
general: {
|
||||
aboutToDelete: 'أنت على وشك حذف {{label}} <1>{{title}}</1>. هل أنت متأكّد؟',
|
||||
aboutToDeleteCount_many: 'أنت على وشك حذف {{count}} {{label}}',
|
||||
aboutToDeleteCount_one: 'أنت على وشك حذف {{count}} {{label}}',
|
||||
aboutToDeleteCount_other: 'أنت على وشك حذف {{count}} {{label}}',
|
||||
addBelow: 'أضف في الاسفل',
|
||||
addFilter: 'أضف فلتر',
|
||||
adminTheme: 'شكل واجهة المستخدم',
|
||||
and: 'و',
|
||||
applyChanges: 'طبق التغييرات',
|
||||
ascending: 'تصاعدي',
|
||||
automatic: 'تلقائي',
|
||||
backToDashboard: 'العودة للوحة التّحكّم',
|
||||
cancel: 'إلغاء',
|
||||
changesNotSaved: 'لم يتمّ حفظ التّغييرات. إن غادرت الآن ، ستفقد تغييراتك.',
|
||||
close: 'إغلاق',
|
||||
collapse: 'طيّ',
|
||||
collections: 'المجموعات',
|
||||
columnToSort: 'التّرتيب حسب العامود',
|
||||
columns: 'الأعمدة',
|
||||
confirm: 'تأكيد',
|
||||
confirmDeletion: 'تأكيد الحذف',
|
||||
confirmDuplication: 'تأكيد التّكرار',
|
||||
copied: 'تمّ النّسخ',
|
||||
copy: 'نسخ',
|
||||
create: 'إنشاء',
|
||||
createNew: 'أنشاء جديد',
|
||||
createNewLabel: 'إنشاء {{label}} جديد',
|
||||
created: 'تمّ الإنشاء',
|
||||
createdAt: 'تمّ الإنشاء في',
|
||||
creating: 'يتمّ الإنشاء',
|
||||
creatingNewLabel: 'جاري إنشاء {{label}} جديد',
|
||||
dark: 'غامق',
|
||||
dashboard: 'لوحة التّحكّم',
|
||||
delete: 'حذف',
|
||||
deletedCountSuccessfully: 'تمّ حذف {{count}} {{label}} بنجاح.',
|
||||
deletedSuccessfully: 'تمّ الحذف بنجاح.',
|
||||
deleting: 'يتمّ الحذف...',
|
||||
descending: 'تنازلي',
|
||||
deselectAllRows: 'إلغاء تحديد جميع الصفوف',
|
||||
duplicate: 'استنساخ',
|
||||
duplicateWithoutSaving: 'استنساخ بدون حفظ التغييرات',
|
||||
edit: 'تعديل',
|
||||
editLabel: 'تعديل {{label}}',
|
||||
editing: 'جاري التعديل',
|
||||
editingLabel_many: 'تعديل {{count}} {{label}}',
|
||||
editingLabel_one: 'تعديل {{count}} {{label}}',
|
||||
editingLabel_other: 'تعديل {{count}} {{label}}',
|
||||
email: 'البريد الإلكتروني',
|
||||
emailAddress: 'عنوان البريد الإلكتروني',
|
||||
enterAValue: 'أدخل قيمة',
|
||||
error: 'خطأ',
|
||||
errors: 'أخطاء',
|
||||
fallbackToDefaultLocale: 'الرجوع إلى اللغة الافتراضية',
|
||||
filter: 'تصفية',
|
||||
filterWhere: 'تصفية {{label}} حيث',
|
||||
filters: 'عوامل التصفية',
|
||||
globals: 'عامة',
|
||||
language: 'اللغة',
|
||||
lastModified: 'آخر تعديل',
|
||||
leaveAnyway: 'المغادرة على أي حال',
|
||||
leaveWithoutSaving: 'المغادرة بدون حفظ',
|
||||
light: 'فاتح',
|
||||
livePreview: 'معاينة مباشرة',
|
||||
loading: 'يتمّ التّحميل',
|
||||
locale: 'اللّغة',
|
||||
locales: 'اللّغات',
|
||||
menu: 'قائمة',
|
||||
moveDown: 'التّحريك إلى الأسفل',
|
||||
moveUp: 'التّحريك إلى الأعلى',
|
||||
newPassword: 'كلمة مرور جديدة',
|
||||
noFiltersSet: 'لم يتم تعيين أي عوامل تصفية',
|
||||
noLabel: '<لا {{label}}>',
|
||||
noOptions: 'لا خيارات',
|
||||
noResults:
|
||||
'لا يوجد {{label}}. إما أن لا {{label}} موجودة حتى الآن أو لا تتطابق مع عوامل التصفية التي حددتها أعلاه.',
|
||||
noValue: 'لا يوجد قيمة',
|
||||
none: 'لا شيء',
|
||||
notFound: 'غير موجود',
|
||||
nothingFound: 'لم يتم العثور على شيء',
|
||||
of: 'من',
|
||||
open: 'فتح',
|
||||
or: 'أو',
|
||||
order: 'التّرتيب',
|
||||
pageNotFound: 'الصّفحة غير موجودة',
|
||||
password: 'كلمة المرور',
|
||||
payloadSettings: 'الإعدادات',
|
||||
perPage: 'لكلّ صفحة: {{limit}}',
|
||||
remove: 'إزالة',
|
||||
reset: 'إعادة تعيين',
|
||||
row: 'سطر',
|
||||
rows: 'أسطُر',
|
||||
save: 'حفظ',
|
||||
saving: 'جاري الحفظ...',
|
||||
searchBy: 'البحث عن طريق {{label}}',
|
||||
selectAll: 'تحديد كل {{count}} {{label}}',
|
||||
selectAllRows: 'حدد جميع الصفوف',
|
||||
selectValue: 'اختيار قيمة',
|
||||
selectedCount: 'تم تحديد {{count}} {{label}}',
|
||||
showAllLabel: 'عرض كل {{label}}',
|
||||
sorryNotFound: 'عذرًا - لا يوجد شيء يتوافق مع طلبك.',
|
||||
sort: 'ترتيب',
|
||||
sortByLabelDirection: 'رتّب حسب {{label}} {{direction}}',
|
||||
stayOnThisPage: 'البقاء على هذه الصفحة',
|
||||
submissionSuccessful: 'تمت الإرسال بنجاح.',
|
||||
submit: 'إرسال',
|
||||
successfullyCreated: '{{label}} تم إنشاؤها بنجاح.',
|
||||
successfullyDuplicated: '{{label}} تم استنساخها بنجاح.',
|
||||
thisLanguage: 'العربية',
|
||||
titleDeleted: 'تم حذف {{label}} "{{title}}" بنجاح.',
|
||||
unauthorized: 'غير مصرح به',
|
||||
unsavedChangesDuplicate: 'لديك تغييرات لم يتم حفظها. هل تريد الاستمرار في الاستنساخ؟',
|
||||
untitled: 'بدون عنوان',
|
||||
updatedAt: 'تم التحديث في',
|
||||
updatedCountSuccessfully: 'تم تحديث {{count}} {{label}} بنجاح.',
|
||||
updatedSuccessfully: 'تم التحديث بنجاح.',
|
||||
updating: 'جار التحديث',
|
||||
uploading: 'جار الرفع',
|
||||
user: 'المستخدم',
|
||||
users: 'المستخدمين',
|
||||
value: 'القيمة',
|
||||
welcome: 'مرحبًا',
|
||||
},
|
||||
operators: {
|
||||
contains: 'يحتوي',
|
||||
equals: 'يساوي',
|
||||
exists: 'موجود',
|
||||
isGreaterThan: 'أكبر من',
|
||||
isGreaterThanOrEqualTo: 'أكبر أو يساوي',
|
||||
isIn: 'موجود في',
|
||||
isLessThan: 'أصغر من',
|
||||
isLessThanOrEqualTo: 'أصغر أو يساوي',
|
||||
isLike: 'هو مثل',
|
||||
isNotEqualTo: 'لا يساوي',
|
||||
isNotIn: 'غير موجود في',
|
||||
near: 'قريب من',
|
||||
},
|
||||
upload: {
|
||||
crop: 'محصول',
|
||||
cropToolDescription: 'اسحب الزوايا المحددة للمنطقة، رسم منطقة جديدة أو قم بضبط القيم أدناه.',
|
||||
dragAndDrop: 'قم بسحب وإسقاط ملفّ',
|
||||
dragAndDropHere: 'أو اسحب الملفّ وأفلته هنا',
|
||||
editImage: 'تعديل الصورة',
|
||||
fileName: 'اسم الملفّ',
|
||||
fileSize: 'حجم الملفّ',
|
||||
focalPoint: 'نقطة التركيز',
|
||||
focalPointDescription: 'اسحب النقطة المركزية مباشرة على المعاينة أو قم بضبط القيم أدناه.',
|
||||
height: 'الطّول',
|
||||
lessInfo: 'معلومات أقلّ',
|
||||
moreInfo: 'معلومات أكثر',
|
||||
previewSizes: 'أحجام المعاينة',
|
||||
selectCollectionToBrowse: 'حدّد مجموعة لاستعراضها',
|
||||
selectFile: 'اختر ملفّ',
|
||||
setCropArea: 'حدد منطقة القص',
|
||||
setFocalPoint: 'حدد النقطة البؤرية',
|
||||
sizes: 'الاحجام',
|
||||
sizesFor: 'أحجام لـ {{label}}',
|
||||
width: 'العرض',
|
||||
},
|
||||
validation: {
|
||||
emailAddress: 'يرجى إدخال عنوان بريد إلكتروني صحيح.',
|
||||
enterNumber: 'يرجى إدخال رقم صحيح.',
|
||||
fieldHasNo: 'هذا الحقل ليس لديه {{label}}',
|
||||
greaterThanMax: '{{value}} أكبر من الحد الأقصى المسموح به {{label}} الذي يبلغ {{max}}.',
|
||||
invalidInput: 'هذا الحقل لديه إدخال غير صالح.',
|
||||
invalidSelection: 'هذا الحقل لديه اختيار غير صالح.',
|
||||
invalidSelections: 'هذا الحقل لديه الاختيارات الغير صالحة التالية:',
|
||||
lessThanMin: '{{value}} أقل من الحد الأدنى المسموح به {{label}} الذي يبلغ {{min}}.',
|
||||
limitReached: 'تم الوصول إلى الحد الأقصى، يمكن إضافة {{max}} عناصر فقط.',
|
||||
longerThanMin: 'يجب أن يكون هذا القيمة أطول من الحد الأدنى للطول الذي هو {{minLength}} أحرف.',
|
||||
notValidDate: '"{{value}}" ليس تاريخا صالحا.',
|
||||
required: 'هذا الحقل مطلوب.',
|
||||
requiresAtLeast: 'هذا الحقل يتطلب على الأقل {{count}} {{label}}.',
|
||||
requiresNoMoreThan: 'هذا الحقل يتطلب عدم تجاوز {{count}} {{label}}.',
|
||||
requiresTwoNumbers: 'هذا الحقل يتطلب رقمين.',
|
||||
shorterThanMax: 'يجب أن تكون هذه القيمة أقصر من الحد الأقصى للطول الذي هو {{maxLength}} أحرف.',
|
||||
trueOrFalse: 'يمكن أن يكون هذا الحقل مساويًا فقط للقيمتين صحيح أو خطأ.',
|
||||
validUploadID: 'هذا الحقل ليس معرّف تحميل صالح.',
|
||||
},
|
||||
version: {
|
||||
aboutToPublishSelection: 'أنت على وشك نشر كلّ {{label}} في التّحديد. هل أنت متأكّد؟',
|
||||
aboutToRestore:
|
||||
'أنت على وشك استرجاع هذا المستند {{label}} إلى الحالة التّي كان عليها في {{versionDate}}.',
|
||||
aboutToRestoreGlobal:
|
||||
'أنت على وشك استرجاع الاعداد العامّ {{label}} إلى الحالة التي كان عليها في {{versionDate}}.',
|
||||
aboutToRevertToPublished: 'أنت على وشك إعادة هذا المستند إلى حالته المنشورة. هل أنت متأكّد؟',
|
||||
aboutToUnpublish: 'أنت على وشك إلغاء نشر هذا المستند. هل أنت متأكّد؟',
|
||||
aboutToUnpublishSelection: 'أنت على وشك إلغاء نشر كلّ {{label}} في التّحديد. هل أنت متأكّد؟',
|
||||
autosave: 'حفظ تلقائي',
|
||||
autosavedSuccessfully: 'تمّ الحفظ التّلقائي بنجاح.',
|
||||
autosavedVersion: 'النّسخة المحفوظة تلقائياً',
|
||||
changed: 'تمّ التّغيير',
|
||||
compareVersion: 'مقارنة النّسخة مع:',
|
||||
confirmPublish: 'تأكيد النّشر',
|
||||
confirmRevertToSaved: 'تأكيد الرّجوع للنسخة المنشورة',
|
||||
confirmUnpublish: 'تأكيد إلغاء النّشر',
|
||||
confirmVersionRestoration: 'تأكيد إستعادة النّسخة',
|
||||
currentDocumentStatus: 'المستند {{docStatus}} الحالي',
|
||||
draft: 'مسودّة',
|
||||
draftSavedSuccessfully: 'تمّ حفظ المسودّة بنجاح.',
|
||||
lastSavedAgo: 'تم الحفظ آخر مرة قبل {{distance}}',
|
||||
noFurtherVersionsFound: 'لم يتمّ العثور على نسخات أخرى',
|
||||
noRowsFound: 'لم يتمّ العثور على {{label}}',
|
||||
preview: 'معاينة',
|
||||
problemRestoringVersion: 'حدث خطأ في استعادة هذه النّسخة',
|
||||
publish: 'نشر',
|
||||
publishChanges: 'نشر التّغييرات',
|
||||
published: 'تمّ النّشر',
|
||||
publishing: 'نشر',
|
||||
restoreThisVersion: 'استعادة هذه النّسخة',
|
||||
restoredSuccessfully: 'تمّت الاستعادة بنحاح.',
|
||||
restoring: 'تتمّ الاستعادة...',
|
||||
revertToPublished: 'الرّجوع للنسخة المنشورة',
|
||||
reverting: 'يتمّ الاسترجاع...',
|
||||
saveDraft: 'حفظ المسودّة',
|
||||
selectLocales: 'حدّد اللّغات المراد عرضها',
|
||||
selectVersionToCompare: 'حدّد نسخة للمقارنة',
|
||||
showLocales: 'اظهر اللّغات:',
|
||||
showingVersionsFor: 'يتمّ عرض النًّسخ ل:',
|
||||
status: 'الحالة',
|
||||
type: 'النّوع',
|
||||
unpublish: 'الغاء النّشر',
|
||||
unpublishing: 'يتمّ الغاء النّشر...',
|
||||
version: 'النّسخة',
|
||||
versionCount_many: 'تمّ العثور على {{count}} نُسخ',
|
||||
versionCount_none: 'لم يتمّ العثور على أيّ من النّسخ',
|
||||
versionCount_one: 'تمّ العثور على {{count}} من النّسخ',
|
||||
versionCount_other: 'تمّ العثور على {{count}} نُسخ',
|
||||
versionCreatedOn: 'تمّ ﻹنشاء النّسخة في {{version}}:',
|
||||
versionID: 'مُعرّف النّسخة',
|
||||
versions: 'النُّسَخ',
|
||||
viewingVersion: 'يتمّ استعراض نسخة ل {{entityLabel}} {{documentTitle}}',
|
||||
viewingVersionGlobal: 'يتمّ استعراض نسخة للاعداد العامّ {{entityLabel}}',
|
||||
viewingVersions: 'يتمّ استعراض النُّسَخ ل {{entityLabel}} {{documentTitle}}',
|
||||
viewingVersionsGlobal: 'يتمّ استعراض النُّسَخ للاعداد العامّ {{entityLabel}}',
|
||||
export const ar = {
|
||||
dateFNSKey: 'ar',
|
||||
translations: {
|
||||
authentication: {
|
||||
account: 'الحساب',
|
||||
accountOfCurrentUser: 'حساب المستخدم الحالي',
|
||||
alreadyActivated: 'تمّ التّفعيل بالفعل',
|
||||
alreadyLoggedIn: 'تمّ تسجيل الدّخول بالفعل',
|
||||
apiKey: 'مفتاح API',
|
||||
backToLogin: 'العودة لتسجيل الدخول',
|
||||
beginCreateFirstUser: 'للبدء, قم بإنشاء المستخدم الأوّل.',
|
||||
changePassword: 'تغيير كلمة المرور',
|
||||
checkYourEmailForPasswordReset:
|
||||
'تحقّق من بريدك الإلكتروني بحثًا عن رابط يسمح لك بإعادة تعيين كلمة المرور الخاصّة بك بشكل آمن.',
|
||||
confirmGeneration: 'تأكيد التّوليد',
|
||||
confirmPassword: 'تأكيد كلمة المرور',
|
||||
createFirstUser: 'إنشاء المستخدم الأوّل',
|
||||
emailNotValid: 'البريد الإلكتروني غير صالح',
|
||||
emailSent: 'تمّ ارسال البريد الإلكتروني',
|
||||
enableAPIKey: 'تفعيل مفتاح API',
|
||||
failedToUnlock: 'فشل فتح القفل',
|
||||
forceUnlock: 'إجبار فتح القفل',
|
||||
forgotPassword: 'نسيت كلمة المرور',
|
||||
forgotPasswordEmailInstructions:
|
||||
'يرجى إدخال البريد الالكتروني أدناه. ستتلقّى رسالة بريد إلكتروني تحتوي على إرشادات حول كيفيّة إعادة تعيين كلمة المرور الخاصّة بك.',
|
||||
forgotPasswordQuestion: 'هل نسيت كلمة المرور؟',
|
||||
generate: 'توليد',
|
||||
generateNewAPIKey: 'توليد مفتاح API جديد',
|
||||
generatingNewAPIKeyWillInvalidate:
|
||||
'سيؤدّي إنشاء مفتاح API جديد إلى <1> إبطال </ 1> المفتاح السّابق. هل أنت متأكّد أنّك تريد المتابعة؟',
|
||||
lockUntil: 'قفل حتى',
|
||||
logBackIn: 'تسجيل الدّخول من جديد',
|
||||
logOut: 'تسجيل الخروج',
|
||||
loggedIn: 'لتسجيل الدّخول مع مستخدم آخر ، يجب عليك <0> تسجيل الخروج </0> أوّلاً.',
|
||||
loggedInChangePassword:
|
||||
'لتغيير كلمة المرور الخاصّة بك ، انتقل إلى <0>حسابك</0> وقم بتعديل كلمة المرور هناك.',
|
||||
loggedOutInactivity: 'لقد تمّ تسجيل الخروج بسبب عدم النّشاط.',
|
||||
loggedOutSuccessfully: 'لقد تمّ تسجيل خروجك بنجاح.',
|
||||
login: 'تسجيل الدخول',
|
||||
loginAttempts: 'محاولات تسجيل الدخول',
|
||||
loginUser: 'تسجيل دخول المستخدم',
|
||||
loginWithAnotherUser: 'لتسجيل الدخول مع مستخدم آخر ، يجب عليك <0> تسجيل الخروج </0> أوّلاً.',
|
||||
logout: 'تسجيل الخروج',
|
||||
logoutUser: 'تسجيل خروج المستخدم',
|
||||
newAPIKeyGenerated: 'تمّ توليد مفتاح API جديد.',
|
||||
newAccountCreated:
|
||||
'تمّ إنشاء حساب جديد لتتمكّن من الوصول إلى <a href="{{serverURL}}"> {{serverURL}} </a> الرّجاء النّقر فوق الرّابط التّالي أو لصق عنوان URL أدناه في متصفّحّك لتأكيد بريدك الإلكتروني : <a href="{{verificationURL}}"> {{verificationURL}} </a> <br> بعد التّحقّق من بريدك الإلكتروني ، ستتمكّن من تسجيل الدّخول بنجاح.',
|
||||
newPassword: 'كلمة مرور جديدة',
|
||||
resetPassword: 'إعادة تعيين كلمة المرور',
|
||||
resetPasswordExpiration: 'انتهاء صلاحيّة إعادة تعيين كلمة المرور',
|
||||
resetPasswordToken: 'رمز إعادة تعيين كلمة المرور',
|
||||
resetYourPassword: 'إعادة تعيين كلمة المرور الخاصّة بك',
|
||||
stayLoggedIn: 'ابق متّصلًا',
|
||||
successfullyUnlocked: 'تمّ فتح القفل بنجاح',
|
||||
unableToVerify: 'غير قادر على التحقق من',
|
||||
verified: 'تمّ التحقّق',
|
||||
verifiedSuccessfully: 'تمّ التحقّق بنجاح',
|
||||
verify: 'قم بالتّحقّق',
|
||||
verifyUser: 'قم بالتّحقّق من المستخدم',
|
||||
verifyYourEmail: 'قم بتأكيد بريدك الألكتروني',
|
||||
youAreInactive:
|
||||
'لم تكن نشطًا منذ فترة قصيرة وسيتمّ تسجيل خروجك قريبًا تلقائيًا من أجل أمنك. هل ترغب في البقاء مسجّلا؟',
|
||||
youAreReceivingResetPassword:
|
||||
'أنت تتلقّى هذا البريد الالكتروني لأنّك (أو لأنّ شخص آخر) طلبت إعادة تعيين كلمة المرور لحسابك. الرّجاء النّقر فوق الرّابط التّالي ، أو لصق هذا الرّابط في متصفّحك لإكمال العمليّة:',
|
||||
youDidNotRequestPassword:
|
||||
'إن لم تطلب هذا ، يرجى تجاهل هذا البريد الإلكتروني وستبقى كلمة مرورك ذاتها بدون تغيير.',
|
||||
},
|
||||
error: {
|
||||
accountAlreadyActivated: 'تم تفعيل هذا الحساب بالفعل.',
|
||||
autosaving: 'حدثت مشكلة أثناء حفظ هذا المستند تلقائيًا.',
|
||||
correctInvalidFields: 'يرجى تصحيح الحقول غير الصالحة.',
|
||||
deletingFile: 'حدث خطأ أثناء حذف الملف.',
|
||||
deletingTitle:
|
||||
'حدث خطأ أثناء حذف {{title}}. يرجى التحقق من الاتصال الخاص بك والمحاولة مرة أخرى.',
|
||||
emailOrPasswordIncorrect: 'البريد الإلكتروني أو كلمة المرور المقدمة غير صحيحة.',
|
||||
followingFieldsInvalid_one: 'الحقل التالي غير صالح:',
|
||||
followingFieldsInvalid_other: 'الحقول التالية غير صالحة:',
|
||||
incorrectCollection: 'مجموعة غير صحيحة',
|
||||
invalidFileType: 'نوع ملف غير صالح',
|
||||
invalidFileTypeValue: 'نوع ملف غير صالح: {{value}}',
|
||||
loadingDocument: 'حدثت مشكلة أثناء تحميل المستند برقم التعريف {{id}}.',
|
||||
missingEmail: 'البريد الإلكتروني مفقود.',
|
||||
missingIDOfDocument: 'معرّف المستند المراد تحديثه مفقود.',
|
||||
missingIDOfVersion: 'معرّف النسخة مفقود.',
|
||||
missingRequiredData: 'توجد بيانات مطلوبة مفقودة.',
|
||||
noFilesUploaded: 'لم يتمّ رفع أيّة ملفّات.',
|
||||
noMatchedField: 'لم يتمّ العثور على حقل مطابق لـ "{{label}}"',
|
||||
noUser: 'لا يوجد مستخدم',
|
||||
notAllowedToAccessPage: 'لا يسمح لك الوصول إلى هذه الصّفحة.',
|
||||
notAllowedToPerformAction: 'لا يسمح لك القيام بهذه العمليّة.',
|
||||
notFound: 'لم يتمّ العثور على المورد المطلوب.',
|
||||
previewing: 'حدث خطأ في اثناء معاينة هذا المستند.',
|
||||
problemUploadingFile: 'حدث خطأ اثناء رفع الملفّ.',
|
||||
tokenInvalidOrExpired: 'الرّمز إمّا غير صالح أو منتهي الصّلاحيّة.',
|
||||
unPublishingDocument: 'حدث خطأ أثناء إلغاء نشر هذا المستند.',
|
||||
unableToDeleteCount: 'يتعذّر حذف {{count}} من {{total}} {{label}}.',
|
||||
unableToUpdateCount: 'يتعذّر تحديث {{count}} من {{total}} {{label}}.',
|
||||
unauthorized: 'غير مصرّح لك ، عليك أن تقوم بتسجيل الدّخول لتتمكّن من تقديم هذا الطّلب.',
|
||||
unknown: 'حدث خطأ غير معروف.',
|
||||
unspecific: 'حدث خطأ.',
|
||||
userLocked: 'تمّ قفل هذا المستخدم نظرًا لوجود عدد كبير من محاولات تسجيل الدّخول الغير ناجحة.',
|
||||
valueMustBeUnique: 'على القيمة أن تكون فريدة',
|
||||
verificationTokenInvalid: 'رمز التحقّق غير صالح.',
|
||||
},
|
||||
fields: {
|
||||
addLabel: 'أضف {{label}}',
|
||||
addLink: 'أضف رابط',
|
||||
addNew: 'أضف جديد',
|
||||
addNewLabel: 'أضف {{label}} جديد',
|
||||
addRelationship: 'أضف علاقة',
|
||||
addUpload: 'أضف تحميل',
|
||||
block: 'وحدة محتوى',
|
||||
blockType: 'نوع وحدة المحتوى',
|
||||
blocks: 'وحدات المحتوى',
|
||||
chooseBetweenCustomTextOrDocument:
|
||||
'اختر بين إدخال عنوان URL نصّي مخصّص أو الرّبط بمستند آخر.',
|
||||
chooseDocumentToLink: 'اختر مستندًا للربط',
|
||||
chooseFromExisting: 'اختر من القائمة',
|
||||
chooseLabel: 'اختر {{label}}',
|
||||
collapseAll: 'طيّ الكلّ',
|
||||
customURL: 'URL مخصّص',
|
||||
editLabelData: 'عدّل بيانات {{label}}',
|
||||
editLink: 'عدّل الرّابط',
|
||||
editRelationship: 'عدّل العلاقة',
|
||||
enterURL: 'ادخل عنوان URL',
|
||||
internalLink: 'رابط داخلي',
|
||||
itemsAndMore: '{{items}} و {{count}} أخرى',
|
||||
labelRelationship: '{{label}} علاقة',
|
||||
latitude: 'خطّ العرض',
|
||||
linkType: 'نوع الرّابط',
|
||||
linkedTo: 'تمّ الرّبط ل <0>{{label}}</0>',
|
||||
longitude: 'خطّ الطّول',
|
||||
newLabel: '{{label}} جديد',
|
||||
openInNewTab: 'الفتح في علامة تبويب جديدة',
|
||||
passwordsDoNotMatch: 'كلمة المرور غير مطابقة.',
|
||||
relatedDocument: 'مستند مربوط',
|
||||
relationTo: 'ربط ل',
|
||||
removeRelationship: 'حذف العلاقة',
|
||||
removeUpload: 'حذف المحتوى المرفوع',
|
||||
saveChanges: 'حفظ التّغييرات',
|
||||
searchForBlock: 'ابحث عن وحدة محتوى',
|
||||
selectExistingLabel: 'اختيار {{label}} من القائمة',
|
||||
selectFieldsToEdit: 'حدّد الحقول اللتي تريد تعديلها',
|
||||
showAll: 'إظهار الكلّ',
|
||||
swapRelationship: 'تبديل العلاقة',
|
||||
swapUpload: 'تبديل المحتوى المرفوع',
|
||||
textToDisplay: 'النصّ الذي تريد إظهاره',
|
||||
toggleBlock: 'Toggle block',
|
||||
uploadNewLabel: 'رفع {{label}} جديد',
|
||||
},
|
||||
general: {
|
||||
aboutToDelete: 'أنت على وشك حذف {{label}} <1>{{title}}</1>. هل أنت متأكّد؟',
|
||||
aboutToDeleteCount_many: 'أنت على وشك حذف {{count}} {{label}}',
|
||||
aboutToDeleteCount_one: 'أنت على وشك حذف {{count}} {{label}}',
|
||||
aboutToDeleteCount_other: 'أنت على وشك حذف {{count}} {{label}}',
|
||||
addBelow: 'أضف في الاسفل',
|
||||
addFilter: 'أضف فلتر',
|
||||
adminTheme: 'شكل واجهة المستخدم',
|
||||
and: 'و',
|
||||
applyChanges: 'طبق التغييرات',
|
||||
ascending: 'تصاعدي',
|
||||
automatic: 'تلقائي',
|
||||
backToDashboard: 'العودة للوحة التّحكّم',
|
||||
cancel: 'إلغاء',
|
||||
changesNotSaved: 'لم يتمّ حفظ التّغييرات. إن غادرت الآن ، ستفقد تغييراتك.',
|
||||
close: 'إغلاق',
|
||||
collapse: 'طيّ',
|
||||
collections: 'المجموعات',
|
||||
columnToSort: 'التّرتيب حسب العامود',
|
||||
columns: 'الأعمدة',
|
||||
confirm: 'تأكيد',
|
||||
confirmDeletion: 'تأكيد الحذف',
|
||||
confirmDuplication: 'تأكيد التّكرار',
|
||||
copied: 'تمّ النّسخ',
|
||||
copy: 'نسخ',
|
||||
create: 'إنشاء',
|
||||
createNew: 'أنشاء جديد',
|
||||
createNewLabel: 'إنشاء {{label}} جديد',
|
||||
created: 'تمّ الإنشاء',
|
||||
createdAt: 'تمّ الإنشاء في',
|
||||
creating: 'يتمّ الإنشاء',
|
||||
creatingNewLabel: 'جاري إنشاء {{label}} جديد',
|
||||
dark: 'غامق',
|
||||
dashboard: 'لوحة التّحكّم',
|
||||
delete: 'حذف',
|
||||
deletedCountSuccessfully: 'تمّ حذف {{count}} {{label}} بنجاح.',
|
||||
deletedSuccessfully: 'تمّ الحذف بنجاح.',
|
||||
deleting: 'يتمّ الحذف...',
|
||||
descending: 'تنازلي',
|
||||
deselectAllRows: 'إلغاء تحديد جميع الصفوف',
|
||||
duplicate: 'استنساخ',
|
||||
duplicateWithoutSaving: 'استنساخ بدون حفظ التغييرات',
|
||||
edit: 'تعديل',
|
||||
editLabel: 'تعديل {{label}}',
|
||||
editing: 'جاري التعديل',
|
||||
editingLabel_many: 'تعديل {{count}} {{label}}',
|
||||
editingLabel_one: 'تعديل {{count}} {{label}}',
|
||||
editingLabel_other: 'تعديل {{count}} {{label}}',
|
||||
email: 'البريد الإلكتروني',
|
||||
emailAddress: 'عنوان البريد الإلكتروني',
|
||||
enterAValue: 'أدخل قيمة',
|
||||
error: 'خطأ',
|
||||
errors: 'أخطاء',
|
||||
fallbackToDefaultLocale: 'الرجوع إلى اللغة الافتراضية',
|
||||
filter: 'تصفية',
|
||||
filterWhere: 'تصفية {{label}} حيث',
|
||||
filters: 'عوامل التصفية',
|
||||
globals: 'عامة',
|
||||
language: 'اللغة',
|
||||
lastModified: 'آخر تعديل',
|
||||
leaveAnyway: 'المغادرة على أي حال',
|
||||
leaveWithoutSaving: 'المغادرة بدون حفظ',
|
||||
light: 'فاتح',
|
||||
livePreview: 'معاينة مباشرة',
|
||||
loading: 'يتمّ التّحميل',
|
||||
locale: 'اللّغة',
|
||||
locales: 'اللّغات',
|
||||
menu: 'قائمة',
|
||||
moveDown: 'التّحريك إلى الأسفل',
|
||||
moveUp: 'التّحريك إلى الأعلى',
|
||||
newPassword: 'كلمة مرور جديدة',
|
||||
noFiltersSet: 'لم يتم تعيين أي عوامل تصفية',
|
||||
noLabel: '<لا {{label}}>',
|
||||
noOptions: 'لا خيارات',
|
||||
noResults:
|
||||
'لا يوجد {{label}}. إما أن لا {{label}} موجودة حتى الآن أو لا تتطابق مع عوامل التصفية التي حددتها أعلاه.',
|
||||
noValue: 'لا يوجد قيمة',
|
||||
none: 'لا شيء',
|
||||
notFound: 'غير موجود',
|
||||
nothingFound: 'لم يتم العثور على شيء',
|
||||
of: 'من',
|
||||
open: 'فتح',
|
||||
or: 'أو',
|
||||
order: 'التّرتيب',
|
||||
pageNotFound: 'الصّفحة غير موجودة',
|
||||
password: 'كلمة المرور',
|
||||
payloadSettings: 'الإعدادات',
|
||||
perPage: 'لكلّ صفحة: {{limit}}',
|
||||
remove: 'إزالة',
|
||||
reset: 'إعادة تعيين',
|
||||
row: 'سطر',
|
||||
rows: 'أسطُر',
|
||||
save: 'حفظ',
|
||||
saving: 'جاري الحفظ...',
|
||||
searchBy: 'البحث عن طريق {{label}}',
|
||||
selectAll: 'تحديد كل {{count}} {{label}}',
|
||||
selectAllRows: 'حدد جميع الصفوف',
|
||||
selectValue: 'اختيار قيمة',
|
||||
selectedCount: 'تم تحديد {{count}} {{label}}',
|
||||
showAllLabel: 'عرض كل {{label}}',
|
||||
sorryNotFound: 'عذرًا - لا يوجد شيء يتوافق مع طلبك.',
|
||||
sort: 'ترتيب',
|
||||
sortByLabelDirection: 'رتّب حسب {{label}} {{direction}}',
|
||||
stayOnThisPage: 'البقاء على هذه الصفحة',
|
||||
submissionSuccessful: 'تمت الإرسال بنجاح.',
|
||||
submit: 'إرسال',
|
||||
successfullyCreated: '{{label}} تم إنشاؤها بنجاح.',
|
||||
successfullyDuplicated: '{{label}} تم استنساخها بنجاح.',
|
||||
thisLanguage: 'العربية',
|
||||
titleDeleted: 'تم حذف {{label}} "{{title}}" بنجاح.',
|
||||
unauthorized: 'غير مصرح به',
|
||||
unsavedChangesDuplicate: 'لديك تغييرات لم يتم حفظها. هل تريد الاستمرار في الاستنساخ؟',
|
||||
untitled: 'بدون عنوان',
|
||||
updatedAt: 'تم التحديث في',
|
||||
updatedCountSuccessfully: 'تم تحديث {{count}} {{label}} بنجاح.',
|
||||
updatedSuccessfully: 'تم التحديث بنجاح.',
|
||||
updating: 'جار التحديث',
|
||||
uploading: 'جار الرفع',
|
||||
user: 'المستخدم',
|
||||
users: 'المستخدمين',
|
||||
value: 'القيمة',
|
||||
welcome: 'مرحبًا',
|
||||
},
|
||||
operators: {
|
||||
contains: 'يحتوي',
|
||||
equals: 'يساوي',
|
||||
exists: 'موجود',
|
||||
isGreaterThan: 'أكبر من',
|
||||
isGreaterThanOrEqualTo: 'أكبر أو يساوي',
|
||||
isIn: 'موجود في',
|
||||
isLessThan: 'أصغر من',
|
||||
isLessThanOrEqualTo: 'أصغر أو يساوي',
|
||||
isLike: 'هو مثل',
|
||||
isNotEqualTo: 'لا يساوي',
|
||||
isNotIn: 'غير موجود في',
|
||||
near: 'قريب من',
|
||||
},
|
||||
upload: {
|
||||
crop: 'محصول',
|
||||
cropToolDescription: 'اسحب الزوايا المحددة للمنطقة، رسم منطقة جديدة أو قم بضبط القيم أدناه.',
|
||||
dragAndDrop: 'قم بسحب وإسقاط ملفّ',
|
||||
dragAndDropHere: 'أو اسحب الملفّ وأفلته هنا',
|
||||
editImage: 'تعديل الصورة',
|
||||
fileName: 'اسم الملفّ',
|
||||
fileSize: 'حجم الملفّ',
|
||||
focalPoint: 'نقطة التركيز',
|
||||
focalPointDescription: 'اسحب النقطة المركزية مباشرة على المعاينة أو قم بضبط القيم أدناه.',
|
||||
height: 'الطّول',
|
||||
lessInfo: 'معلومات أقلّ',
|
||||
moreInfo: 'معلومات أكثر',
|
||||
previewSizes: 'أحجام المعاينة',
|
||||
selectCollectionToBrowse: 'حدّد مجموعة لاستعراضها',
|
||||
selectFile: 'اختر ملفّ',
|
||||
setCropArea: 'حدد منطقة القص',
|
||||
setFocalPoint: 'حدد النقطة البؤرية',
|
||||
sizes: 'الاحجام',
|
||||
sizesFor: 'أحجام لـ {{label}}',
|
||||
width: 'العرض',
|
||||
},
|
||||
validation: {
|
||||
emailAddress: 'يرجى إدخال عنوان بريد إلكتروني صحيح.',
|
||||
enterNumber: 'يرجى إدخال رقم صحيح.',
|
||||
fieldHasNo: 'هذا الحقل ليس لديه {{label}}',
|
||||
greaterThanMax: '{{value}} أكبر من الحد الأقصى المسموح به {{label}} الذي يبلغ {{max}}.',
|
||||
invalidInput: 'هذا الحقل لديه إدخال غير صالح.',
|
||||
invalidSelection: 'هذا الحقل لديه اختيار غير صالح.',
|
||||
invalidSelections: 'هذا الحقل لديه الاختيارات الغير صالحة التالية:',
|
||||
lessThanMin: '{{value}} أقل من الحد الأدنى المسموح به {{label}} الذي يبلغ {{min}}.',
|
||||
limitReached: 'تم الوصول إلى الحد الأقصى، يمكن إضافة {{max}} عناصر فقط.',
|
||||
longerThanMin: 'يجب أن يكون هذا القيمة أطول من الحد الأدنى للطول الذي هو {{minLength}} أحرف.',
|
||||
notValidDate: '"{{value}}" ليس تاريخا صالحا.',
|
||||
required: 'هذا الحقل مطلوب.',
|
||||
requiresAtLeast: 'هذا الحقل يتطلب على الأقل {{count}} {{label}}.',
|
||||
requiresNoMoreThan: 'هذا الحقل يتطلب عدم تجاوز {{count}} {{label}}.',
|
||||
requiresTwoNumbers: 'هذا الحقل يتطلب رقمين.',
|
||||
shorterThanMax:
|
||||
'يجب أن تكون هذه القيمة أقصر من الحد الأقصى للطول الذي هو {{maxLength}} أحرف.',
|
||||
trueOrFalse: 'يمكن أن يكون هذا الحقل مساويًا فقط للقيمتين صحيح أو خطأ.',
|
||||
validUploadID: 'هذا الحقل ليس معرّف تحميل صالح.',
|
||||
},
|
||||
version: {
|
||||
type: 'النّوع',
|
||||
aboutToPublishSelection: 'أنت على وشك نشر كلّ {{label}} في التّحديد. هل أنت متأكّد؟',
|
||||
aboutToRestore:
|
||||
'أنت على وشك استرجاع هذا المستند {{label}} إلى الحالة التّي كان عليها في {{versionDate}}.',
|
||||
aboutToRestoreGlobal:
|
||||
'أنت على وشك استرجاع الاعداد العامّ {{label}} إلى الحالة التي كان عليها في {{versionDate}}.',
|
||||
aboutToRevertToPublished: 'أنت على وشك إعادة هذا المستند إلى حالته المنشورة. هل أنت متأكّد؟',
|
||||
aboutToUnpublish: 'أنت على وشك إلغاء نشر هذا المستند. هل أنت متأكّد؟',
|
||||
aboutToUnpublishSelection: 'أنت على وشك إلغاء نشر كلّ {{label}} في التّحديد. هل أنت متأكّد؟',
|
||||
autosave: 'حفظ تلقائي',
|
||||
autosavedSuccessfully: 'تمّ الحفظ التّلقائي بنجاح.',
|
||||
autosavedVersion: 'النّسخة المحفوظة تلقائياً',
|
||||
changed: 'تمّ التّغيير',
|
||||
compareVersion: 'مقارنة النّسخة مع:',
|
||||
confirmPublish: 'تأكيد النّشر',
|
||||
confirmRevertToSaved: 'تأكيد الرّجوع للنسخة المنشورة',
|
||||
confirmUnpublish: 'تأكيد إلغاء النّشر',
|
||||
confirmVersionRestoration: 'تأكيد إستعادة النّسخة',
|
||||
currentDocumentStatus: 'المستند {{docStatus}} الحالي',
|
||||
draft: 'مسودّة',
|
||||
draftSavedSuccessfully: 'تمّ حفظ المسودّة بنجاح.',
|
||||
lastSavedAgo: 'تم الحفظ آخر مرة قبل {{distance}}',
|
||||
noFurtherVersionsFound: 'لم يتمّ العثور على نسخات أخرى',
|
||||
noRowsFound: 'لم يتمّ العثور على {{label}}',
|
||||
preview: 'معاينة',
|
||||
problemRestoringVersion: 'حدث خطأ في استعادة هذه النّسخة',
|
||||
publish: 'نشر',
|
||||
publishChanges: 'نشر التّغييرات',
|
||||
published: 'تمّ النّشر',
|
||||
publishing: 'نشر',
|
||||
restoreThisVersion: 'استعادة هذه النّسخة',
|
||||
restoredSuccessfully: 'تمّت الاستعادة بنحاح.',
|
||||
restoring: 'تتمّ الاستعادة...',
|
||||
revertToPublished: 'الرّجوع للنسخة المنشورة',
|
||||
reverting: 'يتمّ الاسترجاع...',
|
||||
saveDraft: 'حفظ المسودّة',
|
||||
selectLocales: 'حدّد اللّغات المراد عرضها',
|
||||
selectVersionToCompare: 'حدّد نسخة للمقارنة',
|
||||
showLocales: 'اظهر اللّغات:',
|
||||
showingVersionsFor: 'يتمّ عرض النًّسخ ل:',
|
||||
status: 'الحالة',
|
||||
unpublish: 'الغاء النّشر',
|
||||
unpublishing: 'يتمّ الغاء النّشر...',
|
||||
version: 'النّسخة',
|
||||
versionCount_many: 'تمّ العثور على {{count}} نُسخ',
|
||||
versionCount_none: 'لم يتمّ العثور على أيّ من النّسخ',
|
||||
versionCount_one: 'تمّ العثور على {{count}} من النّسخ',
|
||||
versionCount_other: 'تمّ العثور على {{count}} نُسخ',
|
||||
versionCreatedOn: 'تمّ ﻹنشاء النّسخة في {{version}}:',
|
||||
versionID: 'مُعرّف النّسخة',
|
||||
versions: 'النُّسَخ',
|
||||
viewingVersion: 'يتمّ استعراض نسخة ل {{entityLabel}} {{documentTitle}}',
|
||||
viewingVersionGlobal: 'يتمّ استعراض نسخة للاعداد العامّ {{entityLabel}}',
|
||||
viewingVersions: 'يتمّ استعراض النُّسَخ ل {{entityLabel}} {{documentTitle}}',
|
||||
viewingVersionsGlobal: 'يتمّ استعراض النُّسَخ للاعداد العامّ {{entityLabel}}',
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
@@ -1,394 +1,398 @@
|
||||
export default {
|
||||
authentication: {
|
||||
account: 'Konto',
|
||||
accountOfCurrentUser: 'Aktuelles Benutzerkonto',
|
||||
alreadyActivated: 'Bereits aktiviert',
|
||||
alreadyLoggedIn: 'Bereits angemeldet',
|
||||
apiKey: 'API-Key',
|
||||
backToLogin: 'Zurück zur Anmeldung',
|
||||
beginCreateFirstUser: 'Erstelle deinen ersten Benutzer um zu beginnen',
|
||||
changePassword: 'Passwort ändern',
|
||||
checkYourEmailForPasswordReset:
|
||||
'Du solltest eine E-Mail mit einem Link zum sicheren Zurücksetzen deines Passworts erhalten haben.',
|
||||
confirmGeneration: 'Generierung bestätigen',
|
||||
confirmPassword: 'Passwort bestätigen',
|
||||
createFirstUser: 'Ersten Benutzer erstellen',
|
||||
emailNotValid: 'Die angegebene E-Mail-Adresse ist ungültig',
|
||||
emailSent: 'E-Mail verschickt',
|
||||
enableAPIKey: 'API-Key aktivieren',
|
||||
failedToUnlock: 'Konnte nicht entsperren',
|
||||
forceUnlock: 'Entsperrung erzwingen',
|
||||
forgotPassword: 'Passwort vergessen',
|
||||
forgotPasswordEmailInstructions:
|
||||
'Bitte gib deine E-Mail-Adresse an. Du wirst eine E-Mail mit Instruktionen zum Zurücksetzen deines Passworts erhalten.',
|
||||
forgotPasswordQuestion: 'Passwort vergessen?',
|
||||
generate: 'Generieren',
|
||||
generateNewAPIKey: 'Neuen API-Key generieren',
|
||||
generatingNewAPIKeyWillInvalidate:
|
||||
'Die Generierung eines neuen API-Keys wird den vorherigen Key <1>ungültig</1> machen. Bist du sicher, dass du fortfahren möchtest?',
|
||||
lockUntil: 'Sperre bis',
|
||||
logBackIn: 'Wieder anmelden',
|
||||
logOut: 'Abmelden',
|
||||
loggedIn:
|
||||
'Um dich mit einem anderen Benutzer anzumelden, musst du dich zuerst <0>abmelden</0>.',
|
||||
loggedInChangePassword:
|
||||
'Um dein Passwort zu ändern, gehe in dein <0>Konto</0> und ändere dort dein Passwort.',
|
||||
loggedOutInactivity: 'Du wurdest aufgrund von Inaktivität abgemeldet.',
|
||||
loggedOutSuccessfully: 'Du wurdest erfolgreich abgemeldet.',
|
||||
login: 'Anmelden',
|
||||
loginAttempts: 'Anmelde-Versuche',
|
||||
loginUser: 'Benutzeranmeldung',
|
||||
loginWithAnotherUser:
|
||||
'Um dich mit einem anderen Benutzer anzumelden, musst du dich zuerst <0>abmelden</0>.',
|
||||
logout: 'Abmelden',
|
||||
logoutUser: 'Benutzerabmeldung',
|
||||
newAPIKeyGenerated: 'Neuer API-Key wurde generiert',
|
||||
newAccountCreated:
|
||||
'Ein neues Konto wurde gerade für dich auf <a href="{{serverURL}}">{{serverURL}}</a> erstellt. Bitte klicke auf den folgenden Link oder kopiere die URL in deinen Browser um deine E-Mail-Adresse zu verifizieren: <a href="{{verificationURL}}">{{verificationURL}}</a><br> Nachdem du deine E-Mail-Adresse verifiziert hast, kannst du dich erfolgreich anmelden.',
|
||||
newPassword: 'Neues Passwort',
|
||||
resetPassword: 'Passwort zurücksetzen',
|
||||
resetPasswordExpiration: 'Passwort-Ablauf zurücksetzen',
|
||||
resetPasswordToken: 'Passwort-Token zurücksetzen',
|
||||
resetYourPassword: 'Dein Passwort zurücksetzen',
|
||||
stayLoggedIn: 'Angemeldet bleiben',
|
||||
successfullyUnlocked: 'Erfolgreich entsperrt',
|
||||
unableToVerify: 'Konnte nicht verifiziert werden',
|
||||
verified: 'Verifiziert',
|
||||
verifiedSuccessfully: 'Erfolgreich verifiziert',
|
||||
verify: 'Verifizieren',
|
||||
verifyUser: 'Benutzer verifizieren',
|
||||
verifyYourEmail: 'Deine E-Mail-Adresse verifizieren',
|
||||
youAreInactive:
|
||||
'Du warst seit einiger Zeit inaktiv und wirst in kurzer Zeit zu deiner eigenen Sicherheit abgemeldet. Möchtest du angemeldet bleiben?',
|
||||
youAreReceivingResetPassword:
|
||||
'Du erhältst diese Nachricht, weil du (oder jemand anderes) das Zurücksetzen deines Passworts für dein Benutzerkonto angefordert hat. Bitte klicke auf den folgenden Link, oder kopiere die URL in deinen Browser den Prozess abzuschließen:',
|
||||
youDidNotRequestPassword:
|
||||
'Solltest du dies nicht angefordert haben, ignoriere diese E-Mail und dein Passwort bleibt unverändert.',
|
||||
},
|
||||
error: {
|
||||
accountAlreadyActivated: 'Dieses Konto wurde bereits aktiviert',
|
||||
autosaving: 'Es gab ein Problem während der automatischen Speicherung für dieses Dokument',
|
||||
correctInvalidFields: 'Bitte ungültige Felder korrigieren.',
|
||||
deletingFile: 'Beim Löschen der Datei ist ein Fehler aufgetreten.',
|
||||
deletingTitle:
|
||||
'Es gab ein Problem während der Löschung von {{title}}. Bitte überprüfe deine Verbindung und versuche es erneut.',
|
||||
emailOrPasswordIncorrect: 'Die E-Mail-Adresse oder das Passwort sind nicht korrekt.',
|
||||
followingFieldsInvalid_one: 'Das folgende Feld ist nicht korrekt:',
|
||||
followingFieldsInvalid_other: 'Die folgenden Felder sind nicht korrekt:',
|
||||
incorrectCollection: 'Falsche Sammlung',
|
||||
invalidFileType: 'Ungültiger Datei-Typ',
|
||||
invalidFileTypeValue: 'Ungültiger Datei-Typ: {{value}}',
|
||||
loadingDocument: 'Es gab ein Problem, das Dokument mit der ID {{id}} zu laden.',
|
||||
missingEmail: 'E-Mail-Adresse fehlt.',
|
||||
missingIDOfDocument: 'ID des zu speichernden Dokuments fehlt.',
|
||||
missingIDOfVersion: 'ID der Version fehlt.',
|
||||
missingRequiredData: 'Erforderliche Daten fehlen.',
|
||||
noFilesUploaded: 'Es wurden keine Dateien hochgeladen.',
|
||||
noMatchedField: 'Kein übereinstimmendes Feld für "{{label}}" gefunden',
|
||||
noUser: 'Kein Benutzer',
|
||||
notAllowedToAccessPage: 'Du hast keine Berechtigung, auf diese Seite zuzugreifen.',
|
||||
notAllowedToPerformAction: 'Du hast keine Berechtigung, diese Aktion auszuführen.',
|
||||
notFound: 'Die angeforderte Ressource wurde nicht gefunden.',
|
||||
previewing: 'Es gab ein Problem beim Vorschauen dieses Dokuments.',
|
||||
problemUploadingFile: 'Es gab ein Problem während des Hochladens der Datei.',
|
||||
tokenInvalidOrExpired: 'Token ist entweder ungültig oder abgelaufen.',
|
||||
unPublishingDocument: 'Es gab ein Problem, dieses Dokument auf Entwurf zu setzen.',
|
||||
unableToDeleteCount: '{{count}} von {{total}} {{label}} konnte nicht gelöscht werden.',
|
||||
unableToUpdateCount: '{{count}} von {{total}} {{label}} konnte nicht aktualisiert werden.',
|
||||
unauthorized: 'Nicht autorisiert - du musst angemeldet sein, um diese Anfrage zu stellen.',
|
||||
unknown: 'Ein unbekannter Fehler ist aufgetreten.',
|
||||
unspecific: 'Ein Fehler ist aufgetreten.',
|
||||
userLocked:
|
||||
'Dieser Benutzer ist auf Grund zu vieler unerfolgreicher Anmelde-Versuche gesperrt.',
|
||||
valueMustBeUnique: 'Wert muss einzigartig sein',
|
||||
verificationTokenInvalid: 'Verifizierungs-Token ist nicht korrekt.',
|
||||
},
|
||||
fields: {
|
||||
addLabel: '{{label}} hinzufügen',
|
||||
addLink: 'Link Hinzufügen',
|
||||
addNew: 'Neu erstellen',
|
||||
addNewLabel: '{{label}} erstellen',
|
||||
addRelationship: 'Verknüpfung Hinzufügen',
|
||||
addUpload: 'Hochladen Hinzufügen',
|
||||
block: 'Block',
|
||||
blockType: 'Block-Typ',
|
||||
blocks: 'Blöcke',
|
||||
chooseBetweenCustomTextOrDocument:
|
||||
'Wähle zwischen einer eigenen Text-URL oder verlinke zu einem anderen Dokument.',
|
||||
chooseDocumentToLink: 'Wähle ein Dokument zum Verlinken',
|
||||
chooseFromExisting: 'Aus vorhandenen auswählen',
|
||||
chooseLabel: '{{label}} auswählen',
|
||||
collapseAll: 'Alle einklappen',
|
||||
customURL: 'Eigene URL',
|
||||
editLabelData: '{{label}} bearbeiten',
|
||||
editLink: 'Bearbeite Link',
|
||||
editRelationship: 'Beziehung Hinzufügen',
|
||||
enterURL: 'URL eingeben',
|
||||
internalLink: 'Interner Link',
|
||||
itemsAndMore: '{{items}} und {{count}} mehr',
|
||||
labelRelationship: '{{label}} Verknüpfung',
|
||||
latitude: 'Breitengrad',
|
||||
linkType: 'Linktyp',
|
||||
linkedTo: 'Verweist auf <0>{{label}}</0>',
|
||||
longitude: 'Längengrad',
|
||||
newLabel: '{{label}} erstellen',
|
||||
openInNewTab: 'Öffne im neuen Tab',
|
||||
passwordsDoNotMatch: 'Passwörter stimmen nicht überein.',
|
||||
relatedDocument: 'Verknüpftes Dokument',
|
||||
relationTo: 'Verknüpfung zu',
|
||||
removeRelationship: 'Beziehung Entfernen',
|
||||
removeUpload: 'Hochgeladene Datei Löschen',
|
||||
saveChanges: 'Änderungen speichern',
|
||||
searchForBlock: 'Nach Block suchen',
|
||||
selectExistingLabel: '{{label}} auswählen (vorhandene)',
|
||||
selectFieldsToEdit: 'Wählen Sie die zu bearbeitenden Felder aus',
|
||||
showAll: 'Alle anzeigen',
|
||||
swapRelationship: 'Beziehung Tauschen',
|
||||
swapUpload: 'Datei Austauschen',
|
||||
textToDisplay: 'Angezeigter Text',
|
||||
toggleBlock: 'Block umschalten',
|
||||
uploadNewLabel: '{{label}} neu hochladen',
|
||||
},
|
||||
general: {
|
||||
aboutToDelete: 'Du bist dabei {{label}} <1>{{title}}</1> zu löschen. Bist du dir sicher?',
|
||||
aboutToDeleteCount_many: 'Sie sind dabei, {{count}} {{label}} zu löschen',
|
||||
aboutToDeleteCount_one: 'Sie sind dabei, {{count}} {{label}} zu löschen',
|
||||
aboutToDeleteCount_other: 'Sie sind dabei, {{count}} {{label}} zu löschen',
|
||||
addBelow: 'Darunter hinzufügen',
|
||||
addFilter: 'Filter hinzufügen',
|
||||
adminTheme: 'Admin-Farbthema',
|
||||
and: 'Und',
|
||||
applyChanges: 'Änderungen anwenden',
|
||||
ascending: 'Aufsteigend',
|
||||
automatic: 'Automatisch',
|
||||
backToDashboard: 'Zurück zur Übersicht',
|
||||
cancel: 'Abbrechen',
|
||||
changesNotSaved:
|
||||
'Deine Änderungen wurden nicht gespeichert. Wenn du diese Seite verlässt, gehen deine Änderungen verloren.',
|
||||
close: 'Schließen',
|
||||
collapse: 'Einklappen',
|
||||
collections: 'Sammlungen',
|
||||
columnToSort: 'Spalten zum Sortieren',
|
||||
columns: 'Spalten',
|
||||
confirm: 'Bestätigen',
|
||||
confirmDeletion: 'Löschen bestätigen',
|
||||
confirmDuplication: 'Duplizieren bestätigen',
|
||||
copied: 'Kopiert',
|
||||
copy: 'Kopieren',
|
||||
create: 'Erstellen',
|
||||
createNew: 'Neu Erstellen',
|
||||
createNewLabel: '{{label}} neu erstellen',
|
||||
created: 'Erstellt',
|
||||
createdAt: 'Erstellt am',
|
||||
creating: 'Erstelle',
|
||||
creatingNewLabel: 'Erstelle {{label}}',
|
||||
dark: 'Dunkel',
|
||||
dashboard: 'Übersicht',
|
||||
delete: 'Löschen',
|
||||
deletedCountSuccessfully: '{{count}} {{label}} erfolgreich gelöscht.',
|
||||
deletedSuccessfully: 'Erfolgreich gelöscht.',
|
||||
deleting: 'Lösche...',
|
||||
descending: 'Absteigend',
|
||||
deselectAllRows: 'Alle Zeilen abwählen',
|
||||
duplicate: 'Duplizieren',
|
||||
duplicateWithoutSaving: 'Dupliziere ohne Änderungen zu speichern',
|
||||
edit: 'Bearbeiten',
|
||||
editLabel: '{{label}} bearbeiten',
|
||||
editing: 'Bearbeite',
|
||||
editingLabel_many: 'Bearbeiten von {{count}} {{label}}',
|
||||
editingLabel_one: 'Bearbeiten von {{count}} {{label}}',
|
||||
editingLabel_other: 'Bearbeiten von {{count}} {{label}}',
|
||||
email: 'E-Mail',
|
||||
emailAddress: 'E-Mail-Adresse',
|
||||
enterAValue: 'Gib einen Wert ein',
|
||||
error: 'Fehler',
|
||||
errors: 'Fehler',
|
||||
fallbackToDefaultLocale: 'Rückgriff auf das Standardgebietsschema',
|
||||
filter: 'Filter',
|
||||
filterWhere: 'Filter {{label}} wo',
|
||||
filters: 'Filter',
|
||||
globals: 'Globale Dokumente',
|
||||
language: 'Sprache',
|
||||
lastModified: 'Zuletzt geändert',
|
||||
leaveAnyway: 'Trotzdem verlassen',
|
||||
leaveWithoutSaving: 'Ohne speichern verlassen',
|
||||
light: 'Hell',
|
||||
livePreview: 'Vorschau',
|
||||
loading: 'Lädt',
|
||||
locale: 'Sprachumgebung',
|
||||
locales: 'Sprachumgebungen',
|
||||
menu: 'Menü',
|
||||
moveDown: 'Nach unten bewegen',
|
||||
moveUp: 'Nach oben bewegen',
|
||||
newPassword: 'Neues Passwort',
|
||||
noFiltersSet: 'Keine Filter gesetzt',
|
||||
noLabel: '<Kein {{label}}>',
|
||||
noOptions: 'Keine Optionen',
|
||||
noResults:
|
||||
'Keine {{label}} gefunden. Entweder es existieren keine {{label}} oder es gibt keine Übereinstimmung zu den von dir verwendeten Filtern.',
|
||||
noValue: 'Kein Wert',
|
||||
none: 'Kein',
|
||||
notFound: 'Nicht gefunden',
|
||||
nothingFound: 'Keine Ergebnisse',
|
||||
of: 'von',
|
||||
open: 'Öffnen',
|
||||
or: 'oder',
|
||||
order: 'Reihenfolge',
|
||||
pageNotFound: 'Seite nicht gefunden',
|
||||
password: 'Passwort',
|
||||
payloadSettings: 'Payload Einstellungen',
|
||||
perPage: 'Pro Seite: {{limit}}',
|
||||
remove: 'Entfernen',
|
||||
reset: 'Zurücksetzen',
|
||||
row: 'Zeile',
|
||||
rows: 'Zeilen',
|
||||
save: 'Speichern',
|
||||
saving: 'Speichert...',
|
||||
searchBy: 'Suche nach {{label}}',
|
||||
selectAll: 'Alle auswählen {{count}} {{label}}',
|
||||
selectAllRows: 'Wählen Sie alle Zeilen aus',
|
||||
selectValue: 'Wert auswählen',
|
||||
selectedCount: '{{count}} {{label}} ausgewählt',
|
||||
showAllLabel: 'Zeige alle {{label}}',
|
||||
sorryNotFound: 'Entschuldige, es entspricht nichts deiner Anfrage',
|
||||
sort: 'Sortieren',
|
||||
sortByLabelDirection: 'Sortieren nach {{label}} {{direction}}',
|
||||
stayOnThisPage: 'Auf dieser Seite bleiben',
|
||||
submissionSuccessful: 'Einrichung erfolgreich.',
|
||||
submit: 'Senden',
|
||||
successfullyCreated: '{{label}} erfolgreich erstellt.',
|
||||
successfullyDuplicated: '{{label}} wurde erfolgreich dupliziert.',
|
||||
thisLanguage: 'Deutsch',
|
||||
titleDeleted: '{{label}} {{title}} wurde erfolgreich gelöscht.',
|
||||
unauthorized: 'Nicht autorisiert',
|
||||
unsavedChangesDuplicate:
|
||||
'Du hast ungespeicherte Änderungen, möchtest du mit dem Duplizieren fortfahren?',
|
||||
untitled: 'ohne Titel',
|
||||
updatedAt: 'Aktualisiert am',
|
||||
updatedCountSuccessfully: '{{count}} {{label}} erfolgreich aktualisiert.',
|
||||
updatedSuccessfully: 'Erfolgreich aktualisiert.',
|
||||
updating: 'Aktualisierung',
|
||||
uploading: 'Hochladen',
|
||||
user: 'Benutzer',
|
||||
users: 'Benutzer',
|
||||
value: 'Wert',
|
||||
welcome: 'Willkommen',
|
||||
},
|
||||
operators: {
|
||||
contains: 'enthält',
|
||||
equals: 'gleich',
|
||||
exists: 'existiert',
|
||||
isGreaterThan: 'ist größer als',
|
||||
isGreaterThanOrEqualTo: 'ist größer oder gleich',
|
||||
isIn: 'ist drin',
|
||||
isLessThan: 'ist kleiner als',
|
||||
isLessThanOrEqualTo: 'ist kleiner oder gleich',
|
||||
isLike: 'ist wie',
|
||||
isNotEqualTo: 'ist nicht gleich',
|
||||
isNotIn: 'ist nicht drin',
|
||||
near: 'in der Nähe',
|
||||
},
|
||||
upload: {
|
||||
crop: 'Zuschneiden',
|
||||
cropToolDescription:
|
||||
'Ziehen Sie die Ecken des ausgewählten Bereichs, zeichnen Sie einen neuen Bereich oder passen Sie die Werte unten an.',
|
||||
dragAndDrop: 'Ziehen Sie eine Datei per Drag-and-Drop',
|
||||
dragAndDropHere: 'oder ziehe eine Datei hier',
|
||||
editImage: 'Bild bearbeiten',
|
||||
fileName: 'Dateiname',
|
||||
fileSize: 'Dateigröße',
|
||||
focalPoint: 'Brennpunkt',
|
||||
focalPointDescription:
|
||||
'Ziehen Sie den Fokuspunkt direkt auf die Vorschau oder passen Sie die Werte unten an.',
|
||||
height: 'Höhe',
|
||||
lessInfo: 'Weniger Info',
|
||||
moreInfo: 'Mehr Info',
|
||||
previewSizes: 'Vorschaugrößen',
|
||||
selectCollectionToBrowse: 'Wähle eine Sammlung zum Durchsuchen aus',
|
||||
selectFile: 'Datei auswählen',
|
||||
setCropArea: 'Bereich zum Zuschneiden festlegen',
|
||||
setFocalPoint: 'Fokuspunkt setzen',
|
||||
sizes: 'Größen',
|
||||
sizesFor: 'Größen für {{label}}',
|
||||
width: 'Breite',
|
||||
},
|
||||
validation: {
|
||||
emailAddress: 'Bitte gib eine korrekte E-Mail-Adresse an.',
|
||||
enterNumber: 'Bitte gib eine gültige Nummer an,',
|
||||
fieldHasNo: 'Dieses Feld hat kein {{label}}',
|
||||
greaterThanMax: '{{value}} ist größer als der maximal erlaubte {{label}} von {{max}}.',
|
||||
invalidInput: 'Dieses Feld hat einen inkorrekten Wert.',
|
||||
invalidSelection: 'Dieses Feld hat eine inkorrekte Auswahl.',
|
||||
invalidSelections: "'Dieses Feld enthält die folgenden inkorrekten Auswahlen:'",
|
||||
lessThanMin: '{{value}} ist kleiner als der minimal erlaubte {{label}} von {{min}}.',
|
||||
limitReached: 'Limit erreicht, es können nur {{max}} Elemente hinzugefügt werden.',
|
||||
longerThanMin: 'Dieser Wert muss länger als die minimale Länge von {{minLength}} Zeichen sein.',
|
||||
notValidDate: '"{{value}}" ist kein gültiges Datum.',
|
||||
required: 'Pflichtfeld',
|
||||
requiresAtLeast: 'Dieses Feld muss mindestens {{count}} {{label}} enthalten.',
|
||||
requiresNoMoreThan: 'Dieses Feld kann nicht mehr als {{count}} {{label}} enthalten.',
|
||||
requiresTwoNumbers: 'Dieses Feld muss zwei Nummern enthalten.',
|
||||
shorterThanMax: 'Dieser Wert muss kürzer als die maximale Länge von {{maxLength}} sein.',
|
||||
trueOrFalse: 'Dieses Feld kann nur wahr oder falsch sein.',
|
||||
validUploadID: "'Dieses Feld enthält keine valide Upload-ID.'",
|
||||
},
|
||||
version: {
|
||||
aboutToPublishSelection:
|
||||
'Sie sind dabei, alle {{label}} in der Auswahl zu veröffentlichen. Bist du dir sicher?',
|
||||
aboutToRestore: 'Du bist dabei, {{label}} auf den Stand vom {{versionDate}} zurücksetzen.',
|
||||
aboutToRestoreGlobal:
|
||||
'Du bist dabei, das Globale Dokument {{label}} auf den Stand vom {{versionDate}} zurückzusetzen.',
|
||||
aboutToRevertToPublished:
|
||||
'Du bist dabei, dieses Dokument auf den Stand des ersten Veröffentlichungsdatums zurückzusetzen - Bist du sicher?',
|
||||
aboutToUnpublish: 'Du bist dabei dieses Dokument auf Entwurf zu setzen - bist du dir sicher?',
|
||||
aboutToUnpublishSelection:
|
||||
'Sie sind dabei, die Veröffentlichung aller {{label}} in der Auswahl aufzuheben. Bist du dir sicher?',
|
||||
autosave: 'Automatische Speicherung',
|
||||
autosavedSuccessfully: 'Erfolgreich automatisch gespeichert.',
|
||||
autosavedVersion: 'Automatisch gespeicherte Version',
|
||||
changed: 'Geändert',
|
||||
compareVersion: 'Vergleiche Version zu:',
|
||||
confirmPublish: 'Veröffentlichung bestätigen',
|
||||
confirmRevertToSaved: 'Zurücksetzen auf die letzte Speicherung bestätigen',
|
||||
confirmUnpublish: 'Setzen auf Entwurf bestätigen',
|
||||
confirmVersionRestoration: ' Wiederherstellung der Version bestätigen',
|
||||
currentDocumentStatus: 'Aktueller Dokumentenstatus: {{docStatus}}',
|
||||
draft: 'Entwurf',
|
||||
draftSavedSuccessfully: 'Entwurf erfolgreich gespeichert.',
|
||||
lastSavedAgo: 'Zuletzt vor {{distance}} gespeichert',
|
||||
noFurtherVersionsFound: 'Keine weiteren Versionen vorhanden',
|
||||
noRowsFound: 'Kein {{label}} gefunden',
|
||||
preview: 'Vorschau',
|
||||
problemRestoringVersion: 'Es gab ein Problem bei der Wiederherstellung dieser Version',
|
||||
publish: 'Veröffentlichen',
|
||||
publishChanges: 'Änderungen veröffentlichen',
|
||||
published: 'Veröffentlicht',
|
||||
publishing: 'Veröffentlichung',
|
||||
restoreThisVersion: 'Diese Version wiederherstellen',
|
||||
restoredSuccessfully: 'Erfolgreich wiederhergestellt.',
|
||||
restoring: 'wiederherstellen...',
|
||||
revertToPublished: 'Auf Veröffentlicht zurücksetzen',
|
||||
reverting: 'zurücksetzen...',
|
||||
saveDraft: 'Entwurf speichern',
|
||||
selectLocales: 'Wähle anzuzeigende Sprachumgebungen',
|
||||
selectVersionToCompare: 'Wähle Version zum Vergleich',
|
||||
showLocales: 'Sprachumgebungen anzeigen:',
|
||||
showingVersionsFor: 'Versionen anzeigen für:',
|
||||
status: 'Status',
|
||||
type: 'Typ',
|
||||
unpublish: 'Auf Entwurf setzen',
|
||||
unpublishing: 'Setze auf Entwurf...',
|
||||
version: 'Version',
|
||||
versionCount_many: '{{count}} Versionen gefunden',
|
||||
versionCount_none: 'Keine Versionen gefunden',
|
||||
versionCount_one: '{{count}} Version gefunden',
|
||||
versionCount_other: '{{count}} Versionen gefunden',
|
||||
versionCreatedOn: '{{version}} erstellt am:',
|
||||
versionID: 'Version ID',
|
||||
versions: 'Versionen',
|
||||
viewingVersion: 'Betrachte Version für {{entityLabel}} {{documentTitle}}',
|
||||
viewingVersionGlobal: '`Betrachte Version für das Globale Dokument {{entityLabel}}',
|
||||
viewingVersions: 'Betrachte Versionen für {{entityLabel}} {{documentTitle}}',
|
||||
viewingVersionsGlobal: '`Betrachte Versionen für das Globale Dokument {{entityLabel}}',
|
||||
export const de = {
|
||||
dateFNSKey: 'de',
|
||||
translations: {
|
||||
authentication: {
|
||||
account: 'Konto',
|
||||
accountOfCurrentUser: 'Aktuelles Benutzerkonto',
|
||||
alreadyActivated: 'Bereits aktiviert',
|
||||
alreadyLoggedIn: 'Bereits angemeldet',
|
||||
apiKey: 'API-Key',
|
||||
backToLogin: 'Zurück zur Anmeldung',
|
||||
beginCreateFirstUser: 'Erstelle deinen ersten Benutzer um zu beginnen',
|
||||
changePassword: 'Passwort ändern',
|
||||
checkYourEmailForPasswordReset:
|
||||
'Du solltest eine E-Mail mit einem Link zum sicheren Zurücksetzen deines Passworts erhalten haben.',
|
||||
confirmGeneration: 'Generierung bestätigen',
|
||||
confirmPassword: 'Passwort bestätigen',
|
||||
createFirstUser: 'Ersten Benutzer erstellen',
|
||||
emailNotValid: 'Die angegebene E-Mail-Adresse ist ungültig',
|
||||
emailSent: 'E-Mail verschickt',
|
||||
enableAPIKey: 'API-Key aktivieren',
|
||||
failedToUnlock: 'Konnte nicht entsperren',
|
||||
forceUnlock: 'Entsperrung erzwingen',
|
||||
forgotPassword: 'Passwort vergessen',
|
||||
forgotPasswordEmailInstructions:
|
||||
'Bitte gib deine E-Mail-Adresse an. Du wirst eine E-Mail mit Instruktionen zum Zurücksetzen deines Passworts erhalten.',
|
||||
forgotPasswordQuestion: 'Passwort vergessen?',
|
||||
generate: 'Generieren',
|
||||
generateNewAPIKey: 'Neuen API-Key generieren',
|
||||
generatingNewAPIKeyWillInvalidate:
|
||||
'Die Generierung eines neuen API-Keys wird den vorherigen Key <1>ungültig</1> machen. Bist du sicher, dass du fortfahren möchtest?',
|
||||
lockUntil: 'Sperre bis',
|
||||
logBackIn: 'Wieder anmelden',
|
||||
logOut: 'Abmelden',
|
||||
loggedIn:
|
||||
'Um dich mit einem anderen Benutzer anzumelden, musst du dich zuerst <0>abmelden</0>.',
|
||||
loggedInChangePassword:
|
||||
'Um dein Passwort zu ändern, gehe in dein <0>Konto</0> und ändere dort dein Passwort.',
|
||||
loggedOutInactivity: 'Du wurdest aufgrund von Inaktivität abgemeldet.',
|
||||
loggedOutSuccessfully: 'Du wurdest erfolgreich abgemeldet.',
|
||||
login: 'Anmelden',
|
||||
loginAttempts: 'Anmelde-Versuche',
|
||||
loginUser: 'Benutzeranmeldung',
|
||||
loginWithAnotherUser:
|
||||
'Um dich mit einem anderen Benutzer anzumelden, musst du dich zuerst <0>abmelden</0>.',
|
||||
logout: 'Abmelden',
|
||||
logoutUser: 'Benutzerabmeldung',
|
||||
newAPIKeyGenerated: 'Neuer API-Key wurde generiert',
|
||||
newAccountCreated:
|
||||
'Ein neues Konto wurde gerade für dich auf <a href="{{serverURL}}">{{serverURL}}</a> erstellt. Bitte klicke auf den folgenden Link oder kopiere die URL in deinen Browser um deine E-Mail-Adresse zu verifizieren: <a href="{{verificationURL}}">{{verificationURL}}</a><br> Nachdem du deine E-Mail-Adresse verifiziert hast, kannst du dich erfolgreich anmelden.',
|
||||
newPassword: 'Neues Passwort',
|
||||
resetPassword: 'Passwort zurücksetzen',
|
||||
resetPasswordExpiration: 'Passwort-Ablauf zurücksetzen',
|
||||
resetPasswordToken: 'Passwort-Token zurücksetzen',
|
||||
resetYourPassword: 'Dein Passwort zurücksetzen',
|
||||
stayLoggedIn: 'Angemeldet bleiben',
|
||||
successfullyUnlocked: 'Erfolgreich entsperrt',
|
||||
unableToVerify: 'Konnte nicht verifiziert werden',
|
||||
verified: 'Verifiziert',
|
||||
verifiedSuccessfully: 'Erfolgreich verifiziert',
|
||||
verify: 'Verifizieren',
|
||||
verifyUser: 'Benutzer verifizieren',
|
||||
verifyYourEmail: 'Deine E-Mail-Adresse verifizieren',
|
||||
youAreInactive:
|
||||
'Du warst seit einiger Zeit inaktiv und wirst in kurzer Zeit zu deiner eigenen Sicherheit abgemeldet. Möchtest du angemeldet bleiben?',
|
||||
youAreReceivingResetPassword:
|
||||
'Du erhältst diese Nachricht, weil du (oder jemand anderes) das Zurücksetzen deines Passworts für dein Benutzerkonto angefordert hat. Bitte klicke auf den folgenden Link, oder kopiere die URL in deinen Browser den Prozess abzuschließen:',
|
||||
youDidNotRequestPassword:
|
||||
'Solltest du dies nicht angefordert haben, ignoriere diese E-Mail und dein Passwort bleibt unverändert.',
|
||||
},
|
||||
error: {
|
||||
accountAlreadyActivated: 'Dieses Konto wurde bereits aktiviert',
|
||||
autosaving: 'Es gab ein Problem während der automatischen Speicherung für dieses Dokument',
|
||||
correctInvalidFields: 'Bitte ungültige Felder korrigieren.',
|
||||
deletingFile: 'Beim Löschen der Datei ist ein Fehler aufgetreten.',
|
||||
deletingTitle:
|
||||
'Es gab ein Problem während der Löschung von {{title}}. Bitte überprüfe deine Verbindung und versuche es erneut.',
|
||||
emailOrPasswordIncorrect: 'Die E-Mail-Adresse oder das Passwort sind nicht korrekt.',
|
||||
followingFieldsInvalid_one: 'Das folgende Feld ist nicht korrekt:',
|
||||
followingFieldsInvalid_other: 'Die folgenden Felder sind nicht korrekt:',
|
||||
incorrectCollection: 'Falsche Sammlung',
|
||||
invalidFileType: 'Ungültiger Datei-Typ',
|
||||
invalidFileTypeValue: 'Ungültiger Datei-Typ: {{value}}',
|
||||
loadingDocument: 'Es gab ein Problem, das Dokument mit der ID {{id}} zu laden.',
|
||||
missingEmail: 'E-Mail-Adresse fehlt.',
|
||||
missingIDOfDocument: 'ID des zu speichernden Dokuments fehlt.',
|
||||
missingIDOfVersion: 'ID der Version fehlt.',
|
||||
missingRequiredData: 'Erforderliche Daten fehlen.',
|
||||
noFilesUploaded: 'Es wurden keine Dateien hochgeladen.',
|
||||
noMatchedField: 'Kein übereinstimmendes Feld für "{{label}}" gefunden',
|
||||
noUser: 'Kein Benutzer',
|
||||
notAllowedToAccessPage: 'Du hast keine Berechtigung, auf diese Seite zuzugreifen.',
|
||||
notAllowedToPerformAction: 'Du hast keine Berechtigung, diese Aktion auszuführen.',
|
||||
notFound: 'Die angeforderte Ressource wurde nicht gefunden.',
|
||||
previewing: 'Es gab ein Problem beim Vorschauen dieses Dokuments.',
|
||||
problemUploadingFile: 'Es gab ein Problem während des Hochladens der Datei.',
|
||||
tokenInvalidOrExpired: 'Token ist entweder ungültig oder abgelaufen.',
|
||||
unPublishingDocument: 'Es gab ein Problem, dieses Dokument auf Entwurf zu setzen.',
|
||||
unableToDeleteCount: '{{count}} von {{total}} {{label}} konnte nicht gelöscht werden.',
|
||||
unableToUpdateCount: '{{count}} von {{total}} {{label}} konnte nicht aktualisiert werden.',
|
||||
unauthorized: 'Nicht autorisiert - du musst angemeldet sein, um diese Anfrage zu stellen.',
|
||||
unknown: 'Ein unbekannter Fehler ist aufgetreten.',
|
||||
unspecific: 'Ein Fehler ist aufgetreten.',
|
||||
userLocked:
|
||||
'Dieser Benutzer ist auf Grund zu vieler unerfolgreicher Anmelde-Versuche gesperrt.',
|
||||
valueMustBeUnique: 'Wert muss einzigartig sein',
|
||||
verificationTokenInvalid: 'Verifizierungs-Token ist nicht korrekt.',
|
||||
},
|
||||
fields: {
|
||||
addLabel: '{{label}} hinzufügen',
|
||||
addLink: 'Link Hinzufügen',
|
||||
addNew: 'Neu erstellen',
|
||||
addNewLabel: '{{label}} erstellen',
|
||||
addRelationship: 'Verknüpfung Hinzufügen',
|
||||
addUpload: 'Hochladen Hinzufügen',
|
||||
block: 'Block',
|
||||
blockType: 'Block-Typ',
|
||||
blocks: 'Blöcke',
|
||||
chooseBetweenCustomTextOrDocument:
|
||||
'Wähle zwischen einer eigenen Text-URL oder verlinke zu einem anderen Dokument.',
|
||||
chooseDocumentToLink: 'Wähle ein Dokument zum Verlinken',
|
||||
chooseFromExisting: 'Aus vorhandenen auswählen',
|
||||
chooseLabel: '{{label}} auswählen',
|
||||
collapseAll: 'Alle einklappen',
|
||||
customURL: 'Eigene URL',
|
||||
editLabelData: '{{label}} bearbeiten',
|
||||
editLink: 'Bearbeite Link',
|
||||
editRelationship: 'Beziehung Hinzufügen',
|
||||
enterURL: 'URL eingeben',
|
||||
internalLink: 'Interner Link',
|
||||
itemsAndMore: '{{items}} und {{count}} mehr',
|
||||
labelRelationship: '{{label}} Verknüpfung',
|
||||
latitude: 'Breitengrad',
|
||||
linkType: 'Linktyp',
|
||||
linkedTo: 'Verweist auf <0>{{label}}</0>',
|
||||
longitude: 'Längengrad',
|
||||
newLabel: '{{label}} erstellen',
|
||||
openInNewTab: 'Öffne im neuen Tab',
|
||||
passwordsDoNotMatch: 'Passwörter stimmen nicht überein.',
|
||||
relatedDocument: 'Verknüpftes Dokument',
|
||||
relationTo: 'Verknüpfung zu',
|
||||
removeRelationship: 'Beziehung Entfernen',
|
||||
removeUpload: 'Hochgeladene Datei Löschen',
|
||||
saveChanges: 'Änderungen speichern',
|
||||
searchForBlock: 'Nach Block suchen',
|
||||
selectExistingLabel: '{{label}} auswählen (vorhandene)',
|
||||
selectFieldsToEdit: 'Wählen Sie die zu bearbeitenden Felder aus',
|
||||
showAll: 'Alle anzeigen',
|
||||
swapRelationship: 'Beziehung Tauschen',
|
||||
swapUpload: 'Datei Austauschen',
|
||||
textToDisplay: 'Angezeigter Text',
|
||||
toggleBlock: 'Block umschalten',
|
||||
uploadNewLabel: '{{label}} neu hochladen',
|
||||
},
|
||||
general: {
|
||||
aboutToDelete: 'Du bist dabei {{label}} <1>{{title}}</1> zu löschen. Bist du dir sicher?',
|
||||
aboutToDeleteCount_many: 'Sie sind dabei, {{count}} {{label}} zu löschen',
|
||||
aboutToDeleteCount_one: 'Sie sind dabei, {{count}} {{label}} zu löschen',
|
||||
aboutToDeleteCount_other: 'Sie sind dabei, {{count}} {{label}} zu löschen',
|
||||
addBelow: 'Darunter hinzufügen',
|
||||
addFilter: 'Filter hinzufügen',
|
||||
adminTheme: 'Admin-Farbthema',
|
||||
and: 'Und',
|
||||
applyChanges: 'Änderungen anwenden',
|
||||
ascending: 'Aufsteigend',
|
||||
automatic: 'Automatisch',
|
||||
backToDashboard: 'Zurück zur Übersicht',
|
||||
cancel: 'Abbrechen',
|
||||
changesNotSaved:
|
||||
'Deine Änderungen wurden nicht gespeichert. Wenn du diese Seite verlässt, gehen deine Änderungen verloren.',
|
||||
close: 'Schließen',
|
||||
collapse: 'Einklappen',
|
||||
collections: 'Sammlungen',
|
||||
columnToSort: 'Spalten zum Sortieren',
|
||||
columns: 'Spalten',
|
||||
confirm: 'Bestätigen',
|
||||
confirmDeletion: 'Löschen bestätigen',
|
||||
confirmDuplication: 'Duplizieren bestätigen',
|
||||
copied: 'Kopiert',
|
||||
copy: 'Kopieren',
|
||||
create: 'Erstellen',
|
||||
createNew: 'Neu Erstellen',
|
||||
createNewLabel: '{{label}} neu erstellen',
|
||||
created: 'Erstellt',
|
||||
createdAt: 'Erstellt am',
|
||||
creating: 'Erstelle',
|
||||
creatingNewLabel: 'Erstelle {{label}}',
|
||||
dark: 'Dunkel',
|
||||
dashboard: 'Übersicht',
|
||||
delete: 'Löschen',
|
||||
deletedCountSuccessfully: '{{count}} {{label}} erfolgreich gelöscht.',
|
||||
deletedSuccessfully: 'Erfolgreich gelöscht.',
|
||||
deleting: 'Lösche...',
|
||||
descending: 'Absteigend',
|
||||
deselectAllRows: 'Alle Zeilen abwählen',
|
||||
duplicate: 'Duplizieren',
|
||||
duplicateWithoutSaving: 'Dupliziere ohne Änderungen zu speichern',
|
||||
edit: 'Bearbeiten',
|
||||
editLabel: '{{label}} bearbeiten',
|
||||
editing: 'Bearbeite',
|
||||
editingLabel_many: 'Bearbeiten von {{count}} {{label}}',
|
||||
editingLabel_one: 'Bearbeiten von {{count}} {{label}}',
|
||||
editingLabel_other: 'Bearbeiten von {{count}} {{label}}',
|
||||
email: 'E-Mail',
|
||||
emailAddress: 'E-Mail-Adresse',
|
||||
enterAValue: 'Gib einen Wert ein',
|
||||
error: 'Fehler',
|
||||
errors: 'Fehler',
|
||||
fallbackToDefaultLocale: 'Rückgriff auf das Standardgebietsschema',
|
||||
filter: 'Filter',
|
||||
filterWhere: 'Filter {{label}} wo',
|
||||
filters: 'Filter',
|
||||
globals: 'Globale Dokumente',
|
||||
language: 'Sprache',
|
||||
lastModified: 'Zuletzt geändert',
|
||||
leaveAnyway: 'Trotzdem verlassen',
|
||||
leaveWithoutSaving: 'Ohne speichern verlassen',
|
||||
light: 'Hell',
|
||||
livePreview: 'Vorschau',
|
||||
loading: 'Lädt',
|
||||
locale: 'Sprachumgebung',
|
||||
locales: 'Sprachumgebungen',
|
||||
menu: 'Menü',
|
||||
moveDown: 'Nach unten bewegen',
|
||||
moveUp: 'Nach oben bewegen',
|
||||
newPassword: 'Neues Passwort',
|
||||
noFiltersSet: 'Keine Filter gesetzt',
|
||||
noLabel: '<Kein {{label}}>',
|
||||
noOptions: 'Keine Optionen',
|
||||
noResults:
|
||||
'Keine {{label}} gefunden. Entweder es existieren keine {{label}} oder es gibt keine Übereinstimmung zu den von dir verwendeten Filtern.',
|
||||
noValue: 'Kein Wert',
|
||||
none: 'Kein',
|
||||
notFound: 'Nicht gefunden',
|
||||
nothingFound: 'Keine Ergebnisse',
|
||||
of: 'von',
|
||||
open: 'Öffnen',
|
||||
or: 'oder',
|
||||
order: 'Reihenfolge',
|
||||
pageNotFound: 'Seite nicht gefunden',
|
||||
password: 'Passwort',
|
||||
payloadSettings: 'Payload Einstellungen',
|
||||
perPage: 'Pro Seite: {{limit}}',
|
||||
remove: 'Entfernen',
|
||||
reset: 'Zurücksetzen',
|
||||
row: 'Zeile',
|
||||
rows: 'Zeilen',
|
||||
save: 'Speichern',
|
||||
saving: 'Speichert...',
|
||||
searchBy: 'Suche nach {{label}}',
|
||||
selectAll: 'Alle auswählen {{count}} {{label}}',
|
||||
selectAllRows: 'Wählen Sie alle Zeilen aus',
|
||||
selectValue: 'Wert auswählen',
|
||||
selectedCount: '{{count}} {{label}} ausgewählt',
|
||||
showAllLabel: 'Zeige alle {{label}}',
|
||||
sorryNotFound: 'Entschuldige, es entspricht nichts deiner Anfrage',
|
||||
sort: 'Sortieren',
|
||||
sortByLabelDirection: 'Sortieren nach {{label}} {{direction}}',
|
||||
stayOnThisPage: 'Auf dieser Seite bleiben',
|
||||
submissionSuccessful: 'Einrichung erfolgreich.',
|
||||
submit: 'Senden',
|
||||
successfullyCreated: '{{label}} erfolgreich erstellt.',
|
||||
successfullyDuplicated: '{{label}} wurde erfolgreich dupliziert.',
|
||||
thisLanguage: 'Deutsch',
|
||||
titleDeleted: '{{label}} {{title}} wurde erfolgreich gelöscht.',
|
||||
unauthorized: 'Nicht autorisiert',
|
||||
unsavedChangesDuplicate:
|
||||
'Du hast ungespeicherte Änderungen, möchtest du mit dem Duplizieren fortfahren?',
|
||||
untitled: 'ohne Titel',
|
||||
updatedAt: 'Aktualisiert am',
|
||||
updatedCountSuccessfully: '{{count}} {{label}} erfolgreich aktualisiert.',
|
||||
updatedSuccessfully: 'Erfolgreich aktualisiert.',
|
||||
updating: 'Aktualisierung',
|
||||
uploading: 'Hochladen',
|
||||
user: 'Benutzer',
|
||||
users: 'Benutzer',
|
||||
value: 'Wert',
|
||||
welcome: 'Willkommen',
|
||||
},
|
||||
operators: {
|
||||
contains: 'enthält',
|
||||
equals: 'gleich',
|
||||
exists: 'existiert',
|
||||
isGreaterThan: 'ist größer als',
|
||||
isGreaterThanOrEqualTo: 'ist größer oder gleich',
|
||||
isIn: 'ist drin',
|
||||
isLessThan: 'ist kleiner als',
|
||||
isLessThanOrEqualTo: 'ist kleiner oder gleich',
|
||||
isLike: 'ist wie',
|
||||
isNotEqualTo: 'ist nicht gleich',
|
||||
isNotIn: 'ist nicht drin',
|
||||
near: 'in der Nähe',
|
||||
},
|
||||
upload: {
|
||||
crop: 'Zuschneiden',
|
||||
cropToolDescription:
|
||||
'Ziehen Sie die Ecken des ausgewählten Bereichs, zeichnen Sie einen neuen Bereich oder passen Sie die Werte unten an.',
|
||||
dragAndDrop: 'Ziehen Sie eine Datei per Drag-and-Drop',
|
||||
dragAndDropHere: 'oder ziehe eine Datei hier',
|
||||
editImage: 'Bild bearbeiten',
|
||||
fileName: 'Dateiname',
|
||||
fileSize: 'Dateigröße',
|
||||
focalPoint: 'Brennpunkt',
|
||||
focalPointDescription:
|
||||
'Ziehen Sie den Fokuspunkt direkt auf die Vorschau oder passen Sie die Werte unten an.',
|
||||
height: 'Höhe',
|
||||
lessInfo: 'Weniger Info',
|
||||
moreInfo: 'Mehr Info',
|
||||
previewSizes: 'Vorschaugrößen',
|
||||
selectCollectionToBrowse: 'Wähle eine Sammlung zum Durchsuchen aus',
|
||||
selectFile: 'Datei auswählen',
|
||||
setCropArea: 'Bereich zum Zuschneiden festlegen',
|
||||
setFocalPoint: 'Fokuspunkt setzen',
|
||||
sizes: 'Größen',
|
||||
sizesFor: 'Größen für {{label}}',
|
||||
width: 'Breite',
|
||||
},
|
||||
validation: {
|
||||
emailAddress: 'Bitte gib eine korrekte E-Mail-Adresse an.',
|
||||
enterNumber: 'Bitte gib eine gültige Nummer an,',
|
||||
fieldHasNo: 'Dieses Feld hat kein {{label}}',
|
||||
greaterThanMax: '{{value}} ist größer als der maximal erlaubte {{label}} von {{max}}.',
|
||||
invalidInput: 'Dieses Feld hat einen inkorrekten Wert.',
|
||||
invalidSelection: 'Dieses Feld hat eine inkorrekte Auswahl.',
|
||||
invalidSelections: "'Dieses Feld enthält die folgenden inkorrekten Auswahlen:'",
|
||||
lessThanMin: '{{value}} ist kleiner als der minimal erlaubte {{label}} von {{min}}.',
|
||||
limitReached: 'Limit erreicht, es können nur {{max}} Elemente hinzugefügt werden.',
|
||||
longerThanMin:
|
||||
'Dieser Wert muss länger als die minimale Länge von {{minLength}} Zeichen sein.',
|
||||
notValidDate: '"{{value}}" ist kein gültiges Datum.',
|
||||
required: 'Pflichtfeld',
|
||||
requiresAtLeast: 'Dieses Feld muss mindestens {{count}} {{label}} enthalten.',
|
||||
requiresNoMoreThan: 'Dieses Feld kann nicht mehr als {{count}} {{label}} enthalten.',
|
||||
requiresTwoNumbers: 'Dieses Feld muss zwei Nummern enthalten.',
|
||||
shorterThanMax: 'Dieser Wert muss kürzer als die maximale Länge von {{maxLength}} sein.',
|
||||
trueOrFalse: 'Dieses Feld kann nur wahr oder falsch sein.',
|
||||
validUploadID: "'Dieses Feld enthält keine valide Upload-ID.'",
|
||||
},
|
||||
version: {
|
||||
type: 'Typ',
|
||||
aboutToPublishSelection:
|
||||
'Sie sind dabei, alle {{label}} in der Auswahl zu veröffentlichen. Bist du dir sicher?',
|
||||
aboutToRestore: 'Du bist dabei, {{label}} auf den Stand vom {{versionDate}} zurücksetzen.',
|
||||
aboutToRestoreGlobal:
|
||||
'Du bist dabei, das Globale Dokument {{label}} auf den Stand vom {{versionDate}} zurückzusetzen.',
|
||||
aboutToRevertToPublished:
|
||||
'Du bist dabei, dieses Dokument auf den Stand des ersten Veröffentlichungsdatums zurückzusetzen - Bist du sicher?',
|
||||
aboutToUnpublish: 'Du bist dabei dieses Dokument auf Entwurf zu setzen - bist du dir sicher?',
|
||||
aboutToUnpublishSelection:
|
||||
'Sie sind dabei, die Veröffentlichung aller {{label}} in der Auswahl aufzuheben. Bist du dir sicher?',
|
||||
autosave: 'Automatische Speicherung',
|
||||
autosavedSuccessfully: 'Erfolgreich automatisch gespeichert.',
|
||||
autosavedVersion: 'Automatisch gespeicherte Version',
|
||||
changed: 'Geändert',
|
||||
compareVersion: 'Vergleiche Version zu:',
|
||||
confirmPublish: 'Veröffentlichung bestätigen',
|
||||
confirmRevertToSaved: 'Zurücksetzen auf die letzte Speicherung bestätigen',
|
||||
confirmUnpublish: 'Setzen auf Entwurf bestätigen',
|
||||
confirmVersionRestoration: ' Wiederherstellung der Version bestätigen',
|
||||
currentDocumentStatus: 'Aktueller Dokumentenstatus: {{docStatus}}',
|
||||
draft: 'Entwurf',
|
||||
draftSavedSuccessfully: 'Entwurf erfolgreich gespeichert.',
|
||||
lastSavedAgo: 'Zuletzt vor {{distance}} gespeichert',
|
||||
noFurtherVersionsFound: 'Keine weiteren Versionen vorhanden',
|
||||
noRowsFound: 'Kein {{label}} gefunden',
|
||||
preview: 'Vorschau',
|
||||
problemRestoringVersion: 'Es gab ein Problem bei der Wiederherstellung dieser Version',
|
||||
publish: 'Veröffentlichen',
|
||||
publishChanges: 'Änderungen veröffentlichen',
|
||||
published: 'Veröffentlicht',
|
||||
publishing: 'Veröffentlichung',
|
||||
restoreThisVersion: 'Diese Version wiederherstellen',
|
||||
restoredSuccessfully: 'Erfolgreich wiederhergestellt.',
|
||||
restoring: 'wiederherstellen...',
|
||||
revertToPublished: 'Auf Veröffentlicht zurücksetzen',
|
||||
reverting: 'zurücksetzen...',
|
||||
saveDraft: 'Entwurf speichern',
|
||||
selectLocales: 'Wähle anzuzeigende Sprachumgebungen',
|
||||
selectVersionToCompare: 'Wähle Version zum Vergleich',
|
||||
showLocales: 'Sprachumgebungen anzeigen:',
|
||||
showingVersionsFor: 'Versionen anzeigen für:',
|
||||
status: 'Status',
|
||||
unpublish: 'Auf Entwurf setzen',
|
||||
unpublishing: 'Setze auf Entwurf...',
|
||||
version: 'Version',
|
||||
versionCount_many: '{{count}} Versionen gefunden',
|
||||
versionCount_none: 'Keine Versionen gefunden',
|
||||
versionCount_one: '{{count}} Version gefunden',
|
||||
versionCount_other: '{{count}} Versionen gefunden',
|
||||
versionCreatedOn: '{{version}} erstellt am:',
|
||||
versionID: 'Version ID',
|
||||
versions: 'Versionen',
|
||||
viewingVersion: 'Betrachte Version für {{entityLabel}} {{documentTitle}}',
|
||||
viewingVersionGlobal: '`Betrachte Version für das Globale Dokument {{entityLabel}}',
|
||||
viewingVersions: 'Betrachte Versionen für {{entityLabel}} {{documentTitle}}',
|
||||
viewingVersionsGlobal: '`Betrachte Versionen für das Globale Dokument {{entityLabel}}',
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
@@ -1,391 +1,395 @@
|
||||
export default {
|
||||
authentication: {
|
||||
account: 'Account',
|
||||
accountOfCurrentUser: 'Account of current user',
|
||||
alreadyActivated: 'Already Activated',
|
||||
alreadyLoggedIn: 'Already logged in',
|
||||
apiKey: 'API Key',
|
||||
backToLogin: 'Back to login',
|
||||
beginCreateFirstUser: 'To begin, create your first user.',
|
||||
changePassword: 'Change Password',
|
||||
checkYourEmailForPasswordReset:
|
||||
'Check your email for a link that will allow you to securely reset your password.',
|
||||
confirmGeneration: 'Confirm Generation',
|
||||
confirmPassword: 'Confirm Password',
|
||||
createFirstUser: 'Create first user',
|
||||
emailNotValid: 'The email provided is not valid',
|
||||
emailSent: 'Email Sent',
|
||||
enableAPIKey: 'Enable API Key',
|
||||
failedToUnlock: 'Failed to unlock',
|
||||
forceUnlock: 'Force Unlock',
|
||||
forgotPassword: 'Forgot Password',
|
||||
forgotPasswordEmailInstructions:
|
||||
'Please enter your email below. You will receive an email message with instructions on how to reset your password.',
|
||||
forgotPasswordQuestion: 'Forgot password?',
|
||||
generate: 'Generate',
|
||||
generateNewAPIKey: 'Generate new API key',
|
||||
generatingNewAPIKeyWillInvalidate:
|
||||
'Generating a new API key will <1>invalidate</1> the previous key. Are you sure you wish to continue?',
|
||||
lockUntil: 'Lock Until',
|
||||
logBackIn: 'Log back in',
|
||||
logOut: 'Log out',
|
||||
loggedIn: 'To log in with another user, you should <0>log out</0> first.',
|
||||
loggedInChangePassword:
|
||||
'To change your password, go to your <0>account</0> and edit your password there.',
|
||||
loggedOutInactivity: 'You have been logged out due to inactivity.',
|
||||
loggedOutSuccessfully: 'You have been logged out successfully.',
|
||||
login: 'Login',
|
||||
loginAttempts: 'Login Attempts',
|
||||
loginUser: 'Login user',
|
||||
loginWithAnotherUser: 'To log in with another user, you should <0>log out</0> first.',
|
||||
logout: 'Logout',
|
||||
logoutUser: 'Logout user',
|
||||
newAPIKeyGenerated: 'New API Key Generated.',
|
||||
newAccountCreated:
|
||||
'A new account has just been created for you to access <a href="{{serverURL}}">{{serverURL}}</a> Please click on the following link or paste the URL below into your browser to verify your email: <a href="{{verificationURL}}">{{verificationURL}}</a><br> After verifying your email, you will be able to log in successfully.',
|
||||
newPassword: 'New Password',
|
||||
resetPassword: 'Reset Password',
|
||||
resetPasswordExpiration: 'Reset Password Expiration',
|
||||
resetPasswordToken: 'Reset Password Token',
|
||||
resetYourPassword: 'Reset Your Password',
|
||||
stayLoggedIn: 'Stay logged in',
|
||||
successfullyUnlocked: 'Successfully unlocked',
|
||||
unableToVerify: 'Unable to Verify',
|
||||
verified: 'Verified',
|
||||
verifiedSuccessfully: 'Verified Successfully',
|
||||
verify: 'Verify',
|
||||
verifyUser: 'Verify User',
|
||||
verifyYourEmail: 'Verify your email',
|
||||
youAreInactive:
|
||||
"You haven't been active in a little while and will shortly be automatically logged out for your own security. Would you like to stay logged in?",
|
||||
youAreReceivingResetPassword:
|
||||
'You are receiving this because you (or someone else) have requested the reset of the password for your account. Please click on the following link, or paste this into your browser to complete the process:',
|
||||
youDidNotRequestPassword:
|
||||
'If you did not request this, please ignore this email and your password will remain unchanged.',
|
||||
},
|
||||
error: {
|
||||
accountAlreadyActivated: 'This account has already been activated.',
|
||||
autosaving: 'There was a problem while autosaving this document.',
|
||||
correctInvalidFields: 'Please correct invalid fields.',
|
||||
deletingFile: 'There was an error deleting file.',
|
||||
deletingTitle:
|
||||
'There was an error while deleting {{title}}. Please check your connection and try again.',
|
||||
emailOrPasswordIncorrect: 'The email or password provided is incorrect.',
|
||||
followingFieldsInvalid_one: 'The following field is invalid:',
|
||||
followingFieldsInvalid_other: 'The following fields are invalid:',
|
||||
incorrectCollection: 'Incorrect Collection',
|
||||
invalidFileType: 'Invalid file type',
|
||||
invalidFileTypeValue: 'Invalid file type: {{value}}',
|
||||
loadingDocument: 'There was a problem loading the document with ID of {{id}}.',
|
||||
missingEmail: 'Missing email.',
|
||||
missingIDOfDocument: 'Missing ID of document to update.',
|
||||
missingIDOfVersion: 'Missing ID of version.',
|
||||
missingRequiredData: 'Missing required data.',
|
||||
noFilesUploaded: 'No files were uploaded.',
|
||||
noMatchedField: 'No matched field found for "{{label}}"',
|
||||
noUser: 'No User',
|
||||
notAllowedToAccessPage: 'You are not allowed to access this page.',
|
||||
notAllowedToPerformAction: 'You are not allowed to perform this action.',
|
||||
notFound: 'The requested resource was not found.',
|
||||
previewing: 'There was a problem previewing this document.',
|
||||
problemUploadingFile: 'There was a problem while uploading the file.',
|
||||
tokenInvalidOrExpired: 'Token is either invalid or has expired.',
|
||||
unPublishingDocument: 'There was a problem while un-publishing this document.',
|
||||
unableToDeleteCount: 'Unable to delete {{count}} out of {{total}} {{label}}.',
|
||||
unableToUpdateCount: 'Unable to update {{count}} out of {{total}} {{label}}.',
|
||||
unauthorized: 'Unauthorized, you must be logged in to make this request.',
|
||||
unknown: 'An unknown error has occurred.',
|
||||
unspecific: 'An error has occurred.',
|
||||
userLocked: 'This user is locked due to having too many failed login attempts.',
|
||||
valueMustBeUnique: 'Value must be unique',
|
||||
verificationTokenInvalid: 'Verification token is invalid.',
|
||||
},
|
||||
fields: {
|
||||
addLabel: 'Add {{label}}',
|
||||
addLink: 'Add Link',
|
||||
addNew: 'Add new',
|
||||
addNewLabel: 'Add new {{label}}',
|
||||
addRelationship: 'Add Relationship',
|
||||
addUpload: 'Add Upload',
|
||||
block: 'block',
|
||||
blockType: 'Block Type',
|
||||
blocks: 'blocks',
|
||||
chooseBetweenCustomTextOrDocument:
|
||||
'Choose between entering a custom text URL or linking to another document.',
|
||||
chooseDocumentToLink: 'Choose a document to link to',
|
||||
chooseFromExisting: 'Choose from existing',
|
||||
chooseLabel: 'Choose {{label}}',
|
||||
collapseAll: 'Collapse All',
|
||||
customURL: 'Custom URL',
|
||||
editLabelData: 'Edit {{label}} data',
|
||||
editLink: 'Edit Link',
|
||||
editRelationship: 'Edit Relationship',
|
||||
enterURL: 'Enter a URL',
|
||||
internalLink: 'Internal Link',
|
||||
itemsAndMore: '{{items}} and {{count}} more',
|
||||
labelRelationship: '{{label}} Relationship',
|
||||
latitude: 'Latitude',
|
||||
linkType: 'Link Type',
|
||||
linkedTo: 'Linked to <0>{{label}}</0>',
|
||||
longitude: 'Longitude',
|
||||
newLabel: 'New {{label}}',
|
||||
openInNewTab: 'Open in new tab',
|
||||
passwordsDoNotMatch: 'Passwords do not match.',
|
||||
relatedDocument: 'Related Document',
|
||||
relationTo: 'Relation To',
|
||||
removeRelationship: 'Remove Relationship',
|
||||
removeUpload: 'Remove Upload',
|
||||
saveChanges: 'Save changes',
|
||||
searchForBlock: 'Search for a block',
|
||||
selectExistingLabel: 'Select existing {{label}}',
|
||||
selectFieldsToEdit: 'Select fields to edit',
|
||||
showAll: 'Show All',
|
||||
swapRelationship: 'Swap Relationship',
|
||||
swapUpload: 'Swap Upload',
|
||||
textToDisplay: 'Text to display',
|
||||
toggleBlock: 'Toggle block',
|
||||
uploadNewLabel: 'Upload new {{label}}',
|
||||
},
|
||||
general: {
|
||||
aboutToDelete: 'You are about to delete the {{label}} <1>{{title}}</1>. Are you sure?',
|
||||
aboutToDeleteCount_many: 'You are about to delete {{count}} {{label}}',
|
||||
aboutToDeleteCount_one: 'You are about to delete {{count}} {{label}}',
|
||||
aboutToDeleteCount_other: 'You are about to delete {{count}} {{label}}',
|
||||
addBelow: 'Add Below',
|
||||
addFilter: 'Add Filter',
|
||||
adminTheme: 'Admin Theme',
|
||||
and: 'And',
|
||||
applyChanges: 'Apply Changes',
|
||||
ascending: 'Ascending',
|
||||
automatic: 'Automatic',
|
||||
backToDashboard: 'Back to Dashboard',
|
||||
cancel: 'Cancel',
|
||||
changesNotSaved:
|
||||
'Your changes have not been saved. If you leave now, you will lose your changes.',
|
||||
close: 'Close',
|
||||
collapse: 'Collapse',
|
||||
collections: 'Collections',
|
||||
columnToSort: 'Column to Sort',
|
||||
columns: 'Columns',
|
||||
confirm: 'Confirm',
|
||||
confirmDeletion: 'Confirm deletion',
|
||||
confirmDuplication: 'Confirm duplication',
|
||||
copied: 'Copied',
|
||||
copy: 'Copy',
|
||||
create: 'Create',
|
||||
createNew: 'Create New',
|
||||
createNewLabel: 'Create new {{label}}',
|
||||
creatingNewLabel: 'Creating new {{label}}',
|
||||
created: 'Created',
|
||||
createdAt: 'Created At',
|
||||
creating: 'Creating',
|
||||
dark: 'Dark',
|
||||
dashboard: 'Dashboard',
|
||||
delete: 'Delete',
|
||||
deletedCountSuccessfully: 'Deleted {{count}} {{label}} successfully.',
|
||||
deletedSuccessfully: 'Deleted successfully.',
|
||||
deleting: 'Deleting...',
|
||||
descending: 'Descending',
|
||||
deselectAllRows: 'Deselect all rows',
|
||||
duplicate: 'Duplicate',
|
||||
duplicateWithoutSaving: 'Duplicate without saving changes',
|
||||
edit: 'Edit',
|
||||
editLabel: 'Edit {{label}}',
|
||||
editing: 'Editing',
|
||||
editingLabel_many: 'Editing {{count}} {{label}}',
|
||||
editingLabel_one: 'Editing {{count}} {{label}}',
|
||||
editingLabel_other: 'Editing {{count}} {{label}}',
|
||||
email: 'Email',
|
||||
emailAddress: 'Email Address',
|
||||
enterAValue: 'Enter a value',
|
||||
error: 'Error',
|
||||
errors: 'Errors',
|
||||
fallbackToDefaultLocale: 'Fallback to default locale',
|
||||
filter: 'Filter',
|
||||
filterWhere: 'Filter {{label}} where',
|
||||
filters: 'Filters',
|
||||
globals: 'Globals',
|
||||
language: 'Language',
|
||||
lastModified: 'Last Modified',
|
||||
leaveAnyway: 'Leave anyway',
|
||||
leaveWithoutSaving: 'Leave without saving',
|
||||
light: 'Light',
|
||||
livePreview: 'Live Preview',
|
||||
loading: 'Loading',
|
||||
locale: 'Locale',
|
||||
locales: 'Locales',
|
||||
menu: 'Menu',
|
||||
moveDown: 'Move Down',
|
||||
moveUp: 'Move Up',
|
||||
newPassword: 'New Password',
|
||||
noFiltersSet: 'No filters set',
|
||||
noLabel: '<No {{label}}>',
|
||||
noOptions: 'No options',
|
||||
noResults:
|
||||
"No {{label}} found. Either no {{label}} exist yet or none match the filters you've specified above.",
|
||||
noValue: 'No value',
|
||||
none: 'None',
|
||||
notFound: 'Not Found',
|
||||
nothingFound: 'Nothing found',
|
||||
of: 'of',
|
||||
or: 'Or',
|
||||
open: 'Open',
|
||||
order: 'Order',
|
||||
pageNotFound: 'Page not found',
|
||||
password: 'Password',
|
||||
payloadSettings: 'Payload Settings',
|
||||
perPage: 'Per Page: {{limit}}',
|
||||
remove: 'Remove',
|
||||
reset: 'Reset',
|
||||
row: 'Row',
|
||||
rows: 'Rows',
|
||||
save: 'Save',
|
||||
saving: 'Saving...',
|
||||
searchBy: 'Search by {{label}}',
|
||||
selectAll: 'Select all {{count}} {{label}}',
|
||||
selectAllRows: 'Select all rows',
|
||||
selectValue: 'Select a value',
|
||||
selectedCount: '{{count}} {{label}} selected',
|
||||
showAllLabel: 'Show all {{label}}',
|
||||
sorryNotFound: 'Sorry—there is nothing to correspond with your request.',
|
||||
sort: 'Sort',
|
||||
sortByLabelDirection: 'Sort by {{label}} {{direction}}',
|
||||
stayOnThisPage: 'Stay on this page',
|
||||
submissionSuccessful: 'Submission Successful.',
|
||||
submit: 'Submit',
|
||||
successfullyCreated: '{{label}} successfully created.',
|
||||
successfullyDuplicated: '{{label}} successfully duplicated.',
|
||||
thisLanguage: 'English',
|
||||
titleDeleted: '{{label}} "{{title}}" successfully deleted.',
|
||||
unauthorized: 'Unauthorized',
|
||||
unsavedChangesDuplicate: 'You have unsaved changes. Would you like to continue to duplicate?',
|
||||
untitled: 'Untitled',
|
||||
updatedAt: 'Updated At',
|
||||
updatedCountSuccessfully: 'Updated {{count}} {{label}} successfully.',
|
||||
updatedSuccessfully: 'Updated successfully.',
|
||||
updating: 'Updating',
|
||||
uploading: 'Uploading',
|
||||
user: 'User',
|
||||
users: 'Users',
|
||||
value: 'Value',
|
||||
welcome: 'Welcome',
|
||||
},
|
||||
operators: {
|
||||
contains: 'contains',
|
||||
equals: 'equals',
|
||||
exists: 'exists',
|
||||
isGreaterThan: 'is greater than',
|
||||
isGreaterThanOrEqualTo: 'is greater than or equal to',
|
||||
isIn: 'is in',
|
||||
isLessThan: 'is less than',
|
||||
isLessThanOrEqualTo: 'is less than or equal to',
|
||||
isLike: 'is like',
|
||||
isNotEqualTo: 'is not equal to',
|
||||
isNotIn: 'is not in',
|
||||
near: 'near',
|
||||
},
|
||||
upload: {
|
||||
crop: 'Crop',
|
||||
cropToolDescription:
|
||||
'Drag the corners of the selected area, draw a new area or adjust the values below.',
|
||||
dragAndDrop: 'Drag and drop a file',
|
||||
dragAndDropHere: 'or drag and drop a file here',
|
||||
editImage: 'Edit Image',
|
||||
focalPoint: 'Focal Point',
|
||||
focalPointDescription:
|
||||
'Drag the focal point directly on the preview or adjust the values below.',
|
||||
fileName: 'File Name',
|
||||
fileSize: 'File Size',
|
||||
height: 'Height',
|
||||
lessInfo: 'Less info',
|
||||
moreInfo: 'More info',
|
||||
previewSizes: 'Preview Sizes',
|
||||
selectCollectionToBrowse: 'Select a Collection to Browse',
|
||||
selectFile: 'Select a file',
|
||||
setCropArea: 'Set crop area',
|
||||
setFocalPoint: 'Set focal point',
|
||||
sizes: 'Sizes',
|
||||
sizesFor: 'Sizes for {{label}}',
|
||||
width: 'Width',
|
||||
},
|
||||
validation: {
|
||||
emailAddress: 'Please enter a valid email address.',
|
||||
enterNumber: 'Please enter a valid number.',
|
||||
fieldHasNo: 'This field has no {{label}}',
|
||||
greaterThanMax: '{{value}} is greater than the max allowed {{label}} of {{max}}.',
|
||||
invalidInput: 'This field has an invalid input.',
|
||||
invalidSelection: 'This field has an invalid selection.',
|
||||
invalidSelections: 'This field has the following invalid selections:',
|
||||
lessThanMin: '{{value}} is less than the min allowed {{label}} of {{min}}.',
|
||||
limitReached: 'Limit reached, only {{max}} items can be added.',
|
||||
longerThanMin: 'This value must be longer than the minimum length of {{minLength}} characters.',
|
||||
notValidDate: '"{{value}}" is not a valid date.',
|
||||
required: 'This field is required.',
|
||||
requiresAtLeast: 'This field requires at least {{count}} {{label}}.',
|
||||
requiresNoMoreThan: 'This field requires no more than {{count}} {{label}}.',
|
||||
requiresTwoNumbers: 'This field requires two numbers.',
|
||||
shorterThanMax: 'This value must be shorter than the max length of {{maxLength}} characters.',
|
||||
trueOrFalse: 'This field can only be equal to true or false.',
|
||||
validUploadID: 'This field is not a valid upload ID.',
|
||||
},
|
||||
version: {
|
||||
aboutToPublishSelection:
|
||||
'You are about to publish all {{label}} in the selection. Are you sure?',
|
||||
aboutToRestore:
|
||||
'You are about to restore this {{label}} document to the state that it was in on {{versionDate}}.',
|
||||
aboutToRestoreGlobal:
|
||||
'You are about to restore the global {{label}} to the state that it was in on {{versionDate}}.',
|
||||
aboutToRevertToPublished:
|
||||
"You are about to revert this document's changes to its published state. Are you sure?",
|
||||
aboutToUnpublish: 'You are about to unpublish this document. Are you sure?',
|
||||
aboutToUnpublishSelection:
|
||||
'You are about to unpublish all {{label}} in the selection. Are you sure?',
|
||||
autosave: 'Autosave',
|
||||
autosavedSuccessfully: 'Autosaved successfully.',
|
||||
autosavedVersion: 'Autosaved version',
|
||||
changed: 'Changed',
|
||||
compareVersion: 'Compare version against:',
|
||||
confirmPublish: 'Confirm publish',
|
||||
confirmRevertToSaved: 'Confirm revert to saved',
|
||||
confirmUnpublish: 'Confirm unpublish',
|
||||
confirmVersionRestoration: 'Confirm version Restoration',
|
||||
currentDocumentStatus: 'Current {{docStatus}} document',
|
||||
draft: 'Draft',
|
||||
draftSavedSuccessfully: 'Draft saved successfully.',
|
||||
lastSavedAgo: 'Last saved {{distance}} ago',
|
||||
noFurtherVersionsFound: 'No further versions found',
|
||||
noRowsFound: 'No {{label}} found',
|
||||
preview: 'Preview',
|
||||
problemRestoringVersion: 'There was a problem restoring this version',
|
||||
publish: 'Publish',
|
||||
publishChanges: 'Publish changes',
|
||||
published: 'Published',
|
||||
publishing: 'Publishing',
|
||||
restoreThisVersion: 'Restore this version',
|
||||
restoredSuccessfully: 'Restored Successfully.',
|
||||
restoring: 'Restoring...',
|
||||
revertToPublished: 'Revert to published',
|
||||
reverting: 'Reverting...',
|
||||
saveDraft: 'Save Draft',
|
||||
selectLocales: 'Select locales to display',
|
||||
selectVersionToCompare: 'Select a version to compare',
|
||||
showLocales: 'Show locales:',
|
||||
showingVersionsFor: 'Showing versions for:',
|
||||
status: 'Status',
|
||||
type: 'Type',
|
||||
unpublish: 'Unpublish',
|
||||
unpublishing: 'Unpublishing...',
|
||||
version: 'Version',
|
||||
versionCount_many: '{{count}} versions found',
|
||||
versionCount_none: 'No versions found',
|
||||
versionCount_one: '{{count}} version found',
|
||||
versionCount_other: '{{count}} versions found',
|
||||
versionCreatedOn: '{{version}} created on:',
|
||||
versionID: 'Version ID',
|
||||
versions: 'Versions',
|
||||
viewingVersion: 'Viewing version for the {{entityLabel}} {{documentTitle}}',
|
||||
viewingVersionGlobal: 'Viewing version for the global {{entityLabel}}',
|
||||
viewingVersions: 'Viewing versions for the {{entityLabel}} {{documentTitle}}',
|
||||
viewingVersionsGlobal: 'Viewing versions for the global {{entityLabel}}',
|
||||
export const en = {
|
||||
dateFNSKey: 'en-US',
|
||||
translations: {
|
||||
authentication: {
|
||||
account: 'Account',
|
||||
accountOfCurrentUser: 'Account of current user',
|
||||
alreadyActivated: 'Already Activated',
|
||||
alreadyLoggedIn: 'Already logged in',
|
||||
apiKey: 'API Key',
|
||||
backToLogin: 'Back to login',
|
||||
beginCreateFirstUser: 'To begin, create your first user.',
|
||||
changePassword: 'Change Password',
|
||||
checkYourEmailForPasswordReset:
|
||||
'Check your email for a link that will allow you to securely reset your password.',
|
||||
confirmGeneration: 'Confirm Generation',
|
||||
confirmPassword: 'Confirm Password',
|
||||
createFirstUser: 'Create first user',
|
||||
emailNotValid: 'The email provided is not valid',
|
||||
emailSent: 'Email Sent',
|
||||
enableAPIKey: 'Enable API Key',
|
||||
failedToUnlock: 'Failed to unlock',
|
||||
forceUnlock: 'Force Unlock',
|
||||
forgotPassword: 'Forgot Password',
|
||||
forgotPasswordEmailInstructions:
|
||||
'Please enter your email below. You will receive an email message with instructions on how to reset your password.',
|
||||
forgotPasswordQuestion: 'Forgot password?',
|
||||
generate: 'Generate',
|
||||
generateNewAPIKey: 'Generate new API key',
|
||||
generatingNewAPIKeyWillInvalidate:
|
||||
'Generating a new API key will <1>invalidate</1> the previous key. Are you sure you wish to continue?',
|
||||
lockUntil: 'Lock Until',
|
||||
logBackIn: 'Log back in',
|
||||
logOut: 'Log out',
|
||||
loggedIn: 'To log in with another user, you should <0>log out</0> first.',
|
||||
loggedInChangePassword:
|
||||
'To change your password, go to your <0>account</0> and edit your password there.',
|
||||
loggedOutInactivity: 'You have been logged out due to inactivity.',
|
||||
loggedOutSuccessfully: 'You have been logged out successfully.',
|
||||
login: 'Login',
|
||||
loginAttempts: 'Login Attempts',
|
||||
loginUser: 'Login user',
|
||||
loginWithAnotherUser: 'To log in with another user, you should <0>log out</0> first.',
|
||||
logout: 'Logout',
|
||||
logoutUser: 'Logout user',
|
||||
newAPIKeyGenerated: 'New API Key Generated.',
|
||||
newAccountCreated:
|
||||
'A new account has just been created for you to access <a href="{{serverURL}}">{{serverURL}}</a> Please click on the following link or paste the URL below into your browser to verify your email: <a href="{{verificationURL}}">{{verificationURL}}</a><br> After verifying your email, you will be able to log in successfully.',
|
||||
newPassword: 'New Password',
|
||||
resetPassword: 'Reset Password',
|
||||
resetPasswordExpiration: 'Reset Password Expiration',
|
||||
resetPasswordToken: 'Reset Password Token',
|
||||
resetYourPassword: 'Reset Your Password',
|
||||
stayLoggedIn: 'Stay logged in',
|
||||
successfullyUnlocked: 'Successfully unlocked',
|
||||
unableToVerify: 'Unable to Verify',
|
||||
verified: 'Verified',
|
||||
verifiedSuccessfully: 'Verified Successfully',
|
||||
verify: 'Verify',
|
||||
verifyUser: 'Verify User',
|
||||
verifyYourEmail: 'Verify your email',
|
||||
youAreInactive:
|
||||
"You haven't been active in a little while and will shortly be automatically logged out for your own security. Would you like to stay logged in?",
|
||||
youAreReceivingResetPassword:
|
||||
'You are receiving this because you (or someone else) have requested the reset of the password for your account. Please click on the following link, or paste this into your browser to complete the process:',
|
||||
youDidNotRequestPassword:
|
||||
'If you did not request this, please ignore this email and your password will remain unchanged.',
|
||||
},
|
||||
error: {
|
||||
accountAlreadyActivated: 'This account has already been activated.',
|
||||
autosaving: 'There was a problem while autosaving this document.',
|
||||
correctInvalidFields: 'Please correct invalid fields.',
|
||||
deletingFile: 'There was an error deleting file.',
|
||||
deletingTitle:
|
||||
'There was an error while deleting {{title}}. Please check your connection and try again.',
|
||||
emailOrPasswordIncorrect: 'The email or password provided is incorrect.',
|
||||
followingFieldsInvalid_one: 'The following field is invalid:',
|
||||
followingFieldsInvalid_other: 'The following fields are invalid:',
|
||||
incorrectCollection: 'Incorrect Collection',
|
||||
invalidFileType: 'Invalid file type',
|
||||
invalidFileTypeValue: 'Invalid file type: {{value}}',
|
||||
loadingDocument: 'There was a problem loading the document with ID of {{id}}.',
|
||||
missingEmail: 'Missing email.',
|
||||
missingIDOfDocument: 'Missing ID of document to update.',
|
||||
missingIDOfVersion: 'Missing ID of version.',
|
||||
missingRequiredData: 'Missing required data.',
|
||||
noFilesUploaded: 'No files were uploaded.',
|
||||
noMatchedField: 'No matched field found for "{{label}}"',
|
||||
noUser: 'No User',
|
||||
notAllowedToAccessPage: 'You are not allowed to access this page.',
|
||||
notAllowedToPerformAction: 'You are not allowed to perform this action.',
|
||||
notFound: 'The requested resource was not found.',
|
||||
previewing: 'There was a problem previewing this document.',
|
||||
problemUploadingFile: 'There was a problem while uploading the file.',
|
||||
tokenInvalidOrExpired: 'Token is either invalid or has expired.',
|
||||
unPublishingDocument: 'There was a problem while un-publishing this document.',
|
||||
unableToDeleteCount: 'Unable to delete {{count}} out of {{total}} {{label}}.',
|
||||
unableToUpdateCount: 'Unable to update {{count}} out of {{total}} {{label}}.',
|
||||
unauthorized: 'Unauthorized, you must be logged in to make this request.',
|
||||
unknown: 'An unknown error has occurred.',
|
||||
unspecific: 'An error has occurred.',
|
||||
userLocked: 'This user is locked due to having too many failed login attempts.',
|
||||
valueMustBeUnique: 'Value must be unique',
|
||||
verificationTokenInvalid: 'Verification token is invalid.',
|
||||
},
|
||||
fields: {
|
||||
addLabel: 'Add {{label}}',
|
||||
addLink: 'Add Link',
|
||||
addNew: 'Add new',
|
||||
addNewLabel: 'Add new {{label}}',
|
||||
addRelationship: 'Add Relationship',
|
||||
addUpload: 'Add Upload',
|
||||
block: 'block',
|
||||
blockType: 'Block Type',
|
||||
blocks: 'blocks',
|
||||
chooseBetweenCustomTextOrDocument:
|
||||
'Choose between entering a custom text URL or linking to another document.',
|
||||
chooseDocumentToLink: 'Choose a document to link to',
|
||||
chooseFromExisting: 'Choose from existing',
|
||||
chooseLabel: 'Choose {{label}}',
|
||||
collapseAll: 'Collapse All',
|
||||
customURL: 'Custom URL',
|
||||
editLabelData: 'Edit {{label}} data',
|
||||
editLink: 'Edit Link',
|
||||
editRelationship: 'Edit Relationship',
|
||||
enterURL: 'Enter a URL',
|
||||
internalLink: 'Internal Link',
|
||||
itemsAndMore: '{{items}} and {{count}} more',
|
||||
labelRelationship: '{{label}} Relationship',
|
||||
latitude: 'Latitude',
|
||||
linkType: 'Link Type',
|
||||
linkedTo: 'Linked to <0>{{label}}</0>',
|
||||
longitude: 'Longitude',
|
||||
newLabel: 'New {{label}}',
|
||||
openInNewTab: 'Open in new tab',
|
||||
passwordsDoNotMatch: 'Passwords do not match.',
|
||||
relatedDocument: 'Related Document',
|
||||
relationTo: 'Relation To',
|
||||
removeRelationship: 'Remove Relationship',
|
||||
removeUpload: 'Remove Upload',
|
||||
saveChanges: 'Save changes',
|
||||
searchForBlock: 'Search for a block',
|
||||
selectExistingLabel: 'Select existing {{label}}',
|
||||
selectFieldsToEdit: 'Select fields to edit',
|
||||
showAll: 'Show All',
|
||||
swapRelationship: 'Swap Relationship',
|
||||
swapUpload: 'Swap Upload',
|
||||
textToDisplay: 'Text to display',
|
||||
toggleBlock: 'Toggle block',
|
||||
uploadNewLabel: 'Upload new {{label}}',
|
||||
},
|
||||
general: {
|
||||
aboutToDelete: 'You are about to delete the {{label}} <1>{{title}}</1>. Are you sure?',
|
||||
aboutToDeleteCount_many: 'You are about to delete {{count}} {{label}}',
|
||||
aboutToDeleteCount_one: 'You are about to delete {{count}} {{label}}',
|
||||
aboutToDeleteCount_other: 'You are about to delete {{count}} {{label}}',
|
||||
addBelow: 'Add Below',
|
||||
addFilter: 'Add Filter',
|
||||
adminTheme: 'Admin Theme',
|
||||
and: 'And',
|
||||
applyChanges: 'Apply Changes',
|
||||
ascending: 'Ascending',
|
||||
automatic: 'Automatic',
|
||||
backToDashboard: 'Back to Dashboard',
|
||||
cancel: 'Cancel',
|
||||
changesNotSaved:
|
||||
'Your changes have not been saved. If you leave now, you will lose your changes.',
|
||||
close: 'Close',
|
||||
collapse: 'Collapse',
|
||||
collections: 'Collections',
|
||||
columnToSort: 'Column to Sort',
|
||||
columns: 'Columns',
|
||||
confirm: 'Confirm',
|
||||
confirmDeletion: 'Confirm deletion',
|
||||
confirmDuplication: 'Confirm duplication',
|
||||
copied: 'Copied',
|
||||
copy: 'Copy',
|
||||
create: 'Create',
|
||||
createNew: 'Create New',
|
||||
createNewLabel: 'Create new {{label}}',
|
||||
created: 'Created',
|
||||
createdAt: 'Created At',
|
||||
creating: 'Creating',
|
||||
creatingNewLabel: 'Creating new {{label}}',
|
||||
dark: 'Dark',
|
||||
dashboard: 'Dashboard',
|
||||
delete: 'Delete',
|
||||
deletedCountSuccessfully: 'Deleted {{count}} {{label}} successfully.',
|
||||
deletedSuccessfully: 'Deleted successfully.',
|
||||
deleting: 'Deleting...',
|
||||
descending: 'Descending',
|
||||
deselectAllRows: 'Deselect all rows',
|
||||
duplicate: 'Duplicate',
|
||||
duplicateWithoutSaving: 'Duplicate without saving changes',
|
||||
edit: 'Edit',
|
||||
editLabel: 'Edit {{label}}',
|
||||
editing: 'Editing',
|
||||
editingLabel_many: 'Editing {{count}} {{label}}',
|
||||
editingLabel_one: 'Editing {{count}} {{label}}',
|
||||
editingLabel_other: 'Editing {{count}} {{label}}',
|
||||
email: 'Email',
|
||||
emailAddress: 'Email Address',
|
||||
enterAValue: 'Enter a value',
|
||||
error: 'Error',
|
||||
errors: 'Errors',
|
||||
fallbackToDefaultLocale: 'Fallback to default locale',
|
||||
filter: 'Filter',
|
||||
filterWhere: 'Filter {{label}} where',
|
||||
filters: 'Filters',
|
||||
globals: 'Globals',
|
||||
language: 'Language',
|
||||
lastModified: 'Last Modified',
|
||||
leaveAnyway: 'Leave anyway',
|
||||
leaveWithoutSaving: 'Leave without saving',
|
||||
light: 'Light',
|
||||
livePreview: 'Live Preview',
|
||||
loading: 'Loading',
|
||||
locale: 'Locale',
|
||||
locales: 'Locales',
|
||||
menu: 'Menu',
|
||||
moveDown: 'Move Down',
|
||||
moveUp: 'Move Up',
|
||||
newPassword: 'New Password',
|
||||
noFiltersSet: 'No filters set',
|
||||
noLabel: '<No {{label}}>',
|
||||
noOptions: 'No options',
|
||||
noResults:
|
||||
"No {{label}} found. Either no {{label}} exist yet or none match the filters you've specified above.",
|
||||
noValue: 'No value',
|
||||
none: 'None',
|
||||
notFound: 'Not Found',
|
||||
nothingFound: 'Nothing found',
|
||||
of: 'of',
|
||||
open: 'Open',
|
||||
or: 'Or',
|
||||
order: 'Order',
|
||||
pageNotFound: 'Page not found',
|
||||
password: 'Password',
|
||||
payloadSettings: 'Payload Settings',
|
||||
perPage: 'Per Page: {{limit}}',
|
||||
remove: 'Remove',
|
||||
reset: 'Reset',
|
||||
row: 'Row',
|
||||
rows: 'Rows',
|
||||
save: 'Save',
|
||||
saving: 'Saving...',
|
||||
searchBy: 'Search by {{label}}',
|
||||
selectAll: 'Select all {{count}} {{label}}',
|
||||
selectAllRows: 'Select all rows',
|
||||
selectValue: 'Select a value',
|
||||
selectedCount: '{{count}} {{label}} selected',
|
||||
showAllLabel: 'Show all {{label}}',
|
||||
sorryNotFound: 'Sorry—there is nothing to correspond with your request.',
|
||||
sort: 'Sort',
|
||||
sortByLabelDirection: 'Sort by {{label}} {{direction}}',
|
||||
stayOnThisPage: 'Stay on this page',
|
||||
submissionSuccessful: 'Submission Successful.',
|
||||
submit: 'Submit',
|
||||
successfullyCreated: '{{label}} successfully created.',
|
||||
successfullyDuplicated: '{{label}} successfully duplicated.',
|
||||
thisLanguage: 'English',
|
||||
titleDeleted: '{{label}} "{{title}}" successfully deleted.',
|
||||
unauthorized: 'Unauthorized',
|
||||
unsavedChangesDuplicate: 'You have unsaved changes. Would you like to continue to duplicate?',
|
||||
untitled: 'Untitled',
|
||||
updatedAt: 'Updated At',
|
||||
updatedCountSuccessfully: 'Updated {{count}} {{label}} successfully.',
|
||||
updatedSuccessfully: 'Updated successfully.',
|
||||
updating: 'Updating',
|
||||
uploading: 'Uploading',
|
||||
user: 'User',
|
||||
users: 'Users',
|
||||
value: 'Value',
|
||||
welcome: 'Welcome',
|
||||
},
|
||||
operators: {
|
||||
contains: 'contains',
|
||||
equals: 'equals',
|
||||
exists: 'exists',
|
||||
isGreaterThan: 'is greater than',
|
||||
isGreaterThanOrEqualTo: 'is greater than or equal to',
|
||||
isIn: 'is in',
|
||||
isLessThan: 'is less than',
|
||||
isLessThanOrEqualTo: 'is less than or equal to',
|
||||
isLike: 'is like',
|
||||
isNotEqualTo: 'is not equal to',
|
||||
isNotIn: 'is not in',
|
||||
near: 'near',
|
||||
},
|
||||
upload: {
|
||||
crop: 'Crop',
|
||||
cropToolDescription:
|
||||
'Drag the corners of the selected area, draw a new area or adjust the values below.',
|
||||
dragAndDrop: 'Drag and drop a file',
|
||||
dragAndDropHere: 'or drag and drop a file here',
|
||||
editImage: 'Edit Image',
|
||||
fileName: 'File Name',
|
||||
fileSize: 'File Size',
|
||||
focalPoint: 'Focal Point',
|
||||
focalPointDescription:
|
||||
'Drag the focal point directly on the preview or adjust the values below.',
|
||||
height: 'Height',
|
||||
lessInfo: 'Less info',
|
||||
moreInfo: 'More info',
|
||||
previewSizes: 'Preview Sizes',
|
||||
selectCollectionToBrowse: 'Select a Collection to Browse',
|
||||
selectFile: 'Select a file',
|
||||
setCropArea: 'Set crop area',
|
||||
setFocalPoint: 'Set focal point',
|
||||
sizes: 'Sizes',
|
||||
sizesFor: 'Sizes for {{label}}',
|
||||
width: 'Width',
|
||||
},
|
||||
validation: {
|
||||
emailAddress: 'Please enter a valid email address.',
|
||||
enterNumber: 'Please enter a valid number.',
|
||||
fieldHasNo: 'This field has no {{label}}',
|
||||
greaterThanMax: '{{value}} is greater than the max allowed {{label}} of {{max}}.',
|
||||
invalidInput: 'This field has an invalid input.',
|
||||
invalidSelection: 'This field has an invalid selection.',
|
||||
invalidSelections: 'This field has the following invalid selections:',
|
||||
lessThanMin: '{{value}} is less than the min allowed {{label}} of {{min}}.',
|
||||
limitReached: 'Limit reached, only {{max}} items can be added.',
|
||||
longerThanMin:
|
||||
'This value must be longer than the minimum length of {{minLength}} characters.',
|
||||
notValidDate: '"{{value}}" is not a valid date.',
|
||||
required: 'This field is required.',
|
||||
requiresAtLeast: 'This field requires at least {{count}} {{label}}.',
|
||||
requiresNoMoreThan: 'This field requires no more than {{count}} {{label}}.',
|
||||
requiresTwoNumbers: 'This field requires two numbers.',
|
||||
shorterThanMax: 'This value must be shorter than the max length of {{maxLength}} characters.',
|
||||
trueOrFalse: 'This field can only be equal to true or false.',
|
||||
validUploadID: 'This field is not a valid upload ID.',
|
||||
},
|
||||
version: {
|
||||
type: 'Type',
|
||||
aboutToPublishSelection:
|
||||
'You are about to publish all {{label}} in the selection. Are you sure?',
|
||||
aboutToRestore:
|
||||
'You are about to restore this {{label}} document to the state that it was in on {{versionDate}}.',
|
||||
aboutToRestoreGlobal:
|
||||
'You are about to restore the global {{label}} to the state that it was in on {{versionDate}}.',
|
||||
aboutToRevertToPublished:
|
||||
"You are about to revert this document's changes to its published state. Are you sure?",
|
||||
aboutToUnpublish: 'You are about to unpublish this document. Are you sure?',
|
||||
aboutToUnpublishSelection:
|
||||
'You are about to unpublish all {{label}} in the selection. Are you sure?',
|
||||
autosave: 'Autosave',
|
||||
autosavedSuccessfully: 'Autosaved successfully.',
|
||||
autosavedVersion: 'Autosaved version',
|
||||
changed: 'Changed',
|
||||
compareVersion: 'Compare version against:',
|
||||
confirmPublish: 'Confirm publish',
|
||||
confirmRevertToSaved: 'Confirm revert to saved',
|
||||
confirmUnpublish: 'Confirm unpublish',
|
||||
confirmVersionRestoration: 'Confirm version Restoration',
|
||||
currentDocumentStatus: 'Current {{docStatus}} document',
|
||||
draft: 'Draft',
|
||||
draftSavedSuccessfully: 'Draft saved successfully.',
|
||||
lastSavedAgo: 'Last saved {{distance}} ago',
|
||||
noFurtherVersionsFound: 'No further versions found',
|
||||
noRowsFound: 'No {{label}} found',
|
||||
preview: 'Preview',
|
||||
problemRestoringVersion: 'There was a problem restoring this version',
|
||||
publish: 'Publish',
|
||||
publishChanges: 'Publish changes',
|
||||
published: 'Published',
|
||||
publishing: 'Publishing',
|
||||
restoreThisVersion: 'Restore this version',
|
||||
restoredSuccessfully: 'Restored Successfully.',
|
||||
restoring: 'Restoring...',
|
||||
revertToPublished: 'Revert to published',
|
||||
reverting: 'Reverting...',
|
||||
saveDraft: 'Save Draft',
|
||||
selectLocales: 'Select locales to display',
|
||||
selectVersionToCompare: 'Select a version to compare',
|
||||
showLocales: 'Show locales:',
|
||||
showingVersionsFor: 'Showing versions for:',
|
||||
status: 'Status',
|
||||
unpublish: 'Unpublish',
|
||||
unpublishing: 'Unpublishing...',
|
||||
version: 'Version',
|
||||
versionCount_many: '{{count}} versions found',
|
||||
versionCount_none: 'No versions found',
|
||||
versionCount_one: '{{count}} version found',
|
||||
versionCount_other: '{{count}} versions found',
|
||||
versionCreatedOn: '{{version}} created on:',
|
||||
versionID: 'Version ID',
|
||||
versions: 'Versions',
|
||||
viewingVersion: 'Viewing version for the {{entityLabel}} {{documentTitle}}',
|
||||
viewingVersionGlobal: 'Viewing version for the global {{entityLabel}}',
|
||||
viewingVersions: 'Viewing versions for the {{entityLabel}} {{documentTitle}}',
|
||||
viewingVersionsGlobal: 'Viewing versions for the global {{entityLabel}}',
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
@@ -1,48 +1,56 @@
|
||||
export type LanguageTranslations = {
|
||||
[namespace: string]: {
|
||||
[key: string]: string
|
||||
import type { Locale } from 'date-fns'
|
||||
|
||||
import type { acceptedLanguages } from './utilities/init.js'
|
||||
|
||||
export type Language = {
|
||||
dateFNSKey: string
|
||||
translations: {
|
||||
[namespace: string]: {
|
||||
[key: string]: string
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export type Translations = {
|
||||
[language: string]: LanguageTranslations
|
||||
export type AcceptedLanguages = (typeof acceptedLanguages)[number]
|
||||
|
||||
export type SupportedLanguages = {
|
||||
[key in AcceptedLanguages]?: Language
|
||||
}
|
||||
|
||||
export type TFunction = (key: string, options?: Record<string, any>) => string
|
||||
|
||||
export type I18n = {
|
||||
dateFNS: Locale
|
||||
/** Corresponding dateFNS key */
|
||||
dateFNSKey: string
|
||||
/** The fallback language */
|
||||
fallbackLanguage: string
|
||||
/** The language of the request */
|
||||
language: string
|
||||
/** Translate function */
|
||||
t: TFunction
|
||||
translations: Translations
|
||||
translations: Language['translations']
|
||||
}
|
||||
|
||||
export type I18nOptions = {
|
||||
fallbackLanguage?: string
|
||||
supportedLanguages?: Translations
|
||||
translations?: {
|
||||
[language: string]:
|
||||
| {
|
||||
$schema: string
|
||||
}
|
||||
| LanguageTranslations
|
||||
}
|
||||
supportedLanguages?: SupportedLanguages
|
||||
translations?: Partial<{
|
||||
[key in AcceptedLanguages]?: Language['translations']
|
||||
}>
|
||||
}
|
||||
|
||||
export type InitTFunction = (args: {
|
||||
config: I18nOptions
|
||||
language?: string
|
||||
translations: Translations
|
||||
translations: Language['translations']
|
||||
}) => {
|
||||
t: TFunction
|
||||
translations: Translations
|
||||
translations: Language['translations']
|
||||
}
|
||||
|
||||
export type InitI18n = (args: {
|
||||
config: I18nOptions
|
||||
context: 'api' | 'client'
|
||||
language?: string
|
||||
}) => I18n
|
||||
}) => Promise<I18n>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import type { Translations } from '../types.js'
|
||||
import type { Language } from '../types.js'
|
||||
|
||||
import { clientTranslationKeys } from '../clientKeys.js'
|
||||
|
||||
@@ -54,18 +54,10 @@ function sortObject(obj) {
|
||||
return sortedObject
|
||||
}
|
||||
|
||||
export const reduceLanguages = (supportedLanguages: Translations, context: 'api' | 'client') => {
|
||||
const languages = {}
|
||||
|
||||
Object.entries(supportedLanguages).forEach(([lang, translations]) => {
|
||||
if (context === 'client') {
|
||||
const clientTranslations = sortObject(filterKeys(translations, '', clientTranslationKeys))
|
||||
|
||||
languages[lang] = clientTranslations
|
||||
} else {
|
||||
languages[lang] = translations
|
||||
}
|
||||
})
|
||||
|
||||
return languages
|
||||
export const getTranslationsByContext = (translations: Language, context: 'api' | 'client') => {
|
||||
if (context === 'client') {
|
||||
return sortObject(filterKeys(translations, '', clientTranslationKeys))
|
||||
} else {
|
||||
return translations
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,8 @@
|
||||
import type { I18n, InitI18n, InitTFunction, Translations } from '../types.js'
|
||||
import type { I18n, InitI18n, InitTFunction, Language } from '../types.js'
|
||||
|
||||
import { importDateFNSLocale } from '../importDateFNSLocale.js'
|
||||
import { deepMerge } from './deepMerge.js'
|
||||
import { reduceLanguages } from './reduceLanguages.js'
|
||||
import { getTranslationsByContext } from './getTranslationsByContext.js'
|
||||
|
||||
/**
|
||||
* @function getTranslationString
|
||||
@@ -17,7 +18,7 @@ export const getTranslationString = ({
|
||||
}: {
|
||||
count?: number
|
||||
key: string
|
||||
translations: Translations[0]
|
||||
translations: Language['translations']
|
||||
}) => {
|
||||
const keys = key.split(':')
|
||||
let keySuffix = ''
|
||||
@@ -104,7 +105,7 @@ type TFunctionConstructor = ({
|
||||
vars,
|
||||
}: {
|
||||
key: string
|
||||
translations?: Translations[0]
|
||||
translations?: Language['translations']
|
||||
vars?: Record<string, any>
|
||||
}) => string
|
||||
|
||||
@@ -178,7 +179,7 @@ export const acceptedLanguages = [
|
||||
'vi',
|
||||
'zh',
|
||||
'zhTw',
|
||||
]
|
||||
] as const
|
||||
|
||||
export function matchLanguage(header: string): string | undefined {
|
||||
const parsedHeader = parseAcceptLanguage(header)
|
||||
@@ -196,14 +197,13 @@ export function matchLanguage(header: string): string | undefined {
|
||||
|
||||
const initTFunction: InitTFunction = (args) => {
|
||||
const { config, language, translations } = args
|
||||
const mergedTranslations = deepMerge(config?.translations ?? {}, translations)
|
||||
const languagePreference = matchLanguage(language)
|
||||
const mergedTranslations = deepMerge(config?.translations?.[language] ?? {}, translations)
|
||||
|
||||
return {
|
||||
t: (key, vars) => {
|
||||
return t({
|
||||
key,
|
||||
translations: mergedTranslations[languagePreference],
|
||||
translations: mergedTranslations,
|
||||
vars,
|
||||
})
|
||||
},
|
||||
@@ -211,14 +211,14 @@ const initTFunction: InitTFunction = (args) => {
|
||||
}
|
||||
}
|
||||
|
||||
function memoize(fn: (args: unknown) => I18n, keys: string[]) {
|
||||
function memoize(fn: (args: unknown) => Promise<I18n>, keys: string[]) {
|
||||
const cacheMap = new Map()
|
||||
|
||||
const memoized = (args) => {
|
||||
const memoized = async (args) => {
|
||||
const cacheKey = keys.reduce((acc, key) => acc + args[key], '')
|
||||
|
||||
if (!cacheMap.has(cacheKey)) {
|
||||
const result = fn(args)
|
||||
const result = await fn(args)
|
||||
cacheMap.set(cacheKey, result)
|
||||
}
|
||||
|
||||
@@ -229,20 +229,29 @@ function memoize(fn: (args: unknown) => I18n, keys: string[]) {
|
||||
}
|
||||
|
||||
export const initI18n: InitI18n = memoize(
|
||||
({ config, context, language = 'en' }: Parameters<InitI18n>[0]) => {
|
||||
const languages = reduceLanguages(config.supportedLanguages, context)
|
||||
async ({ config, context, language = 'en' }: Parameters<InitI18n>[0]) => {
|
||||
const translations = getTranslationsByContext(
|
||||
config.supportedLanguages[language].translations,
|
||||
context,
|
||||
)
|
||||
|
||||
const { t, translations } = initTFunction({
|
||||
const { t, translations: mergedTranslations } = initTFunction({
|
||||
config,
|
||||
language: language || config.fallbackLanguage,
|
||||
translations: languages,
|
||||
translations,
|
||||
})
|
||||
|
||||
const dateFNSKey = config.supportedLanguages[language]?.dateFNSKey || 'en-US'
|
||||
|
||||
const dateFNS = await importDateFNSLocale(dateFNSKey)
|
||||
|
||||
const i18n: I18n = {
|
||||
dateFNS,
|
||||
dateFNSKey,
|
||||
fallbackLanguage: config.fallbackLanguage,
|
||||
language: language || config.fallbackLanguage,
|
||||
t,
|
||||
translations,
|
||||
translations: mergedTranslations,
|
||||
}
|
||||
|
||||
return i18n
|
||||
|
||||
@@ -131,7 +131,7 @@ export const Autosave: React.FC<Props> = ({
|
||||
{!saving && lastSaved && (
|
||||
<React.Fragment>
|
||||
{t('version:lastSavedAgo', {
|
||||
distance: formatTimeToNow(lastSaved, i18n.language),
|
||||
distance: formatTimeToNow({ date: lastSaved, i18n }),
|
||||
})}
|
||||
</React.Fragment>
|
||||
)}
|
||||
|
||||
@@ -11,7 +11,7 @@ import type { Props } from './types.js'
|
||||
import { Calendar as CalendarIcon } from '../../icons/Calendar/index.js'
|
||||
import { X as XIcon } from '../../icons/X/index.js'
|
||||
import { useTranslation } from '../../providers/Translation/index.js'
|
||||
import { getDateLocale } from '../../utilities/getDateLocale.js'
|
||||
import { getFormattedLocale } from './getFormattedLocale.js'
|
||||
import './index.scss'
|
||||
|
||||
const baseClass = 'date-time-picker'
|
||||
@@ -37,10 +37,10 @@ const DateTime: React.FC<Props> = (props) => {
|
||||
// Use the user's AdminUI language preference for the locale
|
||||
const { i18n } = useTranslation()
|
||||
|
||||
const { locale, localeData } = getDateLocale(i18n.language)
|
||||
const datepickerLocale = getFormattedLocale(i18n.language)
|
||||
|
||||
try {
|
||||
registerLocale(locale, localeData)
|
||||
registerLocale(datepickerLocale, i18n.dateFNS)
|
||||
} catch (e) {
|
||||
console.warn(`Could not find DatePicker locale for ${i18n.language}`)
|
||||
}
|
||||
@@ -108,7 +108,7 @@ const DateTime: React.FC<Props> = (props) => {
|
||||
<ReactDatePicker
|
||||
{...dateTimePickerProps}
|
||||
dropdownMode="select"
|
||||
locale={locale}
|
||||
locale={datepickerLocale}
|
||||
showMonthDropdown
|
||||
showYearDropdown
|
||||
/>
|
||||
|
||||
12
packages/ui/src/elements/DatePicker/getFormattedLocale.ts
Normal file
12
packages/ui/src/elements/DatePicker/getFormattedLocale.ts
Normal file
@@ -0,0 +1,12 @@
|
||||
export const getFormattedLocale = (language = 'enUS') => {
|
||||
const formattedLocales = {
|
||||
en: 'enUS',
|
||||
my: 'enUS', // Burmese is not currently supported
|
||||
ua: 'uk',
|
||||
zh: 'zhCN',
|
||||
}
|
||||
|
||||
const formattedLocale = formattedLocales[language] || language
|
||||
|
||||
return formattedLocale
|
||||
}
|
||||
@@ -122,13 +122,15 @@ export const DocumentControls: React.FC<{
|
||||
.filter(Boolean)
|
||||
.join(' ')}
|
||||
title={
|
||||
data?.updatedAt ? formatDate(data?.updatedAt, dateFormat, i18n.language) : ''
|
||||
data?.updatedAt
|
||||
? formatDate({ date: data?.updatedAt, i18n, pattern: dateFormat })
|
||||
: ''
|
||||
}
|
||||
>
|
||||
<p className={`${baseClass}__label`}>{i18n.t('general:lastModified')}: </p>
|
||||
{data?.updatedAt && (
|
||||
<p className={`${baseClass}__value`}>
|
||||
{formatDate(data.updatedAt, dateFormat, i18n.language)}
|
||||
{formatDate({ date: data?.updatedAt, i18n, pattern: dateFormat })}
|
||||
</p>
|
||||
)}
|
||||
</li>
|
||||
@@ -137,13 +139,15 @@ export const DocumentControls: React.FC<{
|
||||
.filter(Boolean)
|
||||
.join(' ')}
|
||||
title={
|
||||
data?.createdAt ? formatDate(data?.createdAt, dateFormat, i18n.language) : ''
|
||||
data?.createdAt
|
||||
? formatDate({ date: data?.createdAt, i18n, pattern: dateFormat })
|
||||
: ''
|
||||
}
|
||||
>
|
||||
<p className={`${baseClass}__label`}>{i18n.t('general:created')}: </p>
|
||||
{data?.createdAt && (
|
||||
<p className={`${baseClass}__value`}>
|
||||
{formatDate(data?.createdAt, dateFormat, i18n.language)}
|
||||
{formatDate({ date: data?.createdAt, i18n, pattern: dateFormat })}
|
||||
</p>
|
||||
)}
|
||||
</li>
|
||||
|
||||
@@ -18,5 +18,5 @@ export const DateCell: React.FC<DefaultCellComponentProps<Date | number | string
|
||||
|
||||
const dateFormat = dateDisplayFormat || dateFormatFromConfig
|
||||
|
||||
return <span>{cellData && formatDate(cellData, dateFormat, i18n.language)}</span>
|
||||
return <span>{cellData && formatDate({ date: cellData, i18n, pattern: dateFormat })}</span>
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
'use client'
|
||||
import type { LanguageTranslations } from '@payloadcms/translations'
|
||||
import type { Language } from '@payloadcms/translations'
|
||||
import type { ClientConfig } from 'payload/types'
|
||||
|
||||
import * as facelessUIImport from '@faceless-ui/modal'
|
||||
@@ -33,19 +33,21 @@ type Props = {
|
||||
children: React.ReactNode
|
||||
componentMap: ComponentMap
|
||||
config: ClientConfig
|
||||
dateFNSKey: Language['dateFNSKey']
|
||||
fallbackLang: ClientConfig['i18n']['fallbackLanguage']
|
||||
lang: string
|
||||
languageCode: string
|
||||
languageOptions: LanguageOptions
|
||||
switchLanguageServerAction?: (lang: string) => Promise<void>
|
||||
translations: LanguageTranslations
|
||||
translations: Language['translations']
|
||||
}
|
||||
|
||||
export const RootProvider: React.FC<Props> = ({
|
||||
children,
|
||||
componentMap,
|
||||
config,
|
||||
dateFNSKey,
|
||||
fallbackLang,
|
||||
lang,
|
||||
languageCode,
|
||||
languageOptions,
|
||||
switchLanguageServerAction,
|
||||
translations,
|
||||
@@ -65,8 +67,9 @@ export const RootProvider: React.FC<Props> = ({
|
||||
<FieldComponentsProvider>
|
||||
<ClientFunctionProvider>
|
||||
<TranslationProvider
|
||||
dateFNSKey={dateFNSKey}
|
||||
fallbackLang={fallbackLang}
|
||||
lang={lang}
|
||||
language={languageCode}
|
||||
languageOptions={languageOptions}
|
||||
switchLanguageServerAction={switchLanguageServerAction}
|
||||
translations={translations}
|
||||
|
||||
@@ -1,9 +1,12 @@
|
||||
'use client'
|
||||
import type { I18n, LanguageTranslations } from '@payloadcms/translations'
|
||||
import type { I18n, Language } from '@payloadcms/translations'
|
||||
import type { Locale } from 'date-fns'
|
||||
import type { ClientConfig } from 'payload/types'
|
||||
|
||||
import { t } from '@payloadcms/translations'
|
||||
import React, { createContext, useContext } from 'react'
|
||||
import { importDateFNSLocale } from '@payloadcms/translations'
|
||||
import enUS from 'date-fns/locale/en-US'
|
||||
import React, { createContext, useContext, useEffect, useState } from 'react'
|
||||
|
||||
import { useRouteCache } from '../RouteCache/index.js'
|
||||
|
||||
@@ -19,6 +22,8 @@ const Context = createContext<{
|
||||
t: (key: string, vars?: Record<string, any>) => string
|
||||
}>({
|
||||
i18n: {
|
||||
dateFNS: enUS,
|
||||
dateFNSKey: 'en-US',
|
||||
fallbackLanguage: 'en',
|
||||
language: 'en',
|
||||
t: (key) => key,
|
||||
@@ -31,22 +36,25 @@ const Context = createContext<{
|
||||
|
||||
type Props = {
|
||||
children: React.ReactNode
|
||||
dateFNSKey: Language['dateFNSKey']
|
||||
fallbackLang: ClientConfig['i18n']['fallbackLanguage']
|
||||
lang: string
|
||||
language: string
|
||||
languageOptions: LanguageOptions
|
||||
switchLanguageServerAction: (lang: string) => Promise<void>
|
||||
translations: LanguageTranslations
|
||||
translations: Language['translations']
|
||||
}
|
||||
|
||||
export const TranslationProvider: React.FC<Props> = ({
|
||||
children,
|
||||
dateFNSKey,
|
||||
fallbackLang,
|
||||
lang,
|
||||
language,
|
||||
languageOptions,
|
||||
switchLanguageServerAction,
|
||||
translations,
|
||||
}) => {
|
||||
const { clearRouteCache } = useRouteCache()
|
||||
const [dateFNS, setDateFNS] = useState<Locale>()
|
||||
|
||||
const nextT = (key: string, vars?: Record<string, unknown>): string =>
|
||||
t({
|
||||
@@ -68,16 +76,26 @@ export const TranslationProvider: React.FC<Props> = ({
|
||||
[switchLanguageServerAction, clearRouteCache],
|
||||
)
|
||||
|
||||
useEffect(() => {
|
||||
const loadDateFNS = async () => {
|
||||
const imported = await importDateFNSLocale(dateFNSKey)
|
||||
|
||||
setDateFNS(imported)
|
||||
}
|
||||
|
||||
void loadDateFNS()
|
||||
}, [dateFNSKey])
|
||||
|
||||
return (
|
||||
<Context.Provider
|
||||
value={{
|
||||
i18n: {
|
||||
dateFNS,
|
||||
dateFNSKey,
|
||||
fallbackLanguage: fallbackLang,
|
||||
language: lang,
|
||||
language,
|
||||
t: nextT,
|
||||
translations: {
|
||||
[lang]: translations,
|
||||
},
|
||||
translations,
|
||||
},
|
||||
languageOptions,
|
||||
switchLanguage,
|
||||
|
||||
@@ -1,22 +1,24 @@
|
||||
import type { I18n } from '@payloadcms/translations'
|
||||
|
||||
import { format, formatDistanceToNow } from 'date-fns'
|
||||
|
||||
import { getDateLocale } from './getDateLocale.js'
|
||||
|
||||
export const formatDate = (
|
||||
date: Date | number | string | undefined,
|
||||
pattern: string,
|
||||
locale?: string,
|
||||
): string => {
|
||||
const theDate = new Date(date)
|
||||
const { localeData } = getDateLocale(locale)
|
||||
return format(theDate, pattern, { locale: localeData })
|
||||
type FormatDateArgs = {
|
||||
date: Date | number | string | undefined
|
||||
i18n: I18n
|
||||
pattern: string
|
||||
}
|
||||
|
||||
export const formatTimeToNow = (
|
||||
date: Date | number | string | undefined,
|
||||
locale?: string,
|
||||
): string => {
|
||||
export const formatDate = ({ date, i18n, pattern }: FormatDateArgs): string => {
|
||||
const theDate = new Date(date)
|
||||
const { localeData } = getDateLocale(locale)
|
||||
return formatDistanceToNow(theDate, { locale: localeData })
|
||||
return format(theDate, pattern, { locale: i18n.dateFNS })
|
||||
}
|
||||
|
||||
type FormatTimeToNowArgs = {
|
||||
date: Date | number | string | undefined
|
||||
i18n: I18n
|
||||
}
|
||||
|
||||
export const formatTimeToNow = ({ date, i18n }: FormatTimeToNowArgs): string => {
|
||||
const theDate = new Date(date)
|
||||
return formatDistanceToNow(theDate, { locale: i18n.dateFNS })
|
||||
}
|
||||
|
||||
@@ -44,7 +44,7 @@ export const formatDocTitle = ({
|
||||
const dateFormat =
|
||||
('date' in fieldConfig.admin && fieldConfig?.admin?.date?.displayFormat) ||
|
||||
dateFormatFromConfig
|
||||
title = formatDate(title, dateFormat, i18n.language) || title
|
||||
title = formatDate({ date: title, i18n, pattern: dateFormat }) || title
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,24 +0,0 @@
|
||||
import type { Locale } from 'date-fns'
|
||||
|
||||
import { dateLocales } from './dateLocales.js'
|
||||
|
||||
export const getDateLocale = (
|
||||
locale = 'enUS',
|
||||
): {
|
||||
locale: string
|
||||
localeData: Locale
|
||||
} => {
|
||||
const formattedLocales = {
|
||||
en: 'enUS',
|
||||
my: 'enUS', // Burmese is not currently supported
|
||||
ua: 'uk',
|
||||
zh: 'zhCN',
|
||||
}
|
||||
|
||||
const formattedLocale = formattedLocales[locale] || locale
|
||||
|
||||
return {
|
||||
locale: formattedLocale,
|
||||
localeData: dateLocales[formattedLocale],
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user