Compare commits

..

59 Commits

Author SHA1 Message Date
Dan Ribbens
cb63095d3f chore(release): v3.0.0-alpha.42 [skip ci] 2024-03-10 14:28:05 -04:00
Dan Ribbens
601f2fb450 chore: add building plugins to release 2024-03-10 14:16:45 -04:00
Alessio Gravili
e746f17167 fix: incorrect TypeScript type for getPayload() props, throw proper error if config doesn't exist 2024-03-10 14:14:29 -04:00
James
5f76097562 chore: merge playwright revisions 2024-03-10 14:08:52 -04:00
James Mikrut
03756c4210 Merge pull request #5286 from payloadcms/feat/pre-compile-css
Feat/pre compile css
2024-03-10 14:06:10 -04:00
James
5e1e158414 chore: add exports for css 2024-03-10 14:05:22 -04:00
James
76d2525fd2 chore: cleanup 2024-03-10 13:57:28 -04:00
James
ec8c7e5c2c chore: finishes css pre-compilation 2024-03-10 13:53:37 -04:00
Elliot DeNolf
0a4cbe1a08 chore: remove unused directive 2024-03-10 13:52:48 -04:00
Dan Ribbens
c228421a38 chore(plugin-form-builder): esm imports 2024-03-10 12:12:49 -04:00
Dan Ribbens
a742f82370 chore: plugins peerDependencies payload workspace 2024-03-10 11:43:13 -04:00
Dan Ribbens
213678ca3e chore(plugin-redirects): esm imports 2024-03-10 11:42:14 -04:00
Dan Ribbens
e1b7ad6a71 chore(plugin-nested-docs): esm imports 2024-03-10 11:39:41 -04:00
Dan Ribbens
8b9985a92c chore(plugin-search): payload peer dependency workspace 2024-03-10 11:32:05 -04:00
Dan Ribbens
f276826b09 chore(plugin-search): esm imports 2024-03-10 11:28:54 -04:00
geisterfurz007
8c1df551ef chore: fix typescript hallucinations (#4559) 2024-03-10 01:53:59 -05:00
Akhil Naidu
b62cb157e1 docs: improve naming for afterForgotPassword hook example code (#5062) 2024-03-10 00:23:29 -05:00
Max Morozov
045c74ce67 docs: fix typo (#5052) 2024-03-10 00:13:09 -05:00
madaxen86
911e902da4 feat: add support for displaying AVIF images (#5227) 2024-03-10 00:00:26 -05:00
Alessio Gravili
4e0d90d720 WIP 2024-03-09 18:20:32 -05:00
James
7b62705cc0 chore: restores webpack config, still broken 2024-03-09 15:55:26 -05:00
James
bdf02bebaa chore: adds spawn process to playwright tests as well 2024-03-09 14:53:53 -05:00
James
94aa309910 chore: avoids importing config into playwright tests 2024-03-09 14:41:00 -05:00
Elliot DeNolf
499a0a782a chore: adjust tgz specifier in pnpm lock 2024-03-08 21:05:00 -05:00
Elliot DeNolf
1e5a531a83 ci: add alpha branch to main workflow 2024-03-08 20:57:14 -05:00
Elliot DeNolf
3e6a4073c4 chore(scripts): cleanup release script 2024-03-08 20:56:39 -05:00
Alessio Gravili
e7cb6abd1f chore: add new obliterate-playwright-cache 2024-03-08 19:48:26 -05:00
Dan Ribbens
abfd8841a5 chore(release): v3.0.0-alpha.41 [skip ci] 2024-03-08 17:07:01 -05:00
Dan Ribbens
5e385fa33b fix(db-postgres): postgres dev push schemas 2024-03-08 17:05:10 -05:00
Jarrod Flesch
95688c7e30 chore: more test adjustments 2024-03-08 16:41:03 -05:00
Jarrod Flesch
b041d3e70e chore: fix uploads int suite 2024-03-08 16:41:03 -05:00
Jarrod Flesch
0e91cddab9 chore: fix relationships test 2024-03-08 16:41:03 -05:00
Jarrod Flesch
d3856693ce chore: fixes localization test 2024-03-08 16:41:03 -05:00
Alessio Gravili
40f36104f3 feat(ui): upgrade react-datepicker and date-fns, fix datepicker not working 2024-03-08 16:20:03 -05:00
Dan Ribbens
7215edb784 chore(release): v3.0.0-alpha.40 [skip ci] 2024-03-08 16:07:05 -05:00
Dan Ribbens
be015320de chore(release): v3.0.0-alpha.39 [skip ci] 2024-03-08 15:57:39 -05:00
Alessio Gravili
a37d53b2e7 fix: lazy imports for DatePicker and CodeEditor 2024-03-08 15:49:40 -05:00
Jarrod Flesch
f43de11121 chore: fixes create view 2024-03-08 15:45:44 -05:00
Jacob Fletcher
4c1129188b Merge pull request #5278 from payloadcms/fix/custom-logout-button
fix(next): ssr custom logout button and icon graphic and narrows client config type
2024-03-08 15:39:00 -05:00
Dan Ribbens
34e04f5251 chore(release): v3.0.0-alpha.37 [skip ci] 2024-03-08 15:33:40 -05:00
Jacob Fletcher
b613d65b36 fix(ui): server renders custom icon 2024-03-08 15:33:27 -05:00
Dan Ribbens
66aec63f6b chore: pnpm lock 2024-03-08 15:32:23 -05:00
James
5b0d18bb3b Merge branch 'alpha' of github.com:payloadcms/payload into alpha 2024-03-08 15:31:42 -05:00
James
1c5b43c218 chore: migration fixes 2024-03-08 15:31:35 -05:00
Jacob Fletcher
c78cfb9fcf chore: narrows ClientConfig type 2024-03-08 15:21:52 -05:00
Jacob Fletcher
927d4dd06f fix(ui): server renders custom logout button 2024-03-08 15:19:53 -05:00
Dan Ribbens
afb75ef75a chore(release): v3.0.0-alpha.36 [skip ci] 2024-03-08 15:06:34 -05:00
James
92181866a4 Merge branch 'alpha' of github.com:payloadcms/payload into alpha 2024-03-08 15:04:12 -05:00
James
c97805c7f1 chore: type issue 2024-03-08 15:04:05 -05:00
Alessio Gravili
c20a139e58 chore(translations): run prettier after creating translation files 2024-03-08 15:03:24 -05:00
James
4287d1032f chore: build fix 2024-03-08 15:03:08 -05:00
Alessio Gravili
8b784d7c10 chore: remove console log 2024-03-08 14:56:02 -05:00
Alessio Gravili
8895f6420f chore: fix all esm test suite imports 2024-03-08 14:42:24 -05:00
Jarrod Flesch
bb10ed5b7d fix: sync localization data after switching locale (#5277)
Co-authored-by: James <james@trbl.design>
2024-03-08 14:40:23 -05:00
Jacob Fletcher
9dc315dbf3 fix(next): ssr custom providers (#5276) 2024-03-08 14:22:20 -05:00
Jacob Fletcher
677531531f fix: sanitizes root components from client config (#5274) 2024-03-08 14:20:50 -05:00
James
70c89b14a9 chore: builds translations as ts instead of json 2024-03-08 14:14:09 -05:00
Alessio Gravili
7f7c94e0d5 Revert "chore: imports translations in a safer manner"
This reverts commit e12e720a99.
2024-03-08 13:44:03 -05:00
Alessio Gravili
e6f09e42a1 chore: fix tsconfig for tests 2024-03-08 13:12:09 -05:00
550 changed files with 26723 additions and 26868 deletions

View File

@@ -4,7 +4,7 @@ on:
pull_request:
types: [ opened, reopened, synchronize ]
push:
branches: ['main', 'feat/next-poc']
branches: ['main', 'alpha']
jobs:
changes:

6
.gitignore vendored
View File

@@ -8,12 +8,15 @@ test-results
.devcontainer
.localstack
/migrations
/media
.localstack
.turbo
.turbo
# Ignore test directory media folder/files
/media
/versions
# Created by https://www.toptal.com/developers/gitignore/api/node,macos,windows,webstorm,sublimetext,visualstudiocode
# Edit at https://www.toptal.com/developers/gitignore?templates=node,macos,windows,webstorm,sublimetext,visualstudiocode
@@ -285,3 +288,4 @@ $RECYCLE.BIN/
# End of https://www.toptal.com/developers/gitignore/api/node,macos,windows,webstorm,sublimetext,visualstudiocode
/build
.swc

15
.swcrc Normal file
View File

@@ -0,0 +1,15 @@
{
"$schema": "https://json.schemastore.org/swcrc",
"sourceMaps": "inline",
"jsc": {
"target": "esnext",
"parser": {
"syntax": "typescript",
"tsx": true,
"dts": true
}
},
"module": {
"type": "es6"
}
}

View File

@@ -292,13 +292,11 @@ For auth-enabled Collections, this hook runs after successful `forgotPassword` o
```ts
import { CollectionAfterForgotPasswordHook } from 'payload/types'
const afterLoginHook: CollectionAfterForgotPasswordHook = async ({
req, // full express request
user, // user being logged in
token, // user token
}) => {
return user
}
const afterForgotPasswordHook: CollectionAfterForgotPasswordHook = async ({
args, // arguments passed into the operation
context,
collection, // The collection which this hook is being run on
}) => {...}
```
## TypeScript

View File

@@ -290,5 +290,5 @@ If you&apos;ve configured tests for your package, integrate them into your workf
The best way to share and allow others to use your plugin once it is complete is to publish an NPM package. This process is straightforward and well documented, find out more about [creating and publishing a NPM package here](https://docs.npmjs.com/creating-and-publishing-scoped-public-packages/).
##### Add payload-plugin topic tag:
Apply the tag **payload-plugin** to your GitHub repository. This will boost the visibility of your plugin and ensure it gets listed with [existing payload plugins](https://github.com/topics/payload-plugin).
##### Use [Semantic Versioning](https://semver.org/) (SemVar):
With the SemVar system you release version numbers that reflect the nature of changes (major, minor, patch). Ensure all major versions reference their Payload compatibility.
##### Use [Semantic Versioning](https://semver.org/) (SemVer):
With the SemVer system you release version numbers that reflect the nature of changes (major, minor, patch). Ensure all major versions reference their Payload compatibility.

1
emptyModule.js Normal file
View File

@@ -0,0 +1 @@
export default {}

View File

@@ -1,6 +1,6 @@
{
"name": "payload-monorepo",
"version": "3.0.0-alpha.35",
"version": "3.0.0-alpha.42",
"private": true,
"type": "module",
"workspaces:": [
@@ -8,9 +8,10 @@
],
"scripts": {
"build": "pnpm run build:core",
"obliterate-playwright-cache": "rm -rf ~/Library/Caches/ms-playwright && find /System/Volumes/Data/private/var/folders -type d -name 'playwright*' -exec rm -rf {} ++ && npx playwright install",
"build:all": "turbo build",
"build:core": "turbo build --filter \"!@payloadcms/plugin-*\"",
"build:plugins": "turbo build --filter \"@payloadcms/plugin-*\" --filter \"!@payloadcms/plugin-search\" --filter \"!@payloadcms/plugin-redirects\" --filter \"!@payloadcms/plugin-nested-docs\"",
"build:plugins": "turbo build --filter \"@payloadcms/plugin-*\"",
"build:app": "next build",
"build:app:analyze": "cross-env ANALYZE=true next build",
"build:create-payload-app": "turbo build --filter create-payload-app",
@@ -40,6 +41,7 @@
"clean:build": "find . \\( -type d \\( -name dist -o -name .cache -o -name .next -o -name .turbo \\) -o -type f -name tsconfig.tsbuildinfo \\) -not -path '*/node_modules/*' -exec rm -rf {} +",
"clean:all": "find . \\( -type d \\( -name node_modules -o -name dist -o -name .cache -o -name .next -o -name .turbo \\) -o -type f -name tsconfig.tsbuildinfo \\) -exec rm -rf {} +",
"dev": "cross-env node --no-deprecation ./test/dev.js",
"devsafe": "rm -rf .next && cross-env node --no-deprecation ./test/dev.js",
"dev:generate-graphql-schema": "cross-env NODE_OPTIONS=--no-deprecation tsx ./test/generateGraphQLSchema.ts",
"dev:generate-types": "cross-env NODE_OPTIONS=--no-deprecation tsx ./test/generateTypes.ts",
"dev:postgres": "pnpm --filter payload run dev:postgres",
@@ -70,7 +72,7 @@
"@next/bundle-analyzer": "^14.1.0",
"@octokit/core": "^5.1.0",
"@payloadcms/eslint-config": "workspace:*",
"@playwright/test": "1.42.1",
"@playwright/test": "^1.42.1",
"@swc/cli": "^0.1.62",
"@swc/jest": "0.2.36",
"@testing-library/jest-dom": "6.4.2",
@@ -122,8 +124,8 @@
"nodemon": "3.0.3",
"pino": "8.15.0",
"pino-pretty": "10.2.0",
"playwright": "file:playwright-1.43.0-next.tgz",
"playwright-core": "file:playwright-core-1.43.0-next.tgz",
"playwright": "^1.42.1",
"playwright-core": "^1.42.1",
"prettier": "^3.0.3",
"prompts": "2.4.2",
"qs": "6.11.2",
@@ -171,14 +173,13 @@
"graphql": "^16.8.1",
"react": "$react",
"react-dom": "$react-dom",
"typescript": "$typescript",
"playwright": "file:playwright-1.43.0-next.tgz",
"playwright-core": "file:playwright-core-1.43.0-next.tgz"
"typescript": "$typescript"
},
"allowedDeprecatedVersions": {
"uuid": "3.4.0",
"abab": "2",
"domexception": "4"
}
}
},
"packageManager": "pnpm@8.15.4+sha256.cea6d0bdf2de3a0549582da3983c70c92ffc577ff4410cbf190817ddc35137c2"
}

View File

@@ -1,6 +1,6 @@
{
"$schema": "https://json.schemastore.org/swcrc",
"sourceMaps": "inline",
"sourceMaps": true,
"jsc": {
"target": "esnext",
"parser": {

View File

@@ -1,6 +1,6 @@
{
"$schema": "https://json.schemastore.org/swcrc",
"sourceMaps": "inline",
"sourceMaps": true,
"jsc": {
"target": "esnext",
"parser": {

View File

@@ -1,6 +1,6 @@
{
"name": "@payloadcms/db-mongodb",
"version": "3.0.0-alpha.35",
"version": "3.0.0-alpha.42",
"description": "The officially supported MongoDB database adapter for Payload - Update 2",
"repository": "https://github.com/payloadcms/payload",
"license": "MIT",

View File

@@ -45,7 +45,7 @@ export const createMigration: CreateMigration = async function createMigration({
// Check if predefined migration exists
if (fs.existsSync(cleanPath)) {
const { down, up } = eval(`require(${cleanPath})`)
const { down, up } = await eval(`import(${cleanPath})`)
migrationFileContent = migrationTemplate(up, down)
} else {
payload.logger.error({

View File

@@ -1,6 +1,6 @@
{
"$schema": "https://json.schemastore.org/swcrc",
"sourceMaps": "inline",
"sourceMaps": true,
"jsc": {
"target": "esnext",
"parser": {

View File

@@ -1,6 +1,6 @@
{
"name": "@payloadcms/db-postgres",
"version": "3.0.0-alpha.35",
"version": "3.0.0-alpha.42",
"description": "The officially supported Postgres database adapter for Payload",
"repository": "https://github.com/payloadcms/payload",
"license": "MIT",

View File

@@ -1,14 +1,14 @@
import type { Payload } from 'payload'
import type { Connect } from 'payload/database'
import { eq, sql } from 'drizzle-orm'
import { sql } from 'drizzle-orm'
import { drizzle } from 'drizzle-orm/node-postgres'
import { numeric, timestamp, varchar } from 'drizzle-orm/pg-core'
import pg from 'pg'
import prompts from 'prompts'
import type { PostgresAdapter } from './types.js'
import { pushDevSchema } from './utilities/pushDevSchema.js'
const connectWithReconnect = async function ({
adapter,
payload,
@@ -93,70 +93,5 @@ export const connect: Connect = async function connect(
)
return
const { pushSchema } = await import('drizzle-kit/payload')
// This will prompt if clarifications are needed for Drizzle to push new schema
const { apply, hasDataLoss, statementsToExecute, warnings } = await pushSchema(
this.schema,
this.drizzle,
)
if (warnings.length) {
let message = `Warnings detected during schema push: \n\n${warnings.join('\n')}\n\n`
if (hasDataLoss) {
message += `DATA LOSS WARNING: Possible data loss detected if schema is pushed.\n\n`
}
message += `Accept warnings and push schema to database?`
const { confirm: acceptWarnings } = await prompts(
{
name: 'confirm',
type: 'confirm',
initial: false,
message,
},
{
onCancel: () => {
process.exit(0)
},
},
)
// Exit if user does not accept warnings.
// Q: Is this the right type of exit for this interaction?
if (!acceptWarnings) {
process.exit(0)
}
}
await apply()
// Migration table def in order to use query using drizzle
const migrationsSchema = this.pgSchema.table('payload_migrations', {
name: varchar('name'),
batch: numeric('batch'),
created_at: timestamp('created_at'),
updated_at: timestamp('updated_at'),
})
const devPush = await this.drizzle
.select()
.from(migrationsSchema)
.where(eq(migrationsSchema.batch, '-1'))
if (!devPush.length) {
await this.drizzle.insert(migrationsSchema).values({
name: 'dev',
batch: '-1',
})
} else {
await this.drizzle
.update(migrationsSchema)
.set({
updated_at: new Date(),
})
.where(eq(migrationsSchema.batch, '-1'))
}
await pushDevSchema(this)
}

View File

@@ -2,7 +2,13 @@ import type { Destroy } from 'payload/database'
import type { PostgresAdapter } from './types.js'
import { pushDevSchema } from './utilities/pushDevSchema.js'
export const destroy: Destroy = async function destroy(this: PostgresAdapter) {
// TODO: this hangs test suite for some reason
// await this.pool.end()
if (process.env.NODE_ENV !== 'production') {
await pushDevSchema(this)
} else {
// TODO: this hangs test suite for some reason
// await this.pool.end()
}
}

View File

@@ -0,0 +1,80 @@
import { eq } from 'drizzle-orm'
import { numeric, timestamp, varchar } from 'drizzle-orm/pg-core'
import prompts from 'prompts'
import type { PostgresAdapter } from '../types.js'
const { pushSchema } = await import('drizzle-kit/payload')
/**
* Pushes the development schema to the database using Drizzle.
*
* @param {PostgresAdapter} db - The PostgresAdapter instance connected to the database.
* @returns {Promise<void>} - A promise that resolves once the schema push is complete.
*/
export const pushDevSchema = async (db: PostgresAdapter) => {
// This will prompt if clarifications are needed for Drizzle to push new schema
const { apply, hasDataLoss, statementsToExecute, warnings } = await pushSchema(
db.schema,
db.drizzle,
)
if (warnings.length) {
let message = `Warnings detected during schema push: \n\n${warnings.join('\n')}\n\n`
if (hasDataLoss) {
message += `DATA LOSS WARNING: Possible data loss detected if schema is pushed.\n\n`
}
message += `Accept warnings and push schema to database?`
const { confirm: acceptWarnings } = await prompts(
{
name: 'confirm',
type: 'confirm',
initial: false,
message,
},
{
onCancel: () => {
process.exit(0)
},
},
)
// Exit if user does not accept warnings.
// Q: Is this the right type of exit for this interaction?
if (!acceptWarnings) {
process.exit(0)
}
}
await apply()
// Migration table def in order to use query using drizzle
const migrationsSchema = db.pgSchema.table('payload_migrations', {
name: varchar('name'),
batch: numeric('batch'),
created_at: timestamp('created_at'),
updated_at: timestamp('updated_at'),
})
const devPush = await db.drizzle
.select()
.from(migrationsSchema)
.where(eq(migrationsSchema.batch, '-1'))
if (!devPush.length) {
await db.drizzle.insert(migrationsSchema).values({
name: 'dev',
batch: '-1',
})
} else {
await db.drizzle
.update(migrationsSchema)
.set({
updated_at: new Date(),
})
.where(eq(migrationsSchema.batch, '-1'))
}
}

View File

@@ -1,6 +1,6 @@
{
"$schema": "https://json.schemastore.org/swcrc",
"sourceMaps": "inline",
"sourceMaps": true,
"jsc": {
"target": "esnext",
"parser": {

View File

@@ -1,6 +1,6 @@
{
"name": "@payloadcms/graphql",
"version": "3.0.0-alpha.35",
"version": "3.0.0-alpha.42",
"main": "./src/index.ts",
"types": "./src/index.d.ts",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"$schema": "https://json.schemastore.org/swcrc",
"sourceMaps": "inline",
"sourceMaps": true,
"jsc": {
"target": "esnext",
"parser": {

View File

@@ -1,6 +1,6 @@
{
"$schema": "https://json.schemastore.org/swcrc",
"sourceMaps": "inline",
"sourceMaps": true,
"jsc": {
"target": "esnext",
"parser": {

View File

@@ -1,12 +1,22 @@
{
"$schema": "https://json.schemastore.org/swcrc",
"sourceMaps": "inline",
"sourceMaps": true,
"jsc": {
"target": "esnext",
"parser": {
"syntax": "typescript",
"tsx": true,
"dts": true
},
"experimental": {
"plugins": [
[
"swc-plugin-transform-remove-imports",
{
"test": "\\.(scss|css)$"
}
]
]
}
},
"module": {

View File

@@ -1,6 +1,6 @@
{
"name": "@payloadcms/next",
"version": "3.0.0-alpha.35",
"version": "3.0.0-alpha.42",
"main": "./src/index.ts",
"types": "./src/index.d.ts",
"type": "module",
@@ -8,9 +8,10 @@
"@payloadcms/next": "./dist/bin/index.js"
},
"scripts": {
"build": "pnpm copyfiles && pnpm build:swc && pnpm build:types",
"build": "pnpm copyfiles && pnpm build:swc && pnpm build:types && pnpm build:webpack && rm dist/prod/index.js",
"build:swc": "swc ./src -d ./dist --config-file .swcrc",
"build:types": "tsc --emitDeclarationOnly --outDir dist",
"build:webpack": "webpack --config webpack.config.js",
"clean": "rimraf {dist,*.tsbuildinfo}",
"copyfiles": "copyfiles -u 1 \"src/**/*.{html,css,scss,ttf,woff,woff2,eot,svg,jpg,png,json}\" \"src/app/api/**\" dist/ && pnpm copyfiles:api",
"copyfiles:api": "copyfiles -u 1 \"src/app/(payload)/**\" dist/template",
@@ -50,7 +51,18 @@
"@types/react": "18.2.15",
"@types/react-dom": "18.2.7",
"@types/ws": "^8.5.10",
"payload": "workspace:*"
"css-loader": "^6.10.0",
"css-minimizer-webpack-plugin": "^6.0.0",
"mini-css-extract-plugin": "1.6.2",
"payload": "workspace:*",
"postcss-loader": "^8.1.1",
"postcss-preset-env": "^9.5.0",
"sass-loader": "^14.1.1",
"swc-loader": "^0.2.6",
"swc-plugin-transform-remove-imports": "^1.12.1",
"terser-webpack-plugin": "^5.3.10",
"webpack": "^5.78.0",
"webpack-cli": "^5.1.4"
},
"dependencies": {
"@dnd-kit/core": "6.0.8",
@@ -79,6 +91,11 @@
"main": "./dist/exports/index.js",
"types": "./dist/exports/index.d.ts",
"exports": {
"./css": {
"import": "./dist/prod/styles.css",
"require": "./dist/prod/styles.css",
"default": "./dist/prod/styles.css"
},
"./withPayload": {
"import": "./dist/withPayload.js",
"require": "./dist/withPayload.js",

View File

@@ -1,6 +1,5 @@
import type { SanitizedConfig } from 'payload/types'
import { auth } from '@payloadcms/next/utilities/auth'
import { translations } from '@payloadcms/translations/client'
import { RootProvider, buildComponentMap } from '@payloadcms/ui'
import '@payloadcms/ui/scss/app.scss'
@@ -11,6 +10,7 @@ import React from 'react'
import 'react-toastify/dist/ReactToastify.css'
import { ClearRouteCache } from '../../elements/ClearRouteCache/index.js'
import { auth } from '../../utilities/auth.js'
import { getPayload } from '../../utilities/getPayload.js'
import { getRequestLanguage } from '../../utilities/getRequestLanguage.js'
import { DefaultEditView } from '../../views/Edit/Default/index.js'
@@ -58,10 +58,11 @@ export const RootLayout = async ({
value: language,
}))
const componentMap = buildComponentMap({
const { componentMap, wrappedChildren } = buildComponentMap({
DefaultCell,
DefaultEditView,
DefaultListView,
children,
config,
permissions,
})
@@ -78,7 +79,7 @@ export const RootLayout = async ({
languageOptions={languageOptions}
translations={mergedTranslations[lang]}
>
{children}
{wrappedChildren}
</RootProvider>
<div id="portal" />
</body>

View File

@@ -1,5 +1,5 @@
@import 'fonts';
@import 'styles';
@import './fonts.scss';
@import './styles.scss';
@import './toastify.scss';
@import './colors.scss';

View File

@@ -12,6 +12,10 @@ if (!cached) {
}
export const getPayload = async (options: InitOptions): Promise<Payload> => {
if (!options?.config) {
throw new Error('Error: the payload config is required for getPayload to work.')
}
if (cached.payload) {
const config = await options.config
@@ -47,7 +51,8 @@ export const getPayload = async (options: InitOptions): Promise<Payload> => {
if (process.env.NODE_ENV !== 'production') {
try {
const ws = new WebSocket('ws://localhost:3000/_next/webpack-hmr')
const port = process.env.PORT || '3000'
const ws = new WebSocket(`ws://localhost:${port}/_next/webpack-hmr`)
ws.onmessage = (event) => {
if (typeof event.data === 'string') {

View File

@@ -13,7 +13,7 @@ import React, { Fragment, useEffect } from 'react'
import { useCallback } from 'react'
export const EditViewClient: React.FC = () => {
const { collectionSlug, getDocPermissions, getVersions, globalSlug, isEditing, setDocumentInfo } =
const { collectionSlug, getDocPermissions, getVersions, globalSlug, isEditing, setOnSave } =
useDocumentInfo()
const {
@@ -58,10 +58,8 @@ export const EditViewClient: React.FC = () => {
)
useEffect(() => {
setDocumentInfo({
onSave,
})
}, [setDocumentInfo, onSave])
setOnSave(() => onSave)
}, [setOnSave, onSave])
// Allow the `DocumentInfoProvider` to hydrate
if (!Edit || (!collectionSlug && !globalSlug)) {

View File

@@ -1,6 +1,11 @@
import type { GenerateViewMetadata } from '../Root/index.jsx'
import { meta } from '../../utilities/meta.js'
export const generateForgotPasswordMetadata = async ({ config, i18n: { t } }) => {
export const generateForgotPasswordMetadata: GenerateViewMetadata = async ({
config,
i18n: { t },
}) => {
return meta({
config,
description: t('authentication:forgotPassword'),

View File

@@ -1,9 +1,16 @@
import type { I18n } from '@payloadcms/translations'
import type { Metadata } from 'next'
import type { SanitizedConfig } from 'payload/types'
import { meta } from '../../utilities/meta.js'
export const generateNotFoundMeta = ({ config, i18n }: { config: SanitizedConfig; i18n: I18n }) => {
export const generateNotFoundMeta = ({
config,
i18n,
}: {
config: SanitizedConfig
i18n: I18n
}): Promise<Metadata> => {
return meta({
config,
description: i18n.t('general:pageNotFound'),

View File

@@ -1,3 +1,5 @@
import type { Metadata } from 'next'
import type { GenerateViewMetadata } from '../Root/index.js'
import { meta } from '../../utilities/meta.js'
@@ -5,7 +7,7 @@ import { meta } from '../../utilities/meta.js'
export const generateResetPasswordMetadata: GenerateViewMetadata = async ({
config,
i18n: { t },
}) => {
}): Promise<Metadata> => {
return meta({
config,
description: t('authentication:resetPassword'),

View File

@@ -0,0 +1,107 @@
import OptimizeCSSAssetsPlugin from 'css-minimizer-webpack-plugin'
import MiniCSSExtractPlugin from 'mini-css-extract-plugin'
import path from 'path'
import TerserJSPlugin from 'terser-webpack-plugin'
import { fileURLToPath } from 'url'
import webpack from 'webpack'
const filename = fileURLToPath(import.meta.url)
const dirname = path.dirname(filename)
const componentWebpackConfig = {
entry: path.resolve(dirname, './src/index.ts'),
externals: ['react', 'react-dom', 'payload', 'payload/config', 'react-image-crop'],
mode: 'production',
module: {
rules: [
{
oneOf: [
{
// exclude: /node_modules/,
test: /\.(t|j)sx?$/,
use: [
{
loader: 'swc-loader',
options: {
jsc: {
experimental: {
plugins: [
// clear the plugins used in .swcrc
],
},
parser: {
syntax: 'typescript',
tsx: true,
},
},
},
},
],
},
{
sideEffects: true,
test: /\.(scss|css)$/,
use: [
MiniCSSExtractPlugin.loader,
'css-loader',
{
loader: 'postcss-loader',
options: {
postcssOptions: {
plugins: ['postcss-preset-env'],
},
},
},
'sass-loader',
],
},
{
type: 'asset/resource',
generator: {
filename: 'payload/[name][ext]',
},
test: [/\.bmp$/, /\.gif$/, /\.jpe?g$/, /\.png$/, /\.svg$/, /\.woff$/, /\.woff2$/],
},
],
},
],
},
optimization: {
minimizer: [
new TerserJSPlugin({
extractComments: false,
}),
new OptimizeCSSAssetsPlugin({}),
],
},
output: {
filename: 'index.js',
libraryTarget: 'commonjs2',
path: path.resolve(dirname, './dist/prod'),
publicPath: '/',
},
plugins: [
new MiniCSSExtractPlugin({
filename: 'styles.css',
ignoreOrder: true,
}),
new webpack.optimize.LimitChunkCountPlugin({
maxChunks: 1,
}),
],
resolve: {
extensionAlias: {
'.js': ['.ts', '.tsx', '.js', '.scss', '.css'],
'.mjs': ['.mts', '.mjs'],
},
extensions: ['.js', '.ts', '.tsx', '.scss', '.css'],
modules: [
'node_modules',
path.resolve(dirname, '../../node_modules'),
path.resolve(dirname, './node_modules'),
],
},
stats: 'errors-only',
}
export default componentWebpackConfig

View File

@@ -1,6 +1,6 @@
{
"$schema": "https://json.schemastore.org/swcrc",
"sourceMaps": "inline",
"sourceMaps": true,
"jsc": {
"target": "esnext",
"parser": {

View File

@@ -1,6 +1,6 @@
{
"name": "payload",
"version": "3.0.0-alpha.35",
"version": "3.0.0-alpha.42",
"description": "Node, React and MongoDB Headless CMS and Application Framework",
"license": "MIT",
"main": "./src/index.js",

View File

@@ -90,7 +90,17 @@ export function compile(
return injectInlineSourceMap({ code: outputText, filename, map: sourceMapText })
}
const swcRegisterConfig: Options = tsCompilerOptionsToSwcConfig(options, filename)
let swcRegisterConfig: Options
if (process.env.SWCRC) {
// when SWCRC environment variable is set to true it will use swcrc file
swcRegisterConfig = {
swc: {
swcrc: true,
},
}
} else {
swcRegisterConfig = tsCompilerOptionsToSwcConfig(options, filename)
}
if (async) {
return transform(sourcecode, filename, swcRegisterConfig).then(({ code, map }) => {
@@ -106,6 +116,7 @@ export function register(options: Partial<ts.CompilerOptions> = {}, hookOpts = {
const locatedConfig = getTsconfig()
const tsconfig = locatedConfig.config.compilerOptions as unknown as ts.CompilerOptions
options = tsconfig
// options.module = ts.ModuleKind.CommonJS
installSourceMapSupport()
return addHook((code, filename) => compile(code, filename, options), {
exts: DEFAULT_EXTENSIONS,

View File

@@ -1,23 +1,35 @@
import type { Field } from '../fields/config/types.js'
import type { SanitizedCollectionConfig, SanitizedGlobalConfig } from '../exports/types.js'
import type { Field, FieldBase, RichTextField } from '../fields/config/types.js'
import type { ClientConfig, SanitizedConfig } from './types.js'
export const sanitizeField = (f) => {
export const sanitizeField = (f: Field) => {
const field = { ...f }
if ('access' in field) delete field.access
if ('hooks' in field) delete field.hooks
if ('validate' in field) delete field.validate
if ('defaultValue' in field) delete field.defaultValue
if ('label' in field) delete field.label
const serverOnlyFieldProperties: Partial<keyof FieldBase | keyof RichTextField>[] = [
'hooks',
'access',
'validate',
'defaultValue',
'label',
// This is a `richText` only property
'editor',
// `fields`
// `blocks`
// `tabs`
// `admin`
// are all handled separately
]
serverOnlyFieldProperties.forEach((key) => {
if (key in field) {
delete field[key]
}
})
if ('fields' in field) {
field.fields = sanitizeFields(field.fields)
}
if ('editor' in field) {
delete field.editor
}
if ('blocks' in field) {
field.blocks = field.blocks.map((block) => {
const sanitized = { ...block }
@@ -27,23 +39,20 @@ export const sanitizeField = (f) => {
}
if ('tabs' in field) {
// @ts-expect-error
field.tabs = field.tabs.map((tab) => sanitizeField(tab))
}
if ('admin' in field) {
field.admin = { ...field.admin }
if ('components' in field.admin) {
delete field.admin.components
}
const serverOnlyFieldAdminProperties = ['components', 'condition', 'description']
if ('condition' in field.admin) {
delete field.admin.condition
}
if ('description' in field.admin) {
delete field.admin.description
}
serverOnlyFieldAdminProperties.forEach((key) => {
if (key in field.admin) {
delete field.admin[key]
}
})
}
return field
@@ -56,11 +65,20 @@ const sanitizeCollections = (
const sanitized = { ...collection }
sanitized.fields = sanitizeFields(sanitized.fields)
delete sanitized.hooks
delete sanitized.access
delete sanitized.endpoints
const serverOnlyCollectionProperties: Partial<keyof SanitizedCollectionConfig>[] = [
'hooks',
'access',
'endpoints',
// `upload`
// `admin`
// are all handled separately
]
if ('editor' in sanitized) delete sanitized.editor
serverOnlyCollectionProperties.forEach((key) => {
if (key in sanitized) {
delete sanitized[key]
}
})
if ('upload' in sanitized && typeof sanitized.upload === 'object') {
sanitized.upload = { ...sanitized.upload }
@@ -70,17 +88,15 @@ const sanitizeCollections = (
if ('admin' in sanitized) {
sanitized.admin = { ...sanitized.admin }
if ('components' in sanitized.admin) {
delete sanitized.admin.components
}
const serverOnlyCollectionAdminProperties: Partial<
keyof SanitizedCollectionConfig['admin']
>[] = ['components', 'hidden', 'preview']
if ('hidden' in sanitized.admin) {
delete sanitized.admin.hidden
}
if ('preview' in sanitized.admin) {
delete sanitized.admin.preview
}
serverOnlyCollectionAdminProperties.forEach((key) => {
if (key in sanitized.admin) {
delete sanitized.admin[key]
}
})
}
return sanitized
@@ -90,24 +106,35 @@ const sanitizeGlobals = (globals: SanitizedConfig['globals']): ClientConfig['glo
globals.map((global) => {
const sanitized = { ...global }
sanitized.fields = sanitizeFields(sanitized.fields)
delete sanitized.hooks
delete sanitized.access
delete sanitized.endpoints
const serverOnlyProperties: Partial<keyof SanitizedGlobalConfig>[] = [
'hooks',
'access',
'endpoints',
// `admin`
// is handled separately
]
serverOnlyProperties.forEach((key) => {
if (key in sanitized) {
delete sanitized[key]
}
})
if ('admin' in sanitized) {
sanitized.admin = { ...sanitized.admin }
if ('components' in sanitized.admin) {
delete sanitized.admin.components
}
const serverOnlyProperties: Partial<keyof SanitizedGlobalConfig['admin']>[] = [
'components',
'hidden',
'preview',
]
if ('hidden' in sanitized.admin) {
delete sanitized.admin.hidden
}
if ('preview' in sanitized.admin) {
delete sanitized.admin.preview
}
serverOnlyProperties.forEach((key) => {
if (key in sanitized.admin) {
delete sanitized.admin[key]
}
})
}
return sanitized
@@ -121,17 +148,45 @@ export const createClientConfig = async (
const config = await configPromise
const clientConfig = { ...config }
delete clientConfig.endpoints
delete clientConfig.db
delete clientConfig.editor
delete clientConfig.plugins
delete clientConfig.sharp
const serverOnlyConfigProperties: Partial<keyof SanitizedConfig>[] = [
'endpoints',
'db',
'editor',
'plugins',
'sharp',
// `admin`
// `onInit`
// `localization`
// `collections`
// `globals`
// are all handled separately
]
serverOnlyConfigProperties.forEach((key) => {
if (key in clientConfig) {
delete clientConfig[key]
}
})
if ('localization' in clientConfig && clientConfig.localization) {
clientConfig.localization = { ...clientConfig.localization }
'localization' in clientConfig &&
clientConfig.localization &&
clientConfig.localization.locales.forEach((locale) => {
delete locale.toString
})
}
if ('admin' in clientConfig) {
clientConfig.admin = { ...clientConfig.admin }
const serverOnlyAdminProperties: Partial<keyof SanitizedConfig['admin']>[] = ['components']
serverOnlyAdminProperties.forEach((key) => {
if (key in clientConfig.admin) {
delete clientConfig.admin[key]
}
})
}
clientConfig.onInit = undefined

View File

@@ -465,7 +465,7 @@ export type Config = {
/**
* Wrap the admin dashboard in custom context providers
*/
providers?: React.ComponentType<{ children: React.ReactNode }>[]
providers?: React.ComponentType<{ children?: React.ReactNode }>[]
/**
* Replace or modify top-level admin routes, or add new ones:
* + `Account` - `/admin/account`
@@ -688,11 +688,17 @@ export type SanitizedConfig = Omit<
}
}
export type ClientConfig = Omit<SanitizedConfig, 'db' | 'endpoints'> & {
collections: (Omit<SanitizedCollectionConfig, 'access' | 'endpoints' | 'fields' | 'hooks'> & {
export type ClientConfig = Omit<SanitizedConfig, 'admin' | 'db' | 'endpoints'> & {
admin: Omit<SanitizedConfig['admin'], 'components'>
collections: (Omit<
SanitizedCollectionConfig,
'access' | 'admin' | 'endpoints' | 'fields' | 'hooks'
> & {
admin: Omit<SanitizedCollectionConfig['admin'], 'components'>
fields: ClientConfigField[]
})[]
globals: (Omit<SanitizedGlobalConfig, 'access' | 'endpoints' | 'fields' | 'hooks'> & {
globals: (Omit<SanitizedGlobalConfig, 'access' | 'admin' | 'endpoints' | 'fields' | 'hooks'> & {
admin: Omit<SanitizedGlobalConfig['admin'], 'components'>
fields: ClientConfigField[]
})[]
}

View File

@@ -36,9 +36,15 @@ export const readMigrationFiles = async ({
return Promise.all(
files.map(async (filePath) => {
// eval used to circumvent errors bundling
const migration = eval(`require('${filePath.replaceAll('\\', '/')}')`)
migration.name = path.basename(filePath).split('.')?.[0]
return migration
const migration = await eval(`import('${filePath.replaceAll('\\', '/')}')`)
const result: Migration = {
name: path.basename(filePath).split('.')?.[0],
down: migration.down,
up: migration.up,
}
return result
}),
)
}

View File

@@ -389,8 +389,8 @@ export type Migration = MigrationData & {
}
export type MigrationData = {
batch: number
id: string
batch?: number
id?: string
name: string
}

View File

@@ -1,4 +1,4 @@
import { translations } from '@payloadcms/translations/api'
import { extractTranslations } from 'payload/utilities'
import type { Config } from '../../config/types.js'
import type { SanitizedGlobalConfig } from './types.js'
@@ -10,6 +10,8 @@ import mergeBaseFields from '../../fields/mergeBaseFields.js'
import { toWords } from '../../utilities/formatLabels.js'
import baseVersionFields from '../../versions/baseFields.js'
const translations = extractTranslations(['general:createdAt', 'general:updatedAt'])
const sanitizeGlobals = (config: Config): SanitizedGlobalConfig[] => {
const { collections, globals } = config

View File

@@ -273,13 +273,6 @@ export class BasePayload<TGeneratedTypes extends GeneratedTypes> {
[slug: string]: any // TODO: Type this
} = {}
delete<T extends keyof TGeneratedTypes['collections']>(
options: DeleteOptions<T>,
): Promise<BulkOperationResult<T> | TGeneratedTypes['collections'][T]> {
const { deleteLocal } = localOperations
return deleteLocal<T>(this, options)
}
/**
* @description delete one or more documents
* @param options
@@ -293,12 +286,22 @@ export class BasePayload<TGeneratedTypes extends GeneratedTypes> {
options: DeleteManyOptions<T>,
): Promise<BulkOperationResult<T>>
delete<T extends keyof TGeneratedTypes['collections']>(
options: DeleteOptions<T>,
): Promise<BulkOperationResult<T> | TGeneratedTypes['collections'][T]> {
const { deleteLocal } = localOperations
return deleteLocal<T>(this, options)
}
/**
* @description Initializes Payload
* @param options
*/
// @ts-expect-error // TODO: TypeScript hallucinating again. fix later
async init(options: InitOptions): Promise<Payload> {
if (!options?.config) {
throw new Error('Error: the payload config is required to initialize payload.')
}
this.logger = Logger('payload', options.loggerOptions, options.loggerDestination)
this.config = await options.config
@@ -421,7 +424,11 @@ if (!cached) {
cached = global._payload = { payload: null, promise: null }
}
export const getPayload = async (options?: InitOptions): Promise<BasePayload<GeneratedTypes>> => {
export const getPayload = async (options: InitOptions): Promise<BasePayload<GeneratedTypes>> => {
if (!options?.config) {
throw new Error('Error: the payload config is required for getPayload to work.')
}
if (cached.payload) {
return cached.payload
}

View File

@@ -38,7 +38,6 @@ async function deleteOperation(args: PreferenceRequest): Promise<Document> {
where,
})
// @ts-expect-error // TODO: fix later
if (result.docs.length === 1) {
return result.docs[0]
}

View File

@@ -1,5 +1,7 @@
export default function isImage(mimeType: string): boolean {
return (
['image/jpeg', 'image/png', 'image/gif', 'image/svg+xml', 'image/webp'].indexOf(mimeType) > -1
['image/jpeg', 'image/png', 'image/gif', 'image/svg+xml', 'image/webp', 'image/avif'].indexOf(
mimeType,
) > -1
)
}

View File

@@ -1,6 +1,6 @@
{
"$schema": "https://json.schemastore.org/swcrc",
"sourceMaps": "inline",
"sourceMaps": true,
"jsc": {
"target": "esnext",
"parser": {

View File

@@ -1,7 +1,7 @@
{
"name": "@payloadcms/plugin-cloud-storage",
"description": "The official cloud storage plugin for Payload CMS",
"version": "3.0.0-alpha.35",
"version": "3.0.0-alpha.42",
"main": "dist/index.js",
"types": "dist/index.d.ts",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"$schema": "https://json.schemastore.org/swcrc",
"sourceMaps": "inline",
"sourceMaps": true,
"exclude": ["/**/*.spec.ts", "/**/mocks"],
"jsc": {
"target": "esnext",

View File

@@ -1,7 +1,7 @@
{
"name": "@payloadcms/plugin-cloud",
"description": "The official Payload Cloud plugin",
"version": "3.0.0-alpha.35",
"version": "3.0.0-alpha.42",
"main": "dist/index.js",
"types": "dist/index.d.ts",
"license": "MIT",

View File

@@ -1,6 +1,6 @@
{
"$schema": "https://json.schemastore.org/swcrc",
"sourceMaps": "inline",
"sourceMaps": true,
"exclude": ["/**/mocks"],
"jsc": {
"target": "esnext",

View File

@@ -18,7 +18,7 @@
"test": "echo \"No tests available.\""
},
"peerDependencies": {
"payload": "^0.18.5 || ^1.0.0 || ^2.0.0",
"payload": "workspace:*",
"react": "^16.8.0 || ^17.0.0 || ^18.0.0"
},
"dependencies": {

View File

@@ -1,4 +1,4 @@
import type { PluginConfig } from '../../../types'
import type { PluginConfig } from '../../../types.js'
const createCharge = async (beforeChangeData: any, formConfig: PluginConfig): Promise<any> => {
const { data, operation } = beforeChangeData

View File

@@ -1,8 +1,8 @@
import type { Email, FormattedEmail, PluginConfig } from '../../../types'
import type { Email, FormattedEmail, PluginConfig } from '../../../types.js'
import { serializeLexical } from '../../../utilities/lexical/serializeLexical'
import { replaceDoubleCurlys } from '../../../utilities/replaceDoubleCurlys'
import { serializeSlate } from '../../../utilities/slate/serializeSlate'
import { serializeLexical } from '../../../utilities/lexical/serializeLexical.js'
import { replaceDoubleCurlys } from '../../../utilities/replaceDoubleCurlys.js'
import { serializeSlate } from '../../../utilities/slate/serializeSlate.js'
const sendEmail = async (beforeChangeData: any, formConfig: PluginConfig): Promise<any> => {
const { data, operation, req } = beforeChangeData

View File

@@ -1,9 +1,9 @@
import type { CollectionConfig } from 'payload/types'
import type { PluginConfig } from '../../types'
import type { PluginConfig } from '../../types.js'
import createCharge from './hooks/createCharge'
import sendEmail from './hooks/sendEmail'
import createCharge from './hooks/createCharge.js'
import sendEmail from './hooks/sendEmail.js'
// all settings can be overridden by the config
export const generateSubmissionCollection = (formConfig: PluginConfig): CollectionConfig => {
@@ -31,7 +31,7 @@ export const generateSubmissionCollection = (formConfig: PluginConfig): Collecti
},
relationTo: formSlug,
required: true,
validate: async (value, { payload, req }) => {
validate: async (value, { req: { payload }, req }) => {
/* Don't run in the client side */
if (!payload) return true

View File

@@ -34,5 +34,7 @@ export const DynamicFieldSelector: React.FC<TextField> = (props) => {
}
}, [fields, getDataByPath])
// TODO: label from config is Record<string, string> | false | string
// but the FormFieldBase type has only label?: string, changing FormFieldBase breaks other ui components
return <Select {...props} options={options} />
}

View File

@@ -1,39 +1,41 @@
import type { Block, Field } from 'payload/types'
import type { FieldConfig, PaymentFieldConfig } from '../../types'
import type { FieldConfig, PaymentFieldConfig } from '../../types.js'
import { DynamicFieldSelector } from './DynamicFieldSelector'
import { DynamicPriceSelector } from './DynamicPriceSelector'
import { DynamicFieldSelector } from './DynamicFieldSelector.js'
import { DynamicPriceSelector } from './DynamicPriceSelector.js'
const name: Field = {
name: 'name',
type: 'text',
label: 'Name (lowercase, no special characters)',
required: true,
type: 'text',
}
const label: Field = {
name: 'label',
type: 'text',
label: 'Label',
localized: true,
type: 'text',
}
const required: Field = {
name: 'required',
label: 'Required',
type: 'checkbox',
label: 'Required',
}
const width: Field = {
name: 'width',
label: 'Field Width (percentage)',
type: 'number',
label: 'Field Width (percentage)',
}
const Select: Block = {
slug: 'select',
fields: [
{
type: 'row',
fields: [
{
...name,
@@ -48,9 +50,9 @@ const Select: Block = {
},
},
],
type: 'row',
},
{
type: 'row',
fields: [
{
...width,
@@ -60,42 +62,42 @@ const Select: Block = {
},
{
name: 'defaultValue',
type: 'text',
admin: {
width: '50%',
},
label: 'Default Value',
localized: true,
type: 'text',
},
],
type: 'row',
},
{
name: 'options',
type: 'array',
fields: [
{
type: 'row',
fields: [
{
name: 'label',
type: 'text',
admin: {
width: '50%',
},
label: 'Label',
localized: true,
required: true,
type: 'text',
},
{
name: 'value',
type: 'text',
admin: {
width: '50%',
},
label: 'Value',
required: true,
type: 'text',
},
],
type: 'row',
},
],
label: 'Select Attribute Options',
@@ -103,7 +105,6 @@ const Select: Block = {
plural: 'Options',
singular: 'Option',
},
type: 'array',
},
required,
],
@@ -111,12 +112,13 @@ const Select: Block = {
plural: 'Select Fields',
singular: 'Select',
},
slug: 'select',
}
const Text: Block = {
slug: 'text',
fields: [
{
type: 'row',
fields: [
{
...name,
@@ -131,9 +133,9 @@ const Text: Block = {
},
},
],
type: 'row',
},
{
type: 'row',
fields: [
{
...width,
@@ -143,15 +145,14 @@ const Text: Block = {
},
{
name: 'defaultValue',
type: 'text',
admin: {
width: '50%',
},
label: 'Default Value',
localized: true,
type: 'text',
},
],
type: 'row',
},
required,
],
@@ -159,12 +160,13 @@ const Text: Block = {
plural: 'Text Fields',
singular: 'Text',
},
slug: 'text',
}
const TextArea: Block = {
slug: 'textarea',
fields: [
{
type: 'row',
fields: [
{
...name,
@@ -179,9 +181,9 @@ const TextArea: Block = {
},
},
],
type: 'row',
},
{
type: 'row',
fields: [
{
...width,
@@ -191,15 +193,14 @@ const TextArea: Block = {
},
{
name: 'defaultValue',
type: 'text',
admin: {
width: '50%',
},
label: 'Default Value',
localized: true,
type: 'text',
},
],
type: 'row',
},
required,
],
@@ -207,12 +208,13 @@ const TextArea: Block = {
plural: 'Text Area Fields',
singular: 'Text Area',
},
slug: 'textarea',
}
const Number: Block = {
slug: 'number',
fields: [
{
type: 'row',
fields: [
{
...name,
@@ -227,9 +229,9 @@ const Number: Block = {
},
},
],
type: 'row',
},
{
type: 'row',
fields: [
{
...width,
@@ -239,14 +241,13 @@ const Number: Block = {
},
{
name: 'defaultValue',
type: 'number',
admin: {
width: '50%',
},
label: 'Default Value',
type: 'number',
},
],
type: 'row',
},
required,
],
@@ -254,12 +255,13 @@ const Number: Block = {
plural: 'Number Fields',
singular: 'Number',
},
slug: 'number',
}
const Email: Block = {
slug: 'email',
fields: [
{
type: 'row',
fields: [
{
...name,
@@ -274,7 +276,6 @@ const Email: Block = {
},
},
],
type: 'row',
},
width,
required,
@@ -283,12 +284,13 @@ const Email: Block = {
plural: 'Email Fields',
singular: 'Email',
},
slug: 'email',
}
const State: Block = {
slug: 'state',
fields: [
{
type: 'row',
fields: [
{
...name,
@@ -303,7 +305,6 @@ const State: Block = {
},
},
],
type: 'row',
},
width,
required,
@@ -312,12 +313,13 @@ const State: Block = {
plural: 'State Fields',
singular: 'State',
},
slug: 'state',
}
const Country: Block = {
slug: 'country',
fields: [
{
type: 'row',
fields: [
{
...name,
@@ -332,7 +334,6 @@ const Country: Block = {
},
},
],
type: 'row',
},
width,
required,
@@ -341,12 +342,13 @@ const Country: Block = {
plural: 'Country Fields',
singular: 'Country',
},
slug: 'country',
}
const Checkbox: Block = {
slug: 'checkbox',
fields: [
{
type: 'row',
fields: [
{
...name,
@@ -361,9 +363,9 @@ const Checkbox: Block = {
},
},
],
type: 'row',
},
{
type: 'row',
fields: [
{
...width,
@@ -378,19 +380,17 @@ const Checkbox: Block = {
},
},
],
type: 'row',
},
{
name: 'defaultValue',
label: 'Default Value',
type: 'checkbox',
label: 'Default Value',
},
],
labels: {
plural: 'Checkbox Fields',
singular: 'Checkbox',
},
slug: 'checkbox',
}
const Payment = (fieldConfig: PaymentFieldConfig): Block => {
@@ -398,16 +398,18 @@ const Payment = (fieldConfig: PaymentFieldConfig): Block => {
if (fieldConfig?.paymentProcessor) {
paymentProcessorField = {
name: 'paymentProcessor',
type: 'select',
label: 'Payment Processor',
options: [],
type: 'select',
...fieldConfig.paymentProcessor,
}
}
const fields = {
slug: 'payment',
fields: [
{
type: 'row',
fields: [
{
...name,
@@ -422,9 +424,9 @@ const Payment = (fieldConfig: PaymentFieldConfig): Block => {
},
},
],
type: 'row',
},
{
type: 'row',
fields: [
{
...width,
@@ -434,30 +436,31 @@ const Payment = (fieldConfig: PaymentFieldConfig): Block => {
},
{
name: 'basePrice',
type: 'number',
admin: {
width: '50%',
},
label: 'Base Price',
type: 'number',
},
],
type: 'row',
},
paymentProcessorField,
{
name: 'priceConditions',
type: 'array',
fields: [
{
name: 'fieldToUse',
type: 'text',
admin: {
components: {
Field: DynamicFieldSelector,
},
},
type: 'text',
},
{
name: 'condition',
type: 'select',
defaultValue: 'hasValue',
label: 'Condition',
options: [
@@ -474,19 +477,19 @@ const Payment = (fieldConfig: PaymentFieldConfig): Block => {
value: 'notEquals',
},
],
type: 'select',
},
{
name: 'valueForCondition',
type: 'text',
admin: {
condition: (_: any, { condition }: any) =>
condition === 'equals' || condition === 'notEquals',
},
label: 'Value',
type: 'text',
},
{
name: 'operator',
type: 'select',
defaultValue: 'add',
options: [
{
@@ -506,10 +509,10 @@ const Payment = (fieldConfig: PaymentFieldConfig): Block => {
value: 'divide',
},
],
type: 'select',
},
{
name: 'valueType',
type: 'radio',
admin: {
width: '100%',
},
@@ -525,17 +528,16 @@ const Payment = (fieldConfig: PaymentFieldConfig): Block => {
value: 'valueOfField',
},
],
type: 'radio',
},
{
name: 'valueForOperator',
type: 'text',
admin: {
components: {
Field: DynamicPriceSelector,
},
},
label: 'Value',
type: 'text',
},
],
label: 'Price Conditions',
@@ -543,7 +545,6 @@ const Payment = (fieldConfig: PaymentFieldConfig): Block => {
plural: 'Price Conditions',
singular: 'Price Condition',
},
type: 'array',
},
required,
].filter(Boolean) as Field[],
@@ -551,25 +552,24 @@ const Payment = (fieldConfig: PaymentFieldConfig): Block => {
plural: 'Payment Fields',
singular: 'Payment',
},
slug: 'payment',
}
return fields
}
const Message: Block = {
slug: 'message',
fields: [
{
name: 'message',
localized: true,
type: 'richText',
localized: true,
},
],
labels: {
plural: 'Message Blocks',
singular: 'Message',
},
slug: 'message',
}
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions

View File

@@ -2,14 +2,15 @@ import type { Block, CollectionConfig, Field } from 'payload/types'
import merge from 'deepmerge'
import type { FieldConfig, PluginConfig } from '../../types'
import type { FieldConfig, PluginConfig } from '../../types.js'
import { fields } from './fields'
import { fields } from './fields.js'
// all settings can be overridden by the config
export const generateFormCollection = (formConfig: PluginConfig): CollectionConfig => {
const redirect: Field = {
name: 'redirect',
type: 'group',
admin: {
condition: (_, siblingData) => siblingData?.confirmationType === 'redirect',
hideGutter: true,
@@ -17,17 +18,17 @@ export const generateFormCollection = (formConfig: PluginConfig): CollectionConf
fields: [
{
name: 'url',
type: 'text',
label: 'URL to redirect to',
required: true,
type: 'text',
},
],
type: 'group',
}
if (formConfig.redirectRelationships) {
redirect.fields.unshift({
name: 'reference',
type: 'relationship',
admin: {
condition: (_, siblingData) => siblingData?.type === 'reference',
},
@@ -35,11 +36,11 @@ export const generateFormCollection = (formConfig: PluginConfig): CollectionConf
maxDepth: 2,
relationTo: formConfig.redirectRelationships,
required: true,
type: 'relationship',
})
redirect.fields.unshift({
name: 'type',
type: 'radio',
admin: {
layout: 'horizontal',
},
@@ -54,7 +55,6 @@ export const generateFormCollection = (formConfig: PluginConfig): CollectionConf
value: 'custom',
},
],
type: 'radio',
})
if (redirect.fields[2].type !== 'row') redirect.fields[2].label = 'Custom URL'
@@ -66,6 +66,7 @@ export const generateFormCollection = (formConfig: PluginConfig): CollectionConf
const config: CollectionConfig = {
...(formConfig?.formOverrides || {}),
slug: formConfig?.formOverrides?.slug || 'forms',
access: {
read: () => true,
...(formConfig?.formOverrides?.access || {}),
@@ -78,11 +79,12 @@ export const generateFormCollection = (formConfig: PluginConfig): CollectionConf
fields: [
{
name: 'title',
required: true,
type: 'text',
required: true,
},
{
name: 'fields',
type: 'blocks',
blocks: Object.entries(formConfig?.fields || {})
.map(([fieldKey, fieldConfig]) => {
// let the config enable/disable fields with either boolean values or objects
@@ -109,15 +111,15 @@ export const generateFormCollection = (formConfig: PluginConfig): CollectionConf
return null
})
.filter(Boolean) as Block[],
type: 'blocks',
},
{
name: 'submitButtonLabel',
localized: true,
type: 'text',
localized: true,
},
{
name: 'confirmationType',
type: 'radio',
admin: {
description:
'Choose whether to display an on-page message or redirect to a different page after they submit the form.',
@@ -134,101 +136,99 @@ export const generateFormCollection = (formConfig: PluginConfig): CollectionConf
value: 'redirect',
},
],
type: 'radio',
},
{
name: 'confirmationMessage',
type: 'richText',
admin: {
condition: (_, siblingData) => siblingData?.confirmationType === 'message',
},
localized: true,
required: true,
type: 'richText',
},
redirect,
{
name: 'emails',
type: 'array',
admin: {
description:
"Send custom emails when the form submits. Use comma separated lists to send the same email to multiple recipients. To reference a value from this form, wrap that field's name with double curly brackets, i.e. {{firstName}}.",
},
fields: [
{
type: 'row',
fields: [
{
name: 'emailTo',
type: 'text',
admin: {
placeholder: '"Email Sender" <sender@email.com>',
width: '100%',
},
label: 'Email To',
type: 'text',
},
{
name: 'cc',
type: 'text',
admin: {
width: '50%',
},
label: 'CC',
type: 'text',
},
{
name: 'bcc',
type: 'text',
admin: {
width: '50%',
},
label: 'BCC',
type: 'text',
},
],
type: 'row',
},
{
type: 'row',
fields: [
{
name: 'replyTo',
type: 'text',
admin: {
placeholder: '"Reply To" <reply-to@email.com>',
width: '50%',
},
label: 'Reply To',
type: 'text',
},
{
name: 'emailFrom',
type: 'text',
admin: {
placeholder: '"Email From" <email-from@email.com>',
width: '50%',
},
label: 'Email From',
type: 'text',
},
],
type: 'row',
},
{
name: 'subject',
type: 'text',
defaultValue: "You've received a new message.",
label: 'Subject',
localized: true,
required: true,
type: 'text',
},
{
name: 'message',
type: 'richText',
admin: {
description: 'Enter the message that should be sent in this email.',
},
label: 'Message',
localized: true,
type: 'richText',
},
],
type: 'array',
},
...(formConfig?.formOverrides?.fields || []),
],
slug: formConfig?.formOverrides?.slug || 'forms',
}
return config

View File

@@ -1,6 +1,6 @@
{
"$schema": "https://json.schemastore.org/swcrc",
"sourceMaps": "inline",
"sourceMaps": true,
"jsc": {
"target": "esnext",
"parser": {

View File

@@ -1,6 +1,6 @@
{
"name": "@payloadcms/plugin-nested-docs",
"version": "1.0.12",
"version": "3.0.0-alpha.42",
"description": "The official Nested Docs plugin for Payload",
"repository": "https://github.com/payloadcms/payload",
"license": "MIT",
@@ -22,7 +22,7 @@
"payload": "workspace:*"
},
"peerDependencies": {
"payload": "^0.18.5 || ^1.0.0 || ^2.0.0"
"payload": "workspace:*"
},
"exports": {
".": {

View File

@@ -1,8 +1,8 @@
import type { CollectionAfterChangeHook, CollectionConfig, PayloadRequest } from 'payload/types'
import type { PluginConfig } from '../types'
import type { PluginConfig } from '../types.js'
import populateBreadcrumbs from '../utilities/populateBreadcrumbs'
import populateBreadcrumbs from '../utilities/populateBreadcrumbs.js'
type ResaveArgs = {
collection: CollectionConfig

View File

@@ -1,6 +1,6 @@
import type { CollectionAfterChangeHook, CollectionConfig } from 'payload/types'
import type { PluginConfig } from '../types'
import type { PluginConfig } from '../types.js'
// This hook automatically re-saves a document after it is created
// so that we can build its breadcrumbs with the newly created document's ID.

View File

@@ -1,14 +1,14 @@
import type { Plugin } from 'payload/config'
import type { SingleRelationshipField } from 'payload/types'
import type { PluginConfig } from './types'
import type { PluginConfig } from './types.js'
import createBreadcrumbsField from './fields/breadcrumbs'
import createParentField from './fields/parent'
import parentFilterOptions from './fields/parentFilterOptions'
import resaveChildren from './hooks/resaveChildren'
import resaveSelfAfterCreate from './hooks/resaveSelfAfterCreate'
import populateBreadcrumbs from './utilities/populateBreadcrumbs'
import createBreadcrumbsField from './fields/breadcrumbs.js'
import createParentField from './fields/parent.js'
import parentFilterOptions from './fields/parentFilterOptions.js'
import resaveChildren from './hooks/resaveChildren.js'
import resaveSelfAfterCreate from './hooks/resaveSelfAfterCreate.js'
import populateBreadcrumbs from './utilities/populateBreadcrumbs.js'
const nestedDocs =
(pluginConfig: PluginConfig): Plugin =>

View File

@@ -1,6 +1,6 @@
import type { CollectionConfig } from 'payload/types'
import type { Breadcrumb, PluginConfig } from '../types'
import type { Breadcrumb, PluginConfig } from '../types.js'
const formatBreadcrumb = (
pluginConfig: PluginConfig,
@@ -24,9 +24,9 @@ const formatBreadcrumb = (
}
return {
doc: lastDoc.id as string,
label,
url,
doc: lastDoc.id as string,
}
}

View File

@@ -1,6 +1,6 @@
import type { CollectionConfig } from 'payload/types'
import type { PluginConfig } from '../types'
import type { PluginConfig } from '../types.js'
const getParents = async (
req: any,

View File

@@ -1,9 +1,9 @@
import type { CollectionConfig } from 'payload/types'
import type { PluginConfig } from '../types'
import type { PluginConfig } from '../types.js'
import formatBreadcrumb from './formatBreadcrumb'
import getParents from './getParents'
import formatBreadcrumb from './formatBreadcrumb.js'
import getParents from './getParents.js'
const populateBreadcrumbs = async (
req: any,

View File

@@ -1,6 +1,6 @@
{
"$schema": "https://json.schemastore.org/swcrc",
"sourceMaps": "inline",
"sourceMaps": true,
"jsc": {
"target": "esnext",
"parser": {

View File

@@ -1,6 +1,6 @@
{
"name": "@payloadcms/plugin-redirects",
"version": "1.0.1",
"version": "3.0.0-alpha.42",
"homepage:": "https://payloadcms.com",
"repository": "git@github.com:payloadcms/plugin-redirects.git",
"description": "Redirects plugin for Payload",
@@ -27,7 +27,7 @@
"author": "dev@payloadcms.com",
"license": "MIT",
"peerDependencies": {
"payload": "^0.18.5 || ^1.0.0 || ^2.0.0"
"payload": "workspace:*"
},
"devDependencies": {
"@payloadcms/eslint-config": "workspace:*",

View File

@@ -1,8 +1,8 @@
import type { Config } from 'payload/config'
import type { PluginConfig } from './types'
import type { PluginConfig } from './types.js'
import deepMerge from './deepMerge'
import deepMerge from './deepMerge.js'
const redirects =
(pluginConfig: PluginConfig) =>
@@ -12,6 +12,7 @@ const redirects =
...(incomingConfig?.collections || []),
deepMerge(
{
slug: 'redirects',
access: {
read: (): boolean => true,
},
@@ -21,16 +22,18 @@ const redirects =
fields: [
{
name: 'from',
type: 'text',
index: true,
label: 'From URL',
required: true,
type: 'text',
},
{
name: 'to',
type: 'group',
fields: [
{
name: 'type',
type: 'radio',
admin: {
layout: 'horizontal',
},
@@ -46,33 +49,30 @@ const redirects =
value: 'custom',
},
],
type: 'radio',
},
{
name: 'reference',
type: 'relationship',
admin: {
condition: (_, siblingData) => siblingData?.type === 'reference',
},
label: 'Document to redirect to',
relationTo: pluginConfig?.collections || [],
required: true,
type: 'relationship',
},
{
name: 'url',
type: 'text',
admin: {
condition: (_, siblingData) => siblingData?.type === 'custom',
},
label: 'Custom URL',
required: true,
type: 'text',
},
],
label: false,
type: 'group',
},
],
slug: 'redirects',
},
pluginConfig?.overrides || {},
),

View File

@@ -1,6 +1,6 @@
{
"$schema": "https://json.schemastore.org/swcrc",
"sourceMaps": "inline",
"sourceMaps": true,
"jsc": {
"target": "esnext",
"parser": {

View File

@@ -1,6 +1,6 @@
{
"name": "@payloadcms/plugin-search",
"version": "1.1.0",
"version": "3.0.0-alpha.42",
"homepage:": "https://payloadcms.com",
"repository": "git@github.com:payloadcms/plugin-search.git",
"description": "Search plugin for Payload",
@@ -27,12 +27,12 @@
"author": "dev@trbl.design",
"license": "MIT",
"peerDependencies": {
"payload": "^0.18.5 || ^1.0.0 || ^2.0.0",
"payload": "workspace:*",
"react": "^16.8.0 || ^17.0.0 || ^18.0.0"
},
"dependencies": {
"@payloadcms/ui": "workspace:*",
"ts-deepmerge": "^2.0.1"
"deepmerge": "4.3.1"
},
"devDependencies": {
"@payloadcms/eslint-config": "workspace:*",

View File

@@ -1,4 +1,4 @@
import type { DocToSync, SearchConfig, SyncWithSearch } from '../../types'
import type { DocToSync, SearchConfig, SyncWithSearch } from '../../types.js'
const syncWithSearch: SyncWithSearch = async (args) => {
const {

View File

@@ -1,15 +1,16 @@
import type { CollectionConfig } from 'payload/types'
import deepMerge from 'ts-deepmerge'
import deepMerge from 'deepmerge'
import type { SearchConfig } from '../types'
import type { SearchConfig } from '../types.js'
import { LinkToDoc } from './ui'
import { LinkToDoc } from './ui/index.js'
// all settings can be overridden by the config
export const generateSearchCollection = (searchConfig: SearchConfig): CollectionConfig =>
deepMerge(
{
slug: 'search',
access: {
create: (): boolean => false,
read: (): boolean => true,
@@ -24,20 +25,21 @@ export const generateSearchCollection = (searchConfig: SearchConfig): Collection
fields: [
{
name: 'title',
type: 'text',
admin: {
readOnly: true,
},
type: 'text',
},
{
name: 'priority',
type: 'number',
admin: {
position: 'sidebar',
},
type: 'number',
},
{
name: 'doc',
type: 'relationship',
admin: {
position: 'sidebar',
readOnly: true,
@@ -46,24 +48,22 @@ export const generateSearchCollection = (searchConfig: SearchConfig): Collection
maxDepth: 0,
relationTo: searchConfig?.collections || [],
required: true,
type: 'relationship',
},
{
name: 'docUrl',
type: 'ui',
admin: {
components: {
Field: LinkToDoc,
},
position: 'sidebar',
},
type: 'ui',
},
],
labels: {
plural: 'Search Results',
singular: 'Search Result',
},
slug: 'search',
},
searchConfig?.searchOverrides || {},
)

View File

@@ -1,5 +1,4 @@
import type { FormState } from '@payloadcms/ui'
import type { UIField } from 'payload/types'
import type { FormState, UIField } from 'payload/types'
import { useConfig, useWatchForm } from '@payloadcms/ui'
import React from 'react'

View File

@@ -1,10 +1,10 @@
import type { Config } from 'payload/config'
import type { SearchConfig } from './types'
import type { SearchConfig } from './types.js'
import { generateSearchCollection } from './Search'
import deleteFromSearch from './Search/hooks/deleteFromSearch'
import syncWithSearch from './Search/hooks/syncWithSearch'
import deleteFromSearch from './Search/hooks/deleteFromSearch.js'
import syncWithSearch from './Search/hooks/syncWithSearch.js'
import { generateSearchCollection } from './Search/index.js'
const Search =
(incomingSearchConfig: SearchConfig) =>

View File

@@ -1,6 +1,6 @@
{
"$schema": "https://json.schemastore.org/swcrc",
"sourceMaps": "inline",
"sourceMaps": true,
"exclude": ["/**/*.spec.ts"],
"jsc": {
"target": "esnext",

View File

@@ -28,7 +28,7 @@
"dist"
],
"peerDependencies": {
"payload": "^1.10.1 || ^2.0.0",
"payload": "workspace:*",
"react": "^16.8.0 || ^17.0.0 || ^18.0.0"
},
"dependencies": {

View File

@@ -1,6 +1,6 @@
{
"$schema": "https://json.schemastore.org/swcrc",
"sourceMaps": "inline",
"sourceMaps": true,
"jsc": {
"target": "esnext",
"parser": {

View File

@@ -1,6 +1,6 @@
{
"name": "@payloadcms/plugin-seo",
"version": "3.0.0-alpha.35",
"version": "3.0.0-alpha.42",
"homepage:": "https://payloadcms.com",
"repository": "git@github.com:payloadcms/plugin-seo.git",
"description": "SEO plugin for Payload",

View File

@@ -1,6 +1,6 @@
{
"$schema": "https://json.schemastore.org/swcrc",
"sourceMaps": "inline",
"sourceMaps": true,
"jsc": {
"target": "esnext",
"parser": {

View File

@@ -29,7 +29,7 @@
"author": "dev@payloadcms.com",
"license": "MIT",
"peerDependencies": {
"payload": "^1.1.8 || ^2.0.0"
"payload": "workspace:*"
},
"dependencies": {
"@payloadcms/ui": "workspace:*",

View File

@@ -1,6 +1,6 @@
{
"$schema": "https://json.schemastore.org/swcrc",
"sourceMaps": "inline",
"sourceMaps": true,
"jsc": {
"target": "esnext",
"parser": {

View File

@@ -1,6 +1,6 @@
{
"name": "@payloadcms/richtext-lexical",
"version": "3.0.0-alpha.35",
"version": "3.0.0-alpha.42",
"description": "The officially supported Lexical richtext adapter for Payload",
"repository": "https://github.com/payloadcms/payload",
"license": "MIT",

View File

@@ -1,6 +1,6 @@
{
"$schema": "https://json.schemastore.org/swcrc",
"sourceMaps": "inline",
"sourceMaps": true,
"jsc": {
"target": "esnext",
"parser": {

View File

@@ -1,6 +1,6 @@
{
"name": "@payloadcms/richtext-slate",
"version": "3.0.0-alpha.35",
"version": "3.0.0-alpha.42",
"description": "The officially supported Slate richtext adapter for Payload",
"repository": "https://github.com/payloadcms/payload",
"license": "MIT",

View File

@@ -1,6 +1,6 @@
{
"$schema": "https://json.schemastore.org/swcrc",
"sourceMaps": "inline",
"sourceMaps": true,
"jsc": {
"target": "esnext",
"parser": {

View File

@@ -1,6 +1,6 @@
{
"name": "@payloadcms/translations",
"version": "3.0.0-alpha.35",
"version": "3.0.0-alpha.42",
"main": "./dist/exports/index.ts",
"types": "./dist/types.d.ts",
"type": "module",

View File

@@ -0,0 +1,87 @@
export default {
authentication: {
account: 'الحساب',
apiKey: 'مفتاح API',
enableAPIKey: 'تفعيل مفتاح API',
newAccountCreated:
'تمّ إنشاء حساب جديد لتتمكّن من الوصول إلى <a href="{{serverURL}}"> {{serverURL}} </a> الرّجاء النّقر فوق الرّابط التّالي أو لصق عنوان URL أدناه في متصفّحّك لتأكيد بريدك الإلكتروني : <a href="{{verificationURL}}"> {{verificationURL}} </a> <br> بعد التّحقّق من بريدك الإلكتروني ، ستتمكّن من تسجيل الدّخول بنجاح.',
resetYourPassword: 'إعادة تعيين كلمة المرور الخاصّة بك',
verified: 'تمّ التحقّق',
verifyYourEmail: 'قم بتأكيد بريدك الألكتروني',
youAreReceivingResetPassword:
'أنت تتلقّى هذا البريد الالكتروني لأنّك (أو لأنّ شخص آخر) طلبت إعادة تعيين كلمة المرور لحسابك. الرّجاء النّقر فوق الرّابط التّالي ، أو لصق هذا الرّابط في متصفّحك لإكمال العمليّة:',
youDidNotRequestPassword:
'إن لم تطلب هذا ، يرجى تجاهل هذا البريد الإلكتروني وستبقى كلمة مرورك ذاتها بدون تغيير.',
},
error: {
deletingFile: 'حدث خطأ أثناء حذف الملف.',
emailOrPasswordIncorrect: 'البريد الإلكتروني أو كلمة المرور المقدمة غير صحيحة.',
followingFieldsInvalid_one: 'الحقل التالي غير صالح:',
followingFieldsInvalid_other: 'الحقول التالية غير صالحة:',
noFilesUploaded: 'لم يتمّ رفع أيّة ملفّات.',
notAllowedToPerformAction: 'لا يسمح لك القيام بهذه العمليّة.',
problemUploadingFile: 'حدث خطأ اثناء رفع الملفّ.',
unableToDeleteCount: 'يتعذّر حذف {{count}} من {{total}} {{label}}.',
unableToUpdateCount: 'يتعذّر تحديث {{count}} من {{total}} {{label}}.',
unauthorized: 'غير مصرّح لك ، عليك أن تقوم بتسجيل الدّخول لتتمكّن من تقديم هذا الطّلب.',
userLocked: 'تمّ قفل هذا المستخدم نظرًا لوجود عدد كبير من محاولات تسجيل الدّخول الغير ناجحة.',
valueMustBeUnique: 'على القيمة أن تكون فريدة',
},
fields: {
chooseBetweenCustomTextOrDocument: 'اختر بين إدخال عنوان URL نصّي مخصّص أو الرّبط بمستند آخر.',
chooseDocumentToLink: 'اختر مستندًا للربط',
customURL: 'URL مخصّص',
enterURL: 'ادخل عنوان URL',
internalLink: 'رابط داخلي',
linkType: 'نوع الرّابط',
openInNewTab: 'الفتح في علامة تبويب جديدة',
textToDisplay: 'النصّ الذي تريد إظهاره',
},
general: {
createdAt: 'تمّ الإنشاء في',
deletedCountSuccessfully: 'تمّ حذف {{count}} {{label}} بنجاح.',
deletedSuccessfully: 'تمّ الحذف بنجاح.',
email: 'البريد الإلكتروني',
notFound: 'غير موجود',
successfullyCreated: '{{label}} تم إنشاؤها بنجاح.',
thisLanguage: 'العربية',
updatedAt: 'تم التحديث في',
updatedCountSuccessfully: 'تم تحديث {{count}} {{label}} بنجاح.',
updatedSuccessfully: 'تم التحديث بنجاح.',
user: 'المستخدم',
users: 'المستخدمين',
value: 'القيمة',
},
upload: {
fileName: 'اسم الملفّ',
fileSize: 'حجم الملفّ',
height: 'الطّول',
sizes: 'الاحجام',
width: 'العرض',
},
validation: {
emailAddress: 'يرجى إدخال عنوان بريد إلكتروني صحيح.',
enterNumber: 'يرجى إدخال رقم صحيح.',
greaterThanMax: '{{value}} أكبر من الحد الأقصى المسموح به {{label}} الذي يبلغ {{max}}.',
invalidInput: 'هذا الحقل لديه إدخال غير صالح.',
invalidSelection: 'هذا الحقل لديه اختيار غير صالح.',
invalidSelections: 'هذا الحقل لديه الاختيارات الغير صالحة التالية:',
lessThanMin: '{{value}} أقل من الحد الأدنى المسموح به {{label}} الذي يبلغ {{min}}.',
longerThanMin: 'يجب أن يكون هذا القيمة أطول من الحد الأدنى للطول الذي هو {{minLength}} أحرف.',
notValidDate: '"{{value}}" ليس تاريخا صالحا.',
required: 'هذا الحقل مطلوب.',
requiresNoMoreThan: 'هذا الحقل يتطلب عدم تجاوز {{count}} {{label}}.',
requiresTwoNumbers: 'هذا الحقل يتطلب رقمين.',
shorterThanMax: 'يجب أن تكون هذه القيمة أقصر من الحد الأقصى للطول الذي هو {{maxLength}} أحرف.',
trueOrFalse: 'يمكن أن يكون هذا الحقل مساويًا فقط للقيمتين صحيح أو خطأ.',
validUploadID: 'هذا الحقل ليس معرّف تحميل صالح.',
},
version: {
autosavedSuccessfully: 'تمّ الحفظ التّلقائي بنجاح.',
draft: 'مسودّة',
draftSavedSuccessfully: 'تمّ حفظ المسودّة بنجاح.',
published: 'تمّ النّشر',
restoredSuccessfully: 'تمّت الاستعادة بنحاح.',
status: 'الحالة',
},
}

View File

@@ -1,85 +0,0 @@
{
"$schema": "./translation-schema.json",
"authentication": {
"account": "الحساب",
"apiKey": "مفتاح API",
"enableAPIKey": "تفعيل مفتاح API",
"newAccountCreated": "تمّ إنشاء حساب جديد لتتمكّن من الوصول إلى <a href=\"{{serverURL}}\"> {{serverURL}} </a> الرّجاء النّقر فوق الرّابط التّالي أو لصق عنوان URL أدناه في متصفّحّك لتأكيد بريدك الإلكتروني : <a href=\"{{verificationURL}}\"> {{verificationURL}} </a> <br> بعد التّحقّق من بريدك الإلكتروني ، ستتمكّن من تسجيل الدّخول بنجاح.",
"resetYourPassword": "إعادة تعيين كلمة المرور الخاصّة بك",
"verified": "تمّ التحقّق",
"verifyYourEmail": "قم بتأكيد بريدك الألكتروني",
"youAreReceivingResetPassword": "أنت تتلقّى هذا البريد الالكتروني لأنّك (أو لأنّ شخص آخر) طلبت إعادة تعيين كلمة المرور لحسابك. الرّجاء النّقر فوق الرّابط التّالي ، أو لصق هذا الرّابط في متصفّحك لإكمال العمليّة:",
"youDidNotRequestPassword": "إن لم تطلب هذا ، يرجى تجاهل هذا البريد الإلكتروني وستبقى كلمة مرورك ذاتها بدون تغيير."
},
"error": {
"deletingFile": "حدث خطأ أثناء حذف الملف.",
"emailOrPasswordIncorrect": "البريد الإلكتروني أو كلمة المرور المقدمة غير صحيحة.",
"followingFieldsInvalid_one": "الحقل التالي غير صالح:",
"followingFieldsInvalid_other": "الحقول التالية غير صالحة:",
"noFilesUploaded": "لم يتمّ رفع أيّة ملفّات.",
"notAllowedToPerformAction": "لا يسمح لك القيام بهذه العمليّة.",
"problemUploadingFile": "حدث خطأ اثناء رفع الملفّ.",
"unableToDeleteCount": "يتعذّر حذف {{count}} من {{total}} {{label}}.",
"unableToUpdateCount": "يتعذّر تحديث {{count}} من {{total}} {{label}}.",
"unauthorized": "غير مصرّح لك ، عليك أن تقوم بتسجيل الدّخول لتتمكّن من تقديم هذا الطّلب.",
"userLocked": "تمّ قفل هذا المستخدم نظرًا لوجود عدد كبير من محاولات تسجيل الدّخول الغير ناجحة.",
"valueMustBeUnique": "على القيمة أن تكون فريدة"
},
"fields": {
"chooseBetweenCustomTextOrDocument": "اختر بين إدخال عنوان URL نصّي مخصّص أو الرّبط بمستند آخر.",
"chooseDocumentToLink": "اختر مستندًا للربط",
"customURL": "URL مخصّص",
"enterURL": "ادخل عنوان URL",
"internalLink": "رابط داخلي",
"linkType": "نوع الرّابط",
"openInNewTab": "الفتح في علامة تبويب جديدة",
"textToDisplay": "النصّ الذي تريد إظهاره"
},
"general": {
"createdAt": "تمّ الإنشاء في",
"deletedCountSuccessfully": "تمّ حذف {{count}} {{label}} بنجاح.",
"deletedSuccessfully": "تمّ الحذف بنجاح.",
"email": "البريد الإلكتروني",
"notFound": "غير موجود",
"successfullyCreated": "{{label}} تم إنشاؤها بنجاح.",
"thisLanguage": "العربية",
"updatedAt": "تم التحديث في",
"updatedCountSuccessfully": "تم تحديث {{count}} {{label}} بنجاح.",
"updatedSuccessfully": "تم التحديث بنجاح.",
"user": "المستخدم",
"users": "المستخدمين",
"value": "القيمة"
},
"upload": {
"fileName": "اسم الملفّ",
"fileSize": "حجم الملفّ",
"height": "الطّول",
"sizes": "الاحجام",
"width": "العرض"
},
"validation": {
"emailAddress": "يرجى إدخال عنوان بريد إلكتروني صحيح.",
"enterNumber": "يرجى إدخال رقم صحيح.",
"greaterThanMax": "{{value}} أكبر من الحد الأقصى المسموح به {{label}} الذي يبلغ {{max}}.",
"invalidInput": "هذا الحقل لديه إدخال غير صالح.",
"invalidSelection": "هذا الحقل لديه اختيار غير صالح.",
"invalidSelections": "هذا الحقل لديه الاختيارات الغير صالحة التالية:",
"lessThanMin": "{{value}} أقل من الحد الأدنى المسموح به {{label}} الذي يبلغ {{min}}.",
"longerThanMin": "يجب أن يكون هذا القيمة أطول من الحد الأدنى للطول الذي هو {{minLength}} أحرف.",
"notValidDate": "\"{{value}}\" ليس تاريخا صالحا.",
"required": "هذا الحقل مطلوب.",
"requiresNoMoreThan": "هذا الحقل يتطلب عدم تجاوز {{count}} {{label}}.",
"requiresTwoNumbers": "هذا الحقل يتطلب رقمين.",
"shorterThanMax": "يجب أن تكون هذه القيمة أقصر من الحد الأقصى للطول الذي هو {{maxLength}} أحرف.",
"trueOrFalse": "يمكن أن يكون هذا الحقل مساويًا فقط للقيمتين صحيح أو خطأ.",
"validUploadID": "هذا الحقل ليس معرّف تحميل صالح."
},
"version": {
"autosavedSuccessfully": "تمّ الحفظ التّلقائي بنجاح.",
"draft": "مسودّة",
"draftSavedSuccessfully": "تمّ حفظ المسودّة بنجاح.",
"published": "تمّ النّشر",
"restoredSuccessfully": "تمّت الاستعادة بنحاح.",
"status": "الحالة"
}
}

View File

@@ -0,0 +1,89 @@
export default {
authentication: {
account: 'Hesab',
apiKey: 'API Açarı',
enableAPIKey: 'API açarını aktivləşdir',
newAccountCreated:
'Sizin üçün yeni hesab yaradıldı. Zəhmət olmasa, e-poçtunuzu doğrulamaq üçün aşağıdakı linke klikləyin: <a href="{{verificationURL}}">{{verificationURL}}</a>. E-poçtunuzu doğruladıqdan sonra uğurla daxil ola bilərsiniz.',
resetYourPassword: 'Şifrənizi sıfırlayın',
verified: 'Doğrulanmış',
verifyYourEmail: 'E-poçtunuzu doğrulayın',
youAreReceivingResetPassword:
'Siz (və ya başqası) hesabınız üçün parolun sıfırlanmasını tələb etdiyiniz üçün bunu alırsınız. Prosesi tamamlamaq üçün zəhmət olmasa aşağıdakı linkə klikləyin:',
youDidNotRequestPassword:
'Əgər siz bunu tələb etməmisinizsə, lütfən, bu e-poçtu nəzərə almayın və şifrəniz dəyişilməz qalacaq.',
},
error: {
deletingFile: 'Faylın silinməsində xəta baş verdi.',
emailOrPasswordIncorrect: 'Təqdim olunan e-poçt və ya şifrə yanlışdır.',
followingFieldsInvalid_many: 'Aşağıdakı sahələr yanlışdır:',
followingFieldsInvalid_one: 'Aşağıdakı sahə yanlışdır:',
followingFieldsInvalid_other: 'Aşağıdaki sahələr yanlışdır:',
noFilesUploaded: 'Heç bir fayl yüklənilməyib.',
notAllowedToPerformAction: 'Bu əməliyyatı icra etməyə icazəniz yoxdur.',
problemUploadingFile: 'Faylın yüklənməsi zamanı problem yarandı.',
unableToDeleteCount: '{{count}} dən {{total}} {{label}} silinə bilmir.',
unableToUpdateCount: '{{count}} dən {{total}} {{label}} yenilənə bilmir.',
unauthorized: 'İcazəniz yoxdur, bu tələbi yerinə yetirmək üçün daxil olmalısınız.',
userLocked: 'Bu istifadəçi çoxsaylı uğursuz giriş cəhdləri səbəbindən kilidlənib.',
valueMustBeUnique: 'Dəyər təkrar olmamalıdır',
},
fields: {
chooseBetweenCustomTextOrDocument:
"Xüsusi mətn URL'si daxil etmək və ya başqa bir sənədə keçid yaratmaq arasında seçim edin.",
chooseDocumentToLink: 'Keçid yaratmaq üçün sənəd seçin',
customURL: 'Xüsusi URL',
enterURL: 'URL daxil edin',
internalLink: 'Daxili Keçid',
linkType: 'Keçid Növü',
openInNewTab: 'Yeni sekmede aç',
textToDisplay: 'Göstəriləcək mətn',
},
general: {
createdAt: 'Yaradıldığı tarix',
deletedCountSuccessfully: '{{count}} {{label}} uğurla silindi.',
deletedSuccessfully: 'Uğurla silindi.',
email: 'Elektron poçt',
notFound: 'Tapılmadı',
successfullyCreated: '{{label}} uğurla yaradıldı.',
thisLanguage: 'Azərbaycan dili',
updatedAt: 'Yeniləndiyi tarix',
updatedCountSuccessfully: '{{count}} {{label}} uğurla yeniləndi.',
updatedSuccessfully: 'Uğurla yeniləndi.',
user: 'İstifadəçi',
users: 'İstifadəçilər',
value: 'Dəyər',
},
upload: {
fileName: 'Faylın Adı',
fileSize: 'Faylım Ölçüsü',
height: 'Hündürlük',
sizes: 'Ölçülər',
width: 'En',
},
validation: {
emailAddress: 'Xahiş edirik doğru elektron poçt ünvanını daxil edin.',
enterNumber: 'Xahiş edirik doğru nömrəni daxil edin.',
greaterThanMax: '{{value}} icazə verilən maksimal {{label}} olan {{max}}-dən böyükdür.',
invalidInput: 'Bu sahə yanlış daxil edilmişdir.',
invalidSelection: 'Bu sahədə yanlış seçim edilmişdir.',
invalidSelections: 'Bu sahədə aşağıdakı yanlış seçimlər edilmişdir:',
lessThanMin: '{{value}} icazə verilən minimal {{label}} olan {{min}}-dən kiçikdir.',
longerThanMin: 'Bu dəyər {{minLength}} simvoldan uzun olmalıdır.',
notValidDate: '"{{value}}" doğru tarix deyil.',
required: 'Bu sahə mütləq doldurulmalıdır.',
requiresNoMoreThan: 'Bu sahə {{count}} {{label}}-dan çox olmamalıdır.',
requiresTwoNumbers: 'Bu sahə iki nömrə tələb edir.',
shorterThanMax: 'Bu dəyər {{maxLength}} simvoldan qısa olmalıdır.',
trueOrFalse: 'Bu sahə yalnız doğru və ya yanlış ola bilər.',
validUploadID: 'Bu sahə doğru yükləmə ID-si deyil.',
},
version: {
autosavedSuccessfully: 'Uğurla avtomatik olaraq yadda saxlandı.',
draft: 'Qaralama',
draftSavedSuccessfully: 'Qaralama uğurla yadda saxlandı.',
published: 'Dərc edilmiş',
restoredSuccessfully: 'Uğurla bərpa edildi.',
status: 'Status',
},
}

View File

@@ -1,86 +0,0 @@
{
"$schema": "./translation-schema.json",
"authentication": {
"account": "Hesab",
"apiKey": "API Açarı",
"enableAPIKey": "API açarını aktivləşdir",
"newAccountCreated": "Sizin üçün yeni hesab yaradıldı. Zəhmət olmasa, e-poçtunuzu doğrulamaq üçün aşağıdakı linke klikləyin: <a href=\"{{verificationURL}}\">{{verificationURL}}</a>. E-poçtunuzu doğruladıqdan sonra uğurla daxil ola bilərsiniz.",
"resetYourPassword": "Şifrənizi sıfırlayın",
"verified": "Doğrulanmış",
"verifyYourEmail": "E-poçtunuzu doğrulayın",
"youAreReceivingResetPassword": "Siz (və ya başqası) hesabınız üçün parolun sıfırlanmasını tələb etdiyiniz üçün bunu alırsınız. Prosesi tamamlamaq üçün zəhmət olmasa aşağıdakı linkə klikləyin:",
"youDidNotRequestPassword": "Əgər siz bunu tələb etməmisinizsə, lütfən, bu e-poçtu nəzərə almayın və şifrəniz dəyişilməz qalacaq."
},
"error": {
"deletingFile": "Faylın silinməsində xəta baş verdi.",
"emailOrPasswordIncorrect": "Təqdim olunan e-poçt və ya şifrə yanlışdır.",
"followingFieldsInvalid_many": "Aşağıdakı sahələr yanlışdır:",
"followingFieldsInvalid_one": "Aşağıdakı sahə yanlışdır:",
"followingFieldsInvalid_other": "Aşağıdaki sahələr yanlışdır:",
"noFilesUploaded": "Heç bir fayl yüklənilməyib.",
"notAllowedToPerformAction": "Bu əməliyyatı icra etməyə icazəniz yoxdur.",
"problemUploadingFile": "Faylın yüklənməsi zamanı problem yarandı.",
"unableToDeleteCount": "{{count}} dən {{total}} {{label}} silinə bilmir.",
"unableToUpdateCount": "{{count}} dən {{total}} {{label}} yenilənə bilmir.",
"unauthorized": "İcazəniz yoxdur, bu tələbi yerinə yetirmək üçün daxil olmalısınız.",
"userLocked": "Bu istifadəçi çoxsaylı uğursuz giriş cəhdləri səbəbindən kilidlənib.",
"valueMustBeUnique": "Dəyər təkrar olmamalıdır"
},
"fields": {
"chooseBetweenCustomTextOrDocument": "Xüsusi mətn URL'si daxil etmək və ya başqa bir sənədə keçid yaratmaq arasında seçim edin.",
"chooseDocumentToLink": "Keçid yaratmaq üçün sənəd seçin",
"customURL": "Xüsusi URL",
"enterURL": "URL daxil edin",
"internalLink": "Daxili Keçid",
"linkType": "Keçid Növü",
"openInNewTab": "Yeni sekmede aç",
"textToDisplay": "Göstəriləcək mətn"
},
"general": {
"createdAt": "Yaradıldığı tarix",
"deletedCountSuccessfully": "{{count}} {{label}} uğurla silindi.",
"deletedSuccessfully": "Uğurla silindi.",
"email": "Elektron poçt",
"notFound": "Tapılmadı",
"successfullyCreated": "{{label}} uğurla yaradıldı.",
"thisLanguage": "Azərbaycan dili",
"updatedAt": "Yeniləndiyi tarix",
"updatedCountSuccessfully": "{{count}} {{label}} uğurla yeniləndi.",
"updatedSuccessfully": "Uğurla yeniləndi.",
"user": "İstifadəçi",
"users": "İstifadəçilər",
"value": "Dəyər"
},
"upload": {
"fileName": "Faylın Adı",
"fileSize": "Faylım Ölçüsü",
"height": "Hündürlük",
"sizes": "Ölçülər",
"width": "En"
},
"validation": {
"emailAddress": "Xahiş edirik doğru elektron poçt ünvanını daxil edin.",
"enterNumber": "Xahiş edirik doğru nömrəni daxil edin.",
"greaterThanMax": "{{value}} icazə verilən maksimal {{label}} olan {{max}}-dən böyükdür.",
"invalidInput": "Bu sahə yanlış daxil edilmişdir.",
"invalidSelection": "Bu sahədə yanlış seçim edilmişdir.",
"invalidSelections": "Bu sahədə aşağıdakı yanlış seçimlər edilmişdir:",
"lessThanMin": "{{value}} icazə verilən minimal {{label}} olan {{min}}-dən kiçikdir.",
"longerThanMin": "Bu dəyər {{minLength}} simvoldan uzun olmalıdır.",
"notValidDate": "\"{{value}}\" doğru tarix deyil.",
"required": "Bu sahə mütləq doldurulmalıdır.",
"requiresNoMoreThan": "Bu sahə {{count}} {{label}}-dan çox olmamalıdır.",
"requiresTwoNumbers": "Bu sahə iki nömrə tələb edir.",
"shorterThanMax": "Bu dəyər {{maxLength}} simvoldan qısa olmalıdır.",
"trueOrFalse": "Bu sahə yalnız doğru və ya yanlış ola bilər.",
"validUploadID": "Bu sahə doğru yükləmə ID-si deyil."
},
"version": {
"autosavedSuccessfully": "Uğurla avtomatik olaraq yadda saxlandı.",
"draft": "Qaralama",
"draftSavedSuccessfully": "Qaralama uğurla yadda saxlandı.",
"published": "Dərc edilmiş",
"restoredSuccessfully": "Uğurla bərpa edildi.",
"status": "Status"
}
}

View File

@@ -0,0 +1,90 @@
export default {
authentication: {
account: 'Профил',
apiKey: 'API ключ',
enableAPIKey: 'Активирай API ключ',
newAccountCreated:
'Току-що беше създаден нов профил за достъп до <a href="{{serverURL}}">{{serverURL}}</a> Моля, въведи връзката в браузъра си, за да потвърдиш имейла си: <a href="{{verificationURL}}">{{verificationURL}}</a><br> След като потвърдиш имейла си, ще можеш да влезеш успешно.',
resetYourPassword: 'Възстанови паролата си',
verified: 'Потвърден',
verifyYourEmail: 'Потвърди имейла си',
youAreReceivingResetPassword:
'Получаваш това, защото ти (или някой друг) е заявил възстановяване на паролата. Натисни връзката или постави това в браузъра си, за да довършиш процеса:',
youDidNotRequestPassword:
'Ако не си заявил това, игнорирай този имейл и паролата ти ще остане непроменена.',
},
error: {
deletingFile: 'Имаше грешка при изтриването на файла.',
emailOrPasswordIncorrect: 'Имейлът или паролата не са правилни.',
followingFieldsInvalid_one: 'Следното поле е некоректно:',
followingFieldsInvalid_other: 'Следните полета са некоректни:',
noFilesUploaded: 'Никакви файлове не бяха качени.',
notAllowedToPerformAction: 'Нямаш право да извършиш това действие.',
problemUploadingFile: 'Имаше проблем при качването на файла.',
unableToDeleteCount: 'Не беше възможно да се изтрият {{count}} от {{total}} {{label}}.',
unableToUpdateCount: 'Не беше възможно да се обновят {{count}} от {{total}} {{label}}.',
unauthorized: 'Неавторизиран, трябва да влезеш, за да извършиш тази заявка.',
userLocked: 'Този потребител има прекалено много невалидни опити за влизане и е заключен.',
valueMustBeUnique: 'Стойността трябва да е уникална',
},
fields: {
chooseBetweenCustomTextOrDocument:
'Избери между това да въведеш текстова връзка или да свържеш с друг документ.',
chooseDocumentToLink: 'Избери документ, с който да свържеш',
customURL: 'Връзка',
enterURL: 'Въведи връзка',
internalLink: 'Вътрешна връзка',
linkType: 'Тип на връзката',
openInNewTab: 'Отвори в нов раздел',
textToDisplay: 'Текст към дисплей',
},
general: {
createdAt: 'Създаден на',
deletedCountSuccessfully: 'Изтрити {{count}} {{label}} успешно.',
deletedSuccessfully: 'Изтрито успешно.',
email: 'Имейл',
notFound: 'Няма открит',
successfullyCreated: '{{label}} успешно създаден.',
thisLanguage: 'Български',
updatedAt: 'Обновен на',
updatedCountSuccessfully: 'Обновени {{count}} {{label}} успешно.',
updatedSuccessfully: 'Обновен успешно.',
user: 'Потребител',
users: 'Потребители',
value: 'Стойност',
},
upload: {
fileName: 'Име на файла',
fileSize: 'Големина на файла',
height: 'Височина',
sizes: 'Големини',
width: 'Ширина',
},
validation: {
emailAddress: 'Моля, въведи валиден имейл адрес.',
enterNumber: 'Моля, въведи валиден номер.',
greaterThanMax: '{{value}} е по-голямо от максимално допустимото {{label}} от {{max}}.',
invalidInput: 'Това поле има невалиден вход.',
invalidSelection: 'Това поле има невалидна селекция.',
invalidSelections: 'Това поле има следните невалидни селекции:',
lessThanMin: '{{value}} е по-малко от минимално допустимото {{label}} от {{min}}.',
longerThanMin:
'Тази стойност трябва да е по-голяма от минималната стойност от {{minLength}} символа.',
notValidDate: '"{{value}}" не е валидна дата.',
required: 'Това поле е задължително.',
requiresNoMoreThan: 'Това поле изисква не повече от {{count}} {{label}}.',
requiresTwoNumbers: 'Това поле изисква 2 числа.',
shorterThanMax:
'Тази стойност трябва да е по-малка от максималната стойност от {{maxLength}} символа.',
trueOrFalse: 'Това поле може да бъде само "true" или "false".',
validUploadID: 'Това поле не е валиден идентификатор на качването.',
},
version: {
autosavedSuccessfully: 'Успешно автоматично запазване.',
draft: 'Чернова',
draftSavedSuccessfully: 'Чернова запазена успешно.',
published: 'Публикувано',
restoredSuccessfully: 'Успешно възстановяване.',
status: 'Статус',
},
}

View File

@@ -1,85 +0,0 @@
{
"$schema": "./translation-schema.json",
"authentication": {
"account": "Профил",
"apiKey": "API ключ",
"enableAPIKey": "Активирай API ключ",
"newAccountCreated": "Току-що беше създаден нов профил за достъп до <a href=\"{{serverURL}}\">{{serverURL}}</a> Моля, въведи връзката в браузъра си, за да потвърдиш имейла си: <a href=\"{{verificationURL}}\">{{verificationURL}}</a><br> След като потвърдиш имейла си, ще можеш да влезеш успешно.",
"resetYourPassword": "Възстанови паролата си",
"verified": "Потвърден",
"verifyYourEmail": "Потвърди имейла си",
"youAreReceivingResetPassword": "Получаваш това, защото ти (или някой друг) е заявил възстановяване на паролата. Натисни връзката или постави това в браузъра си, за да довършиш процеса:",
"youDidNotRequestPassword": "Ако не си заявил това, игнорирай този имейл и паролата ти ще остане непроменена."
},
"error": {
"deletingFile": "Имаше грешка при изтриването на файла.",
"emailOrPasswordIncorrect": "Имейлът или паролата не са правилни.",
"followingFieldsInvalid_one": "Следното поле е некоректно:",
"followingFieldsInvalid_other": "Следните полета са некоректни:",
"noFilesUploaded": "Никакви файлове не бяха качени.",
"notAllowedToPerformAction": "Нямаш право да извършиш това действие.",
"problemUploadingFile": "Имаше проблем при качването на файла.",
"unableToDeleteCount": "Не беше възможно да се изтрият {{count}} от {{total}} {{label}}.",
"unableToUpdateCount": "Не беше възможно да се обновят {{count}} от {{total}} {{label}}.",
"unauthorized": "Неавторизиран, трябва да влезеш, за да извършиш тази заявка.",
"userLocked": "Този потребител има прекалено много невалидни опити за влизане и е заключен.",
"valueMustBeUnique": "Стойността трябва да е уникална"
},
"fields": {
"chooseBetweenCustomTextOrDocument": "Избери между това да въведеш текстова връзка или да свържеш с друг документ.",
"chooseDocumentToLink": "Избери документ, с който да свържеш",
"customURL": "Връзка",
"enterURL": "Въведи връзка",
"internalLink": "Вътрешна връзка",
"linkType": "Тип на връзката",
"openInNewTab": "Отвори в нов раздел",
"textToDisplay": "Текст към дисплей"
},
"general": {
"createdAt": "Създаден на",
"deletedCountSuccessfully": "Изтрити {{count}} {{label}} успешно.",
"deletedSuccessfully": "Изтрито успешно.",
"email": "Имейл",
"notFound": "Няма открит",
"successfullyCreated": "{{label}} успешно създаден.",
"thisLanguage": "Български",
"updatedAt": "Обновен на",
"updatedCountSuccessfully": "Обновени {{count}} {{label}} успешно.",
"updatedSuccessfully": "Обновен успешно.",
"user": "Потребител",
"users": "Потребители",
"value": "Стойност"
},
"upload": {
"fileName": "Име на файла",
"fileSize": "Големина на файла",
"height": "Височина",
"sizes": "Големини",
"width": "Ширина"
},
"validation": {
"emailAddress": "Моля, въведи валиден имейл адрес.",
"enterNumber": "Моля, въведи валиден номер.",
"greaterThanMax": "{{value}} е по-голямо от максимално допустимото {{label}} от {{max}}.",
"invalidInput": "Това поле има невалиден вход.",
"invalidSelection": "Това поле има невалидна селекция.",
"invalidSelections": "Това поле има следните невалидни селекции:",
"lessThanMin": "{{value}} е по-малко от минимално допустимото {{label}} от {{min}}.",
"longerThanMin": "Тази стойност трябва да е по-голяма от минималната стойност от {{minLength}} символа.",
"notValidDate": "\"{{value}}\" не е валидна дата.",
"required": "Това поле е задължително.",
"requiresNoMoreThan": "Това поле изисква не повече от {{count}} {{label}}.",
"requiresTwoNumbers": "Това поле изисква 2 числа.",
"shorterThanMax": "Тази стойност трябва да е по-малка от максималната стойност от {{maxLength}} символа.",
"trueOrFalse": "Това поле може да бъде само \"true\" или \"false\".",
"validUploadID": "Това поле не е валиден идентификатор на качването."
},
"version": {
"autosavedSuccessfully": "Успешно автоматично запазване.",
"draft": "Чернова",
"draftSavedSuccessfully": "Чернова запазена успешно.",
"published": "Публикувано",
"restoredSuccessfully": "Успешно възстановяване.",
"status": "Статус"
}
}

View File

@@ -0,0 +1,88 @@
export default {
authentication: {
account: 'Účet',
apiKey: 'Klíč API',
enableAPIKey: 'Povolit klíč API',
newAccountCreated:
'Pro přístup k <a href="{{serverURL}}">{{serverURL}}</a> byl pro vás vytvořen nový účet. Klepněte na následující odkaz nebo zkopírujte URL do svého prohlížeče pro ověření vašeho emailu: <a href="{{verificationURL}}">{{verificationURL}}</a><br> Po ověření vašeho emailu se budete moci úspěšně přihlásit.',
resetYourPassword: 'Resetujte své heslo',
verified: 'Ověřeno',
verifyYourEmail: 'Ověřte svůj email',
youAreReceivingResetPassword:
'Tento email obdržíte, protože jste (nebo někdo jiný) požádali o resetování hesla pro váš účet.',
youDidNotRequestPassword:
'Pokud jste o to nepožádali, ignorujte prosím tento e-mail a vaše heslo zůstane nezměněno.',
},
error: {
deletingFile: 'Při mazání souboru došlo k chybě.',
emailOrPasswordIncorrect: 'Zadaný email nebo heslo není správné.',
followingFieldsInvalid_one: 'Následující pole je neplatné:',
followingFieldsInvalid_other: 'Následující pole jsou neplatná:',
noFilesUploaded: 'Nebyly nahrány žádné soubory.',
notAllowedToPerformAction: 'Nemáte povolení provádět tuto akci.',
problemUploadingFile: 'Při nahrávání souboru došlo k chybě.',
unableToDeleteCount: 'Nelze smazat {{count}} z {{total}} {{label}}',
unableToUpdateCount: 'Nelze aktualizovat {{count}} z {{total}} {{label}}.',
unauthorized: 'Neautorizováno, pro zadání tohoto požadavku musíte být přihlášeni.',
userLocked: 'Tento uživatel je uzamčen kvůli příliš mnoha neúspěšným pokusům o přihlášení.',
valueMustBeUnique: 'Hodnota musí být jedinečná',
},
fields: {
chooseBetweenCustomTextOrDocument:
'Zvolte mezi vložením vlastního textového URL nebo odkazováním na jiný dokument.',
chooseDocumentToLink: 'Vyberte dokument, na který se chcete odkázat',
customURL: 'Vlastní URL',
enterURL: 'Zadejte URL',
internalLink: 'Interní odkaz',
linkType: 'Typ odkazu',
openInNewTab: 'Otevřít v nové záložce',
textToDisplay: 'Text k zobrazení',
},
general: {
createdAt: 'Vytvořeno v',
deletedCountSuccessfully: 'Úspěšně smazáno {{count}} {{label}}.',
deletedSuccessfully: 'Úspěšně odstraněno.',
email: 'E-mail',
notFound: 'Nenalezeno',
successfullyCreated: '{{label}} úspěšně vytvořeno.',
thisLanguage: 'Čeština',
updatedAt: 'Aktualizováno v',
updatedCountSuccessfully: 'Úspěšně aktualizováno {{count}} {{label}}.',
updatedSuccessfully: 'Úspěšně aktualizováno.',
user: 'Uživatel',
users: 'Uživatelé',
value: 'Hodnota',
},
upload: {
fileName: 'Název souboru',
fileSize: 'Velikost souboru',
height: 'Výška',
sizes: 'Velikosti',
width: 'Šířka',
},
validation: {
emailAddress: 'Zadejte prosím platnou e-mailovou adresu.',
enterNumber: 'Zadejte prosím platné číslo.',
greaterThanMax: '{{value}} je vyšší než maximálně povolená {{label}} {{max}}.',
invalidInput: 'Toto pole má neplatný vstup.',
invalidSelection: 'Toto pole má neplatný výběr.',
invalidSelections: 'Toto pole má následující neplatné výběry:',
lessThanMin: '{{value}} je nižší než minimálně povolená {{label}} {{min}}.',
longerThanMin: 'Tato hodnota musí být delší než minimální délka {{minLength}} znaků.',
notValidDate: '"{{value}}" není platné datum.',
required: 'Toto pole je povinné.',
requiresNoMoreThan: 'Toto pole vyžaduje ne více než {{count}} {{label}}.',
requiresTwoNumbers: 'Toto pole vyžaduje dvě čísla.',
shorterThanMax: 'Tato hodnota musí být kratší než maximální délka {{maxLength}} znaků.',
trueOrFalse: 'Toto pole může být rovno pouze true nebo false.',
validUploadID: 'Toto pole není platné ID pro odeslání.',
},
version: {
autosavedSuccessfully: 'Úspěšně uloženo automaticky.',
draft: 'Koncept',
draftSavedSuccessfully: 'Koncept úspěšně uložen.',
published: 'Publikováno',
restoredSuccessfully: 'Úspěšně obnoveno.',
status: 'Stav',
},
}

View File

@@ -1,85 +0,0 @@
{
"$schema": "./translation-schema.json",
"authentication": {
"account": "Účet",
"apiKey": "Klíč API",
"enableAPIKey": "Povolit klíč API",
"newAccountCreated": "Pro přístup k <a href=\"{{serverURL}}\">{{serverURL}}</a> byl pro vás vytvořen nový účet. Klepněte na následující odkaz nebo zkopírujte URL do svého prohlížeče pro ověření vašeho emailu: <a href=\"{{verificationURL}}\">{{verificationURL}}</a><br> Po ověření vašeho emailu se budete moci úspěšně přihlásit.",
"resetYourPassword": "Resetujte své heslo",
"verified": "Ověřeno",
"verifyYourEmail": "Ověřte svůj email",
"youAreReceivingResetPassword": "Tento email obdržíte, protože jste (nebo někdo jiný) požádali o resetování hesla pro váš účet.",
"youDidNotRequestPassword": "Pokud jste o to nepožádali, ignorujte prosím tento e-mail a vaše heslo zůstane nezměněno."
},
"error": {
"deletingFile": "Při mazání souboru došlo k chybě.",
"emailOrPasswordIncorrect": "Zadaný email nebo heslo není správné.",
"followingFieldsInvalid_one": "Následující pole je neplatné:",
"followingFieldsInvalid_other": "Následující pole jsou neplatná:",
"noFilesUploaded": "Nebyly nahrány žádné soubory.",
"notAllowedToPerformAction": "Nemáte povolení provádět tuto akci.",
"problemUploadingFile": "Při nahrávání souboru došlo k chybě.",
"unableToDeleteCount": "Nelze smazat {{count}} z {{total}} {{label}}",
"unableToUpdateCount": "Nelze aktualizovat {{count}} z {{total}} {{label}}.",
"unauthorized": "Neautorizováno, pro zadání tohoto požadavku musíte být přihlášeni.",
"userLocked": "Tento uživatel je uzamčen kvůli příliš mnoha neúspěšným pokusům o přihlášení.",
"valueMustBeUnique": "Hodnota musí být jedinečná"
},
"fields": {
"chooseBetweenCustomTextOrDocument": "Zvolte mezi vložením vlastního textového URL nebo odkazováním na jiný dokument.",
"chooseDocumentToLink": "Vyberte dokument, na který se chcete odkázat",
"customURL": "Vlastní URL",
"enterURL": "Zadejte URL",
"internalLink": "Interní odkaz",
"linkType": "Typ odkazu",
"openInNewTab": "Otevřít v nové záložce",
"textToDisplay": "Text k zobrazení"
},
"general": {
"createdAt": "Vytvořeno v",
"deletedCountSuccessfully": "Úspěšně smazáno {{count}} {{label}}.",
"deletedSuccessfully": "Úspěšně odstraněno.",
"email": "E-mail",
"notFound": "Nenalezeno",
"successfullyCreated": "{{label}} úspěšně vytvořeno.",
"thisLanguage": "Čeština",
"updatedAt": "Aktualizováno v",
"updatedCountSuccessfully": "Úspěšně aktualizováno {{count}} {{label}}.",
"updatedSuccessfully": "Úspěšně aktualizováno.",
"user": "Uživatel",
"users": "Uživatelé",
"value": "Hodnota"
},
"upload": {
"fileName": "Název souboru",
"fileSize": "Velikost souboru",
"height": "Výška",
"sizes": "Velikosti",
"width": "Šířka"
},
"validation": {
"emailAddress": "Zadejte prosím platnou e-mailovou adresu.",
"enterNumber": "Zadejte prosím platné číslo.",
"greaterThanMax": "{{value}} je vyšší než maximálně povolená {{label}} {{max}}.",
"invalidInput": "Toto pole má neplatný vstup.",
"invalidSelection": "Toto pole má neplatný výběr.",
"invalidSelections": "Toto pole má následující neplatné výběry:",
"lessThanMin": "{{value}} je nižší než minimálně povolená {{label}} {{min}}.",
"longerThanMin": "Tato hodnota musí být delší než minimální délka {{minLength}} znaků.",
"notValidDate": "\"{{value}}\" není platné datum.",
"required": "Toto pole je povinné.",
"requiresNoMoreThan": "Toto pole vyžaduje ne více než {{count}} {{label}}.",
"requiresTwoNumbers": "Toto pole vyžaduje dvě čísla.",
"shorterThanMax": "Tato hodnota musí být kratší než maximální délka {{maxLength}} znaků.",
"trueOrFalse": "Toto pole může být rovno pouze true nebo false.",
"validUploadID": "Toto pole není platné ID pro odeslání."
},
"version": {
"autosavedSuccessfully": "Úspěšně uloženo automaticky.",
"draft": "Koncept",
"draftSavedSuccessfully": "Koncept úspěšně uložen.",
"published": "Publikováno",
"restoredSuccessfully": "Úspěšně obnoveno.",
"status": "Stav"
}
}

View File

@@ -0,0 +1,89 @@
export default {
authentication: {
account: 'Konto',
apiKey: 'API-Key',
enableAPIKey: 'API-Key aktivieren',
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.',
resetYourPassword: 'Dein Passwort zurücksetzen',
verified: 'Verifiziert',
verifyYourEmail: 'Deine E-Mail-Adresse verifizieren',
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: {
deletingFile: 'Beim Löschen der Datei ist ein Fehler aufgetreten.',
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:',
noFilesUploaded: 'Es wurden keine Dateien hochgeladen.',
notAllowedToPerformAction: 'Du hast keine Berechtigung, diese Aktion auszuführen.',
problemUploadingFile: 'Es gab ein Problem während des Hochladens der Datei.',
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.',
userLocked:
'Dieser Benutzer ist auf Grund zu vieler unerfolgreicher Anmelde-Versuche gesperrt.',
valueMustBeUnique: 'Wert muss einzigartig sein',
},
fields: {
chooseBetweenCustomTextOrDocument:
'Wähle zwischen einer eigenen Text-URL oder verlinke zu einem anderen Dokument.',
chooseDocumentToLink: 'Wähle ein Dokument zum Verlinken',
customURL: 'Eigene URL',
enterURL: 'URL eingeben',
internalLink: 'Interner Link',
linkType: 'Linktyp',
openInNewTab: 'Öffne im neuen Tab',
textToDisplay: 'Angezeigter Text',
},
general: {
createdAt: 'Erstellt am',
deletedCountSuccessfully: '{{count}} {{label}} erfolgreich gelöscht.',
deletedSuccessfully: 'Erfolgreich gelöscht.',
email: 'E-Mail',
notFound: 'Nicht gefunden',
successfullyCreated: '{{label}} erfolgreich erstellt.',
thisLanguage: 'Deutsch',
updatedAt: 'Aktualisiert am',
updatedCountSuccessfully: '{{count}} {{label}} erfolgreich aktualisiert.',
updatedSuccessfully: 'Erfolgreich aktualisiert.',
user: 'Benutzer',
users: 'Benutzer',
value: 'Wert',
},
upload: {
fileName: 'Dateiname',
fileSize: 'Dateigröße',
height: 'Höhe',
sizes: 'Größen',
width: 'Breite',
},
validation: {
emailAddress: 'Bitte gib eine korrekte E-Mail-Adresse an.',
enterNumber: 'Bitte gib eine gültige Nummer an,',
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}}.',
longerThanMin: 'Dieser Wert muss länger als die minimale Länge von {{minLength}} Zeichen sein.',
notValidDate: '"{{value}}" ist kein gültiges Datum.',
required: 'Pflichtfeld',
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: {
autosavedSuccessfully: 'Erfolgreich automatisch gespeichert.',
draft: 'Entwurf',
draftSavedSuccessfully: 'Entwurf erfolgreich gespeichert.',
published: 'Veröffentlicht',
restoredSuccessfully: 'Erfolgreich wiederhergestellt.',
status: 'Status',
},
}

View File

@@ -1,85 +0,0 @@
{
"$schema": "./translation-schema.json",
"authentication": {
"account": "Konto",
"apiKey": "API-Key",
"enableAPIKey": "API-Key aktivieren",
"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.",
"resetYourPassword": "Dein Passwort zurücksetzen",
"verified": "Verifiziert",
"verifyYourEmail": "Deine E-Mail-Adresse verifizieren",
"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": {
"deletingFile": "Beim Löschen der Datei ist ein Fehler aufgetreten.",
"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:",
"noFilesUploaded": "Es wurden keine Dateien hochgeladen.",
"notAllowedToPerformAction": "Du hast keine Berechtigung, diese Aktion auszuführen.",
"problemUploadingFile": "Es gab ein Problem während des Hochladens der Datei.",
"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.",
"userLocked": "Dieser Benutzer ist auf Grund zu vieler unerfolgreicher Anmelde-Versuche gesperrt.",
"valueMustBeUnique": "Wert muss einzigartig sein"
},
"fields": {
"chooseBetweenCustomTextOrDocument": "Wähle zwischen einer eigenen Text-URL oder verlinke zu einem anderen Dokument.",
"chooseDocumentToLink": "Wähle ein Dokument zum Verlinken",
"customURL": "Eigene URL",
"enterURL": "URL eingeben",
"internalLink": "Interner Link",
"linkType": "Linktyp",
"openInNewTab": "Öffne im neuen Tab",
"textToDisplay": "Angezeigter Text"
},
"general": {
"createdAt": "Erstellt am",
"deletedCountSuccessfully": "{{count}} {{label}} erfolgreich gelöscht.",
"deletedSuccessfully": "Erfolgreich gelöscht.",
"email": "E-Mail",
"notFound": "Nicht gefunden",
"successfullyCreated": "{{label}} erfolgreich erstellt.",
"thisLanguage": "Deutsch",
"updatedAt": "Aktualisiert am",
"updatedCountSuccessfully": "{{count}} {{label}} erfolgreich aktualisiert.",
"updatedSuccessfully": "Erfolgreich aktualisiert.",
"user": "Benutzer",
"users": "Benutzer",
"value": "Wert"
},
"upload": {
"fileName": "Dateiname",
"fileSize": "Dateigröße",
"height": "Höhe",
"sizes": "Größen",
"width": "Breite"
},
"validation": {
"emailAddress": "Bitte gib eine korrekte E-Mail-Adresse an.",
"enterNumber": "Bitte gib eine gültige Nummer an,",
"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}}.",
"longerThanMin": "Dieser Wert muss länger als die minimale Länge von {{minLength}} Zeichen sein.",
"notValidDate": "\"{{value}}\" ist kein gültiges Datum.",
"required": "Pflichtfeld",
"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": {
"autosavedSuccessfully": "Erfolgreich automatisch gespeichert.",
"draft": "Entwurf",
"draftSavedSuccessfully": "Entwurf erfolgreich gespeichert.",
"published": "Veröffentlicht",
"restoredSuccessfully": "Erfolgreich wiederhergestellt.",
"status": "Status"
}
}

View File

@@ -0,0 +1,88 @@
export default {
authentication: {
account: 'Account',
apiKey: 'API Key',
enableAPIKey: 'Enable API Key',
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.',
resetYourPassword: 'Reset Your Password',
verified: 'Verified',
verifyYourEmail: 'Verify your email',
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: {
deletingFile: 'There was an error deleting file.',
emailOrPasswordIncorrect: 'The email or password provided is incorrect.',
followingFieldsInvalid_one: 'The following field is invalid:',
followingFieldsInvalid_other: 'The following fields are invalid:',
noFilesUploaded: 'No files were uploaded.',
notAllowedToPerformAction: 'You are not allowed to perform this action.',
problemUploadingFile: 'There was a problem while uploading the file.',
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.',
userLocked: 'This user is locked due to having too many failed login attempts.',
valueMustBeUnique: 'Value must be unique',
},
fields: {
chooseBetweenCustomTextOrDocument:
'Choose between entering a custom text URL or linking to another document.',
chooseDocumentToLink: 'Choose a document to link to',
customURL: 'Custom URL',
enterURL: 'Enter a URL',
internalLink: 'Internal Link',
linkType: 'Link Type',
openInNewTab: 'Open in new tab',
textToDisplay: 'Text to display',
},
general: {
createdAt: 'Created At',
deletedCountSuccessfully: 'Deleted {{count}} {{label}} successfully.',
deletedSuccessfully: 'Deleted successfully.',
email: 'Email',
notFound: 'Not Found',
successfullyCreated: '{{label}} successfully created.',
thisLanguage: 'English',
updatedAt: 'Updated At',
updatedCountSuccessfully: 'Updated {{count}} {{label}} successfully.',
updatedSuccessfully: 'Updated successfully.',
user: 'User',
users: 'Users',
value: 'Value',
},
upload: {
fileName: 'File Name',
fileSize: 'File Size',
height: 'Height',
sizes: 'Sizes',
width: 'Width',
},
validation: {
emailAddress: 'Please enter a valid email address.',
enterNumber: 'Please enter a valid number.',
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}}.',
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.',
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: {
autosavedSuccessfully: 'Autosaved successfully.',
draft: 'Draft',
draftSavedSuccessfully: 'Draft saved successfully.',
published: 'Published',
restoredSuccessfully: 'Restored Successfully.',
status: 'Status',
},
}

View File

@@ -1,85 +0,0 @@
{
"$schema": "./translation-schema.json",
"authentication": {
"account": "Account",
"apiKey": "API Key",
"enableAPIKey": "Enable API Key",
"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.",
"resetYourPassword": "Reset Your Password",
"verified": "Verified",
"verifyYourEmail": "Verify your email",
"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": {
"deletingFile": "There was an error deleting file.",
"emailOrPasswordIncorrect": "The email or password provided is incorrect.",
"followingFieldsInvalid_one": "The following field is invalid:",
"followingFieldsInvalid_other": "The following fields are invalid:",
"noFilesUploaded": "No files were uploaded.",
"notAllowedToPerformAction": "You are not allowed to perform this action.",
"problemUploadingFile": "There was a problem while uploading the file.",
"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.",
"userLocked": "This user is locked due to having too many failed login attempts.",
"valueMustBeUnique": "Value must be unique"
},
"fields": {
"chooseBetweenCustomTextOrDocument": "Choose between entering a custom text URL or linking to another document.",
"chooseDocumentToLink": "Choose a document to link to",
"customURL": "Custom URL",
"enterURL": "Enter a URL",
"internalLink": "Internal Link",
"linkType": "Link Type",
"openInNewTab": "Open in new tab",
"textToDisplay": "Text to display"
},
"general": {
"createdAt": "Created At",
"deletedCountSuccessfully": "Deleted {{count}} {{label}} successfully.",
"deletedSuccessfully": "Deleted successfully.",
"email": "Email",
"notFound": "Not Found",
"successfullyCreated": "{{label}} successfully created.",
"thisLanguage": "English",
"updatedAt": "Updated At",
"updatedCountSuccessfully": "Updated {{count}} {{label}} successfully.",
"updatedSuccessfully": "Updated successfully.",
"user": "User",
"users": "Users",
"value": "Value"
},
"upload": {
"fileName": "File Name",
"fileSize": "File Size",
"height": "Height",
"sizes": "Sizes",
"width": "Width"
},
"validation": {
"emailAddress": "Please enter a valid email address.",
"enterNumber": "Please enter a valid number.",
"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}}.",
"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.",
"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": {
"autosavedSuccessfully": "Autosaved successfully.",
"draft": "Draft",
"draftSavedSuccessfully": "Draft saved successfully.",
"published": "Published",
"restoredSuccessfully": "Restored Successfully.",
"status": "Status"
}
}

View File

@@ -0,0 +1,89 @@
export default {
authentication: {
account: 'Cuenta',
apiKey: 'Clave API',
enableAPIKey: 'Habilitar Clave API',
newAccountCreated:
'Se ha creado una nueva cuenta para que puedas acceder a <a href="{{serverURL}}">{{serverURL}}</a>. Por favor, haz click o copia el siguiente enlace a tu navegador para verificar tu correo: <a href="{{verificationURL}}">{{verificationURL}}</a>.<br> Una vez hayas verificado tu correo, podrás iniciar sesión.',
resetYourPassword: 'Restablecer tu Contraseña',
verified: 'Verificado',
verifyYourEmail: 'Verifica tu correo',
youAreReceivingResetPassword:
'Estás recibiendo esto porque tú (o alguien más) ha solicitado restablecer la contraseña de tu cuenta. Por favor haz click en el siguiente enlace o pégalo en tu navegador para completar el proceso:',
youDidNotRequestPassword:
'Si tú no solicitaste esto, por favor ignora este correo y tu contraseña no se cambiará.',
},
error: {
deletingFile: 'Ocurrió un error al eliminar el archivo.',
emailOrPasswordIncorrect: 'El correo o la contraseña introducida es incorrecta.',
followingFieldsInvalid_one: 'El siguiente campo es inválido:',
followingFieldsInvalid_other: 'Los siguientes campos son inválidos:',
noFilesUploaded: 'No se subieron archivos.',
notAllowedToPerformAction: 'No tienes permiso para realizar esta acción.',
problemUploadingFile: 'Ocurrió un problema al subir el archivo.',
unableToDeleteCount: 'No se pudo eliminar {{count}} de {{total}} {{label}}.',
unableToUpdateCount: 'No se puede actualizar {{count}} de {{total}} {{label}}.',
unauthorized: 'No autorizado, debes iniciar sesión para realizar esta solicitud.',
userLocked:
'Este usuario ha sido bloqueado debido a que tiene muchos intentos fallidos para iniciar sesión.',
valueMustBeUnique: 'El valor debe ser único',
},
fields: {
chooseBetweenCustomTextOrDocument:
'Elige entre ingresar una URL personalizada o enlazar a otro documento.',
chooseDocumentToLink: 'Elige un documento a enlazar',
customURL: 'URL Personalizado',
enterURL: 'Ingresar URL',
internalLink: 'Enlace Interno',
linkType: 'Tipo de enlace',
openInNewTab: 'Abrir en nueva pestaña',
textToDisplay: 'Texto a mostrar',
},
general: {
createdAt: 'Fecha de creación',
deletedCountSuccessfully: 'Se eliminó {{count}} {{label}} con éxito.',
deletedSuccessfully: 'Borrado exitosamente.',
email: 'Correo electrónico',
notFound: 'No encontrado',
successfullyCreated: '{{label}} creado correctamente.',
thisLanguage: 'Español',
updatedAt: 'Fecha de modificado',
updatedCountSuccessfully: '{{count}} {{label}} actualizado con éxito.',
updatedSuccessfully: 'Actualizado con éxito.',
user: 'Usuario',
users: 'Usuarios',
value: 'Valor',
},
upload: {
fileName: 'Nombre del archivo',
fileSize: 'Tamaño del archivo',
height: 'Alto',
sizes: 'Tamaños',
width: 'Ancho',
},
validation: {
emailAddress: 'Por favor introduce un correo electrónico válido.',
enterNumber: 'Por favor introduce un número válido.',
greaterThanMax: '{{value}} es mayor que el {{label}} máximo permitido de {{max}}.',
invalidInput: 'La información en este campo es inválida.',
invalidSelection: 'La selección en este campo es inválida.',
invalidSelections: 'Este campo tiene las siguientes selecciones inválidas:',
lessThanMin: '{{value}} es menor que el {{label}} mínimo permitido de {{min}}.',
longerThanMin: 'Este dato debe ser más largo que el mínimo de {{minLength}} caracteres.',
notValidDate: '"{{value}}" es una fecha inválida.',
required: 'Este campo es obligatorio.',
requiresNoMoreThan: 'Este campo require no más de {{count}} {{label}}',
requiresTwoNumbers: 'Este campo requiere dos números.',
shorterThanMax: 'Este dato debe ser más corto que el máximo de {{maxLength}} caracteres.',
trueOrFalse: 'Este campo solamente puede ser verdadero o falso.',
validUploadID: "'Este campo no es una ID de subida válida.'",
},
version: {
autosavedSuccessfully: 'Guardado automáticamente con éxito.',
draft: 'Borrador',
draftSavedSuccessfully: 'Borrador guardado con éxito.',
published: 'Publicado',
restoredSuccessfully: 'Restaurado éxito.',
status: 'Estado',
},
}

View File

@@ -1,85 +0,0 @@
{
"$schema": "./translation-schema.json",
"authentication": {
"account": "Cuenta",
"apiKey": "Clave API",
"enableAPIKey": "Habilitar Clave API",
"newAccountCreated": "Se ha creado una nueva cuenta para que puedas acceder a <a href=\"{{serverURL}}\">{{serverURL}}</a>. Por favor, haz click o copia el siguiente enlace a tu navegador para verificar tu correo: <a href=\"{{verificationURL}}\">{{verificationURL}}</a>.<br> Una vez hayas verificado tu correo, podrás iniciar sesión.",
"resetYourPassword": "Restablecer tu Contraseña",
"verified": "Verificado",
"verifyYourEmail": "Verifica tu correo",
"youAreReceivingResetPassword": "Estás recibiendo esto porque tú (o alguien más) ha solicitado restablecer la contraseña de tu cuenta. Por favor haz click en el siguiente enlace o pégalo en tu navegador para completar el proceso:",
"youDidNotRequestPassword": "Si tú no solicitaste esto, por favor ignora este correo y tu contraseña no se cambiará."
},
"error": {
"deletingFile": "Ocurrió un error al eliminar el archivo.",
"emailOrPasswordIncorrect": "El correo o la contraseña introducida es incorrecta.",
"followingFieldsInvalid_one": "El siguiente campo es inválido:",
"followingFieldsInvalid_other": "Los siguientes campos son inválidos:",
"noFilesUploaded": "No se subieron archivos.",
"notAllowedToPerformAction": "No tienes permiso para realizar esta acción.",
"problemUploadingFile": "Ocurrió un problema al subir el archivo.",
"unableToDeleteCount": "No se pudo eliminar {{count}} de {{total}} {{label}}.",
"unableToUpdateCount": "No se puede actualizar {{count}} de {{total}} {{label}}.",
"unauthorized": "No autorizado, debes iniciar sesión para realizar esta solicitud.",
"userLocked": "Este usuario ha sido bloqueado debido a que tiene muchos intentos fallidos para iniciar sesión.",
"valueMustBeUnique": "El valor debe ser único"
},
"fields": {
"chooseBetweenCustomTextOrDocument": "Elige entre ingresar una URL personalizada o enlazar a otro documento.",
"chooseDocumentToLink": "Elige un documento a enlazar",
"customURL": "URL Personalizado",
"enterURL": "Ingresar URL",
"internalLink": "Enlace Interno",
"linkType": "Tipo de enlace",
"openInNewTab": "Abrir en nueva pestaña",
"textToDisplay": "Texto a mostrar"
},
"general": {
"createdAt": "Fecha de creación",
"deletedCountSuccessfully": "Se eliminó {{count}} {{label}} con éxito.",
"deletedSuccessfully": "Borrado exitosamente.",
"email": "Correo electrónico",
"notFound": "No encontrado",
"successfullyCreated": "{{label}} creado correctamente.",
"thisLanguage": "Español",
"updatedAt": "Fecha de modificado",
"updatedCountSuccessfully": "{{count}} {{label}} actualizado con éxito.",
"updatedSuccessfully": "Actualizado con éxito.",
"user": "Usuario",
"users": "Usuarios",
"value": "Valor"
},
"upload": {
"fileName": "Nombre del archivo",
"fileSize": "Tamaño del archivo",
"height": "Alto",
"sizes": "Tamaños",
"width": "Ancho"
},
"validation": {
"emailAddress": "Por favor introduce un correo electrónico válido.",
"enterNumber": "Por favor introduce un número válido.",
"greaterThanMax": "{{value}} es mayor que el {{label}} máximo permitido de {{max}}.",
"invalidInput": "La información en este campo es inválida.",
"invalidSelection": "La selección en este campo es inválida.",
"invalidSelections": "Este campo tiene las siguientes selecciones inválidas:",
"lessThanMin": "{{value}} es menor que el {{label}} mínimo permitido de {{min}}.",
"longerThanMin": "Este dato debe ser más largo que el mínimo de {{minLength}} caracteres.",
"notValidDate": "\"{{value}}\" es una fecha inválida.",
"required": "Este campo es obligatorio.",
"requiresNoMoreThan": "Este campo require no más de {{count}} {{label}}",
"requiresTwoNumbers": "Este campo requiere dos números.",
"shorterThanMax": "Este dato debe ser más corto que el máximo de {{maxLength}} caracteres.",
"trueOrFalse": "Este campo solamente puede ser verdadero o falso.",
"validUploadID": "'Este campo no es una ID de subida válida.'"
},
"version": {
"autosavedSuccessfully": "Guardado automáticamente con éxito.",
"draft": "Borrador",
"draftSavedSuccessfully": "Borrador guardado con éxito.",
"published": "Publicado",
"restoredSuccessfully": "Restaurado éxito.",
"status": "Estado"
}
}

View File

@@ -0,0 +1,88 @@
export default {
authentication: {
account: 'نمایه',
apiKey: 'کلید اِی‌پی‌آی',
enableAPIKey: 'فعال‌سازی کلید اِی‌پی‌آی',
newAccountCreated:
'یک نمایه کاربری تازه برای دسترسی شما ساخته شده است <a href="{{serverURL}}">{{serverURL}}</a> لطفاً روی پیوند زیر کلیک کنید یا آدرس زیر را در مرورگر خود قرار دهید تا رایانامه خود را تأیید کنید: <a href="{{verificationURL}}">{{verificationURL}}</a><br> پس از تایید رایانامه خود، می توانید وارد سیستم شوید.',
resetYourPassword: 'گذرواژه خود را بازنشانی کنید',
verified: 'تأیید شده',
verifyYourEmail: 'رایانامه خود را تأیید کنید',
youAreReceivingResetPassword:
'درخواست بازنشانی گذرواژه نمایه توسط شما یا فرد دیگری فرستاده شده است، اگر این درخواست از سمت شما بوده روی پیوند مقابل کلیک کنید یا در مرورگر وب خود پیوند را کپی کنید تا مراحل بازنشانی گذرواژه تکمیل شود، در غیر این صورت جای نگرانی نیست این پیام را نادیده بگیرید:',
youDidNotRequestPassword:
'اگر شما این درخواست را ندادید، لطفاً این رایانامه را نادیده بگیرید و گذرواژه شما تغییری نخواهد کرد.',
},
error: {
deletingFile: 'هنگام حذف فایل خطایی روی داد.',
emailOrPasswordIncorrect: 'رایانامه یا گذرواژه ارائه شده نادرست است.',
followingFieldsInvalid_one: 'کادر زیر نامعتبر است:',
followingFieldsInvalid_other: 'کادرهای زیر نامعتبر هستند:',
noFilesUploaded: 'هیچ رسانه‌ای بارگذاری نشده.',
notAllowedToPerformAction: 'این عملیات برای شما مجاز نیست.',
problemUploadingFile: 'هنگام بارگذاری سند خطایی رخ داد.',
unableToDeleteCount: 'نمی‌توان {{count}} از {{total}} {{label}} را حذف کرد.',
unableToUpdateCount: 'امکان به روز رسانی {{count}} خارج از {{total}} {{label}} وجود ندارد.',
unauthorized: 'درخواست نامعتبر، جهت فرستادن این درخواست باید وارد شوید.',
userLocked: 'این کاربر به دلیل تلاش های زیاد برای ورود ناموفق قفل شده است.',
valueMustBeUnique: 'مقدار باید منحصر به فرد باشد',
},
fields: {
chooseBetweenCustomTextOrDocument:
'بین یک نشانی وب یا پیوند دادن به سندی دیگری یکی را انتخاب کنید.',
chooseDocumentToLink: 'یک سند را برای پیوند دادن برگزینید',
customURL: 'URL سفارشی',
enterURL: 'یک نشانی وب وارد کنید',
internalLink: 'پیوند درونی',
linkType: 'نوع پیوند',
openInNewTab: 'بازکردن درزبانه تازه',
textToDisplay: 'متن برای نمایش',
},
general: {
createdAt: 'ساخته شده در',
deletedCountSuccessfully: 'تعداد {{count}} {{label}} با موفقیت پاک گردید.',
deletedSuccessfully: 'با موفقیت حذف شد.',
email: 'رایانامه',
notFound: 'یافت نشد',
successfullyCreated: '{{label}} با موفقیت ساخته شد.',
thisLanguage: 'فارسی',
updatedAt: 'بروز شده در',
updatedCountSuccessfully: 'تعداد {{count}} با عنوان {{label}} با موفقیت بروزرسانی شدند.',
updatedSuccessfully: 'با موفقیت به‌روز شد.',
user: 'کاربر',
users: 'کاربران',
value: 'مقدار',
},
upload: {
fileName: 'نام رسانه',
fileSize: 'حجم رسانه',
height: 'ارتفاع',
sizes: 'اندازه‌ها',
width: 'پهنا',
},
validation: {
emailAddress: 'لطفاً یک نشانی رایانامه معتبر وارد کنید.',
enterNumber: 'لطفاً یک شماره درست وارد کنید.',
greaterThanMax: '{{value}} بیشتر از حداکثر مجاز برای {{label}} است که {{max}} است.',
invalidInput: 'این کادر دارای ورودی نامعتبر است.',
invalidSelection: 'این کادر دارای یک انتخاب نامعتبر است.',
invalidSelections: 'این کادر دارای انتخاب‌های نامعتبر زیر است:',
lessThanMin: '{{value}} کمتر از حداقل مجاز برای {{label}} است که {{min}} است.',
longerThanMin: 'ورودی باید بیش از حداقل {{minLength}} واژه باشد.',
notValidDate: '"{{value}}" یک تاریخ معتبر نیست.',
required: 'این کادر اجباری است.',
requiresNoMoreThan: 'این رشته به بیش از {{count}} {{label}} نیاز دارد.',
requiresTwoNumbers: 'این کادر به دو عدد نیاز دارد.',
shorterThanMax: 'ورودی باید کمتر از {{maxLength}} واژه باشد.',
trueOrFalse: 'این کادر فقط می تواند به صورت true یا false باشد.',
validUploadID: 'این فیلد یک شناسه بارگذاری معتبر نیست.',
},
version: {
autosavedSuccessfully: 'با موفقیت ذخیره خودکار شد.',
draft: 'پیش‌نویس',
draftSavedSuccessfully: 'پیش‌نویس با موفقیت ذخیره شد.',
published: 'انتشار یافته',
restoredSuccessfully: 'با موفقیت بازیابی شد.',
status: 'وضعیت',
},
}

View File

@@ -1,85 +0,0 @@
{
"$schema": "./translation-schema.json",
"authentication": {
"account": "نمایه",
"apiKey": "کلید اِی‌پی‌آی",
"enableAPIKey": "فعال‌سازی کلید اِی‌پی‌آی",
"newAccountCreated": "یک نمایه کاربری تازه برای دسترسی شما ساخته شده است <a href=\"{{serverURL}}\">{{serverURL}}</a> لطفاً روی پیوند زیر کلیک کنید یا آدرس زیر را در مرورگر خود قرار دهید تا رایانامه خود را تأیید کنید: <a href=\"{{verificationURL}}\">{{verificationURL}}</a><br> پس از تایید رایانامه خود، می توانید وارد سیستم شوید.",
"resetYourPassword": "گذرواژه خود را بازنشانی کنید",
"verified": "تأیید شده",
"verifyYourEmail": "رایانامه خود را تأیید کنید",
"youAreReceivingResetPassword": "درخواست بازنشانی گذرواژه نمایه توسط شما یا فرد دیگری فرستاده شده است، اگر این درخواست از سمت شما بوده روی پیوند مقابل کلیک کنید یا در مرورگر وب خود پیوند را کپی کنید تا مراحل بازنشانی گذرواژه تکمیل شود، در غیر این صورت جای نگرانی نیست این پیام را نادیده بگیرید:",
"youDidNotRequestPassword": "اگر شما این درخواست را ندادید، لطفاً این رایانامه را نادیده بگیرید و گذرواژه شما تغییری نخواهد کرد."
},
"error": {
"deletingFile": "هنگام حذف فایل خطایی روی داد.",
"emailOrPasswordIncorrect": "رایانامه یا گذرواژه ارائه شده نادرست است.",
"followingFieldsInvalid_one": "کادر زیر نامعتبر است:",
"followingFieldsInvalid_other": "کادرهای زیر نامعتبر هستند:",
"noFilesUploaded": "هیچ رسانه‌ای بارگذاری نشده.",
"notAllowedToPerformAction": "این عملیات برای شما مجاز نیست.",
"problemUploadingFile": "هنگام بارگذاری سند خطایی رخ داد.",
"unableToDeleteCount": "نمی‌توان {{count}} از {{total}} {{label}} را حذف کرد.",
"unableToUpdateCount": "امکان به روز رسانی {{count}} خارج از {{total}} {{label}} وجود ندارد.",
"unauthorized": "درخواست نامعتبر، جهت فرستادن این درخواست باید وارد شوید.",
"userLocked": "این کاربر به دلیل تلاش های زیاد برای ورود ناموفق قفل شده است.",
"valueMustBeUnique": "مقدار باید منحصر به فرد باشد"
},
"fields": {
"chooseBetweenCustomTextOrDocument": "بین یک نشانی وب یا پیوند دادن به سندی دیگری یکی را انتخاب کنید.",
"chooseDocumentToLink": "یک سند را برای پیوند دادن برگزینید",
"customURL": "URL سفارشی",
"enterURL": "یک نشانی وب وارد کنید",
"internalLink": "پیوند درونی",
"linkType": "نوع پیوند",
"openInNewTab": "بازکردن درزبانه تازه",
"textToDisplay": "متن برای نمایش"
},
"general": {
"createdAt": "ساخته شده در",
"deletedCountSuccessfully": "تعداد {{count}} {{label}} با موفقیت پاک گردید.",
"deletedSuccessfully": "با موفقیت حذف شد.",
"email": "رایانامه",
"notFound": "یافت نشد",
"successfullyCreated": "{{label}} با موفقیت ساخته شد.",
"thisLanguage": "فارسی",
"updatedAt": "بروز شده در",
"updatedCountSuccessfully": "تعداد {{count}} با عنوان {{label}} با موفقیت بروزرسانی شدند.",
"updatedSuccessfully": "با موفقیت به‌روز شد.",
"user": "کاربر",
"users": "کاربران",
"value": "مقدار"
},
"upload": {
"fileName": "نام رسانه",
"fileSize": "حجم رسانه",
"height": "ارتفاع",
"sizes": "اندازه‌ها",
"width": "پهنا"
},
"validation": {
"emailAddress": "لطفاً یک نشانی رایانامه معتبر وارد کنید.",
"enterNumber": "لطفاً یک شماره درست وارد کنید.",
"greaterThanMax": "{{value}} بیشتر از حداکثر مجاز برای {{label}} است که {{max}} است.",
"invalidInput": "این کادر دارای ورودی نامعتبر است.",
"invalidSelection": "این کادر دارای یک انتخاب نامعتبر است.",
"invalidSelections": "این کادر دارای انتخاب‌های نامعتبر زیر است:",
"lessThanMin": "{{value}} کمتر از حداقل مجاز برای {{label}} است که {{min}} است.",
"longerThanMin": "ورودی باید بیش از حداقل {{minLength}} واژه باشد.",
"notValidDate": "\"{{value}}\" یک تاریخ معتبر نیست.",
"required": "این کادر اجباری است.",
"requiresNoMoreThan": "این رشته به بیش از {{count}} {{label}} نیاز دارد.",
"requiresTwoNumbers": "این کادر به دو عدد نیاز دارد.",
"shorterThanMax": "ورودی باید کمتر از {{maxLength}} واژه باشد.",
"trueOrFalse": "این کادر فقط می تواند به صورت true یا false باشد.",
"validUploadID": "این فیلد یک شناسه بارگذاری معتبر نیست."
},
"version": {
"autosavedSuccessfully": "با موفقیت ذخیره خودکار شد.",
"draft": "پیش‌نویس",
"draftSavedSuccessfully": "پیش‌نویس با موفقیت ذخیره شد.",
"published": "انتشار یافته",
"restoredSuccessfully": "با موفقیت بازیابی شد.",
"status": "وضعیت"
}
}

View File

@@ -0,0 +1,91 @@
export default {
authentication: {
account: 'Compte',
apiKey: 'Clé API',
enableAPIKey: 'Activer la clé API',
newAccountCreated:
'Un nouveau compte vient d\'être créé pour vous permettre d\'accéder <a href="{{serverURL}}">{{serverURL}}</a>. Veuillez cliquer sur le lien suivant ou collez l\'URL ci-dessous dans votre navigateur pour vérifier votre adresse e-mail: <a href="{{verificationURL}}">{{verificationURL}}</a><br>. Après avoir vérifié votre adresse e-mail, vous pourrez vous connecter avec succès.',
resetYourPassword: 'Réinitialisez votre mot de passe',
verified: 'Vérifié',
verifyYourEmail: 'Vérifiez votre e-mail',
youAreReceivingResetPassword:
"Vous recevez ceci parce que vous (ou quelqu'un d'autre) avez demandé la réinitialisation du mot de passe de votre compte. Veuillez cliquer sur le lien suivant ou le coller dans votre navigateur pour terminer le processus :",
youDidNotRequestPassword:
"Si vous ne l'avez pas demandé, veuillez ignorer cet e-mail et votre mot de passe restera inchangé.",
},
error: {
deletingFile: "Une erreur s'est produite lors de la suppression du fichier.",
emailOrPasswordIncorrect: "L'adresse e-mail ou le mot de passe fourni est incorrect.",
followingFieldsInvalid_one: "Le champ suivant n'est pas valide :",
followingFieldsInvalid_other: 'Les champs suivants ne sont pas valides :',
noFilesUploaded: "Aucun fichier n'a été téléversé.",
notAllowedToPerformAction: "Vous n'êtes pas autorisé à effectuer cette action.",
problemUploadingFile: 'Il y a eu un problème lors du téléversement du fichier.',
unableToDeleteCount: 'Impossible de supprimer {{count}} sur {{total}} {{label}}.',
unableToUpdateCount: 'Impossible de mettre à jour {{count}} sur {{total}} {{label}}.',
unauthorized: 'Non autorisé, vous devez être connecté pour effectuer cette demande.',
userLocked:
"Cet utilisateur est verrouillé en raison d'un trop grand nombre de tentatives de connexion infructueuses.",
valueMustBeUnique: 'La valeur doit être unique',
},
fields: {
chooseBetweenCustomTextOrDocument:
'Choisissez entre saisir une URL personnalisée ou créer un lien vers un autre document.',
chooseDocumentToLink: 'Choisissez un document vers lequel établir un lien',
customURL: 'URL personnalisée',
enterURL: 'Entrez une URL',
internalLink: 'Lien interne',
linkType: 'Type de lien',
openInNewTab: 'Ouvrir dans un nouvel onglet',
textToDisplay: 'Texte à afficher',
},
general: {
createdAt: 'Créé(e) à',
deletedCountSuccessfully: '{{count}} {{label}} supprimé avec succès.',
deletedSuccessfully: 'Supprimé(e) avec succès.',
email: 'E-mail',
notFound: 'Pas trouvé',
successfullyCreated: '{{label}} créé(e) avec succès.',
thisLanguage: 'Français',
updatedAt: 'Modifié le',
updatedCountSuccessfully: '{{count}} {{label}} mis à jour avec succès.',
updatedSuccessfully: 'Mis à jour avec succés.',
user: 'Utilisateur',
users: 'Utilisateurs',
value: 'Valeur',
},
upload: {
fileName: 'Nom du fichier',
fileSize: 'Taille du fichier',
height: 'Hauteur',
sizes: 'Tailles',
width: 'Largeur',
},
validation: {
emailAddress: "S'il vous plaît, veuillez entrer une adresse e-mail valide.",
enterNumber: "S'il vous plait, veuillez entrer un nombre valide.",
greaterThanMax: '{{value}} est supérieur au max autorisé {{label}} de {{max}}.',
invalidInput: 'Ce champ a une entrée invalide.',
invalidSelection: 'Ce champ a une sélection invalide.',
invalidSelections: 'Ce champ contient des sélections invalides suivantes :',
lessThanMin: '{{value}} est inférieur au min autorisé {{label}} de {{min}}.',
longerThanMin:
'Cette valeur doit être supérieure à la longueur minimale de {{minLength}} caractères.',
notValidDate: '"{{value}}" n\'est pas une date valide.',
required: 'Ce champ est requis.',
requiresNoMoreThan: 'Ce champ ne doit pas avoir plus de {{count}} {{label}}.',
requiresTwoNumbers: 'Ce champ doit avoir deux chiffres.',
shorterThanMax:
'Cette valeur doit être inférieure à la longueur maximale de {{maxLength}} caractères.',
trueOrFalse: "Ce champ ne peut être égal qu'à vrai ou faux.",
validUploadID: "Ce champ n'est pas un valide identifiant de fichier.",
},
version: {
autosavedSuccessfully: 'Enregistrement automatique réussi.',
draft: 'Brouillon',
draftSavedSuccessfully: 'Brouillon enregistré avec succès.',
published: 'Publié',
restoredSuccessfully: 'Restauré(e) avec succès.',
status: 'Statut',
},
}

View File

@@ -1,85 +0,0 @@
{
"$schema": "./translation-schema.json",
"authentication": {
"account": "Compte",
"apiKey": "Clé API",
"enableAPIKey": "Activer la clé API",
"newAccountCreated": "Un nouveau compte vient d'être créé pour vous permettre d'accéder <a href=\"{{serverURL}}\">{{serverURL}}</a>. Veuillez cliquer sur le lien suivant ou collez l'URL ci-dessous dans votre navigateur pour vérifier votre adresse e-mail: <a href=\"{{verificationURL}}\">{{verificationURL}}</a><br>. Après avoir vérifié votre adresse e-mail, vous pourrez vous connecter avec succès.",
"resetYourPassword": "Réinitialisez votre mot de passe",
"verified": "Vérifié",
"verifyYourEmail": "Vérifiez votre e-mail",
"youAreReceivingResetPassword": "Vous recevez ceci parce que vous (ou quelqu'un d'autre) avez demandé la réinitialisation du mot de passe de votre compte. Veuillez cliquer sur le lien suivant ou le coller dans votre navigateur pour terminer le processus :",
"youDidNotRequestPassword": "Si vous ne l'avez pas demandé, veuillez ignorer cet e-mail et votre mot de passe restera inchangé."
},
"error": {
"deletingFile": "Une erreur s'est produite lors de la suppression du fichier.",
"emailOrPasswordIncorrect": "L'adresse e-mail ou le mot de passe fourni est incorrect.",
"followingFieldsInvalid_one": "Le champ suivant n'est pas valide :",
"followingFieldsInvalid_other": "Les champs suivants ne sont pas valides :",
"noFilesUploaded": "Aucun fichier n'a été téléversé.",
"notAllowedToPerformAction": "Vous n'êtes pas autorisé à effectuer cette action.",
"problemUploadingFile": "Il y a eu un problème lors du téléversement du fichier.",
"unableToDeleteCount": "Impossible de supprimer {{count}} sur {{total}} {{label}}.",
"unableToUpdateCount": "Impossible de mettre à jour {{count}} sur {{total}} {{label}}.",
"unauthorized": "Non autorisé, vous devez être connecté pour effectuer cette demande.",
"userLocked": "Cet utilisateur est verrouillé en raison d'un trop grand nombre de tentatives de connexion infructueuses.",
"valueMustBeUnique": "La valeur doit être unique"
},
"fields": {
"chooseBetweenCustomTextOrDocument": "Choisissez entre saisir une URL personnalisée ou créer un lien vers un autre document.",
"chooseDocumentToLink": "Choisissez un document vers lequel établir un lien",
"customURL": "URL personnalisée",
"enterURL": "Entrez une URL",
"internalLink": "Lien interne",
"linkType": "Type de lien",
"openInNewTab": "Ouvrir dans un nouvel onglet",
"textToDisplay": "Texte à afficher"
},
"general": {
"createdAt": "Créé(e) à",
"deletedCountSuccessfully": "{{count}} {{label}} supprimé avec succès.",
"deletedSuccessfully": "Supprimé(e) avec succès.",
"email": "E-mail",
"notFound": "Pas trouvé",
"successfullyCreated": "{{label}} créé(e) avec succès.",
"thisLanguage": "Français",
"updatedAt": "Modifié le",
"updatedCountSuccessfully": "{{count}} {{label}} mis à jour avec succès.",
"updatedSuccessfully": "Mis à jour avec succés.",
"user": "Utilisateur",
"users": "Utilisateurs",
"value": "Valeur"
},
"upload": {
"fileName": "Nom du fichier",
"fileSize": "Taille du fichier",
"height": "Hauteur",
"sizes": "Tailles",
"width": "Largeur"
},
"validation": {
"emailAddress": "S'il vous plaît, veuillez entrer une adresse e-mail valide.",
"enterNumber": "S'il vous plait, veuillez entrer un nombre valide.",
"greaterThanMax": "{{value}} est supérieur au max autorisé {{label}} de {{max}}.",
"invalidInput": "Ce champ a une entrée invalide.",
"invalidSelection": "Ce champ a une sélection invalide.",
"invalidSelections": "Ce champ contient des sélections invalides suivantes :",
"lessThanMin": "{{value}} est inférieur au min autorisé {{label}} de {{min}}.",
"longerThanMin": "Cette valeur doit être supérieure à la longueur minimale de {{minLength}} caractères.",
"notValidDate": "\"{{value}}\" n'est pas une date valide.",
"required": "Ce champ est requis.",
"requiresNoMoreThan": "Ce champ ne doit pas avoir plus de {{count}} {{label}}.",
"requiresTwoNumbers": "Ce champ doit avoir deux chiffres.",
"shorterThanMax": "Cette valeur doit être inférieure à la longueur maximale de {{maxLength}} caractères.",
"trueOrFalse": "Ce champ ne peut être égal qu'à vrai ou faux.",
"validUploadID": "Ce champ n'est pas un valide identifiant de fichier."
},
"version": {
"autosavedSuccessfully": "Enregistrement automatique réussi.",
"draft": "Brouillon",
"draftSavedSuccessfully": "Brouillon enregistré avec succès.",
"published": "Publié",
"restoredSuccessfully": "Restauré(e) avec succès.",
"status": "Statut"
}
}

Some files were not shown because too many files have changed in this diff Show More