From 30948ab5454b718720486adc2caf05600ad37466 Mon Sep 17 00:00:00 2001 From: James Date: Mon, 8 Apr 2024 16:25:21 -0400 Subject: [PATCH 001/177] chore: dynamically loads translations --- .../admin/[[...segments]]/not-found.tsx | 6 +- app/(payload)/admin/[[...segments]]/page.tsx | 2 +- app/(payload)/api/[...slug]/route.ts | 2 +- app/(payload)/api/graphql-playground/route.ts | 2 +- app/(payload)/api/graphql/route.ts | 2 +- app/(payload)/layout.tsx | 2 +- packages/next/src/layouts/Root/index.tsx | 24 +- .../next/src/routes/rest/buildFormState.ts | 29 +- .../utilities/buildFieldSchemaMap/index.ts | 42 +-- .../buildFieldSchemaMap/traverseFields.ts | 142 +++++---- .../src/utilities/createPayloadRequest.ts | 4 +- packages/next/src/utilities/getNextI18n.ts | 6 +- packages/next/src/utilities/initPage.ts | 6 +- .../next/src/views/CreateFirstUser/index.tsx | 2 + packages/next/src/views/List/index.tsx | 5 +- packages/next/src/views/NotFound/index.tsx | 2 +- packages/next/src/views/Root/meta.ts | 2 +- packages/payload/node.d.ts | 7 +- packages/payload/node.js | 7 +- packages/payload/src/admin/RichText.ts | 4 +- .../src/admin/forms/FieldDescription.ts | 4 +- packages/payload/src/admin/forms/Label.ts | 4 +- .../payload/src/auth/baseFields/apiKey.ts | 9 +- packages/payload/src/auth/baseFields/auth.ts | 5 +- .../src/auth/baseFields/verification.ts | 6 +- packages/payload/src/auth/defaultUser.ts | 8 +- .../payload/src/auth/operations/local/auth.ts | 2 +- .../payload/src/collections/config/client.ts | 32 +- .../src/collections/config/sanitize.ts | 7 +- .../payload/src/collections/config/schema.ts | 4 +- .../payload/src/collections/config/types.ts | 5 +- .../collections/operations/local/create.ts | 3 +- .../collections/operations/local/duplicate.ts | 2 +- packages/payload/src/config/client.ts | 25 +- packages/payload/src/config/sanitize.ts | 5 +- packages/payload/src/config/types.ts | 4 +- .../payload/src/errors/AuthenticationError.ts | 4 +- .../payload/src/errors/ErrorDeletingFile.ts | 7 +- .../payload/src/errors/FileUploadError.ts | 4 +- packages/payload/src/errors/Forbidden.ts | 4 +- packages/payload/src/errors/LockedAuth.ts | 4 +- packages/payload/src/errors/MissingFile.ts | 8 +- packages/payload/src/errors/NotFound.ts | 4 +- .../payload/src/errors/UnathorizedError.ts | 4 +- .../payload/src/errors/ValidationError.ts | 6 +- packages/payload/src/exports/utilities.ts | 1 - packages/payload/src/fields/config/client.ts | 38 ++- packages/payload/src/fields/config/schema.ts | 11 +- packages/payload/src/fields/config/types.ts | 10 +- .../src/fields/setDefaultBeforeDuplicate.ts | 8 +- packages/payload/src/globals/config/client.ts | 24 +- .../payload/src/globals/config/sanitize.ts | 8 +- packages/payload/src/globals/config/schema.ts | 4 +- .../operations/local/findVersionByID.ts | 1 + .../src/translations/extractTranslations.ts | 19 -- .../payload/src/translations/getLocalI18n.ts | 4 +- packages/payload/src/uploads/getBaseFields.ts | 19 +- .../payload/src/utilities/createLocalReq.ts | 6 +- packages/payload/src/versions/baseFields.ts | 10 +- packages/payload/uploads.d.ts | 4 +- packages/payload/uploads.js | 4 +- .../field/features/link/drawer/baseFields.ts | 29 +- .../src/field/features/link/feature.server.ts | 7 +- .../plugins/floatingLinkEditor/utilities.ts | 4 +- .../src/field/features/types.ts | 10 +- .../src/generateComponentMap.tsx | 3 +- .../elements/link/LinkDrawer/baseFields.ts | 29 +- .../src/generateComponentMap.tsx | 7 +- .../richtext-slate/src/generateSchemaMap.ts | 5 +- packages/translations/package.json | 31 +- .../src/_generatedFiles_/api/ar.js | 94 ------ .../src/_generatedFiles_/api/az.js | 96 ------ .../src/_generatedFiles_/api/bg.js | 97 ------ .../src/_generatedFiles_/api/cs.js | 94 ------ .../src/_generatedFiles_/api/de.js | 96 ------ .../src/_generatedFiles_/api/en.js | 95 ------ .../src/_generatedFiles_/api/es.js | 96 ------ .../src/_generatedFiles_/api/fa.js | 95 ------ .../src/_generatedFiles_/api/fr.js | 98 ------ .../src/_generatedFiles_/api/hr.js | 95 ------ .../src/_generatedFiles_/api/hu.js | 97 ------ .../src/_generatedFiles_/api/index.ts | 65 ---- .../src/_generatedFiles_/api/it.js | 97 ------ .../src/_generatedFiles_/api/ja.js | 95 ------ .../src/_generatedFiles_/api/ko.js | 95 ------ .../src/_generatedFiles_/api/my.js | 98 ------ .../src/_generatedFiles_/api/nb.js | 95 ------ .../src/_generatedFiles_/api/nl.js | 95 ------ .../src/_generatedFiles_/api/pl.js | 95 ------ .../src/_generatedFiles_/api/pt.js | 95 ------ .../src/_generatedFiles_/api/ro.js | 100 ------ .../src/_generatedFiles_/api/rs-latin.js | 95 ------ .../src/_generatedFiles_/api/rs.js | 95 ------ .../src/_generatedFiles_/api/ru.js | 96 ------ .../src/_generatedFiles_/api/sv.js | 95 ------ .../src/_generatedFiles_/api/th.js | 93 ------ .../src/_generatedFiles_/api/tr.js | 95 ------ .../src/_generatedFiles_/api/ua.js | 95 ------ .../src/_generatedFiles_/api/vi.js | 94 ------ .../src/_generatedFiles_/api/zh-tw.js | 92 ------ .../src/_generatedFiles_/api/zh.js | 92 ------ .../src/_generatedFiles_/client/ar.js | 288 ----------------- .../src/_generatedFiles_/client/az.js | 294 ----------------- .../src/_generatedFiles_/client/bg.js | 291 ----------------- .../src/_generatedFiles_/client/cs.js | 291 ----------------- .../src/_generatedFiles_/client/de.js | 294 ----------------- .../src/_generatedFiles_/client/en.js | 294 ----------------- .../src/_generatedFiles_/client/es.js | 294 ----------------- .../src/_generatedFiles_/client/fa.js | 291 ----------------- .../src/_generatedFiles_/client/fr.js | 298 ------------------ .../src/_generatedFiles_/client/hr.js | 290 ----------------- .../src/_generatedFiles_/client/hu.js | 294 ----------------- .../src/_generatedFiles_/client/index.ts | 65 ---- .../src/_generatedFiles_/client/it.js | 294 ----------------- .../src/_generatedFiles_/client/ja.js | 291 ----------------- .../src/_generatedFiles_/client/ko.js | 288 ----------------- .../src/_generatedFiles_/client/my.js | 297 ----------------- .../src/_generatedFiles_/client/nb.js | 294 ----------------- .../src/_generatedFiles_/client/nl.js | 296 ----------------- .../src/_generatedFiles_/client/pl.js | 293 ----------------- .../src/_generatedFiles_/client/pt.js | 294 ----------------- .../src/_generatedFiles_/client/ro.js | 293 ----------------- .../src/_generatedFiles_/client/rs-latin.js | 290 ----------------- .../src/_generatedFiles_/client/rs.js | 289 ----------------- .../src/_generatedFiles_/client/ru.js | 294 ----------------- .../src/_generatedFiles_/client/sv.js | 293 ----------------- .../src/_generatedFiles_/client/th.js | 288 ----------------- .../src/_generatedFiles_/client/tr.js | 293 ----------------- .../src/_generatedFiles_/client/ua.js | 292 ----------------- .../src/_generatedFiles_/client/vi.js | 288 ----------------- .../src/_generatedFiles_/client/zh-tw.js | 284 ----------------- .../src/_generatedFiles_/client/zh.js | 284 ----------------- packages/translations/src/all/index.ts | 65 ---- packages/translations/src/clientKeys.ts | 272 ++++++++++++++++ packages/translations/src/exports/all.ts | 65 ++++ .../translations/src/{all => languages}/ar.ts | 0 .../translations/src/{all => languages}/az.ts | 0 .../translations/src/{all => languages}/bg.ts | 0 .../translations/src/{all => languages}/cs.ts | 0 .../translations/src/{all => languages}/de.ts | 0 .../translations/src/{all => languages}/en.ts | 0 .../translations/src/{all => languages}/es.ts | 0 .../translations/src/{all => languages}/fa.ts | 0 .../translations/src/{all => languages}/fr.ts | 0 .../translations/src/{all => languages}/hr.ts | 0 .../translations/src/{all => languages}/hu.ts | 0 .../translations/src/{all => languages}/it.ts | 0 .../translations/src/{all => languages}/ja.ts | 0 .../translations/src/{all => languages}/ko.ts | 0 .../translations/src/{all => languages}/my.ts | 0 .../translations/src/{all => languages}/nb.ts | 0 .../translations/src/{all => languages}/nl.ts | 0 .../translations/src/{all => languages}/pl.ts | 0 .../translations/src/{all => languages}/pt.ts | 0 .../translations/src/{all => languages}/rn.sh | 0 .../translations/src/{all => languages}/ro.ts | 0 .../translations/src/{all => languages}/rs.ts | 0 .../{all/rs-latin.ts => languages/rsLatin.ts} | 0 .../translations/src/{all => languages}/ru.ts | 0 .../translations/src/{all => languages}/sv.ts | 0 .../translations/src/{all => languages}/th.ts | 0 .../translations/src/{all => languages}/tr.ts | 0 .../translations/src/{all => languages}/ua.ts | 0 .../translations/src/{all => languages}/vi.ts | 0 .../translations/src/{all => languages}/zh.ts | 0 .../src/{all/zh-tw.ts => languages/zhTw.ts} | 0 packages/translations/src/types.ts | 7 +- .../src/utilities/dynamicImport.ts | 174 ++++++++++ .../src/utilities/getTranslation.ts | 14 +- packages/translations/src/utilities/init.ts | 15 +- packages/translations/tsconfig.json | 1 - packages/ui/src/elements/StepNav/index.tsx | 4 +- .../buildComponentMap/collections.tsx | 4 + .../ComponentMap/buildComponentMap/fields.tsx | 38 ++- .../buildComponentMap/globals.tsx | 4 + .../ComponentMap/buildComponentMap/index.tsx | 6 +- test/_community/collections/Posts/index.ts | 26 +- test/_community/config.ts | 27 +- tsconfig.json | 4 +- 179 files changed, 997 insertions(+), 12237 deletions(-) delete mode 100644 packages/payload/src/translations/extractTranslations.ts delete mode 100644 packages/translations/src/_generatedFiles_/api/ar.js delete mode 100644 packages/translations/src/_generatedFiles_/api/az.js delete mode 100644 packages/translations/src/_generatedFiles_/api/bg.js delete mode 100644 packages/translations/src/_generatedFiles_/api/cs.js delete mode 100644 packages/translations/src/_generatedFiles_/api/de.js delete mode 100644 packages/translations/src/_generatedFiles_/api/en.js delete mode 100644 packages/translations/src/_generatedFiles_/api/es.js delete mode 100644 packages/translations/src/_generatedFiles_/api/fa.js delete mode 100644 packages/translations/src/_generatedFiles_/api/fr.js delete mode 100644 packages/translations/src/_generatedFiles_/api/hr.js delete mode 100644 packages/translations/src/_generatedFiles_/api/hu.js delete mode 100644 packages/translations/src/_generatedFiles_/api/index.ts delete mode 100644 packages/translations/src/_generatedFiles_/api/it.js delete mode 100644 packages/translations/src/_generatedFiles_/api/ja.js delete mode 100644 packages/translations/src/_generatedFiles_/api/ko.js delete mode 100644 packages/translations/src/_generatedFiles_/api/my.js delete mode 100644 packages/translations/src/_generatedFiles_/api/nb.js delete mode 100644 packages/translations/src/_generatedFiles_/api/nl.js delete mode 100644 packages/translations/src/_generatedFiles_/api/pl.js delete mode 100644 packages/translations/src/_generatedFiles_/api/pt.js delete mode 100644 packages/translations/src/_generatedFiles_/api/ro.js delete mode 100644 packages/translations/src/_generatedFiles_/api/rs-latin.js delete mode 100644 packages/translations/src/_generatedFiles_/api/rs.js delete mode 100644 packages/translations/src/_generatedFiles_/api/ru.js delete mode 100644 packages/translations/src/_generatedFiles_/api/sv.js delete mode 100644 packages/translations/src/_generatedFiles_/api/th.js delete mode 100644 packages/translations/src/_generatedFiles_/api/tr.js delete mode 100644 packages/translations/src/_generatedFiles_/api/ua.js delete mode 100644 packages/translations/src/_generatedFiles_/api/vi.js delete mode 100644 packages/translations/src/_generatedFiles_/api/zh-tw.js delete mode 100644 packages/translations/src/_generatedFiles_/api/zh.js delete mode 100644 packages/translations/src/_generatedFiles_/client/ar.js delete mode 100644 packages/translations/src/_generatedFiles_/client/az.js delete mode 100644 packages/translations/src/_generatedFiles_/client/bg.js delete mode 100644 packages/translations/src/_generatedFiles_/client/cs.js delete mode 100644 packages/translations/src/_generatedFiles_/client/de.js delete mode 100644 packages/translations/src/_generatedFiles_/client/en.js delete mode 100644 packages/translations/src/_generatedFiles_/client/es.js delete mode 100644 packages/translations/src/_generatedFiles_/client/fa.js delete mode 100644 packages/translations/src/_generatedFiles_/client/fr.js delete mode 100644 packages/translations/src/_generatedFiles_/client/hr.js delete mode 100644 packages/translations/src/_generatedFiles_/client/hu.js delete mode 100644 packages/translations/src/_generatedFiles_/client/index.ts delete mode 100644 packages/translations/src/_generatedFiles_/client/it.js delete mode 100644 packages/translations/src/_generatedFiles_/client/ja.js delete mode 100644 packages/translations/src/_generatedFiles_/client/ko.js delete mode 100644 packages/translations/src/_generatedFiles_/client/my.js delete mode 100644 packages/translations/src/_generatedFiles_/client/nb.js delete mode 100644 packages/translations/src/_generatedFiles_/client/nl.js delete mode 100644 packages/translations/src/_generatedFiles_/client/pl.js delete mode 100644 packages/translations/src/_generatedFiles_/client/pt.js delete mode 100644 packages/translations/src/_generatedFiles_/client/ro.js delete mode 100644 packages/translations/src/_generatedFiles_/client/rs-latin.js delete mode 100644 packages/translations/src/_generatedFiles_/client/rs.js delete mode 100644 packages/translations/src/_generatedFiles_/client/ru.js delete mode 100644 packages/translations/src/_generatedFiles_/client/sv.js delete mode 100644 packages/translations/src/_generatedFiles_/client/th.js delete mode 100644 packages/translations/src/_generatedFiles_/client/tr.js delete mode 100644 packages/translations/src/_generatedFiles_/client/ua.js delete mode 100644 packages/translations/src/_generatedFiles_/client/vi.js delete mode 100644 packages/translations/src/_generatedFiles_/client/zh-tw.js delete mode 100644 packages/translations/src/_generatedFiles_/client/zh.js delete mode 100644 packages/translations/src/all/index.ts create mode 100644 packages/translations/src/clientKeys.ts create mode 100644 packages/translations/src/exports/all.ts rename packages/translations/src/{all => languages}/ar.ts (100%) rename packages/translations/src/{all => languages}/az.ts (100%) rename packages/translations/src/{all => languages}/bg.ts (100%) rename packages/translations/src/{all => languages}/cs.ts (100%) rename packages/translations/src/{all => languages}/de.ts (100%) rename packages/translations/src/{all => languages}/en.ts (100%) rename packages/translations/src/{all => languages}/es.ts (100%) rename packages/translations/src/{all => languages}/fa.ts (100%) rename packages/translations/src/{all => languages}/fr.ts (100%) rename packages/translations/src/{all => languages}/hr.ts (100%) rename packages/translations/src/{all => languages}/hu.ts (100%) rename packages/translations/src/{all => languages}/it.ts (100%) rename packages/translations/src/{all => languages}/ja.ts (100%) rename packages/translations/src/{all => languages}/ko.ts (100%) rename packages/translations/src/{all => languages}/my.ts (100%) rename packages/translations/src/{all => languages}/nb.ts (100%) rename packages/translations/src/{all => languages}/nl.ts (100%) rename packages/translations/src/{all => languages}/pl.ts (100%) rename packages/translations/src/{all => languages}/pt.ts (100%) rename packages/translations/src/{all => languages}/rn.sh (100%) rename packages/translations/src/{all => languages}/ro.ts (100%) rename packages/translations/src/{all => languages}/rs.ts (100%) rename packages/translations/src/{all/rs-latin.ts => languages/rsLatin.ts} (100%) rename packages/translations/src/{all => languages}/ru.ts (100%) rename packages/translations/src/{all => languages}/sv.ts (100%) rename packages/translations/src/{all => languages}/th.ts (100%) rename packages/translations/src/{all => languages}/tr.ts (100%) rename packages/translations/src/{all => languages}/ua.ts (100%) rename packages/translations/src/{all => languages}/vi.ts (100%) rename packages/translations/src/{all => languages}/zh.ts (100%) rename packages/translations/src/{all/zh-tw.ts => languages/zhTw.ts} (100%) create mode 100644 packages/translations/src/utilities/dynamicImport.ts diff --git a/app/(payload)/admin/[[...segments]]/not-found.tsx b/app/(payload)/admin/[[...segments]]/not-found.tsx index 8b7a445fe7..a7d49cffe1 100644 --- a/app/(payload)/admin/[[...segments]]/not-found.tsx +++ b/app/(payload)/admin/[[...segments]]/not-found.tsx @@ -3,7 +3,7 @@ import type { Metadata } from 'next' import config from '@payload-config' /* DO NOT MODIFY IT BECAUSE IT COULD BE REWRITTEN AT ANY TIME. */ -import { NotFoundPage, generatePageMetadata } from '@payloadcms/next/views/NotFound/index.js' +import { NotFoundPage, generatePageMetadata } from '@payloadcms/next/views.js' type Args = { params: { @@ -14,8 +14,8 @@ type Args = { } } -export const generateMetadata = ({ params }: Args): Promise => - generatePageMetadata({ config, params }) +export const generateMetadata = ({ params, searchParams }: Args): Promise => + generatePageMetadata({ config, params, searchParams }) const NotFound = ({ params, searchParams }: Args) => NotFoundPage({ config, params, searchParams }) diff --git a/app/(payload)/admin/[[...segments]]/page.tsx b/app/(payload)/admin/[[...segments]]/page.tsx index ee9bd415c3..cd97ec8606 100644 --- a/app/(payload)/admin/[[...segments]]/page.tsx +++ b/app/(payload)/admin/[[...segments]]/page.tsx @@ -3,7 +3,7 @@ import type { Metadata } from 'next' import config from '@payload-config' /* DO NOT MODIFY IT BECAUSE IT COULD BE REWRITTEN AT ANY TIME. */ -import { RootPage, generatePageMetadata } from '@payloadcms/next/views/Root/index.js' +import { RootPage, generatePageMetadata } from '@payloadcms/next/views.js' type Args = { params: { diff --git a/app/(payload)/api/[...slug]/route.ts b/app/(payload)/api/[...slug]/route.ts index eacae29614..c982aa94d5 100644 --- a/app/(payload)/api/[...slug]/route.ts +++ b/app/(payload)/api/[...slug]/route.ts @@ -1,7 +1,7 @@ /* THIS FILE WAS GENERATED AUTOMATICALLY BY PAYLOAD. */ /* DO NOT MODIFY it because it could be re-written at any time. */ import config from '@payload-config' -import { REST_DELETE, REST_GET, REST_PATCH, REST_POST } from '@payloadcms/next/routes/index.js' +import { REST_DELETE, REST_GET, REST_PATCH, REST_POST } from '@payloadcms/next/routes.js' export const GET = REST_GET(config) export const POST = REST_POST(config) diff --git a/app/(payload)/api/graphql-playground/route.ts b/app/(payload)/api/graphql-playground/route.ts index 7832c8ba92..997feb2415 100644 --- a/app/(payload)/api/graphql-playground/route.ts +++ b/app/(payload)/api/graphql-playground/route.ts @@ -1,6 +1,6 @@ /* THIS FILE WAS GENERATED AUTOMATICALLY BY PAYLOAD. */ /* DO NOT MODIFY it because it could be re-written at any time. */ import config from '@payload-config' -import { GRAPHQL_PLAYGROUND_GET } from '@payloadcms/next/routes/index.js' +import { GRAPHQL_PLAYGROUND_GET } from '@payloadcms/next/routes.js' export const GET = GRAPHQL_PLAYGROUND_GET(config) diff --git a/app/(payload)/api/graphql/route.ts b/app/(payload)/api/graphql/route.ts index 4caee1b7cb..2b7c41215b 100644 --- a/app/(payload)/api/graphql/route.ts +++ b/app/(payload)/api/graphql/route.ts @@ -1,6 +1,6 @@ /* THIS FILE WAS GENERATED AUTOMATICALLY BY PAYLOAD. */ /* DO NOT MODIFY it because it could be re-written at any time. */ import config from '@payload-config' -import { GRAPHQL_POST } from '@payloadcms/next/routes/index.js' +import { GRAPHQL_POST } from '@payloadcms/next/routes.js' export const POST = GRAPHQL_POST(config) diff --git a/app/(payload)/layout.tsx b/app/(payload)/layout.tsx index 88fedb4042..18bdb4de37 100644 --- a/app/(payload)/layout.tsx +++ b/app/(payload)/layout.tsx @@ -1,6 +1,6 @@ /* THIS FILE WAS GENERATED AUTOMATICALLY BY PAYLOAD. */ import configPromise from '@payload-config' -import { RootLayout } from '@payloadcms/next/layouts/Root/index.js' +import { RootLayout } from '@payloadcms/next/layouts.js' /* DO NOT MODIFY IT BECAUSE IT COULD BE REWRITTEN AT ANY TIME. */ import React from 'react' diff --git a/packages/next/src/layouts/Root/index.tsx b/packages/next/src/layouts/Root/index.tsx index 692c39bb92..0ca44eea13 100644 --- a/packages/next/src/layouts/Root/index.tsx +++ b/packages/next/src/layouts/Root/index.tsx @@ -1,13 +1,12 @@ import type { SanitizedConfig } from 'payload/types' -import { translations } from '@payloadcms/translations/client' +import { initI18n } from '@payloadcms/translations' import { RootProvider } from '@payloadcms/ui/providers/Root' import '@payloadcms/ui/scss/app.scss' import { buildComponentMap } from '@payloadcms/ui/utilities/buildComponentMap' import { headers as getHeaders, cookies as nextCookies } from 'next/headers.js' import { parseCookies } from 'payload/auth' import { createClientConfig } from 'payload/config' -import { deepMerge } from 'payload/utilities' import React from 'react' import 'react-toastify/dist/ReactToastify.css' @@ -30,7 +29,6 @@ export const RootLayout = async ({ config: Promise }) => { const config = await configPromise - const clientConfig = await createClientConfig(config) const headers = getHeaders() const cookies = parseCookies(headers) @@ -40,16 +38,19 @@ export const RootLayout = async ({ config, cookies, headers, - }) ?? clientConfig.i18n.fallbackLanguage + }) ?? config.i18n.fallbackLanguage + + const i18n = await initI18n({ config: config.i18n, context: 'client', language: lang }) + const clientConfig = await createClientConfig({ config, t: i18n.t }) const dir = rtlLanguages.includes(lang) ? 'RTL' : 'LTR' - const mergedTranslations = deepMerge(translations, clientConfig.i18n.translations) - - const languageOptions = Object.entries(translations || {}).map(([language, translations]) => ({ - label: translations.general.thisLanguage, - value: language, - })) + const languageOptions = Object.entries(i18n.translations || {}).map( + ([language, translations]) => ({ + label: translations.general.thisLanguage, + value: language, + }), + ) // eslint-disable-next-line @typescript-eslint/require-await async function switchLanguageServerAction(lang: string): Promise { @@ -66,6 +67,7 @@ export const RootLayout = async ({ DefaultListView, children, config, + i18n, }) return ( @@ -79,7 +81,7 @@ export const RootLayout = async ({ languageOptions={languageOptions} // eslint-disable-next-line react/jsx-no-bind switchLanguageServerAction={switchLanguageServerAction} - translations={mergedTranslations[lang]} + translations={i18n.translations[lang]} > {wrappedChildren} diff --git a/packages/next/src/routes/rest/buildFormState.ts b/packages/next/src/routes/rest/buildFormState.ts index 345e3da570..ec1a16ccd7 100644 --- a/packages/next/src/routes/rest/buildFormState.ts +++ b/packages/next/src/routes/rest/buildFormState.ts @@ -15,21 +15,32 @@ import type { FieldSchemaMap } from '../../utilities/buildFieldSchemaMap/types.j import { buildFieldSchemaMap } from '../../utilities/buildFieldSchemaMap/index.js' -let cached = global._payload_fieldSchemaMap - +let cached: { + promise: Promise | null + schemaMap: FieldSchemaMap | null +} = global._payload_fieldSchemaMap if (!cached) { // eslint-disable-next-line no-multi-assign - cached = global._payload_fieldSchemaMap = null + cached = global._payload_fieldSchemaMap = { promise: null, schemaMap: null } } -export const getFieldSchemaMap = (config: SanitizedConfig): FieldSchemaMap => { - if (cached && process.env.NODE_ENV !== 'development') { - return cached +export const getFieldSchemaMap = async (config: SanitizedConfig): Promise => { + if (cached.schemaMap && process.env.NODE_ENV !== 'development') { + return cached.schemaMap } - cached = buildFieldSchemaMap(config) + if (!cached.promise) { + cached.promise = buildFieldSchemaMap(config) + } - return cached + try { + cached.schemaMap = await cached.promise + } catch (e) { + cached.promise = null + throw e + } + + return cached.schemaMap } export const buildFormState = async ({ req }: { req: PayloadRequest }) => { @@ -65,7 +76,7 @@ export const buildFormState = async ({ req }: { req: PayloadRequest }) => { }) } - const fieldSchemaMap = getFieldSchemaMap(req.payload.config) + const fieldSchemaMap = await getFieldSchemaMap(req.payload.config) const id = collectionSlug ? reqData.id : undefined const schemaPathSegments = schemaPath.split('.') diff --git a/packages/next/src/utilities/buildFieldSchemaMap/index.ts b/packages/next/src/utilities/buildFieldSchemaMap/index.ts index 76859df3fd..a07f495e28 100644 --- a/packages/next/src/utilities/buildFieldSchemaMap/index.ts +++ b/packages/next/src/utilities/buildFieldSchemaMap/index.ts @@ -4,30 +4,34 @@ import type { FieldSchemaMap } from './types.js' import { traverseFields } from './traverseFields.js' -export const buildFieldSchemaMap = (config: SanitizedConfig): FieldSchemaMap => { +export const buildFieldSchemaMap = async (config: SanitizedConfig): Promise => { const result: FieldSchemaMap = new Map() const validRelationships = config.collections.map((c) => c.slug) || [] - config.collections.forEach((collection) => { - traverseFields({ - config, - fields: collection.fields, - schemaMap: result, - schemaPath: collection.slug, - validRelationships, - }) - }) + await Promise.all( + config.collections.map(async (collection) => { + await traverseFields({ + config, + fields: collection.fields, + schemaMap: result, + schemaPath: collection.slug, + validRelationships, + }) + }), + ) - config.globals.forEach((global) => { - traverseFields({ - config, - fields: global.fields, - schemaMap: result, - schemaPath: global.slug, - validRelationships, - }) - }) + await Promise.all( + config.globals.map(async (global) => { + await traverseFields({ + config, + fields: global.fields, + schemaMap: result, + schemaPath: global.slug, + validRelationships, + }) + }), + ) return result } diff --git a/packages/next/src/utilities/buildFieldSchemaMap/traverseFields.ts b/packages/next/src/utilities/buildFieldSchemaMap/traverseFields.ts index 2cb94dfb56..efec468e98 100644 --- a/packages/next/src/utilities/buildFieldSchemaMap/traverseFields.ts +++ b/packages/next/src/utilities/buildFieldSchemaMap/traverseFields.ts @@ -12,83 +12,89 @@ type Args = { validRelationships: string[] } -export const traverseFields = ({ +export const traverseFields = async ({ config, fields, schemaMap, schemaPath, validRelationships, -}: Args) => { - fields.map((field) => { - switch (field.type) { - case 'group': - case 'array': - schemaMap.set(`${schemaPath}.${field.name}`, field.fields) +}: Args): Promise => { + await Promise.all( + fields.map(async (field) => { + switch (field.type) { + case 'group': + case 'array': + schemaMap.set(`${schemaPath}.${field.name}`, field.fields) - traverseFields({ - config, - fields: field.fields, - schemaMap, - schemaPath: `${schemaPath}.${field.name}`, - validRelationships, - }) - break - - case 'collapsible': - case 'row': - traverseFields({ - config, - fields: field.fields, - schemaMap, - schemaPath, - validRelationships, - }) - break - - case 'blocks': - field.blocks.map((block) => { - const blockSchemaPath = `${schemaPath}.${field.name}.${block.slug}` - - schemaMap.set(blockSchemaPath, block.fields) - - traverseFields({ - config, - fields: block.fields, - schemaMap, - schemaPath: blockSchemaPath, - validRelationships, - }) - }) - break - - case 'richText': - if (typeof field.editor.generateSchemaMap === 'function') { - field.editor.generateSchemaMap({ + await traverseFields({ config, + fields: field.fields, schemaMap, schemaPath: `${schemaPath}.${field.name}`, - }) - } - - break - - case 'tabs': - field.tabs.map((tab) => { - const tabSchemaPath = tabHasName(tab) ? `${schemaPath}.${tab.name}` : schemaPath - - if (tabHasName(tab)) { - schemaMap.set(tabSchemaPath, tab.fields) - } - - traverseFields({ - config, - fields: tab.fields, - schemaMap, - schemaPath: tabSchemaPath, validRelationships, }) - }) - break - } - }) + break + + case 'collapsible': + case 'row': + await traverseFields({ + config, + fields: field.fields, + schemaMap, + schemaPath, + validRelationships, + }) + break + + case 'blocks': + await Promise.all( + field.blocks.map(async (block) => { + const blockSchemaPath = `${schemaPath}.${field.name}.${block.slug}` + + schemaMap.set(blockSchemaPath, block.fields) + + await traverseFields({ + config, + fields: block.fields, + schemaMap, + schemaPath: blockSchemaPath, + validRelationships, + }) + }), + ) + break + + case 'richText': + if (typeof field.editor.generateSchemaMap === 'function') { + await field.editor.generateSchemaMap({ + config, + schemaMap, + schemaPath: `${schemaPath}.${field.name}`, + }) + } + + break + + case 'tabs': + await Promise.all( + field.tabs.map(async (tab) => { + const tabSchemaPath = tabHasName(tab) ? `${schemaPath}.${tab.name}` : schemaPath + + if (tabHasName(tab)) { + schemaMap.set(tabSchemaPath, tab.fields) + } + + await traverseFields({ + config, + fields: tab.fields, + schemaMap, + schemaPath: tabSchemaPath, + validRelationships, + }) + }), + ) + break + } + }), + ) } diff --git a/packages/next/src/utilities/createPayloadRequest.ts b/packages/next/src/utilities/createPayloadRequest.ts index 1d171d1a57..72ec72bfcd 100644 --- a/packages/next/src/utilities/createPayloadRequest.ts +++ b/packages/next/src/utilities/createPayloadRequest.ts @@ -6,7 +6,6 @@ import type { } from 'payload/types' import { initI18n } from '@payloadcms/translations' -import { translations } from '@payloadcms/translations/api' import { executeAuthStrategies } from 'payload/auth' import { parseCookies } from 'payload/auth' import { getDataLoader } from 'payload/utilities' @@ -72,11 +71,10 @@ export const createPayloadRequest = async ({ headers: request.headers, }) - const i18n = initI18n({ + const i18n = await initI18n({ config: config.i18n, context: 'api', language, - translations, }) const customRequest: CustomPayloadRequest = { diff --git a/packages/next/src/utilities/getNextI18n.ts b/packages/next/src/utilities/getNextI18n.ts index 25a7d2a523..82c488c644 100644 --- a/packages/next/src/utilities/getNextI18n.ts +++ b/packages/next/src/utilities/getNextI18n.ts @@ -2,21 +2,19 @@ import type { I18n } from '@payloadcms/translations' import type { SanitizedConfig } from 'payload/types' import { initI18n } from '@payloadcms/translations' -import { translations } from '@payloadcms/translations/client' import { cookies, headers } from 'next/headers.js' import { getRequestLanguage } from './getRequestLanguage.js' -export const getNextI18n = ({ +export const getNextI18n = async ({ config, language, }: { config: SanitizedConfig language?: string -}): I18n => +}): Promise => initI18n({ config: config.i18n, context: 'client', language: language || getRequestLanguage({ config, cookies: cookies(), headers: headers() }), - translations, }) diff --git a/packages/next/src/utilities/initPage.ts b/packages/next/src/utilities/initPage.ts index 1704570209..efcededc71 100644 --- a/packages/next/src/utilities/initPage.ts +++ b/packages/next/src/utilities/initPage.ts @@ -8,7 +8,6 @@ import type { } from 'payload/types' import { initI18n } from '@payloadcms/translations' -import { translations } from '@payloadcms/translations/client' import { findLocaleFromCode } from '@payloadcms/ui/utilities/findLocaleFromCode' import { headers as getHeaders } from 'next/headers.js' import { notFound, redirect } from 'next/navigation.js' @@ -45,14 +44,13 @@ export const initPage = async ({ const cookies = parseCookies(headers) const language = getRequestLanguage({ config: payload.config, cookies, headers }) - const i18n = initI18n({ + const i18n = await initI18n({ config: payload.config.i18n, context: 'client', language, - translations, }) - const req = createLocalReq( + const req = await createLocalReq( { fallbackLocale: null, locale: locale.code, diff --git a/packages/next/src/views/CreateFirstUser/index.tsx b/packages/next/src/views/CreateFirstUser/index.tsx index f0dd3316be..814e522381 100644 --- a/packages/next/src/views/CreateFirstUser/index.tsx +++ b/packages/next/src/views/CreateFirstUser/index.tsx @@ -16,6 +16,7 @@ export const CreateFirstUser: React.FC = async ({ initPageResult const { req, req: { + i18n, payload: { config, config: { @@ -51,6 +52,7 @@ export const CreateFirstUser: React.FC = async ({ initPageResult const createFirstUserFieldMap = mapFields({ config, fieldSchema: fields, + i18n, parentPath: userSlug, }) diff --git a/packages/next/src/views/List/index.tsx b/packages/next/src/views/List/index.tsx index b808f6b2c0..fd23b1f2b8 100644 --- a/packages/next/src/views/List/index.tsx +++ b/packages/next/src/views/List/index.tsx @@ -117,7 +117,10 @@ export const ListView: React.FC = async ({ initPageResult, searc => { const config = await configPromise - const i18n = getNextI18n({ + const i18n = await getNextI18n({ config, }) diff --git a/packages/next/src/views/Root/meta.ts b/packages/next/src/views/Root/meta.ts index 0edcfd5319..dbbed934d6 100644 --- a/packages/next/src/views/Root/meta.ts +++ b/packages/next/src/views/Root/meta.ts @@ -49,7 +49,7 @@ export const generatePageMetadata = async ({ config: configPromise, params }: Ar const isGlobal = segmentOne === 'globals' const isCollection = segmentOne === 'collections' - const i18n = getNextI18n({ + const i18n = await getNextI18n({ config, }) diff --git a/packages/payload/node.d.ts b/packages/payload/node.d.ts index 3f0b713267..58a3d77ef7 100644 --- a/packages/payload/node.d.ts +++ b/packages/payload/node.d.ts @@ -1,5 +1,2 @@ -export { - importConfig, - importWithoutClientFiles, -} from './dist/utilities/importWithoutClientFiles.js' -//# sourceMappingURL=node.d.ts.map +export { importConfig, importWithoutClientFiles } from './dist/utilities/importWithoutClientFiles.js'; +//# sourceMappingURL=node.d.ts.map \ No newline at end of file diff --git a/packages/payload/node.js b/packages/payload/node.js index a5fae121f4..9973c022ed 100644 --- a/packages/payload/node.js +++ b/packages/payload/node.js @@ -1,6 +1,3 @@ -export { - importConfig, - importWithoutClientFiles, -} from './dist/utilities/importWithoutClientFiles.js' +export { importConfig, importWithoutClientFiles } from './dist/utilities/importWithoutClientFiles.js'; -//# sourceMappingURL=node.js.map +//# sourceMappingURL=node.js.map \ No newline at end of file diff --git a/packages/payload/src/admin/RichText.ts b/packages/payload/src/admin/RichText.ts index 54c3f83b0b..e3d2dd6d09 100644 --- a/packages/payload/src/admin/RichText.ts +++ b/packages/payload/src/admin/RichText.ts @@ -1,3 +1,4 @@ +import type { I18n } from '@payloadcms/translations' import type { JSONSchema4 } from 'json-schema' import type { SanitizedConfig } from '../config/types.js' @@ -28,13 +29,14 @@ type RichTextAdapterBase< }) => Promise | null generateComponentMap: (args: { config: SanitizedConfig + i18n: I18n schemaPath: string }) => Map generateSchemaMap?: (args: { config: SanitizedConfig schemaMap: Map schemaPath: string - }) => Map + }) => Map | Promise> outputSchema?: ({ collectionIDFieldTypes, config, diff --git a/packages/payload/src/admin/forms/FieldDescription.ts b/packages/payload/src/admin/forms/FieldDescription.ts index acbbbb7b35..cd2c2fd9f5 100644 --- a/packages/payload/src/admin/forms/FieldDescription.ts +++ b/packages/payload/src/admin/forms/FieldDescription.ts @@ -1,6 +1,8 @@ import type React from 'react' -export type DescriptionFunction = () => string +import type { LabelFunction } from '../../config/types.js' + +export type DescriptionFunction = LabelFunction export type DescriptionComponent = React.ComponentType diff --git a/packages/payload/src/admin/forms/Label.ts b/packages/payload/src/admin/forms/Label.ts index 1c5e39bae0..0a725d7c5f 100644 --- a/packages/payload/src/admin/forms/Label.ts +++ b/packages/payload/src/admin/forms/Label.ts @@ -1,8 +1,10 @@ +import type { LabelFunction } from '../../config/types.js' + export type LabelProps = { CustomLabel?: React.ReactNode as?: 'label' | 'span' htmlFor?: string - label?: Record | false | string + label?: LabelFunction | Record | false | string required?: boolean unstyled?: boolean } diff --git a/packages/payload/src/auth/baseFields/apiKey.ts b/packages/payload/src/auth/baseFields/apiKey.ts index efea8c3d40..0840a2c2eb 100644 --- a/packages/payload/src/auth/baseFields/apiKey.ts +++ b/packages/payload/src/auth/baseFields/apiKey.ts @@ -2,15 +2,12 @@ import crypto from 'crypto' import type { Field, FieldHook } from '../../fields/config/types.js' -import { extractTranslations } from '../../translations/extractTranslations.js' - -const labels = extractTranslations(['authentication:enableAPIKey', 'authentication:apiKey']) - const encryptKey: FieldHook = ({ req, value }) => value ? req.payload.encrypt(value as string) : null const decryptKey: FieldHook = ({ req, value }) => value ? req.payload.decrypt(value as string) : undefined +// eslint-disable-next-line no-restricted-exports export default [ { name: 'enableAPIKey', @@ -21,7 +18,7 @@ export default [ }, }, defaultValue: false, - label: labels['authentication:enableAPIKey'], + label: ({ t }) => t('authentication:enableAPIKey'), }, { name: 'apiKey', @@ -35,7 +32,7 @@ export default [ afterRead: [decryptKey], beforeChange: [encryptKey], }, - label: labels['authentication:apiKey'], + label: ({ t }) => t('authentication:apiKey'), }, { name: 'apiKeyIndex', diff --git a/packages/payload/src/auth/baseFields/auth.ts b/packages/payload/src/auth/baseFields/auth.ts index 8933034f97..6018779b0c 100644 --- a/packages/payload/src/auth/baseFields/auth.ts +++ b/packages/payload/src/auth/baseFields/auth.ts @@ -1,9 +1,6 @@ import type { Field } from '../../fields/config/types.js' import { email } from '../../fields/validations.js' -import { extractTranslations } from '../../translations/extractTranslations.js' - -const labels = extractTranslations(['general:email']) const baseAuthFields: Field[] = [ { @@ -14,7 +11,7 @@ const baseAuthFields: Field[] = [ Field: () => null, }, }, - label: labels['general:email'], + label: ({ t }) => t('general:email'), required: true, unique: true, validate: email, diff --git a/packages/payload/src/auth/baseFields/verification.ts b/packages/payload/src/auth/baseFields/verification.ts index 7a2610f9c2..7c9719849a 100644 --- a/packages/payload/src/auth/baseFields/verification.ts +++ b/packages/payload/src/auth/baseFields/verification.ts @@ -1,9 +1,5 @@ import type { Field, FieldHook } from '../../fields/config/types.js' -import { extractTranslations } from '../../translations/extractTranslations.js' - -const labels = extractTranslations(['authentication:verified']) - const autoRemoveVerificationToken: FieldHook = ({ data, operation, originalDoc, value }) => { // If a user manually sets `_verified` to true, // and it was `false`, set _verificationToken to `null`. @@ -33,7 +29,7 @@ export default [ Field: () => null, }, }, - label: labels['authentication:verified'], + label: ({ t }) => t('authentication:verified'), }, { name: '_verificationToken', diff --git a/packages/payload/src/auth/defaultUser.ts b/packages/payload/src/auth/defaultUser.ts index 807dc2f2f2..beed302a2f 100644 --- a/packages/payload/src/auth/defaultUser.ts +++ b/packages/payload/src/auth/defaultUser.ts @@ -1,9 +1,5 @@ import type { CollectionConfig } from '../collections/config/types.js' -import { extractTranslations } from '../translations/extractTranslations.js' - -const labels = extractTranslations(['general:user', 'general:users']) - export const defaultUserCollection: CollectionConfig = { slug: 'users', admin: { @@ -14,7 +10,7 @@ export const defaultUserCollection: CollectionConfig = { }, fields: [], labels: { - plural: labels['general:users'], - singular: labels['general:user'], + plural: ({ t }) => t('general:users'), + singular: ({ t }) => t('general:user'), }, } diff --git a/packages/payload/src/auth/operations/local/auth.ts b/packages/payload/src/auth/operations/local/auth.ts index 05ddc439f5..b221d550f0 100644 --- a/packages/payload/src/auth/operations/local/auth.ts +++ b/packages/payload/src/auth/operations/local/auth.ts @@ -10,6 +10,6 @@ export const auth = async (payload: Payload, options: AuthArgs): Promise { +export const createClientCollectionConfig = ({ + collection, + t, +}: { + collection: SanitizedCollectionConfig + t: TFunction +}) => { const sanitized = { ...collection } - sanitized.fields = createClientFieldConfigs(sanitized.fields) + sanitized.fields = createClientFieldConfigs({ fields: sanitized.fields, t }) const serverOnlyCollectionProperties: Partial[] = [ 'hooks', @@ -60,6 +68,14 @@ export const createClientCollectionConfig = (collection: SanitizedCollectionConf delete sanitized.auth.verify } + if (sanitized.labels) { + Object.entries(sanitized.labels).forEach(([labelType, collectionLabel]) => { + if (typeof collectionLabel === 'function') { + sanitized.labels[labelType] = collectionLabel({ t }) + } + }) + } + if ('admin' in sanitized) { sanitized.admin = { ...sanitized.admin } @@ -85,7 +101,11 @@ export const createClientCollectionConfig = (collection: SanitizedCollectionConf return sanitized } -export const createClientCollectionConfigs = ( - collections: SanitizedCollectionConfig[], -): ClientCollectionConfig[] => - collections.map((collection) => createClientCollectionConfig(collection)) +export const createClientCollectionConfigs = ({ + collections, + t, +}: { + collections: SanitizedCollectionConfig[] + t: TFunction +}): ClientCollectionConfig[] => + collections.map((collection) => createClientCollectionConfig({ collection, t })) diff --git a/packages/payload/src/collections/config/sanitize.ts b/packages/payload/src/collections/config/sanitize.ts index abb87a9b28..601c0feb88 100644 --- a/packages/payload/src/collections/config/sanitize.ts +++ b/packages/payload/src/collections/config/sanitize.ts @@ -11,15 +11,12 @@ import TimestampsRequired from '../../errors/TimestampsRequired.js' import { sanitizeFields } from '../../fields/config/sanitize.js' import { fieldAffectsData } from '../../fields/config/types.js' import mergeBaseFields from '../../fields/mergeBaseFields.js' -import { extractTranslations } from '../../translations/extractTranslations.js' import { getBaseUploadFields } from '../../uploads/getBaseFields.js' import { formatLabels } from '../../utilities/formatLabels.js' import { isPlainObject } from '../../utilities/isPlainObject.js' import baseVersionFields from '../../versions/baseFields.js' import { authDefaults, defaults } from './defaults.js' -const translations = extractTranslations(['general:createdAt', 'general:updatedAt']) - const sanitizeCollection = ( config: Config, collection: CollectionConfig, @@ -51,7 +48,7 @@ const sanitizeCollection = ( disableBulkEdit: true, hidden: true, }, - label: translations['general:updatedAt'], + label: ({ t }) => t('general:updatedAt'), }) } if (!hasCreatedAt) { @@ -64,7 +61,7 @@ const sanitizeCollection = ( // The default sort for list view is createdAt. Thus, enabling indexing by default, is a major performance improvement, especially for large or a large amount of collections. type: 'date', index: true, - label: translations['general:createdAt'], + label: ({ t }) => t('general:createdAt'), }) } } diff --git a/packages/payload/src/collections/config/schema.ts b/packages/payload/src/collections/config/schema.ts index 871753cf55..04c93e2f95 100644 --- a/packages/payload/src/collections/config/schema.ts +++ b/packages/payload/src/collections/config/schema.ts @@ -140,10 +140,10 @@ const collectionSchema = joi.object().keys({ labels: joi.object({ plural: joi .alternatives() - .try(joi.string(), joi.object().pattern(joi.string(), [joi.string()])), + .try(joi.func(), joi.string(), joi.object().pattern(joi.string(), [joi.string()])), singular: joi .alternatives() - .try(joi.string(), joi.object().pattern(joi.string(), [joi.string()])), + .try(joi.func(), joi.string(), joi.object().pattern(joi.string(), [joi.string()])), }), timestamps: joi.boolean(), typescript: joi.object().keys({ diff --git a/packages/payload/src/collections/config/types.ts b/packages/payload/src/collections/config/types.ts index 81141181ba..0decc884ea 100644 --- a/packages/payload/src/collections/config/types.ts +++ b/packages/payload/src/collections/config/types.ts @@ -14,6 +14,7 @@ import type { Endpoint, EntityDescription, GeneratePreviewURL, + LabelFunction, LivePreviewConfig, } from '../../config/types.js' import type { Field } from '../../fields/config/types.js' @@ -360,8 +361,8 @@ export type CollectionConfig = { * Label configuration */ labels?: { - plural?: Record | string - singular?: Record | string + plural?: LabelFunction | Record | string + singular?: LabelFunction | Record | string } slug: string /** diff --git a/packages/payload/src/collections/operations/local/create.ts b/packages/payload/src/collections/operations/local/create.ts index aa553cd6ef..e5986f7464 100644 --- a/packages/payload/src/collections/operations/local/create.ts +++ b/packages/payload/src/collections/operations/local/create.ts @@ -34,6 +34,7 @@ export type Options = { user?: Document } +// eslint-disable-next-line no-restricted-exports export default async function createLocal( payload: Payload, options: Options, @@ -58,7 +59,7 @@ export default async function createLocal({ diff --git a/packages/payload/src/collections/operations/local/duplicate.ts b/packages/payload/src/collections/operations/local/duplicate.ts index d2a491ff1f..7e7a79dbb9 100644 --- a/packages/payload/src/collections/operations/local/duplicate.ts +++ b/packages/payload/src/collections/operations/local/duplicate.ts @@ -50,7 +50,7 @@ export async function duplicate({ id, diff --git a/packages/payload/src/config/client.ts b/packages/payload/src/config/client.ts index dad2ffd5e2..99d6bcdd81 100644 --- a/packages/payload/src/config/client.ts +++ b/packages/payload/src/config/client.ts @@ -1,3 +1,5 @@ +import type { TFunction } from '@payloadcms/translations' + import type { ClientCollectionConfig } from '../collections/config/client.js' import type { SanitizedCollectionConfig } from '../collections/config/types.js' import type { ClientGlobalConfig } from '../globals/config/client.js' @@ -41,10 +43,13 @@ export type ClientConfig = Omit< globals: ClientGlobalConfig[] } -export const createClientConfig = async ( - configPromise: Promise | SanitizedConfig, -): Promise => { - const config = await configPromise +export const createClientConfig = async ({ + config, + t, +}: { + config: SanitizedConfig + t: TFunction +}): Promise => { const clientConfig: ClientConfig = { ...config } const serverOnlyConfigProperties: Partial[] = [ @@ -95,11 +100,15 @@ export const createClientConfig = async ( } } - clientConfig.collections = createClientCollectionConfigs( - clientConfig.collections as SanitizedCollectionConfig[], - ) + clientConfig.collections = createClientCollectionConfigs({ + collections: clientConfig.collections as SanitizedCollectionConfig[], + t, + }) - clientConfig.globals = createClientGlobalConfigs(clientConfig.globals as SanitizedGlobalConfig[]) + clientConfig.globals = createClientGlobalConfigs({ + globals: clientConfig.globals as SanitizedGlobalConfig[], + t, + }) return clientConfig } diff --git a/packages/payload/src/config/sanitize.ts b/packages/payload/src/config/sanitize.ts index 36dc1e912d..57fb523112 100644 --- a/packages/payload/src/config/sanitize.ts +++ b/packages/payload/src/config/sanitize.ts @@ -1,4 +1,3 @@ -import { translations } from '@payloadcms/translations/api' import merge from 'deepmerge' import type { @@ -87,8 +86,8 @@ export const sanitizeConfig = (incomingConfig: Config): SanitizedConfig => { config.i18n = { fallbackLanguage: 'en', - supportedLanguages: Object.keys(translations), - translations, + supportedLanguages: ['en'], + translations: {}, ...(incomingConfig?.i18n ?? {}), } diff --git a/packages/payload/src/config/types.ts b/packages/payload/src/config/types.ts index b072f9c754..b6b8f5fb51 100644 --- a/packages/payload/src/config/types.ts +++ b/packages/payload/src/config/types.ts @@ -1,4 +1,4 @@ -import type { I18nOptions } from '@payloadcms/translations' +import type { I18nOptions, TFunction } from '@payloadcms/translations' import type { Options as ExpressFileUploadOptions } from 'express-fileupload' import type GraphQL from 'graphql' import type { Transporter } from 'nodemailer' @@ -363,6 +363,8 @@ export type LocalizationConfig = Prettify< LocalizationConfigWithLabels | LocalizationConfigWithNoLabels > +export type LabelFunction = ({ t }: { t: TFunction }) => string + export type SharpDependency = ( input?: | ArrayBuffer diff --git a/packages/payload/src/errors/AuthenticationError.ts b/packages/payload/src/errors/AuthenticationError.ts index 06daf39ddf..a446954279 100644 --- a/packages/payload/src/errors/AuthenticationError.ts +++ b/packages/payload/src/errors/AuthenticationError.ts @@ -1,6 +1,6 @@ import type { TFunction } from '@payloadcms/translations' -import { translations } from '@payloadcms/translations/api' +import en from '@payloadcms/translations/languages/en' import httpStatus from 'http-status' import APIError from './APIError.js' @@ -8,7 +8,7 @@ import APIError from './APIError.js' class AuthenticationError extends APIError { constructor(t?: TFunction) { super( - t ? t('error:emailOrPasswordIncorrect') : translations.en.error.emailOrPasswordIncorrect, + t ? t('error:emailOrPasswordIncorrect') : en.error.emailOrPasswordIncorrect, httpStatus.UNAUTHORIZED, ) } diff --git a/packages/payload/src/errors/ErrorDeletingFile.ts b/packages/payload/src/errors/ErrorDeletingFile.ts index 99bb991ce6..c53251dbf0 100644 --- a/packages/payload/src/errors/ErrorDeletingFile.ts +++ b/packages/payload/src/errors/ErrorDeletingFile.ts @@ -1,16 +1,13 @@ import type { TFunction } from '@payloadcms/translations' -import { translations } from '@payloadcms/translations/api' +import en from '@payloadcms/translations/languages/en' import httpStatus from 'http-status' import APIError from './APIError.js' class ErrorDeletingFile extends APIError { constructor(t?: TFunction) { - super( - t ? t('error:deletingFile') : translations.en.error.deletingFile, - httpStatus.INTERNAL_SERVER_ERROR, - ) + super(t ? t('error:deletingFile') : en.error.deletingFile, httpStatus.INTERNAL_SERVER_ERROR) } } diff --git a/packages/payload/src/errors/FileUploadError.ts b/packages/payload/src/errors/FileUploadError.ts index ba2ec88bee..36a4f13a6a 100644 --- a/packages/payload/src/errors/FileUploadError.ts +++ b/packages/payload/src/errors/FileUploadError.ts @@ -1,6 +1,6 @@ import type { TFunction } from '@payloadcms/translations' -import { translations } from '@payloadcms/translations/api' +import en from '@payloadcms/translations/languages/en' import httpStatus from 'http-status' import APIError from './APIError.js' @@ -8,7 +8,7 @@ import APIError from './APIError.js' class FileUploadError extends APIError { constructor(t?: TFunction) { super( - t ? t('error:problemUploadingFile') : translations.en.error.problemUploadingFile, + t ? t('error:problemUploadingFile') : en.error.problemUploadingFile, httpStatus.BAD_REQUEST, ) } diff --git a/packages/payload/src/errors/Forbidden.ts b/packages/payload/src/errors/Forbidden.ts index b27024fe92..471ce09e09 100644 --- a/packages/payload/src/errors/Forbidden.ts +++ b/packages/payload/src/errors/Forbidden.ts @@ -1,6 +1,6 @@ import type { TFunction } from '@payloadcms/translations' -import { translations } from '@payloadcms/translations/api' +import en from '@payloadcms/translations/languages/en' import httpStatus from 'http-status' import APIError from './APIError.js' @@ -8,7 +8,7 @@ import APIError from './APIError.js' class Forbidden extends APIError { constructor(t?: TFunction) { super( - t ? t('error:notAllowedToPerformAction') : translations.en.error.notAllowedToPerformAction, + t ? t('error:notAllowedToPerformAction') : en.error.notAllowedToPerformAction, httpStatus.FORBIDDEN, ) } diff --git a/packages/payload/src/errors/LockedAuth.ts b/packages/payload/src/errors/LockedAuth.ts index cbdfc06394..3d7f36ce1f 100644 --- a/packages/payload/src/errors/LockedAuth.ts +++ b/packages/payload/src/errors/LockedAuth.ts @@ -1,13 +1,13 @@ import type { TFunction } from '@payloadcms/translations' -import { translations } from '@payloadcms/translations/api' +import en from '@payloadcms/translations/languages/en' import httpStatus from 'http-status' import APIError from './APIError.js' class LockedAuth extends APIError { constructor(t?: TFunction) { - super(t ? t('error:userLocked') : translations.en.error.userLocked, httpStatus.UNAUTHORIZED) + super(t ? t('error:userLocked') : en.error.userLocked, httpStatus.UNAUTHORIZED) } } diff --git a/packages/payload/src/errors/MissingFile.ts b/packages/payload/src/errors/MissingFile.ts index c5b0fc4224..314237f440 100644 --- a/packages/payload/src/errors/MissingFile.ts +++ b/packages/payload/src/errors/MissingFile.ts @@ -1,16 +1,14 @@ import type { TFunction } from '@payloadcms/translations' -import { translations } from '@payloadcms/translations/api' +import en from '@payloadcms/translations/languages/en' + import httpStatus from 'http-status' import APIError from './APIError.js' class MissingFile extends APIError { constructor(t?: TFunction) { - super( - t ? t('error:noFilesUploaded') : translations.en.error.noFilesUploaded, - httpStatus.BAD_REQUEST, - ) + super(t ? t('error:noFilesUploaded') : en.error.noFilesUploaded, httpStatus.BAD_REQUEST) } } diff --git a/packages/payload/src/errors/NotFound.ts b/packages/payload/src/errors/NotFound.ts index df54dd9b9a..9676f45d25 100644 --- a/packages/payload/src/errors/NotFound.ts +++ b/packages/payload/src/errors/NotFound.ts @@ -1,13 +1,13 @@ import type { TFunction } from '@payloadcms/translations' -import { translations } from '@payloadcms/translations/api' +import en from '@payloadcms/translations/languages/en' import httpStatus from 'http-status' import APIError from './APIError.js' class NotFound extends APIError { constructor(t?: TFunction) { - super(t ? t('general:notFound') : translations.en.general.notFound, httpStatus.NOT_FOUND) + super(t ? t('general:notFound') : en.general.notFound, httpStatus.NOT_FOUND) } } diff --git a/packages/payload/src/errors/UnathorizedError.ts b/packages/payload/src/errors/UnathorizedError.ts index 02c862a2b0..e46f8decc4 100644 --- a/packages/payload/src/errors/UnathorizedError.ts +++ b/packages/payload/src/errors/UnathorizedError.ts @@ -1,13 +1,13 @@ import type { TFunction } from '@payloadcms/translations' -import { translations } from '@payloadcms/translations/api' +import en from '@payloadcms/translations/languages/en' import httpStatus from 'http-status' import APIError from './APIError.js' class UnauthorizedError extends APIError { constructor(t?: TFunction) { - super(t ? t('error:unauthorized') : translations.en.error.unauthorized, httpStatus.UNAUTHORIZED) + super(t ? t('error:unauthorized') : en.error.unauthorized, httpStatus.UNAUTHORIZED) } } diff --git a/packages/payload/src/errors/ValidationError.ts b/packages/payload/src/errors/ValidationError.ts index 30d33c45ef..96d4d95605 100644 --- a/packages/payload/src/errors/ValidationError.ts +++ b/packages/payload/src/errors/ValidationError.ts @@ -1,6 +1,6 @@ import type { TFunction } from '@payloadcms/translations' -import { translations } from '@payloadcms/translations/api' +import en from '@payloadcms/translations/languages/en' import httpStatus from 'http-status' import APIError from './APIError.js' @@ -10,8 +10,8 @@ class ValidationError extends APIError<{ field: string; message: string }[]> { const message = t ? t('error:followingFieldsInvalid', { count: results.length }) : results.length === 1 - ? translations.en.error.followingFieldsInvalid_one - : translations.en.error.followingFieldsInvalid_other + ? en.error.followingFieldsInvalid_one + : en.error.followingFieldsInvalid_other super(`${message} ${results.map((f) => f.field).join(', ')}`, httpStatus.BAD_REQUEST, results) } diff --git a/packages/payload/src/exports/utilities.ts b/packages/payload/src/exports/utilities.ts index 792998dec9..1e50cea389 100644 --- a/packages/payload/src/exports/utilities.ts +++ b/packages/payload/src/exports/utilities.ts @@ -2,7 +2,6 @@ export { getDataLoader } from '../collections/dataloader.js' export { default as getDefaultValue } from '../fields/getDefaultValue.js' export { promise as afterReadPromise } from '../fields/hooks/afterRead/promise.js' export { traverseFields as afterReadTraverseFields } from '../fields/hooks/afterRead/traverseFields.js' -export { extractTranslations } from '../translations/extractTranslations.js' export { formatFilesize } from '../uploads/formatFilesize.js' diff --git a/packages/payload/src/fields/config/client.ts b/packages/payload/src/fields/config/client.ts index 5c6af598f2..f971027162 100644 --- a/packages/payload/src/fields/config/client.ts +++ b/packages/payload/src/fields/config/client.ts @@ -1,3 +1,5 @@ +import type { TFunction } from '@payloadcms/translations' + import type { Field, FieldBase } from '../../fields/config/types.js' export type ClientFieldConfig = Omit @@ -13,8 +15,14 @@ export type ServerOnlyFieldAdminProperties = keyof Pick< 'components' | 'condition' | 'description' > -export const createClientFieldConfig = (f: Field) => { - const field = { ...f } +export const createClientFieldConfig = ({ + field: incomingField, + t, +}: { + field: Field + t: TFunction +}) => { + const field = { ...incomingField } const serverOnlyFieldProperties: Partial[] = [ 'hooks', @@ -37,21 +45,32 @@ export const createClientFieldConfig = (f: Field) => { } }) + if ('options' in field && Array.isArray(field.options)) { + field.options = field.options.map((option) => { + if (typeof option === 'object' && typeof option.label === 'function') { + return { + label: option.label({ t }), + value: option.value, + } + } + }) + } + if ('fields' in field) { - field.fields = createClientFieldConfigs(field.fields) + field.fields = createClientFieldConfigs({ fields: field.fields, t }) } if ('blocks' in field) { field.blocks = field.blocks.map((block) => { const sanitized = { ...block } - sanitized.fields = createClientFieldConfigs(sanitized.fields) + sanitized.fields = createClientFieldConfigs({ fields: sanitized.fields, t }) return sanitized }) } if ('tabs' in field) { // @ts-expect-error - field.tabs = field.tabs.map((tab) => createClientFieldConfig(tab)) + field.tabs = field.tabs.map((tab) => createClientFieldConfig({ field: tab, t })) } if ('admin' in field) { @@ -73,5 +92,10 @@ export const createClientFieldConfig = (f: Field) => { return field } -export const createClientFieldConfigs = (fields: Field[]): Field[] => - fields.map(createClientFieldConfig) +export const createClientFieldConfigs = ({ + fields, + t, +}: { + fields: Field[] + t: TFunction +}): Field[] => fields.map((field) => createClientFieldConfig({ field, t })) diff --git a/packages/payload/src/fields/config/schema.ts b/packages/payload/src/fields/config/schema.ts index 2381b8f1f3..cf9fe52253 100644 --- a/packages/payload/src/fields/config/schema.ts +++ b/packages/payload/src/fields/config/schema.ts @@ -52,7 +52,12 @@ export const baseField = joi index: joi.boolean().default(false), label: joi .alternatives() - .try(joi.object().pattern(joi.string(), [joi.string()]), joi.string(), joi.valid(false)), + .try( + joi.func(), + joi.object().pattern(joi.string(), [joi.string()]), + joi.string(), + joi.valid(false), + ), localized: joi.boolean().default(false), required: joi.boolean().default(false), saveToJWT: joi.alternatives().try(joi.boolean(), joi.string()).default(false), @@ -216,7 +221,7 @@ export const select = baseField.keys({ joi.object({ label: joi .alternatives() - .try(joi.string(), joi.object().pattern(joi.string(), [joi.string()])), + .try(joi.func(), joi.string(), joi.object().pattern(joi.string(), [joi.string()])), value: joi.string().required().allow(''), }), ), @@ -245,7 +250,7 @@ export const radio = baseField.keys({ joi.object({ label: joi .alternatives() - .try(joi.string(), joi.object().pattern(joi.string(), [joi.string()])) + .try(joi.func(), joi.string(), joi.object().pattern(joi.string(), [joi.string()])) .required(), value: joi.string().required().allow(''), }), diff --git a/packages/payload/src/fields/config/types.ts b/packages/payload/src/fields/config/types.ts index 94ad02aaac..ad656e66a0 100644 --- a/packages/payload/src/fields/config/types.ts +++ b/packages/payload/src/fields/config/types.ts @@ -17,6 +17,7 @@ import type { } from '../../admin/types.js' import type { User } from '../../auth/index.js' import type { SanitizedCollectionConfig, TypeWithID } from '../../collections/config/types.js' +import type { LabelFunction } from '../../config/types.js' import type { DBIdentifierName } from '../../database/types.js' import type { SanitizedGlobalConfig } from '../../globals/config/types.js' import type { Operation, PayloadRequest, RequestContext, Where } from '../../types/index.js' @@ -134,8 +135,8 @@ type Admin = { } export type Labels = { - plural: Record | string - singular: Record | string + plural: LabelFunction | Record | string + singular: LabelFunction | Record | string } export type BaseValidateOptions = { @@ -165,7 +166,7 @@ export type Validate< export type ClientValidate = Omit export type OptionObject = { - label: Record | string + label: LabelFunction | Record | string value: string } @@ -193,7 +194,7 @@ export interface FieldBase { beforeValidate?: FieldHook[] } index?: boolean - label?: Record | false | string + label?: LabelFunction | Record | false | string localized?: boolean name: string required?: boolean @@ -394,6 +395,7 @@ export type UnnamedTab = Omit & { | { [selectedLanguage: string]: string } + | LabelFunction | string localized?: never } diff --git a/packages/payload/src/fields/setDefaultBeforeDuplicate.ts b/packages/payload/src/fields/setDefaultBeforeDuplicate.ts index fcf1fa56fe..a94a116ec9 100644 --- a/packages/payload/src/fields/setDefaultBeforeDuplicate.ts +++ b/packages/payload/src/fields/setDefaultBeforeDuplicate.ts @@ -1,16 +1,12 @@ // default beforeDuplicate hook for required and unique fields import type { FieldAffectingData, FieldHook } from './config/types.js' -import { extractTranslations } from '../translations/extractTranslations.js' - -const copyTranslations = extractTranslations(['general:copy']) - const unique: FieldHook = ({ value }) => (typeof value === 'string' ? `${value} - Copy` : undefined) const localizedUnique: FieldHook = ({ req, value }) => - value ? `${value} - ${copyTranslations?.[req.locale]?.['general:copy'] ?? 'Copy'}` : undefined + value ? `${value} - ${req?.t('general:copy') ?? 'Copy'}` : undefined const uniqueRequired: FieldHook = ({ value }) => `${value} - Copy` const localizedUniqueRequired: FieldHook = ({ req, value }) => - `${value} - ${copyTranslations?.[req.locale]?.['general:copy'] ?? 'Copy'}` + `${value} - ${req?.t('general:copy') ?? 'Copy'}` export const setDefaultBeforeDuplicate = (field: FieldAffectingData) => { if ( diff --git a/packages/payload/src/globals/config/client.ts b/packages/payload/src/globals/config/client.ts index 7d0c1210ff..23fc17a99e 100644 --- a/packages/payload/src/globals/config/client.ts +++ b/packages/payload/src/globals/config/client.ts @@ -1,3 +1,5 @@ +import type { TFunction } from '@payloadcms/translations' + import type { LivePreviewConfig, SanitizedConfig, @@ -30,11 +32,15 @@ export type ClientGlobalConfig = Omit< fields: ClientFieldConfig[] } -export const createClientGlobalConfig = ( - global: SanitizedConfig['globals'][0], -): ClientGlobalConfig => { +export const createClientGlobalConfig = ({ + global, + t, +}: { + global: SanitizedConfig['globals'][0] + t: TFunction +}): ClientGlobalConfig => { const sanitized = { ...global } - sanitized.fields = createClientFieldConfigs(sanitized.fields) + sanitized.fields = createClientFieldConfigs({ fields: sanitized.fields, t }) const serverOnlyProperties: Partial[] = [ 'hooks', @@ -73,6 +79,10 @@ export const createClientGlobalConfig = ( return sanitized } -export const createClientGlobalConfigs = ( - globals: SanitizedConfig['globals'], -): ClientGlobalConfig[] => globals.map((global) => createClientGlobalConfig(global)) +export const createClientGlobalConfigs = ({ + globals, + t, +}: { + globals: SanitizedConfig['globals'] + t: TFunction +}): ClientGlobalConfig[] => globals.map((global) => createClientGlobalConfig({ global, t })) diff --git a/packages/payload/src/globals/config/sanitize.ts b/packages/payload/src/globals/config/sanitize.ts index 0972ad89d6..463e971d80 100644 --- a/packages/payload/src/globals/config/sanitize.ts +++ b/packages/payload/src/globals/config/sanitize.ts @@ -1,5 +1,3 @@ -import { extractTranslations } from 'payload/utilities' - import type { Config } from '../../config/types.js' import type { SanitizedGlobalConfig } from './types.js' @@ -10,8 +8,6 @@ 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 @@ -80,7 +76,7 @@ const sanitizeGlobals = (config: Config): SanitizedGlobalConfig[] => { disableBulkEdit: true, hidden: true, }, - label: translations['general:updatedAt'], + label: ({ t }) => t('general:updatedAt'), }) } if (!hasCreatedAt) { @@ -91,7 +87,7 @@ const sanitizeGlobals = (config: Config): SanitizedGlobalConfig[] => { disableBulkEdit: true, hidden: true, }, - label: translations['general:createdAt'], + label: ({ t }) => t('general:createdAt'), }) } diff --git a/packages/payload/src/globals/config/schema.ts b/packages/payload/src/globals/config/schema.ts index b58554f7fe..da9bda9e05 100644 --- a/packages/payload/src/globals/config/schema.ts +++ b/packages/payload/src/globals/config/schema.ts @@ -65,7 +65,9 @@ const globalSchema = joi beforeRead: joi.array().items(joi.func()), beforeValidate: joi.array().items(joi.func()), }), - label: joi.alternatives().try(joi.string(), joi.object().pattern(joi.string(), [joi.string()])), + label: joi + .alternatives() + .try(joi.func(), joi.string(), joi.object().pattern(joi.string(), [joi.string()])), typescript: joi.object().keys({ interface: joi.string(), }), diff --git a/packages/payload/src/globals/operations/local/findVersionByID.ts b/packages/payload/src/globals/operations/local/findVersionByID.ts index f4eb5c43a7..4eddd7f5bb 100644 --- a/packages/payload/src/globals/operations/local/findVersionByID.ts +++ b/packages/payload/src/globals/operations/local/findVersionByID.ts @@ -20,6 +20,7 @@ export type Options = { user?: Document } +// eslint-disable-next-line no-restricted-exports export default async function findVersionByIDLocal( payload: Payload, options: Options, diff --git a/packages/payload/src/translations/extractTranslations.ts b/packages/payload/src/translations/extractTranslations.ts deleted file mode 100644 index 41ef64d5cc..0000000000 --- a/packages/payload/src/translations/extractTranslations.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { translations } from '@payloadcms/translations/api' - -export const extractTranslations = (keys: string[]): Record> => { - const result = {} - keys.forEach((key) => { - result[key] = {} - }) - Object.entries(translations).forEach(([language, resource]) => { - keys.forEach((key) => { - const [section, target] = key.split(':') - if (resource?.[section]?.[target]) { - result[key][language] = resource[section][target] - } else { - // console.error(`Missing translation for ${key} in ${language}`) - } - }) - }) - return result -} diff --git a/packages/payload/src/translations/getLocalI18n.ts b/packages/payload/src/translations/getLocalI18n.ts index 9a7e753c02..a96ebdd26c 100644 --- a/packages/payload/src/translations/getLocalI18n.ts +++ b/packages/payload/src/translations/getLocalI18n.ts @@ -1,9 +1,8 @@ import { initI18n } from '@payloadcms/translations' -import { translations } from '@payloadcms/translations/api' import type { SanitizedConfig } from '../config/types.js' -export const getLocalI18n = ({ +export const getLocalI18n = async ({ config, language = 'en', }: { @@ -14,5 +13,4 @@ export const getLocalI18n = ({ config: config.i18n, context: 'api', language, - translations, }) diff --git a/packages/payload/src/uploads/getBaseFields.ts b/packages/payload/src/uploads/getBaseFields.ts index 51b1a5ea9f..a9a1507eb4 100644 --- a/packages/payload/src/uploads/getBaseFields.ts +++ b/packages/payload/src/uploads/getBaseFields.ts @@ -3,17 +3,8 @@ import type { Config } from '../config/types.js' import type { Field } from '../fields/config/types.js' import type { UploadConfig } from './types.js' -import { extractTranslations } from '../translations/extractTranslations.js' import { mimeTypeValidator } from './mimeTypeValidator.js' -const labels = extractTranslations([ - 'upload:width', - 'upload:height', - 'upload:fileSize', - 'upload:fileName', - 'upload:sizes', -]) - type GenerateURLArgs = { collectionSlug: string config: Config @@ -87,7 +78,7 @@ export const getBaseUploadFields = ({ collection, config }: Options): Field[] => hidden: true, readOnly: true, }, - label: labels['upload:width'], + label: ({ t }) => t('upload:width'), } const height: Field = { @@ -97,7 +88,7 @@ export const getBaseUploadFields = ({ collection, config }: Options): Field[] => hidden: true, readOnly: true, }, - label: labels['upload:height'], + label: ({ t }) => t('upload:height'), } const filesize: Field = { @@ -107,7 +98,7 @@ export const getBaseUploadFields = ({ collection, config }: Options): Field[] => hidden: true, readOnly: true, }, - label: labels['upload:fileSize'], + label: ({ t }) => t('upload:fileSize'), } const filename: Field = { @@ -119,7 +110,7 @@ export const getBaseUploadFields = ({ collection, config }: Options): Field[] => readOnly: true, }, index: true, - label: labels['upload:fileName'], + label: ({ t }) => t('upload:fileName'), unique: true, } @@ -201,7 +192,7 @@ export const getBaseUploadFields = ({ collection, config }: Options): Field[] => ], label: size.name, })), - label: labels['upload:Sizes'], + label: ({ t }) => t('upload:Sizes'), }, ]) } diff --git a/packages/payload/src/utilities/createLocalReq.ts b/packages/payload/src/utilities/createLocalReq.ts index 7b0bfb1eca..31689b0121 100644 --- a/packages/payload/src/utilities/createLocalReq.ts +++ b/packages/payload/src/utilities/createLocalReq.ts @@ -63,12 +63,12 @@ type CreateLocalReq = ( user?: User }, payload: Payload, -) => PayloadRequest -export const createLocalReq: CreateLocalReq = ( +) => Promise +export const createLocalReq: CreateLocalReq = async ( { context, fallbackLocale, locale: localeArg, req = {} as PayloadRequest, user }, payload, ) => { - const i18n = req?.i18n || getLocalI18n({ config: payload.config }) + const i18n = req?.i18n || (await getLocalI18n({ config: payload.config })) if (payload.config?.localization) { const locale = localeArg === '*' ? 'all' : localeArg diff --git a/packages/payload/src/versions/baseFields.ts b/packages/payload/src/versions/baseFields.ts index b84309b445..f57d909fca 100644 --- a/packages/payload/src/versions/baseFields.ts +++ b/packages/payload/src/versions/baseFields.ts @@ -1,16 +1,12 @@ import type { Field } from '../fields/config/types.js' -import { extractTranslations } from '../translations/extractTranslations.js' - -const labels = extractTranslations(['version:draft', 'version:published', 'version:status']) - export const statuses = [ { - label: labels['version:draft'], + label: ({ t }) => t('version:draft'), value: 'draft', }, { - label: labels['version:published'], + label: ({ t }) => t('version:published'), value: 'published', }, ] @@ -26,7 +22,7 @@ const baseVersionFields: Field[] = [ disableBulkEdit: true, }, defaultValue: 'draft', - label: labels['version:status'], + label: ({ t }) => t('version:status'), options: statuses, }, ] diff --git a/packages/payload/uploads.d.ts b/packages/payload/uploads.d.ts index 0f752224b8..4cb00bd0f9 100644 --- a/packages/payload/uploads.d.ts +++ b/packages/payload/uploads.d.ts @@ -1,2 +1,2 @@ -export { getFileByPath } from './dist/uploads/getFileByPath.js' -//# sourceMappingURL=uploads.d.ts.map +export { getFileByPath } from './dist/uploads/getFileByPath.js'; +//# sourceMappingURL=uploads.d.ts.map \ No newline at end of file diff --git a/packages/payload/uploads.js b/packages/payload/uploads.js index 45787b92e6..cc581e56e9 100644 --- a/packages/payload/uploads.js +++ b/packages/payload/uploads.js @@ -1,3 +1,3 @@ -export { getFileByPath } from './dist/uploads/getFileByPath.js' +export { getFileByPath } from './dist/uploads/getFileByPath.js'; -//# sourceMappingURL=uploads.js.map +//# sourceMappingURL=uploads.js.map \ No newline at end of file diff --git a/packages/richtext-lexical/src/field/features/link/drawer/baseFields.ts b/packages/richtext-lexical/src/field/features/link/drawer/baseFields.ts index 2d2a10929f..3aa8ae89fd 100644 --- a/packages/richtext-lexical/src/field/features/link/drawer/baseFields.ts +++ b/packages/richtext-lexical/src/field/features/link/drawer/baseFields.ts @@ -2,21 +2,8 @@ import type { User } from 'payload/auth' import type { Config } from 'payload/config' import type { Field, RadioField, TextField } from 'payload/types' -import { extractTranslations } from 'payload/utilities' - import { validateUrl } from '../../../lexical/utils/url.js' -const translations = extractTranslations([ - 'fields:textToDisplay', - 'fields:linkType', - 'fields:chooseBetweenCustomTextOrDocument', - 'fields:customURL', - 'fields:internalLink', - 'fields:enterURL', - 'fields:chooseDocumentToLink', - 'fields:openInNewTab', -]) - export const getBaseFields = ( config: Config, enabledCollections: false | string[], @@ -49,7 +36,7 @@ export const getBaseFields = ( { name: 'text', type: 'text', - label: translations['fields:textToDisplay'], + label: ({ t }) => t('fields:textToDisplay'), required: true, }, { @@ -68,13 +55,13 @@ export const getBaseFields = ( name: 'linkType', type: 'radio', admin: { - description: translations['fields:chooseBetweenCustomTextOrDocument'], + description: ({ t }) => t('fields:chooseBetweenCustomTextOrDocument'), }, defaultValue: 'custom', - label: translations['fields:linkType'], + label: ({ t }) => t('fields:linkType'), options: [ { - label: translations['fields:customURL'], + label: ({ t }) => t('fields:customURL'), value: 'custom', }, ], @@ -83,7 +70,7 @@ export const getBaseFields = ( { name: 'url', type: 'text', - label: translations['fields:enterURL'], + label: ({ t }) => t('fields:enterURL'), required: true, validate: (value: string) => { if (value && !validateUrl(value)) { @@ -98,7 +85,7 @@ export const getBaseFields = ( // Only display internal link-specific fields / options / conditions if there are enabled relations if (enabledRelations?.length) { ;(baseFields[1].fields[0] as RadioField).options.push({ - label: translations['fields:internalLink'], + label: ({ t }) => t('fields:internalLink'), value: 'internal', }) ;(baseFields[1].fields[1] as TextField).admin = { @@ -123,7 +110,7 @@ export const getBaseFields = ( } } : null, - label: translations['fields:chooseDocumentToLink'], + label: ({ t }) => t('fields:chooseDocumentToLink'), relationTo: enabledRelations, required: true, }) @@ -132,7 +119,7 @@ export const getBaseFields = ( baseFields[1].fields.push({ name: 'newTab', type: 'checkbox', - label: translations['fields:openInNewTab'], + label: ({ t }) => t('fields:openInNewTab'), }) return baseFields as Field[] diff --git a/packages/richtext-lexical/src/field/features/link/feature.server.ts b/packages/richtext-lexical/src/field/features/link/feature.server.ts index 91ec370e3d..ce5ad9b456 100644 --- a/packages/richtext-lexical/src/field/features/link/feature.server.ts +++ b/packages/richtext-lexical/src/field/features/link/feature.server.ts @@ -3,7 +3,6 @@ import type { SanitizedConfig } from 'payload/config' import type { FieldWithRichTextRequiredEditor } from 'payload/types' import { initI18n } from '@payloadcms/translations' -import { translations } from '@payloadcms/translations/client' import type { HTMLConverter } from '../converters/html/converter/types.js' import type { FeatureProviderProviderServer } from '../types.js' @@ -67,11 +66,11 @@ export const LinkFeature: FeatureProviderProviderServer { - const i18n = initI18n({ config: config.i18n, context: 'client', translations }) + generateSchemaMap: async ({ config, props }) => { + const i18n = await initI18n({ config: config.i18n, context: 'client' }) return { - fields: transformExtraFields( + fields: await transformExtraFields( props.fields, config, i18n, diff --git a/packages/richtext-lexical/src/field/features/link/plugins/floatingLinkEditor/utilities.ts b/packages/richtext-lexical/src/field/features/link/plugins/floatingLinkEditor/utilities.ts index f10426527f..1ae0803a34 100644 --- a/packages/richtext-lexical/src/field/features/link/plugins/floatingLinkEditor/utilities.ts +++ b/packages/richtext-lexical/src/field/features/link/plugins/floatingLinkEditor/utilities.ts @@ -7,7 +7,7 @@ import { getBaseFields } from '../../drawer/baseFields.js' /** * This function is run to enrich the basefields which every link has with potential, custom user-added fields. */ -export function transformExtraFields( +export async function transformExtraFields( customFieldSchema: | ((args: { config: SanitizedConfig; defaultFields: Field[]; i18n: I18n }) => Field[]) | Field[], @@ -15,7 +15,7 @@ export function transformExtraFields( i18n: I18n, enabledCollections?: false | string[], disabledCollections?: false | string[], -): Field[] { +): Promise { const baseFields: Field[] = getBaseFields(config, enabledCollections, disabledCollections) const fields = diff --git a/packages/richtext-lexical/src/field/features/types.ts b/packages/richtext-lexical/src/field/features/types.ts index f55c6140a4..0fed182a1f 100644 --- a/packages/richtext-lexical/src/field/features/types.ts +++ b/packages/richtext-lexical/src/field/features/types.ts @@ -188,9 +188,13 @@ export type ServerFeature = { props: ServerProps schemaMap: Map schemaPath: string - }) => { - [key: string]: Field[] - } + }) => + | { + [key: string]: Field[] + } + | Promise<{ + [key: string]: Field[] + }> generatedTypes?: { modifyOutputSchema: ({ collectionIDFieldTypes, diff --git a/packages/richtext-lexical/src/generateComponentMap.tsx b/packages/richtext-lexical/src/generateComponentMap.tsx index 542cff7e43..43ad1ef9de 100644 --- a/packages/richtext-lexical/src/generateComponentMap.tsx +++ b/packages/richtext-lexical/src/generateComponentMap.tsx @@ -13,7 +13,7 @@ export const getGenerateComponentMap = (args: { resolvedFeatureMap: ResolvedServerFeatureMap }): RichTextAdapter['generateComponentMap'] => - ({ config, schemaPath }) => { + ({ config, i18n, schemaPath }) => { const validRelationships = config.collections.map((c) => c.slug) || [] const componentMap = new Map() @@ -87,6 +87,7 @@ export const getGenerateComponentMap = config, disableAddingID: true, fieldSchema: sanitizedFields, + i18n, parentPath: `${schemaPath}.feature.${featureKey}.fields.${schemaKey}`, readOnly: false, }) diff --git a/packages/richtext-slate/src/field/elements/link/LinkDrawer/baseFields.ts b/packages/richtext-slate/src/field/elements/link/LinkDrawer/baseFields.ts index 6dd9a6d634..95b71395f5 100644 --- a/packages/richtext-slate/src/field/elements/link/LinkDrawer/baseFields.ts +++ b/packages/richtext-slate/src/field/elements/link/LinkDrawer/baseFields.ts @@ -2,41 +2,28 @@ import type { User } from 'payload/auth' import type { Config } from 'payload/config' import type { Field } from 'payload/types' -import { extractTranslations } from 'payload/utilities' - -const translations = extractTranslations([ - 'fields:textToDisplay', - 'fields:linkType', - 'fields:chooseBetweenCustomTextOrDocument', - 'fields:customURL', - 'fields:internalLink', - 'fields:enterURL', - 'fields:chooseDocumentToLink', - 'fields:openInNewTab', -]) - export const getBaseFields = (config: Config): Field[] => [ { name: 'text', type: 'text', - label: translations['fields:textToDisplay'], + label: ({ t }) => t('fields:textToDisplay'), required: true, }, { name: 'linkType', type: 'radio', admin: { - description: translations['fields:chooseBetweenCustomTextOrDocument'], + description: ({ t }) => t('fields:chooseBetweenCustomTextOrDocument'), }, defaultValue: 'custom', - label: translations['fields:linkType'], + label: ({ t }) => t('fields:linkType'), options: [ { - label: translations['fields:customURL'], + label: ({ t }) => t('fields:customURL'), value: 'custom', }, { - label: translations['fields:internalLink'], + label: ({ t }) => t('fields:internalLink'), value: 'internal', }, ], @@ -48,7 +35,7 @@ export const getBaseFields = (config: Config): Field[] => [ admin: { condition: ({ linkType }) => linkType !== 'internal', }, - label: translations['fields:enterURL'], + label: ({ t }) => t('fields:enterURL'), required: true, }, { @@ -66,7 +53,7 @@ export const getBaseFields = (config: Config): Field[] => [ return false } }, - label: translations['fields:chooseDocumentToLink'], + label: ({ t }) => t('fields:chooseDocumentToLink'), relationTo: config.collections .filter(({ admin: { enableRichTextLink, hidden } }) => { if (typeof hidden !== 'function' && hidden) { @@ -80,6 +67,6 @@ export const getBaseFields = (config: Config): Field[] => [ { name: 'newTab', type: 'checkbox', - label: translations['fields:openInNewTab'], + label: ({ t }) => t('fields:openInNewTab'), }, ] diff --git a/packages/richtext-slate/src/generateComponentMap.tsx b/packages/richtext-slate/src/generateComponentMap.tsx index 55f396e3b5..e658dd99e6 100644 --- a/packages/richtext-slate/src/generateComponentMap.tsx +++ b/packages/richtext-slate/src/generateComponentMap.tsx @@ -1,7 +1,5 @@ import type { RichTextAdapter } from 'payload/types' -import { initI18n } from '@payloadcms/translations' -import { translations } from '@payloadcms/translations/client' import { mapFields } from '@payloadcms/ui/utilities/buildComponentMap' import { sanitizeFields } from 'payload/config' import React from 'react' @@ -16,10 +14,9 @@ import { defaultLeaves as leafTypes } from './field/leaves/index.js' export const getGenerateComponentMap = (args: AdapterArguments): RichTextAdapter['generateComponentMap'] => - ({ config }) => { + ({ config, i18n }) => { const componentMap = new Map() - const i18n = initI18n({ config: config.i18n, context: 'client', translations }) const validRelationships = config.collections.map((c) => c.slug) || [] ;(args?.admin?.leaves || Object.values(leafTypes)).forEach((leaf) => { @@ -78,6 +75,7 @@ export const getGenerateComponentMap = const mappedFields = mapFields({ config, fieldSchema: linkFields, + i18n, readOnly: false, }) @@ -108,6 +106,7 @@ export const getGenerateComponentMap = const mappedFields = mapFields({ config, fieldSchema: uploadFields, + i18n, readOnly: false, }) diff --git a/packages/richtext-slate/src/generateSchemaMap.ts b/packages/richtext-slate/src/generateSchemaMap.ts index 6875b0b609..ff2387f61f 100644 --- a/packages/richtext-slate/src/generateSchemaMap.ts +++ b/packages/richtext-slate/src/generateSchemaMap.ts @@ -1,7 +1,6 @@ import type { RichTextAdapter } from 'payload/types' import { initI18n } from '@payloadcms/translations' -import { translations } from '@payloadcms/translations/client' import { sanitizeFields } from 'payload/config' import type { AdapterArguments, RichTextCustomElement } from './types.js' @@ -13,8 +12,8 @@ import { uploadFieldsSchemaPath } from './field/elements/upload/shared.js' export const getGenerateSchemaMap = (args: AdapterArguments): RichTextAdapter['generateSchemaMap'] => - ({ config, schemaMap, schemaPath }) => { - const i18n = initI18n({ config: config.i18n, context: 'client', translations }) + async ({ config, schemaMap, schemaPath }) => { + const i18n = await initI18n({ config: config.i18n, context: 'client' }) const validRelationships = config.collections.map((c) => c.slug) || [] ;(args?.admin?.elements || Object.values(elementTypes)).forEach((el) => { diff --git a/packages/translations/package.json b/packages/translations/package.json index dc705d7027..a80e01fa29 100644 --- a/packages/translations/package.json +++ b/packages/translations/package.json @@ -12,9 +12,8 @@ }, "scripts": { "build:types": "tsc --outDir dist", - "build": "pnpm writeFiles && pnpm build:types", + "build": "pnpm build:types", "clean": "rimraf {dist,*.tsbuildinfo}", - "writeFiles": "npx tsx ./writeTranslationFiles.ts", "prepublishOnly": "pnpm clean && pnpm turbo build" }, "exports": { @@ -22,13 +21,13 @@ "import": "./src/exports/index.ts", "require": "./src/exports/index.ts" }, - "./api": { - "import": "./src/_generatedFiles_/api/index.ts", - "require": "./src/_generatedFiles_/api/index.ts" + "./*": { + "import": "./src/exports/*.ts", + "require": "./src/exports/*.ts" }, - "./client": { - "import": "./src/_generatedFiles_/client/index.ts", - "require": "./src/_generatedFiles_/client/index.ts" + "./languages/*": { + "import": "./src/languages/*.ts", + "require": "./src/languages/*.ts" } }, "publishConfig": { @@ -41,15 +40,15 @@ "require": "./dist/exports/index.js", "types": "./dist/exports/*.d.ts" }, - "./api": { - "import": "./dist/_generatedFiles_/api/index.js", - "require": "./dist/_generatedFiles_/api/index.js", - "types": "./dist/_generatedFiles_/exports/*.d.ts" + "./*": { + "import": "./dist/exports/*.js", + "require": "./dist/exports/*.js", + "types": "./dist/exports/*.d.ts" }, - "./client": { - "import": "./dist/_generatedFiles_/client/index.js", - "require": "./dist/_generatedFiles_/client/index.js", - "types": "./dist/_generatedFiles_/exports/*.d.ts" + "./languages/*": { + "import": "./dist/languages/*.js", + "require": "./dist/languages/*.js", + "types": "./dist/languages/*.d.ts" } } }, diff --git a/packages/translations/src/_generatedFiles_/api/ar.js b/packages/translations/src/_generatedFiles_/api/ar.js deleted file mode 100644 index 36a30b0435..0000000000 --- a/packages/translations/src/_generatedFiles_/api/ar.js +++ /dev/null @@ -1,94 +0,0 @@ -export default { - authentication: { - account: 'الحساب', - apiKey: 'مفتاح API', - enableAPIKey: 'تفعيل مفتاح API', - loggedInChangePassword: - 'لتغيير كلمة المرور الخاصّة بك ، انتقل إلى <0>حسابك وقم بتعديل كلمة المرور هناك.', - newAccountCreated: - 'تمّ إنشاء حساب جديد لتتمكّن من الوصول إلى {{serverURL}} الرّجاء النّقر فوق الرّابط التّالي أو لصق عنوان URL أدناه في متصفّحّك لتأكيد بريدك الإلكتروني : {{verificationURL}}
بعد التّحقّق من بريدك الإلكتروني ، ستتمكّن من تسجيل الدّخول بنجاح.', - 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: { - copy: 'نسخ', - createdAt: 'تمّ الإنشاء في', - deletedCountSuccessfully: 'تمّ حذف {{count}} {{label}} بنجاح.', - deletedSuccessfully: 'تمّ الحذف بنجاح.', - email: 'البريد الإلكتروني', - notFound: 'غير موجود', - row: 'سطر', - rows: 'أسطُر', - successfullyCreated: '{{label}} تم إنشاؤها بنجاح.', - successfullyDuplicated: '{{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: 'هذا الحقل مطلوب.', - requiresAtLeast: 'هذا الحقل يتطلب على الأقل {{count}} {{label}}.', - requiresNoMoreThan: 'هذا الحقل يتطلب عدم تجاوز {{count}} {{label}}.', - requiresTwoNumbers: 'هذا الحقل يتطلب رقمين.', - shorterThanMax: 'يجب أن تكون هذه القيمة أقصر من الحد الأقصى للطول الذي هو {{maxLength}} أحرف.', - trueOrFalse: 'يمكن أن يكون هذا الحقل مساويًا فقط للقيمتين صحيح أو خطأ.', - validUploadID: 'هذا الحقل ليس معرّف تحميل صالح.', - }, - version: { - autosavedSuccessfully: 'تمّ الحفظ التّلقائي بنجاح.', - draft: 'مسودّة', - draftSavedSuccessfully: 'تمّ حفظ المسودّة بنجاح.', - published: 'تمّ النّشر', - restoredSuccessfully: 'تمّت الاستعادة بنحاح.', - status: 'الحالة', - }, -} diff --git a/packages/translations/src/_generatedFiles_/api/az.js b/packages/translations/src/_generatedFiles_/api/az.js deleted file mode 100644 index 5f6d454bee..0000000000 --- a/packages/translations/src/_generatedFiles_/api/az.js +++ /dev/null @@ -1,96 +0,0 @@ -export default { - authentication: { - account: 'Hesab', - apiKey: 'API Açarı', - enableAPIKey: 'API açarını aktivləşdir', - loggedInChangePassword: - 'Parolu dəyişdirmək üçün hesabınıza get və orada şifrənizi redaktə edin.', - newAccountCreated: - 'Sizin üçün yeni hesab yaradıldı. Zəhmət olmasa, e-poçtunuzu doğrulamaq üçün aşağıdakı linke klikləyin: {{verificationURL}}. 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: { - copy: 'Kopyala', - createdAt: 'Yaradıldığı tarix', - deletedCountSuccessfully: '{{count}} {{label}} uğurla silindi.', - deletedSuccessfully: 'Uğurla silindi.', - email: 'Elektron poçt', - notFound: 'Tapılmadı', - row: 'Sətir', - rows: 'Sətirlər', - successfullyCreated: '{{label}} uğurla yaradıldı.', - successfullyDuplicated: '{{label}} uğurla dublikatlandı.', - 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.', - requiresAtLeast: 'Bu sahə ən azı {{count}} {{label}} tələb edir.', - 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', - }, -} diff --git a/packages/translations/src/_generatedFiles_/api/bg.js b/packages/translations/src/_generatedFiles_/api/bg.js deleted file mode 100644 index b1d5a645a3..0000000000 --- a/packages/translations/src/_generatedFiles_/api/bg.js +++ /dev/null @@ -1,97 +0,0 @@ -export default { - authentication: { - account: 'Профил', - apiKey: 'API ключ', - enableAPIKey: 'Активирай API ключ', - loggedInChangePassword: - 'За да промениш паролата си, отиди в своя <0>профил и я промени оттам.', - newAccountCreated: - 'Току-що беше създаден нов профил за достъп до {{serverURL}} Моля, въведи връзката в браузъра си, за да потвърдиш имейла си: {{verificationURL}}
След като потвърдиш имейла си, ще можеш да влезеш успешно.', - 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: { - copy: 'Копирай', - createdAt: 'Създаден на', - deletedCountSuccessfully: 'Изтрити {{count}} {{label}} успешно.', - deletedSuccessfully: 'Изтрито успешно.', - email: 'Имейл', - notFound: 'Няма открит', - row: 'ред', - rows: 'Редове', - successfullyCreated: '{{label}} успешно създаден.', - successfullyDuplicated: '{{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: 'Това поле е задължително.', - requiresAtLeast: 'Това поле изисква поне {{count}} {{label}}.', - requiresNoMoreThan: 'Това поле изисква не повече от {{count}} {{label}}.', - requiresTwoNumbers: 'Това поле изисква 2 числа.', - shorterThanMax: - 'Тази стойност трябва да е по-малка от максималната стойност от {{maxLength}} символа.', - trueOrFalse: 'Това поле може да бъде само "true" или "false".', - validUploadID: 'Това поле не е валиден идентификатор на качването.', - }, - version: { - autosavedSuccessfully: 'Успешно автоматично запазване.', - draft: 'Чернова', - draftSavedSuccessfully: 'Чернова запазена успешно.', - published: 'Публикувано', - restoredSuccessfully: 'Успешно възстановяване.', - status: 'Статус', - }, -} diff --git a/packages/translations/src/_generatedFiles_/api/cs.js b/packages/translations/src/_generatedFiles_/api/cs.js deleted file mode 100644 index 2bc80c146c..0000000000 --- a/packages/translations/src/_generatedFiles_/api/cs.js +++ /dev/null @@ -1,94 +0,0 @@ -export default { - authentication: { - account: 'Účet', - apiKey: 'Klíč API', - enableAPIKey: 'Povolit klíč API', - loggedInChangePassword: 'Pro změnu hesla přejděte do svého <0>účtu a zde si heslo upravte.', - newAccountCreated: - 'Pro přístup k {{serverURL}} 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: {{verificationURL}}
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: { - copy: 'Kopírovat', - createdAt: 'Vytvořeno v', - deletedCountSuccessfully: 'Úspěšně smazáno {{count}} {{label}}.', - deletedSuccessfully: 'Úspěšně odstraněno.', - email: 'E-mail', - notFound: 'Nenalezeno', - row: 'Řádek', - rows: 'Řádky', - successfullyCreated: '{{label}} úspěšně vytvořeno.', - successfullyDuplicated: '{{label}} úspěšně duplikováno.', - 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é.', - requiresAtLeast: 'Toto pole vyžaduje alespoň {{count}} {{label}}.', - 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', - }, -} diff --git a/packages/translations/src/_generatedFiles_/api/de.js b/packages/translations/src/_generatedFiles_/api/de.js deleted file mode 100644 index ac3d18c973..0000000000 --- a/packages/translations/src/_generatedFiles_/api/de.js +++ /dev/null @@ -1,96 +0,0 @@ -export default { - authentication: { - account: 'Konto', - apiKey: 'API-Key', - enableAPIKey: 'API-Key aktivieren', - loggedInChangePassword: - 'Um dein Passwort zu ändern, gehe in dein <0>Konto und ändere dort dein Passwort.', - newAccountCreated: - 'Ein neues Konto wurde gerade für dich auf {{serverURL}} erstellt. Bitte klicke auf den folgenden Link oder kopiere die URL in deinen Browser um deine E-Mail-Adresse zu verifizieren: {{verificationURL}}
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: { - copy: 'Kopieren', - createdAt: 'Erstellt am', - deletedCountSuccessfully: '{{count}} {{label}} erfolgreich gelöscht.', - deletedSuccessfully: 'Erfolgreich gelöscht.', - email: 'E-Mail', - notFound: 'Nicht gefunden', - row: 'Zeile', - rows: 'Zeilen', - successfullyCreated: '{{label}} erfolgreich erstellt.', - successfullyDuplicated: '{{label}} wurde erfolgreich dupliziert.', - 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', - requiresAtLeast: 'Dieses Feld muss mindestens {{count}} {{label}} enthalten.', - requiresNoMoreThan: 'Dieses Feld kann nicht mehr als {{count}} {{label}} enthalten.', - requiresTwoNumbers: 'Dieses Feld muss zwei Nummern enthalten.', - shorterThanMax: 'Dieser Wert muss kürzer als die maximale Länge von {{maxLength}} sein.', - trueOrFalse: 'Dieses Feld kann nur wahr oder falsch sein.', - validUploadID: "'Dieses Feld enthält keine valide Upload-ID.'", - }, - version: { - autosavedSuccessfully: 'Erfolgreich automatisch gespeichert.', - draft: 'Entwurf', - draftSavedSuccessfully: 'Entwurf erfolgreich gespeichert.', - published: 'Veröffentlicht', - restoredSuccessfully: 'Erfolgreich wiederhergestellt.', - status: 'Status', - }, -} diff --git a/packages/translations/src/_generatedFiles_/api/en.js b/packages/translations/src/_generatedFiles_/api/en.js deleted file mode 100644 index 27242b8e9f..0000000000 --- a/packages/translations/src/_generatedFiles_/api/en.js +++ /dev/null @@ -1,95 +0,0 @@ -export default { - authentication: { - account: 'Account', - apiKey: 'API Key', - enableAPIKey: 'Enable API Key', - loggedInChangePassword: - 'To change your password, go to your <0>account and edit your password there.', - newAccountCreated: - 'A new account has just been created for you to access {{serverURL}} Please click on the following link or paste the URL below into your browser to verify your email: {{verificationURL}}
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: { - copy: 'Copy', - createdAt: 'Created At', - deletedCountSuccessfully: 'Deleted {{count}} {{label}} successfully.', - deletedSuccessfully: 'Deleted successfully.', - email: 'Email', - notFound: 'Not Found', - row: 'Row', - rows: 'Rows', - successfullyCreated: '{{label}} successfully created.', - successfullyDuplicated: '{{label}} successfully duplicated.', - 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.', - requiresAtLeast: 'This field requires at least {{count}} {{label}}.', - requiresNoMoreThan: 'This field requires no more than {{count}} {{label}}.', - requiresTwoNumbers: 'This field requires two numbers.', - shorterThanMax: 'This value must be shorter than the max length of {{maxLength}} characters.', - trueOrFalse: 'This field can only be equal to true or false.', - validUploadID: 'This field is not a valid upload ID.', - }, - version: { - autosavedSuccessfully: 'Autosaved successfully.', - draft: 'Draft', - draftSavedSuccessfully: 'Draft saved successfully.', - published: 'Published', - restoredSuccessfully: 'Restored Successfully.', - status: 'Status', - }, -} diff --git a/packages/translations/src/_generatedFiles_/api/es.js b/packages/translations/src/_generatedFiles_/api/es.js deleted file mode 100644 index add3a1b0b6..0000000000 --- a/packages/translations/src/_generatedFiles_/api/es.js +++ /dev/null @@ -1,96 +0,0 @@ -export default { - authentication: { - account: 'Cuenta', - apiKey: 'Clave API', - enableAPIKey: 'Habilitar Clave API', - loggedInChangePassword: - 'Para cambiar tu contraseña, entra a <0>tu cuenta y edita la contraseña desde ahí.', - newAccountCreated: - 'Se ha creado una nueva cuenta para que puedas acceder a {{serverURL}}. Por favor, haz click o copia el siguiente enlace a tu navegador para verificar tu correo: {{verificationURL}}.
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: { - copy: 'Copiar', - createdAt: 'Fecha de creación', - deletedCountSuccessfully: 'Se eliminó {{count}} {{label}} con éxito.', - deletedSuccessfully: 'Borrado exitosamente.', - email: 'Correo electrónico', - notFound: 'No encontrado', - row: 'Fila', - rows: 'Filas', - successfullyCreated: '{{label}} creado correctamente.', - successfullyDuplicated: '{{label}} duplicado 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.', - requiresAtLeast: 'Este campo require al menos {{count}} {{label}}.', - 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', - }, -} diff --git a/packages/translations/src/_generatedFiles_/api/fa.js b/packages/translations/src/_generatedFiles_/api/fa.js deleted file mode 100644 index 1046c40ed7..0000000000 --- a/packages/translations/src/_generatedFiles_/api/fa.js +++ /dev/null @@ -1,95 +0,0 @@ -export default { - authentication: { - account: 'نمایه', - apiKey: 'کلید اِی‌پی‌آی', - enableAPIKey: 'فعال‌سازی کلید اِی‌پی‌آی', - loggedInChangePassword: - 'برای تغییر گذرواژه، به <0>نمایه بروید تا گذرواژه خود را ویرایش کنید.', - newAccountCreated: - 'یک نمایه کاربری تازه برای دسترسی شما ساخته شده است {{serverURL}} لطفاً روی پیوند زیر کلیک کنید یا آدرس زیر را در مرورگر خود قرار دهید تا رایانامه خود را تأیید کنید: {{verificationURL}}
پس از تایید رایانامه خود، می توانید وارد سیستم شوید.', - 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: { - copy: 'رونوشت', - createdAt: 'ساخته شده در', - deletedCountSuccessfully: 'تعداد {{count}} {{label}} با موفقیت پاک گردید.', - deletedSuccessfully: 'با موفقیت حذف شد.', - email: 'رایانامه', - notFound: 'یافت نشد', - row: 'ردیف', - rows: 'ردیف‌ها', - successfullyCreated: '{{label}} با موفقیت ساخته شد.', - successfullyDuplicated: '{{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: 'این کادر اجباری است.', - requiresAtLeast: 'این رشته حداقل نیازمند {{count}} {{label}}.', - requiresNoMoreThan: 'این رشته به بیش از {{count}} {{label}} نیاز دارد.', - requiresTwoNumbers: 'این کادر به دو عدد نیاز دارد.', - shorterThanMax: 'ورودی باید کمتر از {{maxLength}} واژه باشد.', - trueOrFalse: 'این کادر فقط می تواند به صورت true یا false باشد.', - validUploadID: 'این فیلد یک شناسه بارگذاری معتبر نیست.', - }, - version: { - autosavedSuccessfully: 'با موفقیت ذخیره خودکار شد.', - draft: 'پیش‌نویس', - draftSavedSuccessfully: 'پیش‌نویس با موفقیت ذخیره شد.', - published: 'انتشار یافته', - restoredSuccessfully: 'با موفقیت بازیابی شد.', - status: 'وضعیت', - }, -} diff --git a/packages/translations/src/_generatedFiles_/api/fr.js b/packages/translations/src/_generatedFiles_/api/fr.js deleted file mode 100644 index 9de9be4d7a..0000000000 --- a/packages/translations/src/_generatedFiles_/api/fr.js +++ /dev/null @@ -1,98 +0,0 @@ -export default { - authentication: { - account: 'Compte', - apiKey: 'Clé API', - enableAPIKey: 'Activer la clé API', - loggedInChangePassword: - 'Pour changer votre mot de passe, rendez-vous sur votre <0>compte puis modifiez-y votre mot de passe.', - newAccountCreated: - 'Un nouveau compte vient d\'être créé pour vous permettre d\'accéder {{serverURL}}. Veuillez cliquer sur le lien suivant ou collez l\'URL ci-dessous dans votre navigateur pour vérifier votre adresse e-mail: {{verificationURL}}
. 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: { - copy: 'Copie', - createdAt: 'Créé(e) à', - deletedCountSuccessfully: '{{count}} {{label}} supprimé avec succès.', - deletedSuccessfully: 'Supprimé(e) avec succès.', - email: 'E-mail', - notFound: 'Pas trouvé', - row: 'Ligne', - rows: 'Lignes', - successfullyCreated: '{{label}} créé(e) avec succès.', - successfullyDuplicated: '{{label}} dupliqué(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.', - requiresAtLeast: 'Ce champ doit avoir au moins {{count}} {{label}}.', - 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', - }, -} diff --git a/packages/translations/src/_generatedFiles_/api/hr.js b/packages/translations/src/_generatedFiles_/api/hr.js deleted file mode 100644 index bd28c0f8ce..0000000000 --- a/packages/translations/src/_generatedFiles_/api/hr.js +++ /dev/null @@ -1,95 +0,0 @@ -export default { - authentication: { - account: 'Račun', - apiKey: 'API ključ', - enableAPIKey: 'Omogući API ključ', - loggedInChangePassword: - 'Da biste promijenili lozinku, otvorite svoj <0>račun i promijenite lozinku tamo.', - newAccountCreated: - 'Novi račun je kreiran. Pristupite računu klikom na {{serverURL}}. Molim kliknite na sljedeći link ili zalijepite URL, koji se nalazi ispod, u preglednik da biste potvrdili svoj email: {{verificationURL}}
Nakon što potvrdite email, moći ćete se prijaviti.', - resetYourPassword: 'Restartiraj svoju lozinku', - verified: 'Potvrđeno', - verifyYourEmail: 'Potvrdi svoj email', - youAreReceivingResetPassword: - 'Primili ste ovo jer ste Vi (ili netko drugi) zatražili promjenu lozinke za Vaš račun. Molim kliknite na poveznicu ili zalijepite ovo u svoje preglednik da biste završili proces:', - youDidNotRequestPassword: - 'Ako niste zatražili ovo, molim ignorirajte ovaj email i Vaša lozinka ostat će nepromijenjena.', - }, - error: { - deletingFile: 'Dogodila se pogreška pri brisanju datoteke.', - emailOrPasswordIncorrect: 'Email ili lozinka netočni.', - followingFieldsInvalid_one: ' Ovo polje je nevaljano:', - followingFieldsInvalid_other: 'Ova polja su nevaljana:', - noFilesUploaded: 'Nijedna datoteka nije učitana.', - notAllowedToPerformAction: 'Nemate dopuštenje izvršiti ovu radnju.', - problemUploadingFile: 'Pojavio se problem pri učitavanju datoteke.', - unableToDeleteCount: 'Nije moguće izbrisati {{count}} od {{total}} {{label}}.', - unableToUpdateCount: 'Nije moguće ažurirati {{count}} od {{total}} {{label}}.', - unauthorized: 'Neovlašten, morate biti prijavljeni da biste uputili ovaj zahtjev.', - userLocked: 'Ovaj korisnik je zaključan zbog previše neuspješnih pokušaja prijave.', - valueMustBeUnique: 'Vrijednost mora biti jedinstvena.', - }, - fields: { - chooseBetweenCustomTextOrDocument: - 'Izaberite između unošenja prilagođenog teksta URL ili poveznice na drugi dokument.', - chooseDocumentToLink: 'Odaberite dokument koji želite povezati.', - customURL: 'Prilagođeni URL', - enterURL: 'Unesi URL', - internalLink: 'Interna poveznika', - linkType: 'Tip poveznce', - openInNewTab: 'Otvori u novoj kartici.', - textToDisplay: 'Tekst za prikaz', - }, - general: { - copy: 'Kopiraj', - createdAt: 'Kreirano u', - deletedCountSuccessfully: 'Uspješno izbrisano {{count}} {{label}}.', - deletedSuccessfully: 'Uspješno obrisano.', - email: 'Email', - notFound: 'Nije pronađeno', - row: 'Red', - rows: 'Redovi', - successfullyCreated: '{{label}} uspješno kreirano.', - successfullyDuplicated: '{{label}} uspješno duplicirano.', - thisLanguage: 'Hrvatski', - updatedAt: 'Ažurirano u', - updatedCountSuccessfully: 'Uspješno ažurirano {{count}} {{label}}.', - updatedSuccessfully: 'Uspješno ažurirano.', - user: 'Korisnik', - users: 'Korisnici', - value: 'Attribute', - }, - upload: { - fileName: 'Ime datoteke', - fileSize: 'Veličina datoteke', - height: 'Visina', - sizes: 'Veličine', - width: 'Širina', - }, - validation: { - emailAddress: 'Molim unestie valjanu email adresu.', - enterNumber: 'Molim unesite valjani broj.', - greaterThanMax: '{{value}} exceeds the maximum allowable {{label}} limit of {{max}}.', - invalidInput: 'Ovo polje ima nevaljan unos.', - invalidSelection: 'Ovo polje ima nevaljan odabir.', - invalidSelections: 'Ovo polje ima sljedeće nevaljane odabire:', - lessThanMin: '{{value}} is below the minimum allowable {{label}} limit of {{min}}.', - longerThanMin: 'Ova vrijednost mora biti duža od minimalne dužine od {{minLength}} znakova', - notValidDate: '"{{value}}" nije valjan datum.', - required: 'Ovo polje je obvezno.', - requiresAtLeast: 'Ovo polje zahtjeva minimalno {{count}} {{label}}.', - requiresNoMoreThan: 'Ovo polje zahtjeva ne više od {{count}} {{label}}.', - requiresTwoNumbers: 'Ovo polje zahtjeva dva broja.', - shorterThanMax: 'Ova vrijednost mora biti kraća od maksimalne dužine od {{maxLength}} znakova', - trueOrFalse: 'Ovo polje može biti samo točno ili netočno', - validUploadID: 'Ovo polje nije valjani ID prijenosa.', - }, - version: { - autosavedSuccessfully: 'Automatsko spremanje uspješno.', - draft: 'Nacrt', - draftSavedSuccessfully: 'Nacrt uspješno spremljen.', - published: 'Objavljeno', - restoredSuccessfully: 'Uspješno vraćeno.', - status: 'Status', - }, -} diff --git a/packages/translations/src/_generatedFiles_/api/hu.js b/packages/translations/src/_generatedFiles_/api/hu.js deleted file mode 100644 index 2dda8d17a3..0000000000 --- a/packages/translations/src/_generatedFiles_/api/hu.js +++ /dev/null @@ -1,97 +0,0 @@ -export default { - authentication: { - account: 'Fiók', - apiKey: 'API-kulcs', - enableAPIKey: 'API-kulcs engedélyezése', - loggedInChangePassword: - 'Jelszavának megváltoztatásához lépjen be <0>fiókjába, és ott szerkessze jelszavát.', - newAccountCreated: - 'Létrehoztunk egy új fiókot, amellyel hozzáférhet a következőhöz {{serverURL}} Kérjük, kattintson a következő linkre, vagy illessze be az alábbi URL-t a böngészőbe az e-mail-cím ellenőrzéséhez : {{verificationURL}}
Az e-mail-cím ellenőrzése után sikeresen be tud majd jelentkezni.', - resetYourPassword: 'Jelszó visszaállítása', - verified: 'Megerősítve', - verifyYourEmail: 'Erősítse meg az e-mail címét', - youAreReceivingResetPassword: - 'Ezt azért kapja, mert Ön (vagy valaki más) kérte fiókja jelszavának visszaállítását. A folyamat befejezéséhez kattintson a következő linkre, vagy illessze be böngészőjébe:', - youDidNotRequestPassword: - 'Ha nem Ön kérte ezt, kérjük, hagyja figyelmen kívül ezt az e-mailt, és jelszava változatlan marad.', - }, - error: { - deletingFile: 'Hiba történt a fájl törlésekor.', - emailOrPasswordIncorrect: 'A megadott e-mail-cím vagy jelszó helytelen.', - followingFieldsInvalid_one: 'A következő mező érvénytelen:', - followingFieldsInvalid_other: 'A következő mezők érvénytelenek:', - noFilesUploaded: 'Nem került fájl feltöltésre.', - notAllowedToPerformAction: 'Ezt a műveletet nem hajthatja végre.', - problemUploadingFile: 'Hiba történt a fájl feltöltése közben.', - unableToDeleteCount: 'Nem sikerült törölni {{count}}/{{total}} {{label}}.', - unableToUpdateCount: 'Nem sikerült frissíteni {{count}}/{{total}} {{label}}.', - unauthorized: 'Jogosulatlan, a kéréshez be kell jelentkeznie.', - userLocked: 'Ez a felhasználó túl sok sikertelen bejelentkezési kísérlet miatt zárolva van.', - valueMustBeUnique: 'Az értéknek egyedinek kell lennie', - }, - fields: { - chooseBetweenCustomTextOrDocument: - 'Válasszon egy egyéni szöveges URL-cím megadása vagy egy másik dokumentumra való hivatkozás között.', - chooseDocumentToLink: 'Válassza ki a dokumentumot, amelyre hivatkozni kíván', - customURL: 'Egyéni URL', - enterURL: 'Adjon meg egy URL-t', - internalLink: 'Belső link', - linkType: 'Link típusa', - openInNewTab: 'Megnyitás új lapon', - textToDisplay: 'Megjelenítendő szöveg', - }, - general: { - copy: 'Másolás', - createdAt: 'Létrehozva:', - deletedCountSuccessfully: '{{count}} {{label}} sikeresen törölve.', - deletedSuccessfully: 'Sikeresen törölve.', - email: 'E-mail', - notFound: 'Nem található', - row: 'Sor', - rows: 'Sorok', - successfullyCreated: '{{label}} sikeresen létrehozva.', - successfullyDuplicated: '{{label}} sikeresen duplikálódott.', - thisLanguage: 'Magyar', - updatedAt: 'Frissítve:', - updatedCountSuccessfully: '{{count}} {{label}} sikeresen frissítve.', - updatedSuccessfully: 'Sikeresen frissítve.', - user: 'Felhasználó', - users: 'Felhasználók', - value: 'Érték', - }, - upload: { - fileName: 'Fájlnév', - fileSize: 'Fájl mérete', - height: 'Magasság', - sizes: 'Méretek', - width: 'Szélesség', - }, - validation: { - emailAddress: 'Kérjük, adjon meg egy érvényes e-mail címet.', - enterNumber: 'Kérjük, adjon meg egy érvényes számot.', - greaterThanMax: '{{value}} nagyobb, mint a megengedett maximum {{label}} érték, ami {{max}}.', - invalidInput: 'Ez a mező érvénytelen értéket tartalmaz.', - invalidSelection: 'Ez a mező érvénytelen kijelöléssel rendelkezik.', - invalidSelections: 'Ez a mező a következő érvénytelen kijelöléseket tartalmazza:', - lessThanMin: '{{value}} kisebb, mint a megengedett minimum {{label}} érték, ami {{min}}.', - longerThanMin: - 'Ennek az értéknek hosszabbnak kell lennie, mint a minimális {{minLength}} karakter hosszúság.', - notValidDate: '" {{value}} " nem érvényes dátum.', - required: 'Ez a mező kötelező.', - requiresAtLeast: 'Ehhez a mezőhöz legalább {{count}} {{label}} szükséges.', - requiresNoMoreThan: 'Ehhez a mezőhöz legfeljebb {{count}} {{label}} szükséges.', - requiresTwoNumbers: 'Ehhez a mezőhöz két szám szükséges.', - shorterThanMax: - 'Ennek az értéknek rövidebbnek kell lennie, mint a maximálisan megengedett {{maxLength}} karakter.', - trueOrFalse: 'Ez a mező csak igaz vagy hamis lehet.', - validUploadID: 'Ez a mező nem érvényes feltöltési azonosító.', - }, - version: { - autosavedSuccessfully: 'Automatikus mentés sikeres.', - draft: 'Piszkozat', - draftSavedSuccessfully: 'A piszkozat sikeresen mentve.', - published: 'Közzétett', - restoredSuccessfully: 'Sikeresen visszaállítva.', - status: 'Állapot', - }, -} diff --git a/packages/translations/src/_generatedFiles_/api/index.ts b/packages/translations/src/_generatedFiles_/api/index.ts deleted file mode 100644 index 0deeb35d53..0000000000 --- a/packages/translations/src/_generatedFiles_/api/index.ts +++ /dev/null @@ -1,65 +0,0 @@ -import ar from './ar.js' -import az from './az.js' -import bg from './bg.js' -import cs from './cs.js' -import de from './de.js' -import en from './en.js' -import es from './es.js' -import fa from './fa.js' -import fr from './fr.js' -import hr from './hr.js' -import hu from './hu.js' -import it from './it.js' -import ja from './ja.js' -import ko from './ko.js' -import my from './my.js' -import nb from './nb.js' -import nl from './nl.js' -import pl from './pl.js' -import pt from './pt.js' -import ro from './ro.js' -import rs from './rs.js' -import rsLatin from './rs-latin.js' -import ru from './ru.js' -import sv from './sv.js' -import th from './th.js' -import tr from './tr.js' -import ua from './ua.js' -import vi from './vi.js' -import zh from './zh.js' -import zhTw from './zh-tw.js' - -export const translations = { - ar, - az, - bg, - cs, - de, - en, - es, - fa, - fr, - hr, - hu, - it, - ja, - ko, - my, - nb, - nl, - pl, - pt, - ro, - rs, - 'rs-latin': rsLatin, - ru, - sv, - th, - tr, - ua, - vi, - zh, - 'zh-tw': zhTw, -} as { - [locale: string]: Record> -} diff --git a/packages/translations/src/_generatedFiles_/api/it.js b/packages/translations/src/_generatedFiles_/api/it.js deleted file mode 100644 index d754b77cd8..0000000000 --- a/packages/translations/src/_generatedFiles_/api/it.js +++ /dev/null @@ -1,97 +0,0 @@ -export default { - authentication: { - account: 'Account', - apiKey: 'Chiave API', - enableAPIKey: 'Abilita la Chiave API', - loggedInChangePassword: - 'Per cambiare la tua password, vai al tuo <0>account e modifica la tua password lì.', - newAccountCreated: - 'Un nuovo account è appena stato creato per te per accedere a {{serverURL}} Clicca sul seguente link o incolla l\'URL qui sotto nel browser per verificare la tua email: {{verificationURL}}
Dopo aver verificato la tua email, sarai in grado di effettuare il log in con successo.', - resetYourPassword: 'Modifica la tua Password', - verified: 'Verificato', - verifyYourEmail: 'Verifica la tua email', - youAreReceivingResetPassword: - 'Ricevi questo messaggio perché tu (o qualcun altro) hai richiesto la modifica della password per il tuo account. Clicca sul seguente link o incollalo nel browser per completare il processo:', - youDidNotRequestPassword: - "Se non l'hai richiesto, ignora questa email e la tua password rimarrà invariata.", - }, - error: { - deletingFile: "Si è verificato un errore durante l'eleminazione del file.", - emailOrPasswordIncorrect: "L'email o la password fornita non è corretta.", - followingFieldsInvalid_one: 'Il seguente campo non è valido:', - followingFieldsInvalid_other: 'I seguenti campi non sono validi:', - noFilesUploaded: 'Nessun file è stato caricato.', - notAllowedToPerformAction: 'Non sei autorizzato a eseguire questa azione.', - problemUploadingFile: 'Si è verificato un problema durante il caricamento del file.', - unableToDeleteCount: 'Impossibile eliminare {{count}} su {{total}} {{label}}.', - unableToUpdateCount: 'Impossibile aggiornare {{count}} su {{total}} {{label}}.', - unauthorized: 'Non autorizzato, devi essere loggato per effettuare questa richiesta.', - userLocked: 'Questo utente è bloccato a causa di troppi tentativi di accesso non riusciti.', - valueMustBeUnique: 'Il valore deve essere univoco', - }, - fields: { - chooseBetweenCustomTextOrDocument: - "Scegli tra l'inserimento di un URL di testo personalizzato o il collegamento a un altro documento.", - chooseDocumentToLink: 'Scegli un documento a cui collegarti', - customURL: 'URL personalizzato', - enterURL: 'Inserisci un URL', - internalLink: 'Collegamento interno', - linkType: 'Tipo di collegamento', - openInNewTab: 'Apri in una nuova scheda', - textToDisplay: 'Testo da visualizzare', - }, - general: { - copy: 'Copia', - createdAt: 'Creato il', - deletedCountSuccessfully: '{{count}} {{label}} eliminato con successo.', - deletedSuccessfully: 'Eliminato con successo.', - email: 'Email', - notFound: 'Non Trovato', - row: 'Riga', - rows: 'Righe', - successfullyCreated: '{{label}} creato con successo.', - successfullyDuplicated: '{{label}} duplicato con successo.', - thisLanguage: 'Italiano', - updatedAt: 'Aggiornato il', - updatedCountSuccessfully: '{{count}} {{label}} aggiornato con successo.', - updatedSuccessfully: 'Aggiornato con successo.', - user: 'Utente', - users: 'Utenti', - value: 'Valore', - }, - upload: { - fileName: 'Nome File', - fileSize: 'Dimensione File', - height: 'Altezza', - sizes: 'Formati', - width: 'Larghezza', - }, - validation: { - emailAddress: 'Si prega di inserire un indirizzo email valido.', - enterNumber: 'Si prega di inserire un numero valido.', - greaterThanMax: '{{value}} è superiore al massimo consentito {{label}} di {{max}}.', - invalidInput: 'Questo campo ha un input non valido.', - invalidSelection: 'Questo campo ha una selezione non valida.', - invalidSelections: "'In questo campo sono presenti le seguenti selezioni non valide:'", - lessThanMin: '{{value}} è inferiore al minimo consentito {{label}} di {{min}}.', - longerThanMin: - 'Questo valore deve essere più lungo della lunghezza minima di {{minLength}} caratteri.', - notValidDate: '"{{value}}" non è una data valida.', - required: 'Questo campo è obbligatorio.', - requiresAtLeast: 'Questo campo richiede almeno {{count}} {{label}}.', - requiresNoMoreThan: 'Questo campo richiede non più di {{count}} {{label}}.', - requiresTwoNumbers: 'Questo campo richiede due numeri.', - shorterThanMax: - 'Questo valore deve essere inferiore alla lunghezza massima di {{maxLength}} caratteri.', - trueOrFalse: "Questo campo può essere solo uguale a 'true' o 'false'.", - validUploadID: "'Questo campo non è un ID di Upload valido.'", - }, - version: { - autosavedSuccessfully: 'Salvataggio automatico riuscito.', - draft: 'Bozza', - draftSavedSuccessfully: 'Bozza salvata con successo.', - published: 'Pubblicato', - restoredSuccessfully: 'Ripristinato con successo.', - status: 'Stato', - }, -} diff --git a/packages/translations/src/_generatedFiles_/api/ja.js b/packages/translations/src/_generatedFiles_/api/ja.js deleted file mode 100644 index c477b397a1..0000000000 --- a/packages/translations/src/_generatedFiles_/api/ja.js +++ /dev/null @@ -1,95 +0,0 @@ -export default { - authentication: { - account: 'アカウント', - apiKey: 'API Key', - enableAPIKey: 'API Keyを許可', - loggedInChangePassword: - 'パスワードを変更するには、<0>アカウントにアクセスしてパスワードを編集してください。', - newAccountCreated: - '{{serverURL}}にアクセスするための新しいアカウントが作成されました。以下のリンクをクリックするか、ブラウザに以下のURLを貼り付けて、メールアドレスの確認を行ってください。{{verificationURL}}
メールアドレスの確認後に、正常にログインできるようになります。', - resetYourPassword: 'パスワードの再設定', - verified: '検証済み', - verifyYourEmail: 'メールアドレスの確認', - youAreReceivingResetPassword: - 'アカウントのパスワードリセットがリクエストされました。次のリンクをクリックする、または、ブラウザにリンクを貼り付けて、手続きを行ってください:', - youDidNotRequestPassword: - 'もし望まない場合は、このメールを無視してください。パスワードは変更されません。', - }, - error: { - deletingFile: 'ファイルの削除中にエラーが発生しました。', - emailOrPasswordIncorrect: 'メールアドレス、または、パスワードが正しくありません。', - followingFieldsInvalid_one: '次のフィールドは無効です:', - followingFieldsInvalid_other: '次のフィールドは無効です:', - noFilesUploaded: 'ファイルがアップロードされていません。', - notAllowedToPerformAction: 'このアクションは許可されていません。', - problemUploadingFile: 'ファイルのアップロード中に問題が発生しました。', - unableToDeleteCount: '{{total}} {{label}} から {{count}} を削除できません。', - unableToUpdateCount: '{{total}} {{label}} のうち {{count}} 個を更新できません。', - unauthorized: '認証されていません。このリクエストを行うにはログインが必要です。', - userLocked: 'このユーザーは、ログイン試行回数が多すぎるため、ロックされています。', - valueMustBeUnique: 'ユニークな値である必要があります。', - }, - fields: { - chooseBetweenCustomTextOrDocument: - 'カスタムテキストのURLを入力するか、他のドキュメントにリンクするかを選択してください。', - chooseDocumentToLink: 'リンクするドキュメントを選択してください。', - customURL: 'カスタムURL', - enterURL: 'URL を入力してください', - internalLink: '内部リンク', - linkType: 'リンクタイプ', - openInNewTab: '新しいタブで開く', - textToDisplay: '表示するテキスト', - }, - general: { - copy: 'コピー', - createdAt: '作成日', - deletedCountSuccessfully: '{{count}}つの{{label}}を正常に削除しました。', - deletedSuccessfully: '正常に削除されました。', - email: 'メールアドレス', - notFound: 'Not Found', - row: '列', - rows: '列', - successfullyCreated: '{{label}} が作成されました。', - successfullyDuplicated: '{{label}} が複製されました。', - thisLanguage: 'Japanese', - 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: '必須フィールドです。', - requiresAtLeast: '少なくとも {{count}} {{label}} 以上が必要です。', - requiresNoMoreThan: '最大で {{count}} {{label}} 以下にする必要があります。', - requiresTwoNumbers: '2つの数値が必要です。', - shorterThanMax: '{{maxLength}} 文字以下にする必要があります。', - trueOrFalse: '"true" または "false" の値にする必要があります。', - validUploadID: '有効なアップロードIDではありません。', - }, - version: { - autosavedSuccessfully: '自動保存に成功しました。', - draft: 'ドラフト', - draftSavedSuccessfully: '下書きは正常に保存されました。', - published: '公開済み', - restoredSuccessfully: '正常に復元されました。', - status: 'ステータス', - }, -} diff --git a/packages/translations/src/_generatedFiles_/api/ko.js b/packages/translations/src/_generatedFiles_/api/ko.js deleted file mode 100644 index 06dac102d1..0000000000 --- a/packages/translations/src/_generatedFiles_/api/ko.js +++ /dev/null @@ -1,95 +0,0 @@ -export default { - authentication: { - account: '계정', - apiKey: 'API 키', - enableAPIKey: 'API 키 활성화', - loggedInChangePassword: - '비밀번호를 변경하려면 <0>계정 화면으로 이동하여 비밀번호를 편집하세요.', - newAccountCreated: - '{{serverURL}}에 접근할 수 있는 새로운 계정이 생성되었습니다. 다음 링크를 클릭하거나 브라우저에 URL을 붙여넣으세요: {{verificationURL}}
이메일을 확인한 후에 로그인할 수 있습니다.', - resetYourPassword: '비밀번호 재설정', - verified: '확인됨', - verifyYourEmail: '이메일을 확인해주세요', - youAreReceivingResetPassword: - '당신(혹은 다른 사람)이 계정의 비밀번호 초기화를 요청했기 때문에 이 이메일을 받았습니다. 다음 링크를 클릭하거나 브라우저에 붙여넣어 비밀번호를 초기화하세요:', - youDidNotRequestPassword: - '비밀번호 초기화를 요청하지 않았다면 이 이메일을 무시하시고 비밀번호를 변경하지 마세요.', - }, - error: { - deletingFile: '파일을 삭제하는 중에 오류가 발생했습니다.', - emailOrPasswordIncorrect: '입력한 이메일 또는 비밀번호가 올바르지 않습니다.', - followingFieldsInvalid_one: '다음 입력란이 유효하지 않습니다:', - followingFieldsInvalid_other: '다음 입력란이 유효하지 않습니다:', - noFilesUploaded: '파일이 업로드되지 않았습니다.', - notAllowedToPerformAction: '이 작업을 수행할 권한이 없습니다.', - problemUploadingFile: '파일 업로드 중에 문제가 발생했습니다.', - unableToDeleteCount: '총 {{total}}개 중 {{count}}개의 {{label}}을(를) 삭제할 수 없습니다.', - unableToUpdateCount: '총 {{total}}개 중 {{count}}개의 {{label}}을(를) 업데이트할 수 없습니다.', - unauthorized: '권한 없음, 이 요청을 수행하려면 로그인해야 합니다.', - userLocked: '이 사용자는 로그인 실패 횟수가 너무 많아 잠겼습니다.', - valueMustBeUnique: '값은 고유해야 합니다.', - }, - fields: { - chooseBetweenCustomTextOrDocument: - '사용자 지정 텍스트 URL 또는 다른 문서에 링크 중 선택하세요.', - chooseDocumentToLink: '연결할 문서 선택', - customURL: '사용자 지정 URL', - enterURL: 'URL 입력', - internalLink: '내부 링크', - linkType: '링크 유형', - openInNewTab: '새 탭에서 열기', - textToDisplay: '표시할 텍스트', - }, - general: { - copy: '복사', - createdAt: '생성 일시', - deletedCountSuccessfully: '{{count}}개의 {{label}}를 삭제했습니다.', - deletedSuccessfully: '삭제되었습니다.', - email: '이메일', - notFound: '찾을 수 없음', - row: '행', - rows: '행', - successfullyCreated: '{{label}}이(가) 생성되었습니다.', - successfullyDuplicated: '{{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: '이 입력란은 필수입니다.', - requiresAtLeast: '이 입력란운 최소한 {{count}} {{label}}이 필요합니다.', - requiresNoMoreThan: '이 입력란은 최대 {{count}} {{label}} 이하이어야 합니다.', - requiresTwoNumbers: '이 입력란은 두 개의 숫자가 필요합니다.', - shorterThanMax: '이 값은 최대 길이인 {{maxLength}}자보다 짧아야 합니다.', - trueOrFalse: '이 입력란은 true 또는 false만 가능합니다.', - validUploadID: '이 입력란은 유효한 업로드 ID가 아닙니다.', - }, - version: { - autosavedSuccessfully: '자동 저장이 완료되었습니다.', - draft: '초안', - draftSavedSuccessfully: '초안이 저장되었습니다.', - published: '게시됨', - restoredSuccessfully: '복원이 완료되었습니다.', - status: '상태', - }, -} diff --git a/packages/translations/src/_generatedFiles_/api/my.js b/packages/translations/src/_generatedFiles_/api/my.js deleted file mode 100644 index 24f2052b59..0000000000 --- a/packages/translations/src/_generatedFiles_/api/my.js +++ /dev/null @@ -1,98 +0,0 @@ -export default { - authentication: { - account: 'အကောင့်', - apiKey: 'API Key', - enableAPIKey: 'API Key ကိုဖွင့်ရန်', - loggedInChangePassword: - 'စကားဝှက် ပြောင်းလဲရန်အတွက် သင့် <0>အကောင့် သို့ဝင်ရောက်ပြီး ပြင်ဆင် သတ်မှတ်ပါ။', - newAccountCreated: - '{{serverURL}} သို့ဝင်ရောက်ရန် သင့်အီးမေးလ်ကို အတည်ပြုရန်အတွက် အကောင့်အသစ်တစ်ခုကို ယခုလေးတင် ဖန်တီးပြီးပါပြီ။ ကျေးဇူးပြု၍ အောက်ပါလင့်ခ်ကို နှိပ်ပါ သို့မဟုတ် သင့်အီးမေးလ်ကို အတည်ပြုရန် ဖော်ပြပါ လင့်ခ်ကို သင့်ဘရောက်ဆာထဲသို့ ကူးထည့်ပါ- {{verificationURL}}
သင့်အီးမေးလ်ကို အတည်ပြုပြီးနောက်၊ သင်သည် အောင်မြင်စွာ လော့ဂ်အင်ဝင်နိုင်ပါမည်။', - resetYourPassword: 'သင့်စကားဝှက်ကို ပြန်လည်သတ်မှတ်ပါ။', - verified: 'စိစစ်ပြီး', - verifyYourEmail: 'သင့်အီးမေးလ်ကို အတည်ပြုပါ။', - youAreReceivingResetPassword: - 'သင့်အကောင့်အတွက် စကားဝှက်ကို ပြန်လည်သတ်မှတ်ရန် သင် (သို့မဟုတ် အခြားသူတစ်ဦးဦး) က တောင်းဆိုထားသောကြောင့်လက်ခံရရှိခြင်းဖြစ်သည်။ ကျေးဇူးပြု၍ အောက်ပါလင့်ခ်ကို နှိပ်ပါ (သို့မဟုတ်) ၎င်းကို သင့်ဘရောက်ဆာထဲသို့ ကူးထည့်ပါ။', - youDidNotRequestPassword: - 'ယခု လုပ်ဆောင်ချက်ကို သင်မတောင်းဆိုထားပါက ဤအီးမေးလ်ကို လျစ်လျူရှုထားခြင်းဖြင့် သင့်စကားဝှက်သည် ပြောင်းလဲမည်မဟုတ်ပါ။', - }, - error: { - deletingFile: 'ဖိုင်ကိုဖျက်ရာတွင် အမှားအယွင်းရှိနေသည်။', - emailOrPasswordIncorrect: 'ထည့်သွင်းထားသော အီးမေးလ် သို့မဟုတ် စကားဝှက်သည် မမှန်ပါ။', - followingFieldsInvalid_one: 'ထည့်သွင်းထားသော အချက်အလက်သည် မမှန်ကန်ပါ။', - followingFieldsInvalid_other: 'ထည့်သွင်းထားသော အချက်အလက်များသည် မမှန်ကန်ပါ။', - noFilesUploaded: 'ဖိုင်များကို အပ်လုဒ်လုပ်ထားခြင်းမရှိပါ။', - notAllowedToPerformAction: 'ဤလုပ်ဆောင်ချက်ကို လုပ်ဆောင်ရန် ခွင့်မပြုပါ။', - problemUploadingFile: 'ဖိုင်ကို အပ်လုဒ်တင်ရာတွင် ပြဿနာရှိနေသည်။', - unableToDeleteCount: '{{total}} {{label}} မှ {{count}} ကို ဖျက်၍မရပါ။', - unableToUpdateCount: '{{total}} {{label}} မှ {{count}} ကို အပ်ဒိတ်လုပ်၍မရပါ။', - unauthorized: 'အခွင့်မရှိပါ။ ဤတောင်းဆိုချက်ကို လုပ်ဆောင်နိုင်ရန် သင်သည် လော့ဂ်အင်ဝင်ရပါမည်။', - userLocked: - 'အကောင့်ထဲကို ဝင်ရန် အရမ်းအရမ်းကို ကြိုးပမ်းနေသောကြောင့် အကောင့်အား လော့ခ်ချလိုက်ပါသည်။', - valueMustBeUnique: 'value သည် အဓိပ္ပာယ်ရှိရပါမည်။', - }, - fields: { - chooseBetweenCustomTextOrDocument: - 'စိတ်ကြိုက်စာသား URL ကိုထည့်ခြင်း သို့မဟုတ် အခြားစာရွက်စာတမ်းတစ်ခုသို့ လင့်ခ်ချိတ်ခြင်းအကြား ရွေးချယ်ပါ။', - chooseDocumentToLink: 'ချိတ်ဆက်ရန် စာရွက်စာတမ်းကို ရွေးပါ။', - customURL: 'စိတ်ကြိုက် URL', - enterURL: 'URL တစ်ခုထည့်ပါ။', - internalLink: 'Internal Link', - linkType: 'လင့်အမျိုးအစား', - openInNewTab: 'တက်ဘ်အသစ်တွင် ဖွင့်ပါ။', - textToDisplay: 'ပြသရန် စာသား', - }, - general: { - copy: 'ကူးယူမည်။', - createdAt: 'ဖန်တီးခဲ့သည့်အချိန်', - deletedCountSuccessfully: '{{count}} {{label}} ကို အောင်မြင်စွာ ဖျက်လိုက်ပါပြီ။', - deletedSuccessfully: 'အောင်မြင်စွာ ဖျက်လိုက်ပါပြီ။', - email: 'အီးမေးလ်', - notFound: 'ဘာမှ မရှိတော့ဘူး။', - row: 'အတန်း', - rows: 'Rows', - successfullyCreated: '{{label}} အောင်မြင်စွာဖန်တီးခဲ့သည်။', - successfullyDuplicated: '{{label}} အောင်မြင်စွာ ပုံတူပွားခဲ့သည်။', - thisLanguage: 'မြန်မာစာ', - updatedAt: 'ပြင်ဆင်ခဲ့သည့်အချိန်', - updatedCountSuccessfully: '{{count}} {{label}} ကို အောင်မြင်စွာ အပ်ဒိတ်လုပ်ခဲ့သည်။', - updatedSuccessfully: 'အပ်ဒိတ်လုပ်ပြီးပါပြီ။', - user: 'အသုံးပြုသူ', - users: 'အသုံးပြုသူများ', - value: 'တန်ဖိုး', - }, - upload: { - fileName: 'ဖိုင် နာမည်', - fileSize: 'ဖိုင် အရွယ်အစား', - height: 'Height', - sizes: 'အရွယ်အစားများ', - width: 'အကျယ်', - }, - validation: { - emailAddress: 'မှန်ကန်သော အီးမေးလ်လိပ်စာကို ထည့်သွင်းပါ။', - enterNumber: 'မှန်ကန်သောနံပါတ်တစ်ခုထည့်ပါ။', - greaterThanMax: - '{{value}} သည် {{max}} ထက် ပိုမိုကြီးသည်။ ဤသည်ဖြင့် {{label}} အများဆုံးခွင့်ပြုထားသော တန်ဖိုးထက် ကြီးသည်။', - invalidInput: 'ဤအကွက်တွင် မမှန်ကန်သော ထည့်သွင်းမှုတစ်ခုရှိသည်။', - invalidSelection: 'ဤအကွက်တွင် မမှန်ကန်သော ရွေးချယ်မှုတစ်ခုရှိသည်။', - invalidSelections: 'ဤအကွက်တွင် အောက်ပါ မမှန်ကန်သော ရွေးချယ်မှုများ ရှိသည်', - lessThanMin: - '{{value}} သည် {{min}} ထက် ပိုမိုနိမ့်သည်။ ဤသည်ဖြင့် {{label}} အနည်းဆုံးခွင့်ပြုထားသော တန်ဖိုးထက် နိမ့်သည်။', - longerThanMin: 'ဤတန်ဖိုးသည် အနိမ့်ဆုံးအရှည် {{minLength}} စာလုံးထက် ပိုရှည်ရမည်။', - notValidDate: '"{{value}}" သည် တရားဝင်ရက်စွဲမဟုတ်ပါ။', - required: 'ဤအကွက်ကို လိုအပ်သည်။', - requiresAtLeast: 'ဤအကွက်သည် အနည်းဆုံး {{count}} {{label}} လိုအပ်သည်', - requiresNoMoreThan: 'ဤအကွက်တွင် {{count}} {{label}} ထက် မပိုရပါ။', - requiresTwoNumbers: 'ဤအကွက်သည် နံပါတ်နှစ်ခု လိုအပ်ပါသည်။', - shorterThanMax: 'ဤတန်ဖိုးသည် စာလုံး {{maxLength}} လုံး၏ အမြင့်ဆုံးအရှည်ထက် ပိုတိုရပါမည်။', - trueOrFalse: 'ဤအကွက်သည် တစ်ခုခုဖြစ်ရပါမည်။', - validUploadID: "'ဤအကွက်သည် မှန်ကန်သော အပ်လုဒ် ID မဟုတ်ပါ။'", - }, - version: { - autosavedSuccessfully: 'အလိုအလျောက် သိမ်းဆည်းပြီးပါပြီ။', - draft: 'မူကြမ်း', - draftSavedSuccessfully: 'မူကြမ်းကို အောင်မြင်စွာ သိမ်းဆည်းပြီးပါပြီ။', - published: 'တင်ပြီးပြီ။', - restoredSuccessfully: 'အောင်မြင်စွာ ပြန်လည်ရယူခဲ့သည်။', - status: 'အခြေအနေ', - }, -} diff --git a/packages/translations/src/_generatedFiles_/api/nb.js b/packages/translations/src/_generatedFiles_/api/nb.js deleted file mode 100644 index 5d2e2dc899..0000000000 --- a/packages/translations/src/_generatedFiles_/api/nb.js +++ /dev/null @@ -1,95 +0,0 @@ -export default { - authentication: { - account: 'Konto', - apiKey: 'API-nøkkel', - enableAPIKey: 'Aktiver API-nøkkel', - loggedInChangePassword: - 'For å endre passordet ditt, gå til <0>kontoen din og endre passordet der.', - newAccountCreated: - 'En ny konto har blitt opprettet for deg på {{serverURL}} Klikk på lenken nedenfor eller lim inn URLen i nettleseren din for å bekrefte e-postadressen din: {{verificationURL}}
Etter at du har bekreftet e-postadressen din, kan du logge inn.', - resetYourPassword: 'Tilbakestill passordet ditt', - verified: 'Bekreftet', - verifyYourEmail: 'Bekreft e-postadressen din', - youAreReceivingResetPassword: - 'Du mottar denne e-posten fordi du (eller noen andre) har bedt om tilbakestilling av passordet til kontoen din. Klikk på lenken nedenfor, eller lim den inn i nettleseren din for å fullføre prosessen:', - youDidNotRequestPassword: - 'Hvis du ikke har bedt om dette, kan du ignorere denne e-posten, og passordet ditt vil forbli uendret.', - }, - error: { - deletingFile: 'Det oppstod en feil under sletting av filen.', - emailOrPasswordIncorrect: 'E-postadressen eller passordet er feil.', - followingFieldsInvalid_one: 'Følgende felt er ugyldig:', - followingFieldsInvalid_other: 'Følgende felter er ugyldige:', - noFilesUploaded: 'Ingen filer ble lastet opp.', - notAllowedToPerformAction: 'Du har ikke tillatelse til å utføre denne handlingen.', - problemUploadingFile: 'Det oppstod et problem under opplasting av filen.', - unableToDeleteCount: 'Kan ikke slette {{count}} av {{total}} {{label}}.', - unableToUpdateCount: 'Kan ikke oppdatere {{count}} av {{total}} {{label}}.', - unauthorized: 'Uautorisert, du må være innlogget for å gjøre denne forespørselen.', - userLocked: 'Denne brukeren er låst på grunn av for mange mislykkede innloggingsforsøk.', - valueMustBeUnique: 'Verdien må være unik', - }, - fields: { - chooseBetweenCustomTextOrDocument: - 'Velg mellom å skrive inn en egen tekst-URL eller å lenke til et annet dokument.', - chooseDocumentToLink: 'Velg et dokument å lenke til', - customURL: 'Egendefinert URL', - enterURL: 'Skriv inn en URL', - internalLink: 'Intern lenke', - linkType: 'Lenketype', - openInNewTab: 'Åpne i ny fane', - textToDisplay: 'Tekst som skal vises', - }, - general: { - copy: 'Kopiér', - createdAt: 'Opprettet', - deletedCountSuccessfully: 'Slettet {{count}} {{label}}.', - deletedSuccessfully: 'Slettet.', - email: 'E-post', - notFound: 'Ikke funnet', - row: 'Rad', - rows: 'Rader', - successfullyCreated: '{{label}} ble opprettet.', - successfullyDuplicated: '{{label}} ble duplisert.', - thisLanguage: 'Norsk', - updatedAt: 'Oppdatert', - updatedCountSuccessfully: 'Oppdaterte {{count}} {{label}} vellykket.', - updatedSuccessfully: 'Oppdatert.', - user: 'Bruker', - users: 'Brukere', - value: 'Verdi', - }, - upload: { - fileName: 'Filnavn', - fileSize: 'Filstørrelse', - height: 'Høyde', - sizes: 'Størrelser', - width: 'Bredde', - }, - validation: { - emailAddress: 'Vennligst skriv inn en gyldig e-postadresse.', - enterNumber: 'Vennligst skriv inn et gyldig tall.', - greaterThanMax: '{{value}} er større enn den tillatte maksimale {{label}} på {{max}}.', - invalidInput: 'Dette feltet har en ugyldig inndata.', - invalidSelection: 'Dette feltet har en ugyldig utvalg.', - invalidSelections: 'Dette feltet har følgende ugyldige utvalg:', - lessThanMin: '{{value}} er mindre enn den tillatte minimale {{label}} på {{min}}.', - longerThanMin: 'Denne verdien må være lengre enn minimumslengden på {{minLength}} tegn.', - notValidDate: '"{{value}}" er ikke en gyldig dato.', - required: 'Dette feltet er påkrevd.', - requiresAtLeast: 'Dette feltet krever minst {{count}} {{label}}.', - requiresNoMoreThan: 'Dette feltet krever maksimalt {{count}} {{label}}.', - requiresTwoNumbers: 'Dette feltet krever to tall.', - shorterThanMax: 'Denne verdien må være kortere enn maksimal lengde på {{maxLength}} tegn.', - trueOrFalse: 'Dette feltet kan bare være likt true eller false.', - validUploadID: 'Dette feltet er ikke en gyldig opplastings-ID.', - }, - version: { - autosavedSuccessfully: 'Lagret automatisk.', - draft: 'Utkast', - draftSavedSuccessfully: 'Utkast lagret.', - published: 'Publisert', - restoredSuccessfully: 'Gjenopprettet.', - status: 'Status', - }, -} diff --git a/packages/translations/src/_generatedFiles_/api/nl.js b/packages/translations/src/_generatedFiles_/api/nl.js deleted file mode 100644 index 76285c7606..0000000000 --- a/packages/translations/src/_generatedFiles_/api/nl.js +++ /dev/null @@ -1,95 +0,0 @@ -export default { - authentication: { - account: 'Account', - apiKey: 'API-sleutel', - enableAPIKey: 'Activeer API-sleutel', - loggedInChangePassword: - 'Om uw wachtwoord te wijzigen, gaat u naar <0>account en wijzigt u daar uw wachtwoord.', - newAccountCreated: - 'Er is zojuist een nieuw account voor u aangemaakt waarmee u toegang krijgt tot {{serverURL}}. Klik op de volgende link, of plak onderstaande URL in uw browser om uw e-mailadres te verifiëren: {{verificationURL}}
Na de verificatie van uw e-mail kunt u succesvol inloggen.', - resetYourPassword: 'Reset uw wachtwoord', - verified: 'Geverifieerd', - verifyYourEmail: 'Verifieer uw e-mailadres', - youAreReceivingResetPassword: - 'U ontvangt dit omdat u (of iemand anders) het wachtwoord voor uw account opnieuw heeft aangevraagd. Klik op de volgende link, of plak deze in uw browser om het proces te voltooien:', - youDidNotRequestPassword: - 'Als u dit niet heeft aangevraagd, negeer dan deze e-mail en uw wachtwoord zal ongewijzigd blijven.', - }, - error: { - deletingFile: 'Er is een fout opgetreden bij het verwijderen van dit bestand.', - emailOrPasswordIncorrect: 'Het opgegeven e-mailadres of wachtwoord is onjuist.', - followingFieldsInvalid_one: 'Het volgende veld is ongeldig:', - followingFieldsInvalid_other: 'De volgende velden zijn ongeldig:', - noFilesUploaded: 'Er zijn geen bestanden geüpload.', - notAllowedToPerformAction: 'U mag deze actie niet uitvoeren.', - problemUploadingFile: 'Er was een probleem bij het uploaden van het bestand.', - unableToDeleteCount: 'Kan {{count}} van {{total}} {{label}} niet verwijderen.', - unableToUpdateCount: 'Kan {{count}} van {{total}} {{label}} niet updaten.', - unauthorized: 'Ongeautoriseerd, u moet ingelogd zijn om dit verzoek te doen.', - userLocked: 'Deze gebruiker is vergrendeld wegens te veel mislukte inlogpogingen.', - valueMustBeUnique: 'De waarde moet uniek zijn', - }, - fields: { - chooseBetweenCustomTextOrDocument: - 'Kies tussen het invoeren van een aangepaste tekst-URL of een koppeling naar een ander document.', - chooseDocumentToLink: 'Kies een document om naar te linken', - customURL: 'Eigen URL', - enterURL: 'Voer een URL in', - internalLink: 'Interne koppeling', - linkType: 'Koppelingstype', - openInNewTab: 'Openen in nieuw tabblad', - textToDisplay: 'Tekst om weer te geven', - }, - general: { - copy: 'Kopiëren', - createdAt: 'Aangemaakt op', - deletedCountSuccessfully: '{{count}} {{label}} succesvol verwijderd.', - deletedSuccessfully: 'Succesvol verwijderd.', - email: 'E-mail', - notFound: 'Niet gevonden', - row: 'Rij', - rows: 'Rijen', - successfullyCreated: '{{label}} succesvol aangemaakt.', - successfullyDuplicated: '{{label}} succesvol gedupliceerd.', - thisLanguage: 'Nederlands', - updatedAt: 'Aangepast op', - updatedCountSuccessfully: '{{count}} {{label}} succesvol bijgewerkt.', - updatedSuccessfully: 'Succesvol aangepast.', - user: 'Gebruiker', - users: 'Gebruikers', - value: 'Waarde', - }, - upload: { - fileName: 'Bestandsnaam', - fileSize: 'Bestandsgrootte', - height: 'Hoogte', - sizes: 'Groottes', - width: 'Breedte', - }, - validation: { - emailAddress: 'Voer een geldig e-mailadres in.', - enterNumber: 'Voer een geldig nummer in.', - greaterThanMax: '{{value}} is groter dan de maximaal toegestane {{label}} van {{max}}.', - invalidInput: 'Dit veld heeft een ongeldige invoer.', - invalidSelection: 'Dit veld heeft een ongeldige selectie.', - invalidSelections: 'Dit veld heeft de volgende ongeldige selecties:', - lessThanMin: '{{value}} is kleiner dan de minimaal toegestane {{label}} van {{min}}.', - longerThanMin: 'Deze waarde moet langer zijn dan de minimale lengte van {{minLength}} tekens.', - notValidDate: '"{{value}}" is geen geldige datum.', - required: 'Dit veld is verplicht.', - requiresAtLeast: 'Dit veld vereist minstens {{count}} {{label}}.', - requiresNoMoreThan: 'Dit veld vereist niet meer dan {{count}} {{label}}.', - requiresTwoNumbers: 'Dit veld vereist twee nummers.', - shorterThanMax: 'Dit veld moet korter zijn dan de maximale lengte van {{maxLength}} tekens.', - trueOrFalse: 'Dit veld kan alleen waar of onwaar zijn.', - validUploadID: 'Dit veld is geen geldige upload-ID.', - }, - version: { - autosavedSuccessfully: 'Succesvol automatisch bewaard.', - draft: 'Concept', - draftSavedSuccessfully: 'Concept succesvol bewaard.', - published: 'Gepubliceerd', - restoredSuccessfully: 'Herstelling succesvol.', - status: 'Status', - }, -} diff --git a/packages/translations/src/_generatedFiles_/api/pl.js b/packages/translations/src/_generatedFiles_/api/pl.js deleted file mode 100644 index 5f3572b906..0000000000 --- a/packages/translations/src/_generatedFiles_/api/pl.js +++ /dev/null @@ -1,95 +0,0 @@ -export default { - authentication: { - account: 'Konto', - apiKey: 'Klucz API', - enableAPIKey: 'Aktywuj klucz API', - loggedInChangePassword: - 'Aby zmienić hasło, przejdź do swojego <0>konta i tam edytuj swoje hasło.', - newAccountCreated: - 'Właśnie utworzono nowe konto, w celu uzyskania dostępu do {{serverURL}}. Kliknij poniższy link lub wklej go do przeglądarki, aby zweryfikować swój adres email: {{verificationURL}}.
Po zweryfikowaniu adresu email będziesz mógł się pomyślnie zalogować.', - resetYourPassword: 'Zresetuj swoje hasło', - verified: 'Zweryfikowano', - verifyYourEmail: 'Zweryfikuj swój email', - youAreReceivingResetPassword: - 'Otrzymałeś tę wiadomość, ponieważ Ty (lub ktoś inny) poprosiłeś o zresetowanie hasła do Twojego konta. Kliknij poniższy link lub wklej go w przeglądarce, aby zakończyć proces:', - youDidNotRequestPassword: - 'Jeśli nie prosiłeś o zmianę hasła, zignoruj tę wiadomość, a Twoje hasło pozostanie niezmienione.', - }, - error: { - deletingFile: '', - emailOrPasswordIncorrect: 'Podany adres e-mail lub hasło jest nieprawidłowe.', - followingFieldsInvalid_one: 'To pole jest nieprawidłowe:', - followingFieldsInvalid_other: 'Następujące pola są nieprawidłowe:', - noFilesUploaded: 'Nie przesłano żadnych plików.', - notAllowedToPerformAction: 'Nie możesz wykonać tej akcji.', - problemUploadingFile: 'Wystąpił problem podczas przesyłania pliku.', - unableToDeleteCount: 'Nie można usunąć {{count}} z {{total}} {{label}}.', - unableToUpdateCount: 'Nie można zaktualizować {{count}} z {{total}} {{label}}.', - unauthorized: 'Brak dostępu, musisz być zalogowany.', - userLocked: 'Ten użytkownik został zablokowany z powodu zbyt wielu nieudanych prób logowania.', - valueMustBeUnique: 'Wartość musi być unikalna', - }, - fields: { - chooseBetweenCustomTextOrDocument: - 'Wybierz między wprowadzeniem niestandardowego tekstowego adresu URL a linkiem do innego dokumentu.', - chooseDocumentToLink: 'Wybierz dokument, do którego chcesz utworzyć łącze', - customURL: 'Niestandardowy adres URL', - enterURL: 'Wpisz adres URL', - internalLink: 'Link wewnętrzny', - linkType: 'Typ łącza', - openInNewTab: 'Otwórz w nowej karcie', - textToDisplay: 'Tekst do wyświetlenia', - }, - general: { - copy: 'Skopiuj', - createdAt: 'Data utworzenia', - deletedCountSuccessfully: 'Pomyślnie usunięto {{count}} {{label}}.', - deletedSuccessfully: 'Pomyślnie usunięto.', - email: 'Email', - notFound: 'Nie znaleziono', - row: 'Wiersz', - rows: 'Wiersze', - successfullyCreated: 'Pomyślnie utworzono {{label}}.', - successfullyDuplicated: 'Pomyślnie zduplikowano {{label}}', - thisLanguage: 'Polski', - updatedAt: 'Data edycji', - updatedCountSuccessfully: 'Pomyślnie zaktualizowano {{count}} {{label}}.', - updatedSuccessfully: 'Aktualizacja zakończona sukcesem.', - user: 'użytkownik', - users: 'użytkownicy', - value: 'Wartość', - }, - upload: { - fileName: 'Nazwa pliku', - fileSize: 'Rozmiar pliku', - height: 'Wysokość', - sizes: 'Rozmiary', - width: 'Szerokość', - }, - validation: { - emailAddress: 'Wprowadź poprawny adres email.', - enterNumber: 'Wprowadź poprawny numer telefonu.', - greaterThanMax: '{{value}} jest większe niż maksymalnie dozwolony {{label}} wynoszący {{max}}.', - invalidInput: 'To pole zawiera nieprawidłowe dane.', - invalidSelection: 'To pole ma nieprawidłowy wybór.', - invalidSelections: 'To pole zawiera następujące, nieprawidłowe wybory:', - lessThanMin: '{{value}} jest mniejsze niż minimalnie dozwolony {{label}} wynoszący {{min}}.', - longerThanMin: 'Ta wartość musi być dłuższa niż minimalna długość znaków: {{minLength}}.', - notValidDate: '"{{value}}" nie jest prawidłową datą.', - required: 'To pole jest wymagane.', - requiresAtLeast: 'To pole wymaga co najmniej {{count}} {{label}}.', - requiresNoMoreThan: 'To pole może posiadać co najmniej {{count}} {{label}}.', - requiresTwoNumbers: 'To pole wymaga dwóch liczb.', - shorterThanMax: 'Ta wartość musi być krótsza niż maksymalna długość znaków: {{maxLength}}.', - trueOrFalse: "To pole może mieć wartość tylko 'true' lub 'false'.", - validUploadID: 'To pole nie jest prawidłowym identyfikatorem przesyłania.', - }, - version: { - autosavedSuccessfully: 'Pomyślnie zapisano automatycznie.', - draft: 'Szkic', - draftSavedSuccessfully: 'Wersja robocza została pomyślnie zapisana.', - published: 'Opublikowano', - restoredSuccessfully: 'Przywrócono pomyślnie.', - status: 'Status', - }, -} diff --git a/packages/translations/src/_generatedFiles_/api/pt.js b/packages/translations/src/_generatedFiles_/api/pt.js deleted file mode 100644 index 2f14c8ca1f..0000000000 --- a/packages/translations/src/_generatedFiles_/api/pt.js +++ /dev/null @@ -1,95 +0,0 @@ -export default { - authentication: { - account: 'Conta', - apiKey: 'Chave da API', - enableAPIKey: 'Habilitar Chave API', - loggedInChangePassword: - 'Para mudar a sua senha, acesse a sua <0>conta e edite sua senha lá.', - newAccountCreated: - 'Uma nova conta acaba de ser criada para que você possa acessar {{serverURL}} Por favor, clique no link a seguir ou cole a URL abaixo no seu navegador para verificar seu email: {{verificationURL}}
Após a verificação de email, você será capaz de fazer o login.', - resetYourPassword: 'Redefinir Sua Senha', - verified: 'Verificado', - verifyYourEmail: 'Verifique seu email', - youAreReceivingResetPassword: - 'Você está recebendo essa mensagem porque você (ou outra pessoa) requisitou a redefinição de senha da sua conta. Por favor, clique no link a seguir ou cole no seu navegador para completar o processo:', - youDidNotRequestPassword: - 'Se você não fez essa requisição, por favor ignore esse email e sua senha permanecerá igual.', - }, - error: { - deletingFile: 'Ocorreu um erro ao excluir o arquivo.', - emailOrPasswordIncorrect: 'O email ou senha fornecido está incorreto.', - followingFieldsInvalid_one: 'O campo a seguir está inválido:', - followingFieldsInvalid_other: 'Os campos a seguir estão inválidos:', - noFilesUploaded: 'Nenhum arquivo foi carregado.', - notAllowedToPerformAction: 'Você não tem permissão para realizar essa ação.', - problemUploadingFile: 'Ocorreu um problema ao carregar o arquivo.', - unableToDeleteCount: 'Não é possível excluir {{count}} de {{total}} {{label}}.', - unableToUpdateCount: 'Não foi possível atualizar {{count}} de {{total}} {{label}}.', - unauthorized: 'Não autorizado. Você deve estar logado para fazer essa requisição', - userLocked: 'Esse usuário está bloqueado devido a muitas tentativas de login malsucedidas.', - valueMustBeUnique: 'Valor deve ser único', - }, - fields: { - chooseBetweenCustomTextOrDocument: - 'Escolha entre inserir um URL de texto personalizado ou vincular a outro documento.', - chooseDocumentToLink: 'Escolha um documento para vincular', - customURL: 'URL personalizado', - enterURL: 'Insira um URL', - internalLink: 'Link Interno', - linkType: 'Tipo de link', - openInNewTab: 'Abrir em nova aba', - textToDisplay: 'Texto a ser exibido', - }, - general: { - copy: 'Copiar', - createdAt: 'Criado Em', - deletedCountSuccessfully: 'Excluído {{count}} {{label}} com sucesso.', - deletedSuccessfully: 'Apagado com sucesso.', - email: 'Email', - notFound: 'Não Encontrado', - row: 'Linha', - rows: 'Linhas', - successfullyCreated: '{{label}} criado com sucesso.', - successfullyDuplicated: '{{label}} duplicado com sucesso.', - thisLanguage: 'Português', - updatedAt: 'Atualizado Em', - updatedCountSuccessfully: 'Atualizado {{count}} {{label}} com sucesso.', - updatedSuccessfully: 'Atualizado com sucesso.', - user: 'usuário', - users: 'usuários', - value: 'Valor', - }, - upload: { - fileName: 'Nome do Arquivo', - fileSize: 'Tamanho do Arquivo', - height: 'Altura', - sizes: 'Tamanhos', - width: 'Largura', - }, - validation: { - emailAddress: 'Por favor, insira um endereço de email válido.', - enterNumber: 'Por favor, insira um número válido.', - greaterThanMax: '{{value}} é maior que o máximo permitido de {{label}} que é {{max}}.', - invalidInput: 'Esse campo tem um conteúdo inválido.', - invalidSelection: 'Esse campo tem uma seleção inválida.', - invalidSelections: "'Esse campo tem as seguintes seleções inválidas:'", - lessThanMin: '{{value}} é menor que o mínimo permitido de {{label}} que é {{min}}.', - longerThanMin: 'Esse valor deve ser maior do que o mínimo de {{minLength}} characters.', - notValidDate: '"{{value}}" não é uma data válida.', - required: 'Esse campo é obrigatório.', - requiresAtLeast: 'Esse campo requer no máximo {{count}} {{label}}.', - requiresNoMoreThan: 'Esse campo requer pelo menos {{count}} {{label}}.', - requiresTwoNumbers: 'Esse campo requer dois números.', - shorterThanMax: 'Esse valor deve ser menor do que o máximo de {{maxLength}} caracteres.', - trueOrFalse: 'Esse campo pode ser apenas verdadeiro (true) ou falso (false)', - validUploadID: "'Esse campo não é um ID de upload válido.'", - }, - version: { - autosavedSuccessfully: 'Salvamento automático com sucesso.', - draft: 'Rascunho', - draftSavedSuccessfully: 'Rascunho salvo com sucesso.', - published: 'Publicado', - restoredSuccessfully: 'Restaurado com sucesso.', - status: 'Status', - }, -} diff --git a/packages/translations/src/_generatedFiles_/api/ro.js b/packages/translations/src/_generatedFiles_/api/ro.js deleted file mode 100644 index 504831722f..0000000000 --- a/packages/translations/src/_generatedFiles_/api/ro.js +++ /dev/null @@ -1,100 +0,0 @@ -export default { - authentication: { - account: 'Cont', - apiKey: 'Cheia API', - enableAPIKey: 'Activați cheia API', - loggedInChangePassword: - 'Pentru a vă schimba parola, accesați <0>contul și editați-vă parola acolo.', - newAccountCreated: - 'A fost creat un nou cont pe care îl puteți accesa {{serverURL}} Vă rugăm să intrați pe următorul link sau să copiați URL-ul de mai jos în browserul dvs. pentru a vă verifica emailul: {{verificationURL}}
După ce vă verificați adresa de email, vă veți putea autentifica cu succes.', - resetYourPassword: 'Resetați-vă parola', - verified: 'Verificat', - verifyYourEmail: 'Verifică-ți emailul', - youAreReceivingResetPassword: - 'Primiți acest mesaj deoarece dumneavoastră (sau altcineva) ați solicitat resetarea parolei pentru contul dumneavoastră. Vă rugăm să dați clic pe următorul link sau să îl copiați în browserul dvs. pentru a finaliza procesul:', - youDidNotRequestPassword: - 'Dacă nu ați solicitat acest lucru, vă rugăm să ignorați acest email și parola dvs. va rămâne neschimbată.', - }, - error: { - deletingFile: 'S-a produs o eroare la ștergerea fișierului.', - emailOrPasswordIncorrect: 'Adresa de e-mail sau parola este incorectă.', - followingFieldsInvalid_one: 'Următorul câmp nu este valid:', - followingFieldsInvalid_other: 'Următoarele câmpuri nu sunt valabile:', - noFilesUploaded: 'Nu a fost încărcat niciun fișier.', - notAllowedToPerformAction: 'Nu aveți voie să efectuați această acțiune.', - problemUploadingFile: 'A existat o problemă în timpul încărcării fișierului.', - unableToDeleteCount: 'Nu se poate șterge {{count}} din {{total}} {{label}}.', - unableToUpdateCount: 'Nu se poate șterge {{count}} din {{total}} {{label}}.', - unauthorized: 'neautorizat, trebuie să vă conectați pentru a face această cerere.', - userLocked: - 'Acest utilizator este blocat din cauza unui număr prea mare de încercări de autentificare eșuate.', - valueMustBeUnique: 'Valoarea trebuie să fie unică', - }, - fields: { - chooseBetweenCustomTextOrDocument: - 'Alegeți între a introduce un text URL personalizat sau a crea un link către un alt document.', - chooseDocumentToLink: 'Alegeți un document către care să creați un link', - customURL: 'URL personalizat', - enterURL: 'Introduceți un URL', - internalLink: 'Link intern', - linkType: 'Tip de link', - openInNewTab: 'Deschideți în tab nou', - textToDisplay: 'Text de afișat', - }, - general: { - copy: 'Copiați', - createdAt: 'Creat la', - deletedCountSuccessfully: 'Șterse cu succes {{count}} {{label}}.', - deletedSuccessfully: 'Șters cu succes.', - email: 'Email', - notFound: 'Nu a fost găsit', - row: 'Rând', - rows: 'Rânduri', - successfullyCreated: '{{label}} creat(ă) cu succes.', - successfullyDuplicated: '{{label}} duplicat(ă) cu succes.', - thisLanguage: 'Română', - updatedAt: 'Actualizat la', - updatedCountSuccessfully: 'Actualizate {{count}} {{label}} cu succes.', - updatedSuccessfully: 'Actualizat cu succes.', - user: 'Utilizator', - users: 'Utilizatori', - value: 'Valoare', - }, - upload: { - fileName: 'Numele fișierului', - fileSize: 'Dimensiunea fișierului', - height: 'Înălțime', - sizes: 'Dimensiuni', - width: 'Lățime', - }, - validation: { - emailAddress: 'Vă rugăm să introduceți o adresă de email validă.', - enterNumber: 'Vă rugăm să introduceți un număr valid.', - greaterThanMax: - '{{value}} este mai mare decât valoarea maximă permisă pentru {{label}} de {{max}}.', - invalidInput: 'Acest câmp are o intrare invalidă.', - invalidSelection: 'Acest câmp are o selecție invalidă.', - invalidSelections: 'Acest câmp are următoarele selecții invalide:', - lessThanMin: - '{{value}} este mai mic decât valoarea minimă permisă pentru {{label}} de {{min}}.', - longerThanMin: - 'Această valoare trebuie să fie mai mare decât lungimea minimă de {{minLength}} caractere.', - notValidDate: '"{{value}}" nu este o dată valabilă.', - required: 'Acest câmp este obligatoriu.', - requiresAtLeast: 'Acest domeniu necesită cel puțin {{count}} {{label}}.', - requiresNoMoreThan: 'Acest câmp nu necesită mai mult de {{count}} {{label}}.', - requiresTwoNumbers: 'Acest câmp necesită două numere.', - shorterThanMax: - 'Această valoare trebuie să fie mai scurtă decât lungimea maximă de {{maxLength}} caractere.', - trueOrFalse: 'Acest câmp poate fi doar egal cu true sau false.', - validUploadID: 'Acest câmp nu este un ID de încărcare valid.', - }, - version: { - autosavedSuccessfully: 'Autosalvare cu succes.', - draft: 'Proiect', - draftSavedSuccessfully: 'Proiect salvat cu succes.', - published: 'Publicat', - restoredSuccessfully: 'Restaurat cu succes.', - status: 'Status', - }, -} diff --git a/packages/translations/src/_generatedFiles_/api/rs-latin.js b/packages/translations/src/_generatedFiles_/api/rs-latin.js deleted file mode 100644 index 8826f13237..0000000000 --- a/packages/translations/src/_generatedFiles_/api/rs-latin.js +++ /dev/null @@ -1,95 +0,0 @@ -export default { - authentication: { - account: 'Nalog', - apiKey: 'API ključ', - enableAPIKey: 'Omogući API ključ', - loggedInChangePassword: - 'Da biste promenili lozinku, otvorite svoj <0>nalog i promenite lozinku.', - newAccountCreated: - 'Novi nalog je kreiran. Pristupite nalogu klikom na {{serverURL}}. Molimo Vas kliknite na sledeći link ili zalepite URL koji se nalazi ispod u pretraživač da biste potvrdili adresu e-pošte: {{verificationURL}}
Nakon što potvrdite adresu e-pošte možete se ulogovati.', - resetYourPassword: 'Promeni svoju lozinku', - verified: 'Potvrđeno', - verifyYourEmail: 'Potvrdi svoju adresu e-pošte', - youAreReceivingResetPassword: - 'Primili ste ovo pošto ste Vi (ili neko u vaše ime) zatražili promenu lozinke naloga. Molimo Vas kliknite na link ili zalepite URL u svoj pretraživač da biste završili proces:', - youDidNotRequestPassword: - 'Ako niste zatražili promenu lozinke ignorišite ovu poruku i lozinka će ostati nepromenjena.', - }, - error: { - deletingFile: 'Dogodila se greška pri brisanju datoteke.', - emailOrPasswordIncorrect: 'Adresa e-pošte ili lozinka su neispravni.', - followingFieldsInvalid_one: 'Ovo polje je nevalidno:', - followingFieldsInvalid_other: 'Ova polja su nevalidna:', - noFilesUploaded: 'Nijedna datoteka nije učitana.', - notAllowedToPerformAction: 'Nemate dozvolu za izvršenje ove radnje.', - problemUploadingFile: 'Postoji problem pri učitavanju datoteke.', - unableToDeleteCount: 'Nije moguće izbrisati {{count}} od {{total}} {{label}}.', - unableToUpdateCount: 'Nije moguće ažurirati {{count}} od {{total}} {{label}}.', - unauthorized: 'Niste autorizovani da biste uputili ovaj zahtev.', - userLocked: 'Ovaj korisnik je zaključan zbog prevelikog broja neuspešnih pokušaja prijave.', - valueMustBeUnique: 'Vrednost mora biti jedinstvena.', - }, - fields: { - chooseBetweenCustomTextOrDocument: - 'Izaberite između unosa prilagođenog teksta URL ili linka na drugi dokument.', - chooseDocumentToLink: 'Odaberite dokument koji želite linkovati.', - customURL: 'Prilagođeni URL', - enterURL: 'Unesi URL', - internalLink: 'Interni link', - linkType: 'Tip linka', - openInNewTab: 'Otvori u novoj kartici.', - textToDisplay: 'Tekst za prikaz', - }, - general: { - copy: 'Kopiraj', - createdAt: 'Kreirano u', - deletedCountSuccessfully: 'Uspešno izbrisano {{count}} {{label}}.', - deletedSuccessfully: 'Uspešno izbrisano.', - email: 'E-pošta', - notFound: 'Nije pronađeno', - row: 'Red', - rows: 'Redovi', - successfullyCreated: '{{label}} uspešno kreirano.', - successfullyDuplicated: '{{label}} uspešno duplicirano.', - thisLanguage: 'Srpski (latinica)', - updatedAt: 'Ažurirano u', - updatedCountSuccessfully: 'Uspešno ažurirano {{count}} {{label}}.', - updatedSuccessfully: 'Uspešno ažurirano.', - user: 'Korisnik', - users: 'Korisnici', - value: 'Vrednost', - }, - upload: { - fileName: 'Ime datoteke', - fileSize: 'Veličina datoteke', - height: 'Visina', - sizes: 'Veličine', - width: 'Širina', - }, - validation: { - emailAddress: 'Molimo Vas unesite validnu email adresu.', - enterNumber: 'Molimo Vas unesite validan broj.', - greaterThanMax: '{{value}} prekoračuje maksimalan dozvoljeni {{label}} limit od {{max}}.', - invalidInput: 'Ovo polje sadrži nevalidan unos.', - invalidSelection: 'Ovo polje sadrži nevalidan odabir.', - invalidSelections: 'Ovo polje ima sledeće nevalidne odabire:', - lessThanMin: '{{value}} je ispod dozvoljenog minimuma za {{label}} (donji limit je {{min}}).', - longerThanMin: 'Ova vrednost mora biti duža od minimalne dužine od {{minLength}} karaktera', - notValidDate: '"{{value}}" nije validan datum.', - required: 'Ovo polje je obavezno.', - requiresAtLeast: 'Ovo polje zahteva minimalno {{count}} {{label}}.', - requiresNoMoreThan: 'Ovo polje zahteva ne više od {{count}} {{label}}.', - requiresTwoNumbers: 'Ovo polje zahteva dva broja.', - shorterThanMax: 'Ova vrednost mora biti kraća od maksimalne dužine od {{maxLength}} karaktera', - trueOrFalse: 'Ovo polje može biti samo tačno ili netačno', - validUploadID: 'Ovo polje ne sadrži validan ID prenosa.', - }, - version: { - autosavedSuccessfully: 'Automatsko čuvanje uspešno.', - draft: 'Nacrt', - draftSavedSuccessfully: 'Nacrt uspešno sačuvan.', - published: 'Objavljeno', - restoredSuccessfully: 'Uspešno vraćeno.', - status: 'Status', - }, -} diff --git a/packages/translations/src/_generatedFiles_/api/rs.js b/packages/translations/src/_generatedFiles_/api/rs.js deleted file mode 100644 index 54b2523769..0000000000 --- a/packages/translations/src/_generatedFiles_/api/rs.js +++ /dev/null @@ -1,95 +0,0 @@ -export default { - authentication: { - account: 'Налог', - apiKey: 'АПИ кључ', - enableAPIKey: 'Омогући API кључ', - loggedInChangePassword: - 'Да бисте променили лозинку, отворите свој <0>налог и промените лозинку.', - newAccountCreated: - 'Нови налог је креиран. Приступите налогу кликом на {{serverURL}}. Молимо Вас кликните на следећи линк или залепите адресу која се налази испод у претраживач да бисте потврдили адресу е-поште: {{verificationURL}}
Након што потврдите адресу е-поште можете се улоговати.', - 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: { - copy: 'Копирај', - createdAt: 'Креирано у', - deletedCountSuccessfully: 'Успешно избрисано {{count}} {{label}}.', - deletedSuccessfully: 'Успешно избрисано.', - email: 'Е-пошта', - notFound: 'Није пронађено', - row: 'Ред', - rows: 'Редови', - successfullyCreated: '{{label}} успешно креирано.', - successfullyDuplicated: '{{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: 'Ова вредност мора бити дужа од минималне дужине од {{минЛенгтх}} карактера', - notValidDate: '"{{value}}" није валидан датум.', - required: 'Ово поље је обавезно.', - requiresAtLeast: 'Ово поље захтева минимално {{count}} {{label}}.', - requiresNoMoreThan: 'Ово поље захтева не више од {{count}} {{label}}.', - requiresTwoNumbers: 'Ово поље захтева два броја.', - shorterThanMax: 'Ова вредност мора бити краћа од максималне дужине од {{maxLength}} карактера', - trueOrFalse: 'Ово поље може бити само тачно или нетачно', - validUploadID: 'Ово поље не садржи валидан ИД преноса.', - }, - version: { - autosavedSuccessfully: 'Аутоматско чување успешно.', - draft: 'Нацрт', - draftSavedSuccessfully: 'Нацрт успешно сачуван.', - published: 'Објављено', - restoredSuccessfully: 'Успешно враћено.', - status: 'Статус', - }, -} diff --git a/packages/translations/src/_generatedFiles_/api/ru.js b/packages/translations/src/_generatedFiles_/api/ru.js deleted file mode 100644 index 5c682ebf17..0000000000 --- a/packages/translations/src/_generatedFiles_/api/ru.js +++ /dev/null @@ -1,96 +0,0 @@ -export default { - authentication: { - account: 'Аккаунт', - apiKey: 'API ключ', - enableAPIKey: 'Активировать API ключ', - loggedInChangePassword: - 'Чтобы изменить пароль, зайдите в свой <0>аккаунт и измените пароль там.', - newAccountCreated: - 'Новый аккаунт был создан для доступа к {{serverURL}} Пожалуйста, кликните по следующей ссылке или вставьте в адресную строку браузера чтобы подтвердить email: {{verificationURL}}
После подтверждения вашего email, вы сможете успешно войти в систему.', - resetYourPassword: 'Сброс вашего пароля', - verified: 'Подтверждено', - verifyYourEmail: 'Подтвердить ваш email', - youAreReceivingResetPassword: - 'Вы получили это сообщение, потому что вы (или кто-то другой) запросили сброс пароля для вашей учетной записи. Пожалуйста, нажмите на следующую ссылку или вставьте ее в браузер, чтобы завершить процесс:', - youDidNotRequestPassword: - 'Если вы не запрашивали этого, пожалуйста, проигнорируйте это письмо, и ваш пароль останется неизменным.', - }, - error: { - deletingFile: 'Произошла ошибка при удалении файла.', - emailOrPasswordIncorrect: 'Указанный email или пароль неверен.', - 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: { - copy: 'Скопировать', - createdAt: 'Дата создания', - deletedCountSuccessfully: 'Удалено {{count}} {{label}} успешно.', - deletedSuccessfully: 'Удален успешно.', - email: 'Email', - notFound: 'Не найдено', - row: 'Строка', - rows: 'Строки', - successfullyCreated: '{{label}} успешно создан.', - successfullyDuplicated: '{{label}} успешно продублирован.', - thisLanguage: 'Русский', - updatedAt: 'Дата правки', - updatedCountSuccessfully: 'Обновлено {{count}} {{label}} успешно.', - updatedSuccessfully: 'Успешно Обновлено.', - user: 'пользователь', - users: 'пользователи', - value: 'Значение', - }, - upload: { - fileName: 'Имя файла', - fileSize: 'Размер файла', - height: 'Высота', - sizes: 'Размеры', - width: 'Ширина', - }, - validation: { - emailAddress: 'Пожалуйста, введите корректный адрес email.', - enterNumber: 'Пожалуйста, введите корректный номер.', - greaterThanMax: '{{value}} больше максимально допустимого значения {{label}} {{max}}.', - invalidInput: 'Это поле имеет недопустимое значение.', - invalidSelection: 'В этом поле выбран недопустимый вариант.', - invalidSelections: "'Это поле содержит следующие неправильные варианты:'", - lessThanMin: '{{value}} меньше минимально допустимого значения {{label}} {{min}}.', - longerThanMin: 'Это значение должно быть больше минимальной длины символов: {{minLength}}.', - notValidDate: '"{{value}}" это не действительная дата.', - required: 'Это обязательное поле.', - requiresAtLeast: 'Это поле требует не менее {{count}} {{label}}', - requiresNoMoreThan: 'Это поле требует не более {{count}} {{label}}', - requiresTwoNumbers: 'В этом поле требуется два числа.', - shorterThanMax: 'Это значение должно быть короче максимальной длины символов {{maxLength}}.', - trueOrFalse: 'Это поле может быть равно только true или false.', - validUploadID: "'Это поле не является действительным ID загрузки.'", - }, - version: { - autosavedSuccessfully: 'Автосохранение успешно.', - draft: 'Черновик', - draftSavedSuccessfully: 'Черновик успешно сохранен.', - published: 'Опубликовано', - restoredSuccessfully: 'Восстановлен успешно.', - status: 'Статус', - }, -} diff --git a/packages/translations/src/_generatedFiles_/api/sv.js b/packages/translations/src/_generatedFiles_/api/sv.js deleted file mode 100644 index 44159c8da3..0000000000 --- a/packages/translations/src/_generatedFiles_/api/sv.js +++ /dev/null @@ -1,95 +0,0 @@ -export default { - authentication: { - account: 'Konto', - apiKey: 'API Nyckel', - enableAPIKey: 'Aktivera API nyckel', - loggedInChangePassword: - 'För att ändra ditt lösenord, gå till ditt <0>konto och redigera ditt lösenord där.', - newAccountCreated: - 'Ett nytt konto har precis skapats som du kan komma åt {{serverURL}} Klicka på följande länk eller klistra in webbadressen nedan i din webbläsare för att verifiera din e-post: {{verificationURL}}
Efter att ha verifierat din e-post kommer du att kunna logga in framgångsrikt.', - resetYourPassword: 'Återställ Ditt Lösenord', - verified: 'Verifierad', - verifyYourEmail: 'Verifiera din epost', - youAreReceivingResetPassword: - 'Du får detta för att du (eller någon annan) har begärt återställning av lösenordet för ditt konto. Klicka på följande länk eller klistra in den i din webbläsare för att slutföra processen:', - youDidNotRequestPassword: - 'Om du inte begärde detta, ignorera detta e-postmeddelande och ditt lösenord kommer att förbli oförändrat.', - }, - error: { - deletingFile: 'Det gick inte att ta bort filen.', - emailOrPasswordIncorrect: 'E-postadressen eller lösenordet som angivits är felaktigt.', - followingFieldsInvalid_one: 'Följande fält är ogiltigt:', - followingFieldsInvalid_other: 'Följande fält är ogiltiga:', - noFilesUploaded: 'Inga filer laddades upp.', - notAllowedToPerformAction: 'Du får inte utföra denna åtgärd.', - problemUploadingFile: 'Det uppstod ett problem när filen laddades upp.', - unableToDeleteCount: 'Det gick inte att ta bort {{count}} av {{total}} {{label}}.', - unableToUpdateCount: 'Det gick inte att uppdatera {{count}} av {{total}} {{label}}.', - unauthorized: 'Obehörig, du måste vara inloggad för att göra denna begäran.', - userLocked: 'Den här användaren är låst på grund av för många misslyckade inloggningsförsök.', - valueMustBeUnique: 'Värdet måste vara unikt', - }, - fields: { - chooseBetweenCustomTextOrDocument: - 'Välj mellan att ange en anpassad text-URL eller länka till ett annat dokument.', - chooseDocumentToLink: 'Välj ett dokument att länka till', - customURL: 'Anpassad URL', - enterURL: 'Ange en URL', - internalLink: 'Intern länk', - linkType: 'Länktyp', - openInNewTab: 'Öppna i ny flik', - textToDisplay: 'Text att visa', - }, - general: { - copy: 'Kopiera', - createdAt: 'Skapad Vid', - deletedCountSuccessfully: 'Raderade {{count}} {{label}} framgångsrikt.', - deletedSuccessfully: 'Togs bort framgångsrikt.', - email: 'E-post', - notFound: 'Hittades inte', - row: 'Rad', - rows: 'Rader', - successfullyCreated: '{{label}} skapades framgångsrikt.', - successfullyDuplicated: '{{label}} duplicerades framgångsrikt.', - thisLanguage: 'Svenska', - updatedAt: 'Uppdaterades Vid', - updatedCountSuccessfully: 'Uppdaterade {{count}} {{label}} framgångsrikt.', - updatedSuccessfully: 'Uppdaterades framgångsrikt.', - user: 'Användare', - users: 'Användare', - value: 'Värde', - }, - upload: { - fileName: 'Filnamn', - fileSize: 'Filstorlek', - height: 'Höjd', - sizes: 'Storlekar', - width: 'Bredd', - }, - validation: { - emailAddress: 'Vänligen ange en giltig e-postadress.', - enterNumber: 'Vänligen skriv in ett giltigt nummer.', - greaterThanMax: '{{value}} är större än den maximalt tillåtna {{label}} av {{max}}.', - invalidInput: 'Det här fältet har en ogiltig inmatning.', - invalidSelection: 'Det här fältet har ett ogiltigt urval.', - invalidSelections: 'Det här fältet har följande ogiltiga val:', - lessThanMin: '{{value}} är mindre än den minst tillåtna {{label}} av {{min}}.', - longerThanMin: 'Detta värde måste vara längre än minimilängden på {{minLength}} tecken.', - notValidDate: '"{{value}}" är inte ett giltigt datum.', - required: 'Detta fält är obligatoriskt.', - requiresAtLeast: 'Detta fält kräver minst {{count}} {{label}}.', - requiresNoMoreThan: 'Detta fält kräver inte mer än {{count}} {{label}}.', - requiresTwoNumbers: 'Detta fält kräver två nummer.', - shorterThanMax: 'Detta värde måste vara kortare än maxlängden på {{maxLength}} tecken.', - trueOrFalse: 'Detta fält kan bara vara lika med sant eller falskt.', - validUploadID: 'Det här fältet är inte ett giltigt uppladdnings-ID', - }, - version: { - autosavedSuccessfully: 'Autosparades framgångsrikt.', - draft: 'Utkast', - draftSavedSuccessfully: 'Utkastet sparades framgångsrikt.', - published: 'Publicerad', - restoredSuccessfully: 'Återställd framgångsrikt.', - status: 'Status', - }, -} diff --git a/packages/translations/src/_generatedFiles_/api/th.js b/packages/translations/src/_generatedFiles_/api/th.js deleted file mode 100644 index 3c97a2944b..0000000000 --- a/packages/translations/src/_generatedFiles_/api/th.js +++ /dev/null @@ -1,93 +0,0 @@ -export default { - authentication: { - account: 'บัญชี', - apiKey: 'API Key', - enableAPIKey: 'เปิดใช้ API Key', - loggedInChangePassword: 'หากต้องการเปลี่ยนรหัสผ่าน กรุณาแก้ไขที่หน้า<0>บัญชีของคุณ', - newAccountCreated: - 'ระบบได้สร้างบัญชีผู้ใช้ให้คุณสำหรับเข้าใช้งาน {{serverURL}} เรียบร้อยแล้ว กรุณากดลิงก์ด้านล่างเพื่อยืนยันอีเมล หลังจากยืนยันอีเมลเสร็จสิ้น คุณจะสามารถเข้าใช้งานระบบได้', - 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: { - copy: 'คัดลอก', - createdAt: 'สร้างเมื่อ', - deletedCountSuccessfully: 'Deleted {{count}} {{label}} successfully.', - deletedSuccessfully: 'ลบสำเร็จ', - email: 'อีเมล', - notFound: 'ไม่พบ', - row: 'แถว', - rows: 'แถว', - successfullyCreated: 'สร้าง {{label}} สำเร็จ', - successfullyDuplicated: 'สำเนา {{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: 'จำเป็นต้องระบุค่า', - requiresAtLeast: 'ต้องมีอย่างน้อย {{count}} {{label}}', - requiresNoMoreThan: 'ห้ามมีเกิน {{count}} {{label}}', - requiresTwoNumbers: 'ต้องมีตัวเลข 2 ค่า', - shorterThanMax: 'ค่าต้องมีความยาวน้อยกว่า {{maxLength}} ตัวอักษร', - trueOrFalse: 'เป็นได้แค่ "ใช่" หรือ "ไม่ใช่"', - validUploadID: 'ไม่ใช่ ID ของการอัปโหลดที่ถูกต้อง', - }, - version: { - autosavedSuccessfully: 'บันทึกอัตโนมัติสำเร็จ', - draft: 'ฉบับร่าง', - draftSavedSuccessfully: 'บันทึกร่างสำเร็จ', - published: 'เผยแพร่แล้ว', - restoredSuccessfully: 'กู้คืนเวอร์ชันสำเร็จ', - status: 'สถานะ', - }, -} diff --git a/packages/translations/src/_generatedFiles_/api/tr.js b/packages/translations/src/_generatedFiles_/api/tr.js deleted file mode 100644 index d07b5a7c11..0000000000 --- a/packages/translations/src/_generatedFiles_/api/tr.js +++ /dev/null @@ -1,95 +0,0 @@ -export default { - authentication: { - account: 'Hesap', - apiKey: 'API Anahtarı', - enableAPIKey: 'Api anahtarını etkinleştir', - loggedInChangePassword: 'Parolanızı değiştirmek için <0>hesabınıza gidebilirsiniz.', - newAccountCreated: - '<0>{{serverURL}} sitesinde adınıza yeni bir hesap oluşturuldu. E-postanızı doğrulamak için bağlantıya tıklayabilirsiniz: <1>{{verificationURL}}
E-postanızı doğruladıktan sonra siteye hesap bilgilerinizle giriş yapabilirsiniz.', - resetYourPassword: 'Parolanızı Sıfırlayın', - verified: 'Doğrulandı', - verifyYourEmail: 'E-postanızı doğrulayın', - youAreReceivingResetPassword: - 'Siz veya bir başkası hesabınızın parolasını sıfırlama isteğinde bulunduğu için bu e-postayı alıyorsunuz. İşlemi tamamlamak için lütfen aşağıdaki bağlantıya tıklayın veya bağlantı adresini tarayıcınızın adres yazma bölümüne kopyalayın.', - youDidNotRequestPassword: - 'Eğer bu işlemi siz gerçekleştirmediyseniz bu e-postayı görmezden gelebilirsiniz.', - }, - error: { - deletingFile: 'Dosya silinirken bir hatayla karşılaşıldı.', - emailOrPasswordIncorrect: 'Girilen e-posta veya parola hatalı', - followingFieldsInvalid_one: 'Lütfen geçersiz alanı düzeltin:', - followingFieldsInvalid_other: 'Lütfen geçersiz alanları düzeltin:', - noFilesUploaded: 'Yüklenen dosya yok', - notAllowedToPerformAction: 'Bu işlemi gerçekleştirmek için izniniz yok.', - problemUploadingFile: 'Dosya yüklenirken bir sorun oluştu.', - unableToDeleteCount: '{{total}} {{label}} içinden {{count}} silinemiyor.', - unableToUpdateCount: '{{total}} {{label}} içinden {{count}} güncellenemiyor.', - unauthorized: 'Bu işlemi gerçekleştirmek için lütfen giriş yapın.', - userLocked: - 'Hesabınız hatalı giriş denemeleri yüzünden geçici olarak kilitlendi. Lütfen daha sonra tekrar deneyin.', - valueMustBeUnique: 'Değer benzersiz olmalıdır', - }, - fields: { - chooseBetweenCustomTextOrDocument: - 'Choose between entering a custom text URL or linking to another document.', - chooseDocumentToLink: 'Bağlantı verilecek bir döküman seçin.', - customURL: 'Özel URL', - enterURL: 'Bir URL girin', - internalLink: 'İç bağlantı', - linkType: 'Bağlantı türü', - openInNewTab: 'Yeni sekmede aç', - textToDisplay: 'Görüntülenecek metin', - }, - general: { - copy: 'Kopyala', - createdAt: 'Oluşturma tarihi', - deletedCountSuccessfully: '{{count}} {{label}} başarıyla silindi.', - deletedSuccessfully: 'Başarıyla silindi.', - email: 'E-posta', - notFound: 'Bulunamadı', - row: 'Satır', - rows: 'Satır', - successfullyCreated: '{{label}} başarıyla oluşturuldu.', - successfullyDuplicated: '{{label}} başarıyla kopyalandı.', - thisLanguage: 'Türkçe', - updatedAt: 'Güncellenme tarihi', - updatedCountSuccessfully: '{{count}} {{label}} başarıyla güncellendi.', - updatedSuccessfully: 'Başarıyla güncellendi.', - user: 'kullanıcı', - users: 'kullanıcı', - value: 'Değer', - }, - upload: { - fileName: 'Dosya adı', - fileSize: 'Dosya boyutu', - height: 'Yükseklik', - sizes: 'Boyutlar', - width: 'Genişlik', - }, - validation: { - emailAddress: 'Lütfen geçerli bir e-posta adresi girin.', - enterNumber: 'Lütfen geçerli bir sayı girin.', - greaterThanMax: '{{value}} izin verilen maksimum {{label}} değerinden daha büyük.', - invalidInput: 'Bu alanda geçersiz bir giriş mevcut.', - invalidSelection: 'Bu alanda geçersiz bir seçim mevcut.', - invalidSelections: "'Bu alan şu geçersiz seçimlere sahip:'", - lessThanMin: '{{value}} izin verilen minimum {{label}} değerinden daha küçük.', - longerThanMin: 'Bu değer minimum {{minLength}} karakterden uzun olmalıdır.', - notValidDate: '"{{value}}" geçerli bir tarih değil.', - required: 'Bu alan gereklidir.', - requiresAtLeast: 'Bu alan en az {{count}} adet {{label}} gerektirmektedir.', - requiresNoMoreThan: 'Bu alana {{count}} adetten fazla {{label}} girilemez.', - requiresTwoNumbers: 'Bu alana en az iki rakam girilmesi zorunludur.', - shorterThanMax: 'Bu alan {{maxLength}} karakterden daha kısa olmalıdır.', - trueOrFalse: 'Bu alan yalnızca doğru ve yanlış olabilir.', - validUploadID: "'Bu alan geçerli bir karşıya yükleme ID'sine sahip değil.'", - }, - version: { - autosavedSuccessfully: 'Otomatik kaydetme başarılı', - draft: 'Taslak', - draftSavedSuccessfully: 'Taslak başarıyla kaydedildi.', - published: 'Yayınlandı', - restoredSuccessfully: 'Geri getirme başarılı.', - status: 'Durum', - }, -} diff --git a/packages/translations/src/_generatedFiles_/api/ua.js b/packages/translations/src/_generatedFiles_/api/ua.js deleted file mode 100644 index 95f623f21b..0000000000 --- a/packages/translations/src/_generatedFiles_/api/ua.js +++ /dev/null @@ -1,95 +0,0 @@ -export default { - authentication: { - account: 'Обліковий запис', - apiKey: 'API ключ', - enableAPIKey: 'Активувати API ключ', - loggedInChangePassword: - 'Щоб змінити ваш пароль, перейдіть до <0>облікового запису і змініть ваш пароль там.', - newAccountCreated: - 'Новий обліковий запис було створено, щоб отримати доступ до {{serverURL}}, будь ласка, натисніть на наступне посилання, або вставте посилання в адресну строку вашого браузера, щоб підтвердити вашу пошту: {{verificationURL}}
Після Підтвердження вашої пошти, ви матимете змогу зайти в систему.', - resetYourPassword: 'Скинути ваш пароль', - verified: 'Підтверджено', - verifyYourEmail: 'Підтвердити пошту', - youAreReceivingResetPassword: - 'Ви отримали це повідомлення, бо ви (або хтось інший) створив запит на скидання пароля до вашого облікового запису. Будь ласка, натисніть на наступне посилання, або вставте посилання в адресний рядок вашого браузера, щоб завершити процес:', - youDidNotRequestPassword: - 'Якщо ви не сторювали запит на це, будь ласка, ігноруйте це повідомлення і пароль залишиться без змін', - }, - error: { - deletingFile: 'Виникла помилка під час видалення файлу', - emailOrPasswordIncorrect: 'Вказаний email або пароль не є вірними', - 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: { - copy: 'Скопіювати', - createdAt: 'Дата створення', - deletedCountSuccessfully: 'Успішно видалено {{count}} {{label}}.', - deletedSuccessfully: 'Успішно видалено.', - email: 'Email', - notFound: 'Не знайдено', - row: 'Рядок', - rows: 'Рядки', - successfullyCreated: '{{label}} успішно створено.', - successfullyDuplicated: '{{label}} успішно продубльовано.', - thisLanguage: 'Українська', - updatedAt: 'Змінено', - updatedCountSuccessfully: 'Успішно оновлено {{count}} {{label}}.', - updatedSuccessfully: 'Успішно відредаговано.', - user: 'Користувач', - users: 'Користувачі', - value: 'Значення', - }, - upload: { - fileName: 'Назва файлу', - fileSize: 'Розмір файлу', - height: 'Висота', - sizes: 'Розміри', - width: 'Ширина', - }, - validation: { - emailAddress: 'Будь ласка, введіть валідну email адресу.', - enterNumber: 'Будь ласка, введіть валідний номер.', - greaterThanMax: '{{value}} більше, ніж дозволено максимуму {{label}} в {{max}}.', - invalidInput: 'У цьому полі введено некоректне значення.', - invalidSelection: 'Це поле має некоректний вибір.', - invalidSelections: 'Це поле має наступні невірні варіанти вибору:', - lessThanMin: '{{value}} менше, ніж дозволено мінімуму {{label}} в {{min}}.', - longerThanMin: 'Це значення має бути більше, ніж мінімальна довжина {{minLength}} characters.', - notValidDate: '"{{value}}" - некоректна дата.', - required: "Це поле є обов'язковим.", - requiresAtLeast: 'Це поле потребує не менше {{count}} {{label}}.', - requiresNoMoreThan: 'Це поле потребує не більше {{count}} {{label}}.', - requiresTwoNumbers: 'У цьому полі потрібно ввести два числа.', - shorterThanMax: 'Це значення має бути меншим за максимальну довжину символів {{maxLength}}.', - trueOrFalse: 'Це поле може мати значення тільки true або false.', - validUploadID: 'Це поле не є дійсним ID завантаження.', - }, - version: { - autosavedSuccessfully: 'Автозбереження успішно виконано.', - draft: 'Чернетка', - draftSavedSuccessfully: 'Чернетка успішно збережена.', - published: 'Опубліковано', - restoredSuccessfully: 'Відновлено успішно.', - status: 'Статус', - }, -} diff --git a/packages/translations/src/_generatedFiles_/api/vi.js b/packages/translations/src/_generatedFiles_/api/vi.js deleted file mode 100644 index 8b475f659a..0000000000 --- a/packages/translations/src/_generatedFiles_/api/vi.js +++ /dev/null @@ -1,94 +0,0 @@ -export default { - authentication: { - account: 'Tài khoản', - apiKey: 'API Key', - enableAPIKey: 'Kích hoạt API Key', - loggedInChangePassword: 'Để đổi mật khẩu, hãy truy cập cài đặt <0>tài khoản.', - newAccountCreated: - 'Một tài khoản mới đã được tạo cho bạn. Tài khoản này được dùng để truy cập {{serverURL}} Hãy nhấp chuột hoặc sao chép đường dẫn sau vào trình duyệt của bạn để xác thực email: {{verificationURL}}
Sau khi email được xác thực, bạn sẽ có thể đăng nhập.', - resetYourPassword: 'Tạo lại mật khẩu', - verified: 'Đã xác thực', - verifyYourEmail: 'Tiến hành xác thực email', - youAreReceivingResetPassword: - 'Bạn nhận được tin nhắn này vì bạn (hoặc một người nào khác) đã gửi yêu cầu thay đổi mật khẩu tài khoản của bạn. Xin hãy nhấp chuột vào đường dẫn sau, hoặc sao chép vào trình duyệt của bạn để hoàn tất quá trình:', - youDidNotRequestPassword: - 'Nếu bạn không phải là người yêu cầu thay đổi mật khẩu, xin hãy bỏ qua tin nhắn này và mật khẩu của bạn sẽ được giữ nguyên.', - }, - error: { - deletingFile: 'Lỗi - Đã xảy ra vấn đề khi xóa tệp này.', - emailOrPasswordIncorrect: 'Lỗi - Email hoặc mật khẩu không chính xác.', - followingFieldsInvalid_one: 'Lỗi - Field sau không hợp lệ:', - followingFieldsInvalid_other: 'Lỗi - Những fields sau không hợp lệ:', - noFilesUploaded: 'Lỗi - File chưa được tải lên.', - notAllowedToPerformAction: 'Lỗi - Bạn không có quyền thực hiện lệnh này.', - problemUploadingFile: 'Lỗi - Đã xảy ra vấn để khi tải lên file sau.', - unableToDeleteCount: 'Không thể xóa {{count}} trong số {{total}} {{label}}.', - unableToUpdateCount: 'Không thể cập nhật {{count}} trên {{total}} {{label}}.', - unauthorized: 'Lỗi - Bạn cần phải đăng nhập trước khi gửi request sau.', - userLocked: 'Lỗi- Tài khoản đã bị khóa do đăng nhập thất bại nhiều lần.', - valueMustBeUnique: 'Lỗi - Giá trị không được trùng lặp.', - }, - fields: { - chooseBetweenCustomTextOrDocument: - 'Chọn giữa nhập URL văn bản tùy chỉnh hoặc liên kết đến tài liệu khác.', - chooseDocumentToLink: 'Chọn một tài liệu để liên kết đến', - customURL: 'URL tùy chỉnh', - enterURL: 'Nhập một URL', - internalLink: 'Liên kết nội bộ', - linkType: 'Loại liên kết', - openInNewTab: 'Mở trong trang mới', - textToDisplay: 'Văn bản để hiển thị', - }, - general: { - copy: 'Sao chép', - createdAt: 'Ngày tạo', - deletedCountSuccessfully: 'Đã xóa thành công {{count}} {{label}}.', - deletedSuccessfully: 'Đã xoá thành công.', - email: 'Email', - notFound: 'Không tìm thấy', - row: 'Hàng', - rows: 'Những hàng', - successfullyCreated: '{{label}} đã được tạo thành công.', - successfullyDuplicated: '{{label}} đã được sao chép thành công.', - thisLanguage: 'Vietnamese (Tiếng Việt)', - updatedAt: 'Ngày cập nhật', - updatedCountSuccessfully: 'Đã cập nhật thành công {{count}} {{label}}.', - updatedSuccessfully: 'Cập nhật thành công.', - user: 'Người dùng', - users: 'Người dùng', - value: 'Giá trị', - }, - upload: { - fileName: 'Tên file', - fileSize: 'Dung lượng file', - height: 'Chiều cao', - sizes: 'Các độ phân giải', - width: 'Chiều rộng', - }, - validation: { - emailAddress: 'Địa chỉ email không hợp lệ.', - enterNumber: 'Vui lòng nhập số.', - greaterThanMax: '{{value}} lớn hơn giá trị tối đa cho phép của {{label}} là {{max}}.', - invalidInput: 'Dữ liệu nhập vào không hợp lệ.', - invalidSelection: 'Lựa chọn ở field này không hợp lệ.', - invalidSelections: "'Field này có những lựa chọn không hợp lệ sau:'", - lessThanMin: '{{value}} nhỏ hơn giá trị tối thiểu cho phép của {{label}} là {{min}}.', - longerThanMin: 'Giá trị này cần có độ dài tối thiểu {{minLength}} ký tự.', - notValidDate: '"{{value}}" không phải là một ngày (date) hợp lệ.', - required: 'Field này cần được diền.', - requiresAtLeast: 'Field này cần tối thiểu {{count}} {{label}}.', - requiresNoMoreThan: 'Field này không thể vượt quá {{count}} {{label}}.', - requiresTwoNumbers: 'Field này cần tối thiểu 2 chữ số.', - shorterThanMax: 'Giá trị phải ngắn hơn hoặc bằng {{maxLength}} ký tự.', - trueOrFalse: 'Field này chỉ có thể chứa giá trị true hoặc false.', - validUploadID: "'Field này không chứa ID tải lên hợp lệ.'", - }, - version: { - autosavedSuccessfully: 'Đã tự động lưu thành công.', - draft: 'Bản nháp', - draftSavedSuccessfully: 'Bản nháp đã được lưu thành công.', - published: 'Đã xuất bản', - restoredSuccessfully: 'Đã khôi phục thành công.', - status: 'Trạng thái', - }, -} diff --git a/packages/translations/src/_generatedFiles_/api/zh-tw.js b/packages/translations/src/_generatedFiles_/api/zh-tw.js deleted file mode 100644 index 734613b768..0000000000 --- a/packages/translations/src/_generatedFiles_/api/zh-tw.js +++ /dev/null @@ -1,92 +0,0 @@ -export default { - authentication: { - account: '帳戶', - apiKey: 'API金鑰', - enableAPIKey: '啟用API金鑰', - loggedInChangePassword: '要更改您的密碼,請前往您的<0>帳戶頁面並在那裡編輯您的密碼。', - newAccountCreated: - '剛剛為您建立了一個可以存取 {{serverURL}} 的新帳戶。請點擊以下連結或在瀏覽器中貼上以下網址以驗證您的電子郵件:{{verificationURL}}
驗證您的電子郵件後,您將能夠成功登入。', - resetYourPassword: '重設您的密碼', - verified: '已驗證', - verifyYourEmail: '驗證您的電子郵件', - youAreReceivingResetPassword: - '您收到此郵件是因為您(或其他人)已請求重設您帳戶的密碼。請點擊以下連結,或將其貼上到您的瀏覽器中以完成該過程:', - youDidNotRequestPassword: '如果您沒有要求這樣做,請忽略這封郵件,您的密碼將保持不變。', - }, - error: { - deletingFile: '刪除文件時出現了錯誤。', - emailOrPasswordIncorrect: '提供的電子郵件或密碼不正確。', - followingFieldsInvalid_one: '下面的字串是無效的:', - followingFieldsInvalid_other: '以下字串是無效的:', - noFilesUploaded: '沒有上傳文件。', - notAllowedToPerformAction: '您不被允許執行此操作。', - problemUploadingFile: '上傳文件時出現了問題。', - unableToDeleteCount: '無法從 {{total}} 個中刪除 {{count}} 個 {{label}}。', - unableToUpdateCount: '無法從 {{total}} 個中更新 {{count}} 個 {{label}}。', - unauthorized: '未經授權,您必須登錄才能提出這個請求。', - userLocked: '該使用者由於有太多次失敗的登錄嘗試而被鎖定。', - valueMustBeUnique: '數值必須是唯一的', - }, - fields: { - chooseBetweenCustomTextOrDocument: '選擇自定義文件或連結到另一個文件。', - chooseDocumentToLink: '選擇要連結的文件', - customURL: '自定義連結', - enterURL: '輸入連結', - internalLink: '內部連結', - linkType: '連結類型', - openInNewTab: '在新標籤中打開', - textToDisplay: '要顯示的文字', - }, - general: { - copy: '複製', - createdAt: '建立於', - deletedCountSuccessfully: '已成功刪除 {{count}} 個 {{label}}。', - deletedSuccessfully: '已成功刪除。', - email: '電子郵件', - notFound: '未找到', - row: '行', - rows: '行', - successfullyCreated: '成功建立{{label}}', - successfullyDuplicated: '成功複製{{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: '該字串為必填項目。', - requiresAtLeast: '該字串至少需要 {{count}} 個 {{label}}。', - requiresNoMoreThan: '該字串要求不超過 {{count}} 個 {{label}。', - requiresTwoNumbers: '該字串需要兩個數字。', - shorterThanMax: '該值長度必須小於{{maxLength}}個字元', - trueOrFalse: '該字串只能等於是或否。', - validUploadID: '該字串不是有效的上傳ID。', - }, - version: { - autosavedSuccessfully: '自動儲存成功。', - draft: '草稿', - draftSavedSuccessfully: '草稿儲存成功。', - published: '已發佈', - restoredSuccessfully: '回復成功。', - status: '狀態', - }, -} diff --git a/packages/translations/src/_generatedFiles_/api/zh.js b/packages/translations/src/_generatedFiles_/api/zh.js deleted file mode 100644 index e04cdf853a..0000000000 --- a/packages/translations/src/_generatedFiles_/api/zh.js +++ /dev/null @@ -1,92 +0,0 @@ -export default { - authentication: { - account: '帐户', - apiKey: 'API密钥', - enableAPIKey: '启用API密钥', - loggedInChangePassword: '要更改您的密码,请到您的<0>帐户页面并在那里编辑您的密码。', - newAccountCreated: - '刚刚为您创建了一个可以访问 {{serverURL}} 的新帐户 请点击以下链接或在浏览器中粘贴以下网址,以验证您的电子邮件: {{verificationURL}}
验证您的电子邮件后,您将能够成功登录。', - resetYourPassword: '重置您的密码', - verified: '已验证', - verifyYourEmail: '验证您的电子邮件', - youAreReceivingResetPassword: - '您收到此邮件是因为您(或其他人)已请求重置您帐户的密码。请点击以下链接,或将其粘贴到您的浏览器中以完成该过程:', - youDidNotRequestPassword: '如果您没有要求这样做,请忽略这封邮件,您的密码将保持不变。', - }, - error: { - deletingFile: '删除文件时出现了错误。', - emailOrPasswordIncorrect: '提供的电子邮件或密码不正确。', - followingFieldsInvalid_one: '下面的字段是无效的:', - followingFieldsInvalid_other: '以下字段是无效的:', - noFilesUploaded: '没有上传文件。', - notAllowedToPerformAction: '您不被允许执行此操作。', - problemUploadingFile: '上传文件时出现了问题。', - unableToDeleteCount: '无法从 {{total}} {{label}} 中删除 {{count}}。', - unableToUpdateCount: '无法更新 {{count}} 个,共 {{total}} 个 {{label}}。', - unauthorized: '未经授权,您必须登录才能提出这个请求。', - userLocked: '该用户由于有太多次失败的登录尝试而被锁定。', - valueMustBeUnique: '值必须是唯一的', - }, - fields: { - chooseBetweenCustomTextOrDocument: '选择输入一个自定义的文本URL或链接到另一个文档。', - chooseDocumentToLink: '选择一个要链接的文档', - customURL: '自定义URL', - enterURL: '输入一个URL', - internalLink: '内部链接', - linkType: '链接类型', - openInNewTab: '在新标签中打开', - textToDisplay: '要显示的文本', - }, - general: { - copy: '复制', - createdAt: '创建于', - deletedCountSuccessfully: '已成功删除 {{count}} {{label}}。', - deletedSuccessfully: '已成功删除。', - email: '电子邮件', - notFound: '未找到', - row: '行', - rows: '行', - successfullyCreated: '成功创建{{label}}', - successfullyDuplicated: '成功复制{{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: '该字段为必填项目。', - requiresAtLeast: '该字段至少需要{{count}} {{label}}。', - requiresNoMoreThan: '该字段要求不超过{{count}} {{label}。', - requiresTwoNumbers: '该字段需要两个数字。', - shorterThanMax: '该值必须小于{{maxLength}}字符的最大长度', - trueOrFalse: '该字段只能等于真或伪。', - validUploadID: '该字段不是有效的上传ID。', - }, - version: { - autosavedSuccessfully: '自动保存成功。', - draft: '草稿', - draftSavedSuccessfully: '草稿成功保存。', - published: '已发布', - restoredSuccessfully: '恢复成功。', - status: '状态', - }, -} diff --git a/packages/translations/src/_generatedFiles_/client/ar.js b/packages/translations/src/_generatedFiles_/client/ar.js deleted file mode 100644 index cbc47102ac..0000000000 --- a/packages/translations/src/_generatedFiles_/client/ar.js +++ /dev/null @@ -1,288 +0,0 @@ -export default { - authentication: { - account: 'الحساب', - accountOfCurrentUser: 'حساب المستخدم الحالي', - alreadyActivated: 'تمّ التّفعيل بالفعل', - alreadyLoggedIn: 'تمّ تسجيل الدّخول بالفعل', - backToLogin: 'العودة لتسجيل الدخول', - beginCreateFirstUser: 'للبدء, قم بإنشاء المستخدم الأوّل.', - changePassword: 'تغيير كلمة المرور', - confirmGeneration: 'تأكيد التّوليد', - confirmPassword: 'تأكيد كلمة المرور', - createFirstUser: 'إنشاء المستخدم الأوّل', - emailNotValid: 'البريد الإلكتروني غير صالح', - emailSent: 'تمّ ارسال البريد الإلكتروني', - enableAPIKey: 'تفعيل مفتاح API', - failedToUnlock: 'فشل فتح القفل', - forceUnlock: 'إجبار فتح القفل', - forgotPassword: 'نسيت كلمة المرور', - forgotPasswordEmailInstructions: - 'يرجى إدخال البريد الالكتروني أدناه. ستتلقّى رسالة بريد إلكتروني تحتوي على إرشادات حول كيفيّة إعادة تعيين كلمة المرور الخاصّة بك.', - forgotPasswordQuestion: 'هل نسيت كلمة المرور؟', - generate: 'توليد', - generateNewAPIKey: 'توليد مفتاح API جديد', - logBackIn: 'تسجيل الدّخول من جديد', - logOut: 'تسجيل الخروج', - loggedOutInactivity: 'لقد تمّ تسجيل الخروج بسبب عدم النّشاط.', - loggedOutSuccessfully: 'لقد تمّ تسجيل خروجك بنجاح.', - login: 'تسجيل الدخول', - logout: 'تسجيل الخروج', - logoutUser: 'تسجيل خروج المستخدم', - newAPIKeyGenerated: 'تمّ توليد مفتاح API جديد.', - newPassword: 'كلمة مرور جديدة', - resetPassword: 'إعادة تعيين كلمة المرور', - stayLoggedIn: 'ابق متّصلًا', - successfullyUnlocked: 'تمّ فتح القفل بنجاح', - unableToVerify: 'غير قادر على التحقق من', - verified: 'تمّ التحقّق', - verifiedSuccessfully: 'تمّ التحقّق بنجاح', - verify: 'قم بالتّحقّق', - verifyUser: 'قم بالتّحقّق من المستخدم', - youAreInactive: - 'لم تكن نشطًا منذ فترة قصيرة وسيتمّ تسجيل خروجك قريبًا تلقائيًا من أجل أمنك. هل ترغب في البقاء مسجّلا؟', - }, - error: { - autosaving: 'حدثت مشكلة أثناء حفظ هذا المستند تلقائيًا.', - correctInvalidFields: 'يرجى تصحيح الحقول غير الصالحة.', - deletingTitle: - 'حدث خطأ أثناء حذف {{title}}. يرجى التحقق من الاتصال الخاص بك والمحاولة مرة أخرى.', - loadingDocument: 'حدثت مشكلة أثناء تحميل المستند برقم التعريف {{id}}.', - noMatchedField: 'لم يتمّ العثور على حقل مطابق لـ "{{label}}"', - notAllowedToAccessPage: 'لا يسمح لك الوصول إلى هذه الصّفحة.', - previewing: 'حدث خطأ في اثناء معاينة هذا المستند.', - unableToDeleteCount: 'يتعذّر حذف {{count}} من {{total}} {{label}}.', - unableToUpdateCount: 'يتعذّر تحديث {{count}} من {{total}} {{label}}.', - unauthorized: 'غير مصرّح لك ، عليك أن تقوم بتسجيل الدّخول لتتمكّن من تقديم هذا الطّلب.', - unknown: 'حدث خطأ غير معروف.', - unspecific: 'حدث خطأ.', - }, - fields: { - addLabel: 'أضف {{label}}', - addLink: 'أضف رابط', - addNew: 'أضف جديد', - addNewLabel: 'أضف {{label}} جديد', - addRelationship: 'أضف علاقة', - addUpload: 'أضف تحميل', - block: 'وحدة محتوى', - blockType: 'نوع وحدة المحتوى', - blocks: 'وحدات المحتوى', - chooseFromExisting: 'اختر من القائمة', - collapseAll: 'طيّ الكلّ', - editLink: 'عدّل الرّابط', - editRelationship: 'عدّل العلاقة', - itemsAndMore: '{{items}} و {{count}} أخرى', - labelRelationship: '{{label}} علاقة', - latitude: 'خطّ العرض', - linkedTo: 'تمّ الرّبط ل <0>{{label}}', - longitude: 'خطّ الطّول', - passwordsDoNotMatch: 'كلمة المرور غير مطابقة.', - removeRelationship: 'حذف العلاقة', - removeUpload: 'حذف المحتوى المرفوع', - saveChanges: 'حفظ التّغييرات', - searchForBlock: 'ابحث عن وحدة محتوى', - selectFieldsToEdit: 'حدّد الحقول اللتي تريد تعديلها', - showAll: 'إظهار الكلّ', - swapRelationship: 'تبديل العلاقة', - swapUpload: 'تبديل المحتوى المرفوع', - toggleBlock: 'Toggle block', - uploadNewLabel: 'رفع {{label}} جديد', - }, - general: { - aboutToDelete: 'أنت على وشك حذف {{label}} <1>{{title}}. هل أنت متأكّد؟', - aboutToDeleteCount_many: 'أنت على وشك حذف {{count}} {{label}}', - aboutToDeleteCount_one: 'أنت على وشك حذف {{count}} {{label}}', - aboutToDeleteCount_other: 'أنت على وشك حذف {{count}} {{label}}', - addBelow: 'أضف في الاسفل', - addFilter: 'أضف فلتر', - adminTheme: 'شكل واجهة المستخدم', - and: 'و', - applyChanges: 'طبق التغييرات', - ascending: 'تصاعدي', - automatic: 'تلقائي', - backToDashboard: 'العودة للوحة التّحكّم', - cancel: 'إلغاء', - changesNotSaved: 'لم يتمّ حفظ التّغييرات. إن غادرت الآن ، ستفقد تغييراتك.', - close: 'إغلاق', - collapse: 'طيّ', - collections: 'المجموعات', - columnToSort: 'التّرتيب حسب العامود', - columns: 'الأعمدة', - confirm: 'تأكيد', - confirmDeletion: 'تأكيد الحذف', - confirmDuplication: 'تأكيد التّكرار', - copied: 'تمّ النّسخ', - copy: 'نسخ', - create: 'إنشاء', - createNew: 'أنشاء جديد', - createNewLabel: 'إنشاء {{label}} جديد', - created: 'تمّ الإنشاء', - creating: 'يتمّ الإنشاء', - creatingNewLabel: 'جاري إنشاء {{label}} جديد', - dark: 'غامق', - dashboard: 'لوحة التّحكّم', - delete: 'حذف', - deletedCountSuccessfully: 'تمّ حذف {{count}} {{label}} بنجاح.', - deleting: 'يتمّ الحذف...', - descending: 'تنازلي', - deselectAllRows: 'إلغاء تحديد جميع الصفوف', - duplicate: 'استنساخ', - duplicateWithoutSaving: 'استنساخ بدون حفظ التغييرات', - edit: 'تعديل', - editLabel: 'تعديل {{label}}', - editing: 'جاري التعديل', - editingLabel_many: 'تعديل {{count}} {{label}}', - editingLabel_one: 'تعديل {{count}} {{label}}', - editingLabel_other: 'تعديل {{count}} {{label}}', - email: 'البريد الإلكتروني', - emailAddress: 'عنوان البريد الإلكتروني', - enterAValue: 'أدخل قيمة', - error: 'خطأ', - errors: 'أخطاء', - fallbackToDefaultLocale: 'الرجوع إلى اللغة الافتراضية', - filterWhere: 'تصفية {{label}} حيث', - filters: 'عوامل التصفية', - globals: 'عامة', - language: 'اللغة', - lastModified: 'آخر تعديل', - leaveAnyway: 'المغادرة على أي حال', - leaveWithoutSaving: 'المغادرة بدون حفظ', - light: 'فاتح', - livePreview: 'معاينة مباشرة', - loading: 'يتمّ التّحميل', - locale: 'اللّغة', - menu: 'قائمة', - moveDown: 'التّحريك إلى الأسفل', - moveUp: 'التّحريك إلى الأعلى', - noFiltersSet: 'لم يتم تعيين أي عوامل تصفية', - noLabel: '<لا {{label}}>', - noOptions: 'لا خيارات', - noResults: - 'لا يوجد {{label}}. إما أن لا {{label}} موجودة حتى الآن أو لا تتطابق مع عوامل التصفية التي حددتها أعلاه.', - noValue: 'لا يوجد قيمة', - none: 'لا شيء', - notFound: 'غير موجود', - nothingFound: 'لم يتم العثور على شيء', - of: 'من', - open: 'فتح', - or: 'أو', - order: 'التّرتيب', - pageNotFound: 'الصّفحة غير موجودة', - password: 'كلمة المرور', - payloadSettings: 'الإعدادات', - perPage: 'لكلّ صفحة: {{limit}}', - remove: 'إزالة', - reset: 'إعادة تعيين', - row: 'سطر', - rows: 'أسطُر', - save: 'حفظ', - saving: 'جاري الحفظ...', - searchBy: 'البحث عن طريق {{label}}', - selectAll: 'تحديد كل {{count}} {{label}}', - selectAllRows: 'حدد جميع الصفوف', - selectValue: 'اختيار قيمة', - selectedCount: 'تم تحديد {{count}} {{label}}', - showAllLabel: 'عرض كل {{label}}', - sorryNotFound: 'عذرًا - لا يوجد شيء يتوافق مع طلبك.', - sort: 'ترتيب', - sortByLabelDirection: 'رتّب حسب {{label}} {{direction}}', - stayOnThisPage: 'البقاء على هذه الصفحة', - submissionSuccessful: 'تمت الإرسال بنجاح.', - submit: 'إرسال', - successfullyCreated: '{{label}} تم إنشاؤها بنجاح.', - thisLanguage: 'العربية', - titleDeleted: 'تم حذف {{label}} "{{title}}" بنجاح.', - unauthorized: 'غير مصرح به', - unsavedChangesDuplicate: 'لديك تغييرات لم يتم حفظها. هل تريد الاستمرار في الاستنساخ؟', - untitled: 'بدون عنوان', - updatedAt: 'تم التحديث في', - updatedCountSuccessfully: 'تم تحديث {{count}} {{label}} بنجاح.', - updatedSuccessfully: 'تم التحديث بنجاح.', - updating: 'جار التحديث', - welcome: 'مرحبًا', - }, - operators: { - contains: 'يحتوي', - equals: 'يساوي', - exists: 'موجود', - isGreaterThan: 'أكبر من', - isGreaterThanOrEqualTo: 'أكبر أو يساوي', - isIn: 'موجود في', - isLessThan: 'أصغر من', - isLessThanOrEqualTo: 'أصغر أو يساوي', - isLike: 'هو مثل', - isNotEqualTo: 'لا يساوي', - isNotIn: 'غير موجود في', - near: 'قريب من', - }, - upload: { - crop: 'محصول', - cropToolDescription: 'اسحب الزوايا المحددة للمنطقة، رسم منطقة جديدة أو قم بضبط القيم أدناه.', - dragAndDrop: 'قم بسحب وإسقاط ملفّ', - editImage: 'تعديل الصورة', - focalPoint: 'نقطة التركيز', - focalPointDescription: 'اسحب النقطة المركزية مباشرة على المعاينة أو قم بضبط القيم أدناه.', - height: 'الطّول', - previewSizes: 'أحجام المعاينة', - selectCollectionToBrowse: 'حدّد مجموعة لاستعراضها', - selectFile: 'اختر ملفّ', - setCropArea: 'حدد منطقة القص', - setFocalPoint: 'حدد النقطة البؤرية', - sizesFor: 'أحجام لـ {{label}}', - width: 'العرض', - }, - validation: { - fieldHasNo: 'هذا الحقل ليس لديه {{label}}', - limitReached: 'تم الوصول إلى الحد الأقصى، يمكن إضافة {{max}} عناصر فقط.', - required: 'هذا الحقل مطلوب.', - requiresAtLeast: 'هذا الحقل يتطلب على الأقل {{count}} {{label}}.', - }, - version: { - aboutToPublishSelection: 'أنت على وشك نشر كلّ {{label}} في التّحديد. هل أنت متأكّد؟', - aboutToRestore: - 'أنت على وشك استرجاع هذا المستند {{label}} إلى الحالة التّي كان عليها في {{versionDate}}.', - aboutToRestoreGlobal: - 'أنت على وشك استرجاع الاعداد العامّ {{label}} إلى الحالة التي كان عليها في {{versionDate}}.', - aboutToRevertToPublished: 'أنت على وشك إعادة هذا المستند إلى حالته المنشورة. هل أنت متأكّد؟', - aboutToUnpublish: 'أنت على وشك إلغاء نشر هذا المستند. هل أنت متأكّد؟', - aboutToUnpublishSelection: 'أنت على وشك إلغاء نشر كلّ {{label}} في التّحديد. هل أنت متأكّد؟', - autosave: 'حفظ تلقائي', - autosavedSuccessfully: 'تمّ الحفظ التّلقائي بنجاح.', - changed: 'تمّ التّغيير', - compareVersion: 'مقارنة النّسخة مع:', - confirmPublish: 'تأكيد النّشر', - confirmRevertToSaved: 'تأكيد الرّجوع للنسخة المنشورة', - confirmUnpublish: 'تأكيد إلغاء النّشر', - confirmVersionRestoration: 'تأكيد إستعادة النّسخة', - draft: 'مسودّة', - draftSavedSuccessfully: 'تمّ حفظ المسودّة بنجاح.', - lastSavedAgo: 'تم الحفظ آخر مرة قبل {{distance}}', - noFurtherVersionsFound: 'لم يتمّ العثور على نسخات أخرى', - noRowsFound: 'لم يتمّ العثور على {{label}}', - preview: 'معاينة', - problemRestoringVersion: 'حدث خطأ في استعادة هذه النّسخة', - publish: 'نشر', - publishChanges: 'نشر التّغييرات', - published: 'تمّ النّشر', - publishing: 'نشر', - restoreThisVersion: 'استعادة هذه النّسخة', - restoredSuccessfully: 'تمّت الاستعادة بنحاح.', - restoring: 'تتمّ الاستعادة...', - revertToPublished: 'الرّجوع للنسخة المنشورة', - saveDraft: 'حفظ المسودّة', - selectLocales: 'حدّد اللّغات المراد عرضها', - selectVersionToCompare: 'حدّد نسخة للمقارنة', - showLocales: 'اظهر اللّغات:', - status: 'الحالة', - type: 'النّوع', - unpublish: 'الغاء النّشر', - unpublishing: 'يتمّ الغاء النّشر...', - version: 'النّسخة', - versionCreatedOn: 'تمّ ﻹنشاء النّسخة في {{version}}:', - versionID: 'مُعرّف النّسخة', - versions: 'النُّسَخ', - viewingVersion: 'يتمّ استعراض نسخة ل {{entityLabel}} {{documentTitle}}', - viewingVersionGlobal: 'يتمّ استعراض نسخة للاعداد العامّ {{entityLabel}}', - viewingVersions: 'يتمّ استعراض النُّسَخ ل {{entityLabel}} {{documentTitle}}', - viewingVersionsGlobal: 'يتمّ استعراض النُّسَخ للاعداد العامّ {{entityLabel}}', - }, -} diff --git a/packages/translations/src/_generatedFiles_/client/az.js b/packages/translations/src/_generatedFiles_/client/az.js deleted file mode 100644 index a8bd664318..0000000000 --- a/packages/translations/src/_generatedFiles_/client/az.js +++ /dev/null @@ -1,294 +0,0 @@ -export default { - authentication: { - account: 'Hesab', - accountOfCurrentUser: 'Cari istifadəçinin hesabı', - alreadyActivated: 'Artıq Aktivləşdirilib', - alreadyLoggedIn: 'Artıq daxil olunub', - backToLogin: 'Girişə qayıt', - beginCreateFirstUser: 'Başlamaq üçün ilk istifadəçinizi yaradın.', - changePassword: 'Parolu dəyişdir', - confirmGeneration: 'Generasiyani təsdiqlə', - confirmPassword: 'Şifrəni təsdiq et', - createFirstUser: 'İlk istifadəçini yaradın', - emailNotValid: 'Təqdim olunan e-poçt etibarlı deyil', - emailSent: 'E-poçt göndərildi', - enableAPIKey: 'API açarını aktivləşdir', - failedToUnlock: 'Kilidi açmaq alınmadı', - forceUnlock: 'Kilidi zorla aç', - forgotPassword: 'Şifrəni unutmusan', - forgotPasswordEmailInstructions: - 'Zəhmət olmasa, e-poçt ünvanınızı aşağıda daxil edin. Siz parolunuzu necə sıfırlamaq barədə təlimatları olan e-poçt mesajı alacaqsınız.', - forgotPasswordQuestion: 'Şifrəni unutmusan?', - generate: 'Yarad', - generateNewAPIKey: 'Yeni API açarı yarad', - logBackIn: 'Yenidən daxil ol', - logOut: 'Çıxış et', - loggedOutInactivity: 'Hərəkətsizlik səbəbindən sistemdən çıxmısınız.', - loggedOutSuccessfully: 'Siz uğurla çıxış etdiniz.', - login: 'Giriş', - logout: 'Çıxış', - logoutUser: 'Sistemdən çıxış', - newAPIKeyGenerated: 'Yeni API Açarı Yaradıldı.', - newPassword: 'Yeni şifrə', - resetPassword: 'Şifrəni sıfırla', - stayLoggedIn: 'Sistemdə qal', - successfullyUnlocked: 'Uğurla kilidi açıldı', - unableToVerify: 'Doğrulamaq mümkün deyil', - verified: 'Doğrulanmış', - verifiedSuccessfully: 'Uğurla doğrulandı', - verify: 'Doğrula', - verifyUser: 'İstifadəçini doğrula', - youAreInactive: - 'Siz bir müddətdir aktiv deyilsiniz və tezliklə öz təhlükəsizliyiniz üçün avtomatik olaraq sistemdən çıxacaqsınız. Daxil olmaq istərdinizmi?', - }, - error: { - autosaving: 'Bu sənədin avto yadda saxlanılması zamanı problem yarandı.', - correctInvalidFields: 'Zəhmət olmasa, yanlış sahələri düzəlt.', - deletingTitle: - '{{title}} silinərkən xəta baş verdi. Zəhmət olmasa, bağlantınızı yoxlayın və yenidən cəhd edin.', - loadingDocument: '{{id}} ID-li sənədin yüklənməsində problem baş verdi.', - noMatchedField: '"{{label}}" üçün uyğun sahə tapılmadı', - notAllowedToAccessPage: 'Bu səhifəyə girməyə icazəniz yoxdur.', - previewing: 'Bu sənədin ön baxışı 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.', - unknown: 'Naməlum bir xəta baş verdi.', - unspecific: 'Xəta baş verdi.', - }, - fields: { - addLabel: '{{label}} əlavə et', - addLink: 'Keçid əlavə et', - addNew: 'Yenisini əlavə et', - addNewLabel: 'Yeni {{label}} əlavə et', - addRelationship: 'Relationship əlavə et', - addUpload: 'Yükləmə əlavə et', - block: 'blok', - blockType: 'Blok Növü', - blocks: 'bloklar', - chooseFromExisting: 'Mövcuddan seçin', - collapseAll: 'Hamısını Bağla', - editLink: 'Keçidi redaktə et', - editRelationship: 'Relationship redaktə et', - itemsAndMore: '{{items}} və daha {{count}} nəfər', - labelRelationship: '{{label}} Relationship', - latitude: 'Enlik', - linkedTo: '<0>{{label}} ilə əlaqəli', - longitude: 'Uzunluq', - passwordsDoNotMatch: 'Şifrələr uyğun gəlmir.', - removeRelationship: 'Relationship sil', - removeUpload: 'Yükləməni sil', - saveChanges: 'Dəyişiklikləri saxla', - searchForBlock: 'Blok üçün axtarış', - selectFieldsToEdit: 'Redaktə ediləcək sahələri seçin', - showAll: 'Hamısını Göstər', - swapRelationship: 'Relationship dəyiş', - swapUpload: 'Yükləməni dəyiş', - toggleBlock: 'Bloku keç', - uploadNewLabel: 'Yeni {{label}} yüklə', - }, - general: { - aboutToDelete: 'Siz {{label}} <1>{{title}} silməyə hazırsınız. Eminsiniz?', - aboutToDeleteCount_many: 'Siz {{count}} {{label}} silməyə hazırsınız.', - aboutToDeleteCount_one: 'Siz {{count}} {{label}} silməyə hazırsınız.', - aboutToDeleteCount_other: 'Siz {{count}} {{label}} silməyə hazırsınız.', - addBelow: 'Aşağıya əlavə et', - addFilter: 'Filter əlavə et', - adminTheme: 'Admin Mövzusu', - and: 'Və', - applyChanges: 'Dəyişiklikləri Tətbiq Edin', - ascending: 'Artan', - automatic: 'Avtomatik', - backToDashboard: 'Panelə qayıdın', - cancel: 'Ləğv et', - changesNotSaved: - 'Dəyişiklikləriniz saxlanılmayıb. İndi çıxsanız, dəyişikliklərinizi itirəcəksiniz.', - close: 'Bağla', - collapse: 'Bağla', - collections: 'Kolleksiyalar', - columnToSort: 'Sıralamağa sütun', - columns: 'Sütunlar', - confirm: 'Təsdiqlə', - confirmDeletion: 'Silməni təsdiqlə', - confirmDuplication: 'Dublikasiyanı təsdiqlə', - copied: 'Kopyalandı', - copy: 'Kopyala', - create: 'Yarat', - createNew: 'Yeni yarat', - createNewLabel: 'Yeni {{label}} yarat', - created: 'Yaradıldı', - creating: 'Yaradılır', - creatingNewLabel: 'Yeni {{label}} yaradılır', - dark: 'Tünd', - dashboard: 'Panel', - delete: 'Sil', - deletedCountSuccessfully: '{{count}} {{label}} uğurla silindi.', - deleting: 'Silinir...', - descending: 'Azalan', - deselectAllRows: 'Bütün sıraları seçimi ləğv edin', - duplicate: 'Dublikat', - duplicateWithoutSaving: 'Dəyişiklikləri saxlamadan dublikatla', - edit: 'Redaktə et', - editLabel: '{{label}} redaktə et', - editing: 'Redaktə olunur', - editingLabel_many: '{{count}} {{label}} redaktə olunur', - editingLabel_one: '{{count}} {{label}} redaktə olunur', - editingLabel_other: '{{count}} {{label}} redaktə olunur', - email: 'Elektron poçt', - emailAddress: 'Elektron poçt ünvanı', - enterAValue: 'Bir dəyər daxil edin', - error: 'Xəta', - errors: 'Xətalar', - fallbackToDefaultLocale: 'Standart lokalə keçid', - filterWhere: '{{label}} filtrlə', - filters: 'Filtərlər', - globals: 'Qloballar', - language: 'Dil', - lastModified: 'Son dəyişdirildi', - leaveAnyway: 'Heç olmasa çıx', - leaveWithoutSaving: 'Saxlamadan çıx', - light: 'Açıq', - livePreview: 'Öncədən baxış', - loading: 'Yüklənir', - locale: 'Lokal', - menu: 'Menyu', - moveDown: 'Aşağı hərəkət et', - moveUp: 'Yuxarı hərəkət et', - noFiltersSet: 'Filter təyin edilməyib', - noLabel: '', - noOptions: 'Heç bir seçim yoxdur', - noResults: - 'Heç bir {{label}} tapılmadı. Ya hələ {{label}} yoxdur, ya da yuxarıda göstərdiyiniz filtrlərə uyğun gəlmir.', - noValue: 'Dəyər yoxdur', - none: 'Heç bir', - notFound: 'Tapılmadı', - nothingFound: 'Heç nə tapılmadı', - of: 'dən', - open: 'Aç', - or: 'Və ya', - order: 'Sıra', - pageNotFound: 'Səhifə tapılmadı', - password: 'Şifrə', - payloadSettings: 'Payload Parametrləri', - perPage: 'Hər səhifədə: {{limit}}', - remove: 'Sil', - reset: 'Yenidən başlat', - row: 'Sətir', - rows: 'Sətirlər', - save: 'Saxla', - saving: 'Saxlanılır...', - searchBy: '{{label}} ilə axtar', - selectAll: 'Bütün {{count}} {{label}} seç', - selectAllRows: 'Bütün sıraları seçin', - selectValue: 'Dəyər seçin', - selectedCount: '{{count}} {{label}} seçildi', - showAllLabel: 'Bütün {{label}}-ı göstər', - sorryNotFound: 'Üzr istəyirik - sizin tələbinizə uyğun heç nə yoxdur.', - sort: 'Sırala', - sortByLabelDirection: '{{label}} {{direction}} ilə sırala', - stayOnThisPage: 'Bu səhifədə qal', - submissionSuccessful: 'Təqdimat uğurlu oldu.', - submit: 'Təqdim et', - successfullyCreated: '{{label}} uğurla yaradıldı.', - thisLanguage: 'Azərbaycan dili', - titleDeleted: '{{label}} "{{title}}" uğurla silindi.', - unauthorized: 'İcazəsiz', - unsavedChangesDuplicate: - 'Saxlanılmamış dəyişiklikləriniz var. Dublikatla davam etmək istəyirsiniz?', - untitled: 'Başlıqsız', - updatedAt: 'Yeniləndiyi tarix', - updatedCountSuccessfully: '{{count}} {{label}} uğurla yeniləndi.', - updatedSuccessfully: 'Uğurla yeniləndi.', - updating: 'Yenilənir', - welcome: 'Xoş gəldiniz', - }, - operators: { - contains: 'daxilində', - equals: 'bərabərdir', - exists: 'mövcuddur', - isGreaterThan: 'dən böyük', - isGreaterThanOrEqualTo: 'böyük və ya bərabər', - isIn: 'daxildir', - isLessThan: 'dən kiçik', - isLessThanOrEqualTo: 'kiçik və ya bərabər', - isLike: 'kimi', - isNotEqualTo: 'bərabər deyil', - isNotIn: 'daxil deyil', - near: 'yaxın', - }, - upload: { - crop: 'Məhsul', - cropToolDescription: - 'Seçilmiş sahənin köşələrini sürükləyin, yeni bir sahə çəkin və ya aşağıdakı dəyərləri düzəltin.', - dragAndDrop: 'Faylı buraya sürükləyin və buraxın', - editImage: 'Şəkili Redaktə Et', - focalPoint: 'Mərkəzi Nöqtə', - focalPointDescription: - 'Fokus nöqtəsini birbaşa önizləməyə sürükləyin və ya aşağıdakı dəyərləri düzəltin.', - height: 'Hündürlük', - previewSizes: 'Öncədən baxış ölçüləri', - selectCollectionToBrowse: 'Gözdən keçirmək üçün bir Kolleksiya seçin', - selectFile: 'Fayl seçin', - setCropArea: 'Məhsul sahəsini təyin et', - setFocalPoint: 'Fokus nöqtəsi təyin et', - sizesFor: '{{label}} üçün ölçülər', - width: 'En', - }, - validation: { - fieldHasNo: 'Bu sahədə heç bir {{label}} yoxdur', - limitReached: 'Limitə çatdınız, yalnız {{max}} element əlavə edilə bilər.', - required: 'Bu sahə mütləq doldurulmalıdır.', - requiresAtLeast: 'Bu sahə ən azı {{count}} {{label}} tələb edir.', - }, - version: { - aboutToPublishSelection: 'Seçimdə olan bütün {{label}}-i dərc etməyə hazırsınız. Əminsiniz?', - aboutToRestore: - 'Bu {{label}} sənədini {{versionDate}} tarixindəki vəziyyətinə bərpa etmək üzrəsiniz.', - aboutToRestoreGlobal: - 'Qlobal {{label}}-i {{versionDate}} tarixindəki vəziyyətinə bərpa etmək üzrəsiniz.', - aboutToRevertToPublished: - 'Bu sənədin dəyişikliklərini dərc edilmiş vəziyyətinə qaytarmağa hazırsınız. Əminsiniz?', - aboutToUnpublish: 'Bu sənədi dərcdən çıxartmağa hazırsınız. Əminsiniz?', - aboutToUnpublishSelection: - 'Seçimdə olan bütün {{label}}-i dərcdən çıxartmağa hazırsınız. Əminsiniz?', - autosave: 'Avtomatik yadda saxlama', - autosavedSuccessfully: 'Uğurla avtomatik olaraq yadda saxlandı.', - changed: 'Dəyişdirildi', - compareVersion: 'Versiyanı müqayisə et:', - confirmPublish: 'Dərci təsdiq edin', - confirmRevertToSaved: 'Yadda saxlanana qayıtmağı təsdiq edin', - confirmUnpublish: 'Dərcdən çıxartmağı təsdiq edin', - confirmVersionRestoration: 'Versiyanın bərpasını təsdiq edin', - draft: 'Qaralama', - draftSavedSuccessfully: 'Qaralama uğurla yadda saxlandı.', - lastSavedAgo: '{{distance}} əvvəl son yadda saxlanıldı', - noFurtherVersionsFound: 'Başqa versiyalar tapılmadı', - noRowsFound: 'Heç bir {{label}} tapılmadı', - preview: 'Öncədən baxış', - problemRestoringVersion: 'Bu versiyanın bərpasında problem yaşandı', - publish: 'Dərc et', - publishChanges: 'Dəyişiklikləri dərc et', - published: 'Dərc edilmiş', - publishing: 'Nəşr', - restoreThisVersion: 'Bu versiyanı bərpa et', - restoredSuccessfully: 'Uğurla bərpa edildi.', - restoring: 'Bərpa olunur...', - revertToPublished: 'Dərc edilmişə qayıt', - saveDraft: 'Qaralamayı yadda saxla', - selectLocales: 'Göstərmək üçün lokalları seçin', - selectVersionToCompare: 'Müqayisə üçün bir versiya seçin', - showLocales: 'Lokalları göstər:', - status: 'Status', - type: 'Növ', - unpublish: 'Dərcdən çıxart', - unpublishing: 'Dərcdən çıxarılır...', - version: 'Versiya', - versionCreatedOn: '{{version}} tarixində yaradıldı:', - versionID: 'Versiyanın ID-si', - versions: 'Versiyalar', - viewingVersion: '{{entityLabel}} {{documentTitle}} üçün versiyanı göstərir', - viewingVersionGlobal: 'Qlobal {{entityLabel}} üçün versiyanı göstərir', - viewingVersions: '{{entityLabel}} {{documentTitle}} üçün versiyaları göstərir', - viewingVersionsGlobal: 'Qlobal {{entityLabel}} üçün versiyaları göstərir', - }, -} diff --git a/packages/translations/src/_generatedFiles_/client/bg.js b/packages/translations/src/_generatedFiles_/client/bg.js deleted file mode 100644 index 09a0318f46..0000000000 --- a/packages/translations/src/_generatedFiles_/client/bg.js +++ /dev/null @@ -1,291 +0,0 @@ -export default { - authentication: { - account: 'Профил', - accountOfCurrentUser: 'Профил на текущия потребител', - alreadyActivated: 'Вече активиран', - alreadyLoggedIn: 'Вече влязъл', - backToLogin: 'Обратно към влизане', - beginCreateFirstUser: 'За да започнеш, създай първия си потребител', - changePassword: 'Промяна на паролата', - confirmGeneration: 'Потвърди генерация', - confirmPassword: 'Потвърди парола', - createFirstUser: 'Създай първи потребител', - emailNotValid: 'Даденият имейл не е валиден', - emailSent: 'Имейлът е изпратен', - enableAPIKey: 'Активирай API ключ', - failedToUnlock: 'Неуспешно отключване', - forceUnlock: 'Принудително отключване', - forgotPassword: 'Забравена парола', - forgotPasswordEmailInstructions: - 'Моля, въведи имейла си по-долу. Ще получиш съобщение с насоки как да промениш паролата си.', - forgotPasswordQuestion: 'Забравена парола?', - generate: 'Генерирай', - generateNewAPIKey: 'Генерирай нов API ключ', - logBackIn: 'Влез обратно', - logOut: 'Изход', - loggedOutInactivity: 'Ти беше изкаран поради неактивност.', - loggedOutSuccessfully: 'Излезе успешно.', - login: 'Вход', - logout: 'Изход', - logoutUser: 'Изкарай потребител', - newAPIKeyGenerated: 'Нов API ключ генериран.', - newPassword: 'Нова парола', - resetPassword: 'Възстанови парола', - stayLoggedIn: 'Запомни ме', - successfullyUnlocked: 'Успешно отключен', - unableToVerify: 'Неуспешно потвърждение', - verified: 'Потвърден', - verifiedSuccessfully: 'Потвърден успешно', - verify: 'Потвърди', - verifyUser: 'Потвърди потребител', - youAreInactive: - 'Не си активен от известно време и ще бъдеш изкаран за собствената си сигурност. Би ли пожелал да останеш вписан?', - }, - error: { - autosaving: 'Имаше проблем в автоматичното запазване на този документ.', - correctInvalidFields: 'Моля, поправи некоректните полета.', - deletingTitle: - 'Имаше проблем при изтриването на {{title}}. Моля провери връзката си и опитай отново.', - loadingDocument: 'Имаше проблем при зареждането на документа с идентификатор {{id}}.', - noMatchedField: 'Поле не беше открито за "{{label}}"', - notAllowedToAccessPage: 'Нямаш право на достъп до тази страница.', - previewing: 'Имаше проблем при предварителното разглеждане на документа.', - unableToDeleteCount: 'Не беше възможно да се изтрият {{count}} от {{total}} {{label}}.', - unableToUpdateCount: 'Не беше възможно да се обновят {{count}} от {{total}} {{label}}.', - unauthorized: 'Неавторизиран, трябва да влезеш, за да извършиш тази заявка.', - unknown: 'Неизвестна грешка.', - unspecific: 'Грешка.', - }, - fields: { - addLabel: 'Добави {{label}}', - addLink: 'Добави нова връзка', - addNew: 'Добави нов', - addNewLabel: 'Добави нов {{label}}', - addRelationship: 'Добави отношение', - addUpload: 'Качи', - block: 'блок', - blockType: 'Тип блок', - blocks: 'блокове', - chooseFromExisting: 'Избери от съществуващите', - collapseAll: 'Свий всички', - editLink: 'Редактирай връзка', - editRelationship: 'Редактирай отношение', - itemsAndMore: '{{items}} и {{count}} повече', - labelRelationship: '{{label}} връзка', - latitude: 'Географска ширина', - linkedTo: 'Свързано с <0>{{label}}', - longitude: 'Географска дължина', - passwordsDoNotMatch: 'Паролите не са еднакви.', - removeRelationship: 'Премахни отношение', - removeUpload: 'Премахни качване', - saveChanges: 'Запази промените', - searchForBlock: 'Търси блок', - selectFieldsToEdit: 'Избери полета за редактиране', - showAll: 'Покажи всички', - swapRelationship: 'Смени отношение', - swapUpload: 'Смени качване', - toggleBlock: 'Превключи блок', - uploadNewLabel: 'Качи нов {{label}}', - }, - general: { - aboutToDelete: 'На път си да изтриеш {{label}} <1>{{title}}. Сигурен ли си?', - aboutToDeleteCount_many: 'На път си да изтриеш {{count}} {{label}}', - aboutToDeleteCount_one: 'На път си да изтриеш {{count}} {{label}}', - aboutToDeleteCount_other: 'На път си да изтриеш {{count}} {{label}}', - addBelow: 'Добави отдолу', - addFilter: 'Добави филтър', - adminTheme: 'Цветова тема', - and: 'И', - applyChanges: 'Приложи промените', - ascending: 'Възходящ', - automatic: 'Автоматична', - backToDashboard: 'Обратно към таблото', - cancel: 'Отмени', - changesNotSaved: 'Промените ти не са запазени. Ако напуснеш сега, ще ги загубиш.', - close: 'Затвори', - collapse: 'Свий', - collections: 'Колекции', - columnToSort: 'Колона за сортиране', - columns: 'Колони', - confirm: 'Потвърди', - confirmDeletion: 'Потвърди изтриване', - confirmDuplication: 'Потвърди дупликация', - copied: 'Копирано', - copy: 'Копирай', - create: 'Създай', - createNew: 'Създай нов', - createNewLabel: 'Създай нов {{label}}', - created: 'Създаден', - creating: 'Създава се', - creatingNewLabel: 'Създаване на нов {{label}}', - dark: 'Тъмна', - dashboard: 'Табло', - delete: 'Изтрий', - deletedCountSuccessfully: 'Изтрити {{count}} {{label}} успешно.', - deleting: 'Изтриване...', - descending: 'Низходящо', - deselectAllRows: 'Деселектирай всички редове', - duplicate: 'Дупликирай', - duplicateWithoutSaving: 'Дупликирай без да запазваш промените', - edit: 'Редактирай', - editLabel: 'Редактирай {{label}}', - editing: 'Редактиране', - editingLabel_many: 'Редактиране на {{count}} {{label}}', - editingLabel_one: 'Редактиране на {{count}} {{label}}', - editingLabel_other: 'Редактиране на {{count}} {{label}}', - email: 'Имейл', - emailAddress: 'Имейл адрес', - enterAValue: 'Въведи стойност', - error: 'Грешка', - errors: 'Грешки', - fallbackToDefaultLocale: 'Използвай локализация по подразбиране', - filterWhere: 'Филтрирай {{label}} където', - filters: 'Филтри', - globals: 'Глобални', - language: 'Език', - lastModified: 'Последно променено', - leaveAnyway: 'Напусни въпреки това', - leaveWithoutSaving: 'Напусни без да запазиш', - light: 'Светла', - livePreview: 'Предварителен преглед', - loading: 'Зарежда се', - locale: 'Локализация', - menu: 'Меню', - moveDown: 'Надолу', - moveUp: 'Нагоре', - noFiltersSet: 'Няма зададени филтри', - noLabel: '<Няма {{label}}>', - noOptions: 'Няма опции', - noResults: - '{{label}} не е открит. {{label}} не съществува или никой не отговаря на зададените филтри.', - noValue: 'Няма стойност', - none: 'Никакъв', - notFound: 'Няма открит', - nothingFound: 'Нищо не беше открито', - of: 'от', - open: 'Отвори', - or: 'Или', - order: 'Ред', - pageNotFound: 'Страницата не беше открита', - password: 'Парола', - payloadSettings: 'Настройки на Payload', - perPage: 'На страница: {{limit}}', - remove: 'Премахни', - reset: 'Нулиране', - row: 'ред', - rows: 'Редове', - save: 'Запази', - saving: 'Запазване...', - searchBy: 'Търси по {{label}}', - selectAll: 'Избери всички {{count}} {{label}}', - selectAllRows: 'Избери всички редове', - selectValue: 'Избери стойност', - selectedCount: '{{count}} {{label}} избрани', - showAllLabel: 'Покажи всички {{label}}', - sorryNotFound: 'Съжаляваме-няма нищо, което да отговаря на търсенето ти.', - sort: 'Сортирай', - sortByLabelDirection: 'Сортирай по {{label}} {{direction}}', - stayOnThisPage: 'Остани на тази страница', - submissionSuccessful: 'Успешно подаване.', - submit: 'Подай', - successfullyCreated: '{{label}} успешно създаден.', - thisLanguage: 'Български', - titleDeleted: '{{label}} "{{title}}" успешно изтрит.', - unauthorized: 'Неавторизиран', - unsavedChangesDuplicate: 'Имаш незапазени промени. Искаш ли да продължиш да дупликираш?', - untitled: 'Неозаглавен', - updatedAt: 'Обновен на', - updatedCountSuccessfully: 'Обновени {{count}} {{label}} успешно.', - updatedSuccessfully: 'Обновен успешно.', - updating: 'Обновява се', - welcome: 'Добре дошъл', - }, - operators: { - contains: 'съдържа', - equals: 'е равно на', - exists: 'съществува', - isGreaterThan: 'е по-голямо от', - isGreaterThanOrEqualTo: 'е по-голямо от или равно на', - isIn: 'е в', - isLessThan: 'е по-малко от', - isLessThanOrEqualTo: 'е по-малко от или равно на', - isLike: 'е като', - isNotEqualTo: 'не е равно на', - isNotIn: 'не е в', - near: 'близко', - }, - upload: { - crop: 'Изрязване', - cropToolDescription: - 'Плъзни ъглите на избраната област, избери нова област или коригирай стойностите по-долу.', - dragAndDrop: 'Дръпни и пусни файл', - editImage: 'Редактирай изображение', - focalPoint: 'Фокусна точка', - focalPointDescription: - 'Премести фокусната точка директно върху визуализацията или регулирай стойностите по-долу.', - height: 'Височина', - previewSizes: 'Преглед на размери', - selectCollectionToBrowse: 'Избери колекция, която да разгледаш', - selectFile: 'Избери файл', - setCropArea: 'Задай област за изрязване', - setFocalPoint: 'Задай фокусна точка', - sizesFor: 'Размери за {{label}}', - width: 'Ширина', - }, - validation: { - fieldHasNo: 'Това поле няма {{label}}', - limitReached: 'Достигнат е лимитът, могат да бъдат добавени само {{max}} елемента.', - required: 'Това поле е задължително.', - requiresAtLeast: 'Това поле изисква поне {{count}} {{label}}.', - }, - version: { - aboutToPublishSelection: 'На път си да публикуваш всички избрани {{label}}. Сигурен ли си?', - aboutToRestore: - 'На път си да възстановиш този {{label}} документ до състоянието му от {{versionDate}}.', - aboutToRestoreGlobal: - 'На път си да възстановиш глобалния докумнт {{label}} до състоянието му от {{versionDate}}.', - aboutToRevertToPublished: - 'На път си да възстановиш промените на този документ до публикуваното му състояние. Сигурен ли си?', - aboutToUnpublish: 'На път си да скриеш този документ. Сигурен ли си?', - aboutToUnpublishSelection: 'На път си да скриеш всички избрани {{label}}. Сигурен ли си?', - autosave: 'Автоматично запазване', - autosavedSuccessfully: 'Успешно автоматично запазване.', - changed: 'Променен', - compareVersion: 'Сравни версия с:', - confirmPublish: 'Потвърди публикуване', - confirmRevertToSaved: 'Потвърди възстановяване до запазен', - confirmUnpublish: 'Потвърди скриване', - confirmVersionRestoration: 'Потвърди възстановяване на версия', - draft: 'Чернова', - draftSavedSuccessfully: 'Чернова запазена успешно.', - lastSavedAgo: 'последно запазено преди {{distance}}', - noFurtherVersionsFound: 'Не са открити повече версии', - noRowsFound: 'Не е открит {{label}}', - preview: 'Предварителен преглед', - problemRestoringVersion: 'Имаше проблем при възстановяването на тази версия', - publish: 'Публикувай', - publishChanges: 'Публикувай промените', - published: 'Публикувано', - publishing: 'Публикуване', - restoreThisVersion: 'Възстанови тази версия', - restoredSuccessfully: 'Успешно възстановяване.', - restoring: 'Възстановяване...', - revertToPublished: 'Върни се до публикуваното', - saveDraft: 'Запази чернова', - selectLocales: 'Избери локализации за показване', - selectVersionToCompare: 'Избери версия за сравняване', - showLocales: 'Покажи преводи:', - status: 'Статус', - type: 'Тип', - unpublish: 'Скрий', - unpublishing: 'Скриване...', - version: 'Версия', - versionCreatedOn: '{{version}} създадена на:', - versionID: 'Идентификатор на версията', - versions: 'Версии', - viewingVersion: 'Гледане на версия за {{entityLabel}} {{documentTitle}}', - viewingVersionGlobal: 'Гледане на версия за глобалния документ {{entityLabel}}', - viewingVersions: 'Гледане на версии за {{entityLabel}} {{documentTitle}}', - viewingVersionsGlobal: 'Гледане на версии за глобалния документ {{entityLabel}}', - }, -} diff --git a/packages/translations/src/_generatedFiles_/client/cs.js b/packages/translations/src/_generatedFiles_/client/cs.js deleted file mode 100644 index 56801026e4..0000000000 --- a/packages/translations/src/_generatedFiles_/client/cs.js +++ /dev/null @@ -1,291 +0,0 @@ -export default { - authentication: { - account: 'Účet', - accountOfCurrentUser: 'Účet současného uživatele', - alreadyActivated: 'Již aktivováno', - alreadyLoggedIn: 'Již přihlášen', - backToLogin: 'Zpět na přihlášení', - beginCreateFirstUser: 'Začněte vytvořením svého prvního uživatele.', - changePassword: 'Změnit heslo', - confirmGeneration: 'Potvrdit generaci', - confirmPassword: 'Potvrdit heslo', - createFirstUser: 'Vytvořit prvního uživatele', - emailNotValid: 'Zadaný email není platný', - emailSent: 'Email odeslán', - enableAPIKey: 'Povolit klíč API', - failedToUnlock: 'Nepodařilo se odemknout', - forceUnlock: 'Vynutit odemčení', - forgotPassword: 'Zapomněli jste heslo?', - forgotPasswordEmailInstructions: - 'Zadejte svůj email níže. Obdržíte email s instrukcemi, jak resetovat vaše heslo.', - forgotPasswordQuestion: 'Zapomněli jste heslo?', - generate: 'Generovat', - generateNewAPIKey: 'Generovat nový klíč API', - logBackIn: 'Znovu se přihlásit', - logOut: 'Odhlásit se', - loggedOutInactivity: 'Byli jste odhlášeni z důvodu neaktivity.', - loggedOutSuccessfully: 'Byli jste úspěšně odhlášeni.', - login: 'Přihlásit se', - logout: 'Odhlásit se', - logoutUser: 'Odhlásit uživatele', - newAPIKeyGenerated: 'Byl vygenerován nový klíč API.', - newPassword: 'Nové heslo', - resetPassword: 'Resetovat heslo', - stayLoggedIn: 'Zůstat přihlášen', - successfullyUnlocked: 'Úspěšně odemčeno', - unableToVerify: 'Nepodařilo se ověřit', - verified: 'Ověřeno', - verifiedSuccessfully: 'Úspěšně ověřeno', - verify: 'Ověřit', - verifyUser: 'Ověřit uživatele', - youAreInactive: - 'Nějakou dobu jste nebyli aktivní a brzy budete automaticky odhlášeni z bezpečnostních důvodů. Chcete zůstat přihlášen?', - }, - error: { - autosaving: 'Při automatickém ukládání tohoto dokumentu došlo k chybě.', - correctInvalidFields: 'Opravte neplatná pole.', - deletingTitle: - 'Při mazání {{title}} došlo k chybě. Zkontrolujte své připojení a zkuste to znovu.', - loadingDocument: 'Při načítání dokumentu s ID {{id}} došlo k chybě.', - noMatchedField: 'Pro "{{label}}" nebylo nalezeno žádné odpovídající pole', - notAllowedToAccessPage: 'Nemáte povolení přistupovat k této stránce.', - previewing: 'Při náhledu tohoto dokumentu 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.', - unknown: 'Došlo k neznámé chybě.', - unspecific: 'Došlo k chybě.', - }, - fields: { - addLabel: 'Přidat {{label}}', - addLink: 'Přidat Odkaz', - addNew: 'Přidat nový', - addNewLabel: 'Přidat nový {{label}}', - addRelationship: 'Přidat vztah', - addUpload: 'Přidat nahrávání', - block: 'blok', - blockType: 'Typ bloku', - blocks: 'bloky', - chooseFromExisting: 'Vybrat z existujících', - collapseAll: 'Sbalit vše', - editLink: 'Upravit odkaz', - editRelationship: 'Upravit vztah', - itemsAndMore: '{{items}} a {{count}} dalších', - labelRelationship: 'Vztah {{label}}', - latitude: 'Zeměpisná šířka', - linkedTo: 'Odkaz na <0>{{label}}', - longitude: 'Zeměpisná délka', - passwordsDoNotMatch: 'Hesla se neshodují.', - removeRelationship: 'Odstranit vztah', - removeUpload: 'Odstranit nahrání', - saveChanges: 'Uložit změny', - searchForBlock: 'Hledat blok', - selectFieldsToEdit: 'Vyberte pole, která chcete upravit', - showAll: 'Zobrazit vše', - swapRelationship: 'Zaměnit vztah', - swapUpload: 'Vyměnit nahrání', - toggleBlock: 'Přepnout blok', - uploadNewLabel: 'Nahrát nový {{label}}', - }, - general: { - aboutToDelete: 'Chystáte se odstranit {{label}} <1>{{title}}. Jste si jisti?', - aboutToDeleteCount_many: 'Chystáte se smazat {{count}} {{label}}', - aboutToDeleteCount_one: 'Chystáte se smazat {{count}} {{label}}', - aboutToDeleteCount_other: 'Chystáte se smazat {{count}} {{label}}', - addBelow: 'Přidat pod', - addFilter: 'Přidat filtr', - adminTheme: 'Motiv administračního rozhraní', - and: 'A', - applyChanges: 'Použít změny', - ascending: 'Vzestupně', - automatic: 'Automatické', - backToDashboard: 'Zpět na nástěnku', - cancel: 'Zrušit', - changesNotSaved: 'Vaše změny nebyly uloženy. Pokud teď odejdete, ztratíte své změny.', - close: 'Zavřít', - collapse: 'Sbalit', - collections: 'Kolekce', - columnToSort: 'Sloupec k seřazení', - columns: 'Sloupce', - confirm: 'Potvrdit', - confirmDeletion: 'Potvrdit odstranění', - confirmDuplication: 'Potvrdit duplikaci', - copied: 'Zkopírováno', - copy: 'Kopírovat', - create: 'Vytvořit', - createNew: 'Vytvořit nové', - createNewLabel: 'Vytvořit nový {{label}}', - created: 'Vytvořeno', - creating: 'Vytváření', - creatingNewLabel: 'Vytváření nového {{label}}', - dark: 'Tmavé', - dashboard: 'Nástěnka', - delete: 'Odstranit', - deletedCountSuccessfully: 'Úspěšně smazáno {{count}} {{label}}.', - deleting: 'Odstraňování...', - descending: 'Sestupně', - deselectAllRows: 'Zrušte výběr všech řádků', - duplicate: 'Duplikovat', - duplicateWithoutSaving: 'Duplikovat bez uložení změn', - edit: 'Upravit', - editLabel: 'Upravit {{label}}', - editing: 'Úpravy', - editingLabel_many: 'Úprava {{count}} {{label}}', - editingLabel_one: 'Úprava {{count}} {{label}}', - editingLabel_other: 'Úprava {{count}} {{label}}', - email: 'E-mail', - emailAddress: 'E-mailová adresa', - enterAValue: 'Zadejte hodnotu', - error: 'Chyba', - errors: 'Chyby', - fallbackToDefaultLocale: 'Zpětné přepnutí do výchozího locale', - filterWhere: 'Filtrovat {{label}} kde', - filters: 'Filtry', - globals: 'Globální', - language: 'Jazyk', - lastModified: 'Naposledy změněno', - leaveAnyway: 'Přesto odejít', - leaveWithoutSaving: 'Odejít bez uložení', - light: 'Světlé', - livePreview: 'Náhled', - loading: 'Načítání', - locale: 'Místní verze', - menu: 'Jídelní lístek', - moveDown: 'Posunout dolů', - moveUp: 'Posunout nahoru', - noFiltersSet: 'Nenastaveny žádné filtry', - noLabel: '<Žádný {{label}}>', - noOptions: 'Žádné možnosti', - noResults: - 'Nebyly nalezeny žádné {{label}}. Buď ještě neexistují žádné {{label}}, nebo žádné nesplňují filtry, které jste zadali výše.', - noValue: 'Žádná hodnota', - none: 'Žádné', - notFound: 'Nenalezeno', - nothingFound: 'Nic nenalezeno', - of: 'z', - open: 'Otevřít', - or: 'Nebo', - order: 'Pořadí', - pageNotFound: 'Stránka nenalezena', - password: 'Heslo', - payloadSettings: 'Nastavení datového záběru', - perPage: 'Na stránku: {{limit}}', - remove: 'Odstranit', - reset: 'Resetovat', - row: 'Řádek', - rows: 'Řádky', - save: 'Uložit', - saving: 'Ukládání...', - searchBy: 'Vyhledat podle {{label}}', - selectAll: 'Vybrat vše {{count}} {{label}}', - selectAllRows: 'Vyberte všechny řádky', - selectValue: 'Vyberte hodnotu', - selectedCount: 'Vybráno {{count}} {{label}}', - showAllLabel: 'Zobrazit všechny {{label}}', - sorryNotFound: 'Je nám líto, ale neexistuje nic, co by odpovídalo vašemu požadavku.', - sort: 'Třídit', - sortByLabelDirection: 'Seřadit podle {{label}} {{direction}}', - stayOnThisPage: 'Zůstat na této stránce', - submissionSuccessful: 'Odeslání úspěšné.', - submit: 'Odeslat', - successfullyCreated: '{{label}} úspěšně vytvořeno.', - thisLanguage: 'Čeština', - titleDeleted: '{{label}} "{{title}}" úspěšně smazáno.', - unauthorized: 'Neoprávněný', - unsavedChangesDuplicate: 'Máte neuložené změny. Chtěli byste pokračovat v duplikování?', - untitled: 'Bez názvu', - updatedAt: 'Aktualizováno v', - updatedCountSuccessfully: 'Úspěšně aktualizováno {{count}} {{label}}.', - updatedSuccessfully: 'Úspěšně aktualizováno.', - updating: 'Aktualizace', - welcome: 'Vítejte', - }, - operators: { - contains: 'obsahuje', - equals: 'rovná se', - exists: 'existuje', - isGreaterThan: 'je větší než', - isGreaterThanOrEqualTo: 'je větší nebo rovno', - isIn: 'je v', - isLessThan: 'je menší než', - isLessThanOrEqualTo: 'je menší nebo rovno', - isLike: 'je jako', - isNotEqualTo: 'není rovno', - isNotIn: 'není in', - near: 'blízko', - }, - upload: { - crop: 'Plodina', - cropToolDescription: - 'Přetáhněte rohy vybrané oblasti, nakreslete novou oblast nebo upravte hodnoty níže.', - dragAndDrop: 'Přetáhněte soubor', - editImage: 'Upravit obrázek', - focalPoint: 'Středobod', - focalPointDescription: 'Přetáhněte bod zaměření přímo na náhled nebo upravte hodnoty níže.', - height: 'Výška', - previewSizes: 'Náhled velikostí', - selectCollectionToBrowse: 'Vyberte kolekci pro procházení', - selectFile: 'Vyberte soubor', - setCropArea: 'Nastavit oblast ořezu', - setFocalPoint: 'Nastavit ohnisko', - sizesFor: 'Velikosti pro {{label}}', - width: 'Šířka', - }, - validation: { - fieldHasNo: 'Toto pole nemá {{label}}', - limitReached: 'Dosáhnutý limit, mohou být přidány pouze {{max}} položky.', - required: 'Toto pole je povinné.', - requiresAtLeast: 'Toto pole vyžaduje alespoň {{count}} {{label}}.', - }, - version: { - aboutToPublishSelection: 'Chystáte se publikovat všechny {{label}} ve výběru. Jsi si jistá?', - aboutToRestore: - 'Chystáte se obnovit tento {{label}} dokument do stavu, v jakém byl {{versionDate}}.', - aboutToRestoreGlobal: - 'Chystáte se obnovit globální {{label}} do stavu, v jakém byl {{versionDate}}.', - aboutToRevertToPublished: - 'Chystáte se vrátit změny tohoto dokumentu do jeho publikovaného stavu. Jste si jisti?', - aboutToUnpublish: 'Chystáte se zrušit publikování tohoto dokumentu. Jste si jisti?', - aboutToUnpublishSelection: - 'Chystáte se zrušit publikování všech {{label}} ve výběru. Jsi si jistá?', - autosave: 'Automatické uložení', - autosavedSuccessfully: 'Úspěšně uloženo automaticky.', - changed: 'Změněno', - compareVersion: 'Porovnat verzi s:', - confirmPublish: 'Potvrďte publikování', - confirmRevertToSaved: 'Potvrdit vrácení k uloženému', - confirmUnpublish: 'Potvrdit zrušení publikování', - confirmVersionRestoration: 'Potvrdit obnovení verze', - draft: 'Koncept', - draftSavedSuccessfully: 'Koncept úspěšně uložen.', - lastSavedAgo: 'Naposledy uloženo před {{distance}}', - noFurtherVersionsFound: 'Nenalezeny další verze', - noRowsFound: 'Nenalezen {{label}}', - preview: 'Náhled', - problemRestoringVersion: 'Při obnovování této verze došlo k problému', - publish: 'Publikovat', - publishChanges: 'Publikovat změny', - published: 'Publikováno', - publishing: 'Publikování', - restoreThisVersion: 'Obnovit tuto verzi', - restoredSuccessfully: 'Úspěšně obnoveno.', - restoring: 'Obnovování...', - revertToPublished: 'Vrátit se k publikovanému', - saveDraft: 'Uložit koncept', - selectLocales: 'Vyberte místní verze pro zobrazení', - selectVersionToCompare: 'Vyberte verzi pro porovnání', - showLocales: 'Zobrazit místní verze:', - status: 'Stav', - type: 'Typ', - unpublish: 'Zrušit publikování', - unpublishing: 'Zrušuji publikování...', - version: 'Verze', - versionCreatedOn: '{{version}} vytvořena:', - versionID: 'ID verze', - versions: 'Verze', - viewingVersion: 'Zobrazuji verzi pro {{entityLabel}} {{documentTitle}}', - viewingVersionGlobal: 'Zobrazuji verzi pro globální {{entityLabel}}', - viewingVersions: 'Zobrazuji verze pro {{entityLabel}} {{documentTitle}}', - viewingVersionsGlobal: 'Zobrazuji verze pro globální {{entityLabel}}', - }, -} diff --git a/packages/translations/src/_generatedFiles_/client/de.js b/packages/translations/src/_generatedFiles_/client/de.js deleted file mode 100644 index 82dc1bd6c0..0000000000 --- a/packages/translations/src/_generatedFiles_/client/de.js +++ /dev/null @@ -1,294 +0,0 @@ -export default { - authentication: { - account: 'Konto', - accountOfCurrentUser: 'Aktuelles Benutzerkonto', - alreadyActivated: 'Bereits aktiviert', - alreadyLoggedIn: 'Bereits angemeldet', - backToLogin: 'Zurück zur Anmeldung', - beginCreateFirstUser: 'Erstelle deinen ersten Benutzer um zu beginnen', - changePassword: 'Passwort ändern', - confirmGeneration: 'Generierung bestätigen', - confirmPassword: 'Passwort bestätigen', - createFirstUser: 'Ersten Benutzer erstellen', - emailNotValid: 'Die angegebene E-Mail-Adresse ist ungültig', - emailSent: 'E-Mail verschickt', - enableAPIKey: 'API-Key aktivieren', - failedToUnlock: 'Konnte nicht entsperren', - forceUnlock: 'Entsperrung erzwingen', - forgotPassword: 'Passwort vergessen', - forgotPasswordEmailInstructions: - 'Bitte gib deine E-Mail-Adresse an. Du wirst eine E-Mail mit Instruktionen zum Zurücksetzen deines Passworts erhalten.', - forgotPasswordQuestion: 'Passwort vergessen?', - generate: 'Generieren', - generateNewAPIKey: 'Neuen API-Key generieren', - logBackIn: 'Wieder anmelden', - logOut: 'Abmelden', - loggedOutInactivity: 'Du wurdest aufgrund von Inaktivität abgemeldet.', - loggedOutSuccessfully: 'Du wurdest erfolgreich abgemeldet.', - login: 'Anmelden', - logout: 'Abmelden', - logoutUser: 'Benutzerabmeldung', - newAPIKeyGenerated: 'Neuer API-Key wurde generiert', - newPassword: 'Neues Passwort', - resetPassword: 'Passwort zurücksetzen', - stayLoggedIn: 'Angemeldet bleiben', - successfullyUnlocked: 'Erfolgreich entsperrt', - unableToVerify: 'Konnte nicht verifiziert werden', - verified: 'Verifiziert', - verifiedSuccessfully: 'Erfolgreich verifiziert', - verify: 'Verifizieren', - verifyUser: 'Benutzer verifizieren', - youAreInactive: - 'Du warst seit einiger Zeit inaktiv und wirst in kurzer Zeit zu deiner eigenen Sicherheit abgemeldet. Möchtest du angemeldet bleiben?', - }, - error: { - autosaving: 'Es gab ein Problem während der automatischen Speicherung für dieses Dokument', - correctInvalidFields: 'Bitte ungültige Felder korrigieren.', - deletingTitle: - 'Es gab ein Problem während der Löschung von {{title}}. Bitte überprüfe deine Verbindung und versuche es erneut.', - loadingDocument: 'Es gab ein Problem, das Dokument mit der ID {{id}} zu laden.', - noMatchedField: 'Kein übereinstimmendes Feld für "{{label}}" gefunden', - notAllowedToAccessPage: 'Du hast keine Berechtigung, auf diese Seite zuzugreifen.', - previewing: 'Es gab ein Problem beim Vorschauen dieses Dokuments.', - unableToDeleteCount: '{{count}} von {{total}} {{label}} konnte nicht gelöscht werden.', - unableToUpdateCount: '{{count}} von {{total}} {{label}} konnte nicht aktualisiert werden.', - unauthorized: 'Nicht autorisiert - du musst angemeldet sein, um diese Anfrage zu stellen.', - unknown: 'Ein unbekannter Fehler ist aufgetreten.', - unspecific: 'Ein Fehler ist aufgetreten.', - }, - fields: { - addLabel: '{{label}} hinzufügen', - addLink: 'Link Hinzufügen', - addNew: 'Neu erstellen', - addNewLabel: '{{label}} erstellen', - addRelationship: 'Verknüpfung Hinzufügen', - addUpload: 'Hochladen Hinzufügen', - block: 'Block', - blockType: 'Block-Typ', - blocks: 'Blöcke', - chooseFromExisting: 'Aus vorhandenen auswählen', - collapseAll: 'Alle einklappen', - editLink: 'Bearbeite Link', - editRelationship: 'Beziehung Hinzufügen', - itemsAndMore: '{{items}} und {{count}} mehr', - labelRelationship: '{{label}} Verknüpfung', - latitude: 'Breitengrad', - linkedTo: 'Verweist auf <0>{{label}}', - longitude: 'Längengrad', - passwordsDoNotMatch: 'Passwörter stimmen nicht überein.', - removeRelationship: 'Beziehung Entfernen', - removeUpload: 'Hochgeladene Datei Löschen', - saveChanges: 'Änderungen speichern', - searchForBlock: 'Nach Block suchen', - selectFieldsToEdit: 'Wählen Sie die zu bearbeitenden Felder aus', - showAll: 'Alle anzeigen', - swapRelationship: 'Beziehung Tauschen', - swapUpload: 'Datei Austauschen', - toggleBlock: 'Block umschalten', - uploadNewLabel: '{{label}} neu hochladen', - }, - general: { - aboutToDelete: 'Du bist dabei {{label}} <1>{{title}} zu löschen. Bist du dir sicher?', - aboutToDeleteCount_many: 'Sie sind dabei, {{count}} {{label}} zu löschen', - aboutToDeleteCount_one: 'Sie sind dabei, {{count}} {{label}} zu löschen', - aboutToDeleteCount_other: 'Sie sind dabei, {{count}} {{label}} zu löschen', - addBelow: 'Darunter hinzufügen', - addFilter: 'Filter hinzufügen', - adminTheme: 'Admin-Farbthema', - and: 'Und', - applyChanges: 'Änderungen anwenden', - ascending: 'Aufsteigend', - automatic: 'Automatisch', - backToDashboard: 'Zurück zur Übersicht', - cancel: 'Abbrechen', - changesNotSaved: - 'Deine Änderungen wurden nicht gespeichert. Wenn du diese Seite verlässt, gehen deine Änderungen verloren.', - close: 'Schließen', - collapse: 'Einklappen', - collections: 'Sammlungen', - columnToSort: 'Spalten zum Sortieren', - columns: 'Spalten', - confirm: 'Bestätigen', - confirmDeletion: 'Löschen bestätigen', - confirmDuplication: 'Duplizieren bestätigen', - copied: 'Kopiert', - copy: 'Kopieren', - create: 'Erstellen', - createNew: 'Neu Erstellen', - createNewLabel: '{{label}} neu erstellen', - created: 'Erstellt', - creating: 'Erstelle', - creatingNewLabel: 'Erstelle {{label}}', - dark: 'Dunkel', - dashboard: 'Übersicht', - delete: 'Löschen', - deletedCountSuccessfully: '{{count}} {{label}} erfolgreich gelöscht.', - deleting: 'Lösche...', - descending: 'Absteigend', - deselectAllRows: 'Alle Zeilen abwählen', - duplicate: 'Duplizieren', - duplicateWithoutSaving: 'Dupliziere ohne Änderungen zu speichern', - edit: 'Bearbeiten', - editLabel: '{{label}} bearbeiten', - editing: 'Bearbeite', - editingLabel_many: 'Bearbeiten von {{count}} {{label}}', - editingLabel_one: 'Bearbeiten von {{count}} {{label}}', - editingLabel_other: 'Bearbeiten von {{count}} {{label}}', - email: 'E-Mail', - emailAddress: 'E-Mail-Adresse', - enterAValue: 'Gib einen Wert ein', - error: 'Fehler', - errors: 'Fehler', - fallbackToDefaultLocale: 'Rückgriff auf das Standardgebietsschema', - filterWhere: 'Filter {{label}} wo', - filters: 'Filter', - globals: 'Globale Dokumente', - language: 'Sprache', - lastModified: 'Zuletzt geändert', - leaveAnyway: 'Trotzdem verlassen', - leaveWithoutSaving: 'Ohne speichern verlassen', - light: 'Hell', - livePreview: 'Vorschau', - loading: 'Lädt', - locale: 'Sprachumgebung', - menu: 'Menü', - moveDown: 'Nach unten bewegen', - moveUp: 'Nach oben bewegen', - noFiltersSet: 'Keine Filter gesetzt', - noLabel: '', - noOptions: 'Keine Optionen', - noResults: - 'Keine {{label}} gefunden. Entweder es existieren keine {{label}} oder es gibt keine Übereinstimmung zu den von dir verwendeten Filtern.', - noValue: 'Kein Wert', - none: 'Kein', - notFound: 'Nicht gefunden', - nothingFound: 'Keine Ergebnisse', - of: 'von', - open: 'Öffnen', - or: 'oder', - order: 'Reihenfolge', - pageNotFound: 'Seite nicht gefunden', - password: 'Passwort', - payloadSettings: 'Payload Einstellungen', - perPage: 'Pro Seite: {{limit}}', - remove: 'Entfernen', - reset: 'Zurücksetzen', - row: 'Zeile', - rows: 'Zeilen', - save: 'Speichern', - saving: 'Speichert...', - searchBy: 'Suche nach {{label}}', - selectAll: 'Alle auswählen {{count}} {{label}}', - selectAllRows: 'Wählen Sie alle Zeilen aus', - selectValue: 'Wert auswählen', - selectedCount: '{{count}} {{label}} ausgewählt', - showAllLabel: 'Zeige alle {{label}}', - sorryNotFound: 'Entschuldige, es entspricht nichts deiner Anfrage', - sort: 'Sortieren', - sortByLabelDirection: 'Sortieren nach {{label}} {{direction}}', - stayOnThisPage: 'Auf dieser Seite bleiben', - submissionSuccessful: 'Einrichung erfolgreich.', - submit: 'Senden', - successfullyCreated: '{{label}} erfolgreich erstellt.', - thisLanguage: 'Deutsch', - titleDeleted: '{{label}} {{title}} wurde erfolgreich gelöscht.', - unauthorized: 'Nicht autorisiert', - unsavedChangesDuplicate: - 'Du hast ungespeicherte Änderungen, möchtest du mit dem Duplizieren fortfahren?', - untitled: 'ohne Titel', - updatedAt: 'Aktualisiert am', - updatedCountSuccessfully: '{{count}} {{label}} erfolgreich aktualisiert.', - updatedSuccessfully: 'Erfolgreich aktualisiert.', - updating: 'Aktualisierung', - welcome: 'Willkommen', - }, - operators: { - contains: 'enthält', - equals: 'gleich', - exists: 'existiert', - isGreaterThan: 'ist größer als', - isGreaterThanOrEqualTo: 'ist größer oder gleich', - isIn: 'ist drin', - isLessThan: 'ist kleiner als', - isLessThanOrEqualTo: 'ist kleiner oder gleich', - isLike: 'ist wie', - isNotEqualTo: 'ist nicht gleich', - isNotIn: 'ist nicht drin', - near: 'in der Nähe', - }, - upload: { - crop: 'Zuschneiden', - cropToolDescription: - 'Ziehen Sie die Ecken des ausgewählten Bereichs, zeichnen Sie einen neuen Bereich oder passen Sie die Werte unten an.', - dragAndDrop: 'Ziehen Sie eine Datei per Drag-and-Drop', - editImage: 'Bild bearbeiten', - focalPoint: 'Brennpunkt', - focalPointDescription: - 'Ziehen Sie den Fokuspunkt direkt auf die Vorschau oder passen Sie die Werte unten an.', - height: 'Höhe', - previewSizes: 'Vorschaugrößen', - selectCollectionToBrowse: 'Wähle eine Sammlung zum Durchsuchen aus', - selectFile: 'Datei auswählen', - setCropArea: 'Bereich zum Zuschneiden festlegen', - setFocalPoint: 'Fokuspunkt setzen', - sizesFor: 'Größen für {{label}}', - width: 'Breite', - }, - validation: { - fieldHasNo: 'Dieses Feld hat kein {{label}}', - limitReached: 'Limit erreicht, es können nur {{max}} Elemente hinzugefügt werden.', - required: 'Pflichtfeld', - requiresAtLeast: 'Dieses Feld muss mindestens {{count}} {{label}} enthalten.', - }, - version: { - aboutToPublishSelection: - 'Sie sind dabei, alle {{label}} in der Auswahl zu veröffentlichen. Bist du dir sicher?', - aboutToRestore: 'Du bist dabei, {{label}} auf den Stand vom {{versionDate}} zurücksetzen.', - aboutToRestoreGlobal: - 'Du bist dabei, das Globale Dokument {{label}} auf den Stand vom {{versionDate}} zurückzusetzen.', - aboutToRevertToPublished: - 'Du bist dabei, dieses Dokument auf den Stand des ersten Veröffentlichungsdatums zurückzusetzen - Bist du sicher?', - aboutToUnpublish: 'Du bist dabei dieses Dokument auf Entwurf zu setzen - bist du dir sicher?', - aboutToUnpublishSelection: - 'Sie sind dabei, die Veröffentlichung aller {{label}} in der Auswahl aufzuheben. Bist du dir sicher?', - autosave: 'Automatische Speicherung', - autosavedSuccessfully: 'Erfolgreich automatisch gespeichert.', - changed: 'Geändert', - compareVersion: 'Vergleiche Version zu:', - confirmPublish: 'Veröffentlichung bestätigen', - confirmRevertToSaved: 'Zurücksetzen auf die letzte Speicherung bestätigen', - confirmUnpublish: 'Setzen auf Entwurf bestätigen', - confirmVersionRestoration: ' Wiederherstellung der Version bestätigen', - draft: 'Entwurf', - draftSavedSuccessfully: 'Entwurf erfolgreich gespeichert.', - lastSavedAgo: 'Zuletzt vor {{distance}} gespeichert', - noFurtherVersionsFound: 'Keine weiteren Versionen vorhanden', - noRowsFound: 'Kein {{label}} gefunden', - preview: 'Vorschau', - problemRestoringVersion: 'Es gab ein Problem bei der Wiederherstellung dieser Version', - publish: 'Veröffentlichen', - publishChanges: 'Änderungen veröffentlichen', - published: 'Veröffentlicht', - publishing: 'Veröffentlichung', - restoreThisVersion: 'Diese Version wiederherstellen', - restoredSuccessfully: 'Erfolgreich wiederhergestellt.', - restoring: 'wiederherstellen...', - revertToPublished: 'Auf Veröffentlicht zurücksetzen', - saveDraft: 'Entwurf speichern', - selectLocales: 'Wähle anzuzeigende Sprachumgebungen', - selectVersionToCompare: 'Wähle Version zum Vergleich', - showLocales: 'Sprachumgebungen anzeigen:', - status: 'Status', - type: 'Typ', - unpublish: 'Auf Entwurf setzen', - unpublishing: 'Setze auf Entwurf...', - version: 'Version', - versionCreatedOn: '{{version}} erstellt am:', - versionID: 'Version ID', - versions: 'Versionen', - viewingVersion: 'Betrachte Version für {{entityLabel}} {{documentTitle}}', - viewingVersionGlobal: '`Betrachte Version für das Globale Dokument {{entityLabel}}', - viewingVersions: 'Betrachte Versionen für {{entityLabel}} {{documentTitle}}', - viewingVersionsGlobal: '`Betrachte Versionen für das Globale Dokument {{entityLabel}}', - }, -} diff --git a/packages/translations/src/_generatedFiles_/client/en.js b/packages/translations/src/_generatedFiles_/client/en.js deleted file mode 100644 index c881762f05..0000000000 --- a/packages/translations/src/_generatedFiles_/client/en.js +++ /dev/null @@ -1,294 +0,0 @@ -export default { - authentication: { - account: 'Account', - accountOfCurrentUser: 'Account of current user', - alreadyActivated: 'Already Activated', - alreadyLoggedIn: 'Already logged in', - backToLogin: 'Back to login', - beginCreateFirstUser: 'To begin, create your first user.', - changePassword: 'Change Password', - confirmGeneration: 'Confirm Generation', - confirmPassword: 'Confirm Password', - createFirstUser: 'Create first user', - emailNotValid: 'The email provided is not valid', - emailSent: 'Email Sent', - enableAPIKey: 'Enable API Key', - failedToUnlock: 'Failed to unlock', - forceUnlock: 'Force Unlock', - forgotPassword: 'Forgot Password', - forgotPasswordEmailInstructions: - 'Please enter your email below. You will receive an email message with instructions on how to reset your password.', - forgotPasswordQuestion: 'Forgot password?', - generate: 'Generate', - generateNewAPIKey: 'Generate new API key', - logBackIn: 'Log back in', - logOut: 'Log out', - loggedOutInactivity: 'You have been logged out due to inactivity.', - loggedOutSuccessfully: 'You have been logged out successfully.', - login: 'Login', - logout: 'Logout', - logoutUser: 'Logout user', - newAPIKeyGenerated: 'New API Key Generated.', - newPassword: 'New Password', - resetPassword: 'Reset Password', - stayLoggedIn: 'Stay logged in', - successfullyUnlocked: 'Successfully unlocked', - unableToVerify: 'Unable to Verify', - verified: 'Verified', - verifiedSuccessfully: 'Verified Successfully', - verify: 'Verify', - verifyUser: 'Verify User', - youAreInactive: - "You haven't been active in a little while and will shortly be automatically logged out for your own security. Would you like to stay logged in?", - }, - error: { - autosaving: 'There was a problem while autosaving this document.', - correctInvalidFields: 'Please correct invalid fields.', - deletingTitle: - 'There was an error while deleting {{title}}. Please check your connection and try again.', - loadingDocument: 'There was a problem loading the document with ID of {{id}}.', - noMatchedField: 'No matched field found for "{{label}}"', - notAllowedToAccessPage: 'You are not allowed to access this page.', - previewing: 'There was a problem previewing this document.', - unableToDeleteCount: 'Unable to delete {{count}} out of {{total}} {{label}}.', - unableToUpdateCount: 'Unable to update {{count}} out of {{total}} {{label}}.', - unauthorized: 'Unauthorized, you must be logged in to make this request.', - unknown: 'An unknown error has occurred.', - unspecific: 'An error has occurred.', - }, - fields: { - addLabel: 'Add {{label}}', - addLink: 'Add Link', - addNew: 'Add new', - addNewLabel: 'Add new {{label}}', - addRelationship: 'Add Relationship', - addUpload: 'Add Upload', - block: 'block', - blockType: 'Block Type', - blocks: 'blocks', - chooseFromExisting: 'Choose from existing', - collapseAll: 'Collapse All', - editLink: 'Edit Link', - editRelationship: 'Edit Relationship', - itemsAndMore: '{{items}} and {{count}} more', - labelRelationship: '{{label}} Relationship', - latitude: 'Latitude', - linkedTo: 'Linked to <0>{{label}}', - longitude: 'Longitude', - passwordsDoNotMatch: 'Passwords do not match.', - removeRelationship: 'Remove Relationship', - removeUpload: 'Remove Upload', - saveChanges: 'Save changes', - searchForBlock: 'Search for a block', - selectFieldsToEdit: 'Select fields to edit', - showAll: 'Show All', - swapRelationship: 'Swap Relationship', - swapUpload: 'Swap Upload', - toggleBlock: 'Toggle block', - uploadNewLabel: 'Upload new {{label}}', - }, - general: { - aboutToDelete: 'You are about to delete the {{label}} <1>{{title}}. Are you sure?', - aboutToDeleteCount_many: 'You are about to delete {{count}} {{label}}', - aboutToDeleteCount_one: 'You are about to delete {{count}} {{label}}', - aboutToDeleteCount_other: 'You are about to delete {{count}} {{label}}', - addBelow: 'Add Below', - addFilter: 'Add Filter', - adminTheme: 'Admin Theme', - and: 'And', - applyChanges: 'Apply Changes', - ascending: 'Ascending', - automatic: 'Automatic', - backToDashboard: 'Back to Dashboard', - cancel: 'Cancel', - changesNotSaved: - 'Your changes have not been saved. If you leave now, you will lose your changes.', - close: 'Close', - collapse: 'Collapse', - collections: 'Collections', - columnToSort: 'Column to Sort', - columns: 'Columns', - confirm: 'Confirm', - confirmDeletion: 'Confirm deletion', - confirmDuplication: 'Confirm duplication', - copied: 'Copied', - copy: 'Copy', - create: 'Create', - createNew: 'Create New', - createNewLabel: 'Create new {{label}}', - created: 'Created', - creating: 'Creating', - creatingNewLabel: 'Creating new {{label}}', - dark: 'Dark', - dashboard: 'Dashboard', - delete: 'Delete', - deletedCountSuccessfully: 'Deleted {{count}} {{label}} successfully.', - deleting: 'Deleting...', - descending: 'Descending', - deselectAllRows: 'Deselect all rows', - duplicate: 'Duplicate', - duplicateWithoutSaving: 'Duplicate without saving changes', - edit: 'Edit', - editLabel: 'Edit {{label}}', - editing: 'Editing', - editingLabel_many: 'Editing {{count}} {{label}}', - editingLabel_one: 'Editing {{count}} {{label}}', - editingLabel_other: 'Editing {{count}} {{label}}', - email: 'Email', - emailAddress: 'Email Address', - enterAValue: 'Enter a value', - error: 'Error', - errors: 'Errors', - fallbackToDefaultLocale: 'Fallback to default locale', - filterWhere: 'Filter {{label}} where', - filters: 'Filters', - globals: 'Globals', - language: 'Language', - lastModified: 'Last Modified', - leaveAnyway: 'Leave anyway', - leaveWithoutSaving: 'Leave without saving', - light: 'Light', - livePreview: 'Live Preview', - loading: 'Loading', - locale: 'Locale', - menu: 'Menu', - moveDown: 'Move Down', - moveUp: 'Move Up', - noFiltersSet: 'No filters set', - noLabel: '', - noOptions: 'No options', - noResults: - "No {{label}} found. Either no {{label}} exist yet or none match the filters you've specified above.", - noValue: 'No value', - none: 'None', - notFound: 'Not Found', - nothingFound: 'Nothing found', - of: 'of', - open: 'Open', - or: 'Or', - order: 'Order', - pageNotFound: 'Page not found', - password: 'Password', - payloadSettings: 'Payload Settings', - perPage: 'Per Page: {{limit}}', - remove: 'Remove', - reset: 'Reset', - row: 'Row', - rows: 'Rows', - save: 'Save', - saving: 'Saving...', - searchBy: 'Search by {{label}}', - selectAll: 'Select all {{count}} {{label}}', - selectAllRows: 'Select all rows', - selectValue: 'Select a value', - selectedCount: '{{count}} {{label}} selected', - showAllLabel: 'Show all {{label}}', - sorryNotFound: 'Sorry—there is nothing to correspond with your request.', - sort: 'Sort', - sortByLabelDirection: 'Sort by {{label}} {{direction}}', - stayOnThisPage: 'Stay on this page', - submissionSuccessful: 'Submission Successful.', - submit: 'Submit', - successfullyCreated: '{{label}} successfully created.', - thisLanguage: 'English', - titleDeleted: '{{label}} "{{title}}" successfully deleted.', - unauthorized: 'Unauthorized', - unsavedChangesDuplicate: 'You have unsaved changes. Would you like to continue to duplicate?', - untitled: 'Untitled', - updatedAt: 'Updated At', - updatedCountSuccessfully: 'Updated {{count}} {{label}} successfully.', - updatedSuccessfully: 'Updated successfully.', - updating: 'Updating', - welcome: 'Welcome', - }, - operators: { - contains: 'contains', - equals: 'equals', - exists: 'exists', - isGreaterThan: 'is greater than', - isGreaterThanOrEqualTo: 'is greater than or equal to', - isIn: 'is in', - isLessThan: 'is less than', - isLessThanOrEqualTo: 'is less than or equal to', - isLike: 'is like', - isNotEqualTo: 'is not equal to', - isNotIn: 'is not in', - near: 'near', - }, - upload: { - crop: 'Crop', - cropToolDescription: - 'Drag the corners of the selected area, draw a new area or adjust the values below.', - dragAndDrop: 'Drag and drop a file', - editImage: 'Edit Image', - focalPoint: 'Focal Point', - focalPointDescription: - 'Drag the focal point directly on the preview or adjust the values below.', - height: 'Height', - previewSizes: 'Preview Sizes', - selectCollectionToBrowse: 'Select a Collection to Browse', - selectFile: 'Select a file', - setCropArea: 'Set crop area', - setFocalPoint: 'Set focal point', - sizesFor: 'Sizes for {{label}}', - width: 'Width', - }, - validation: { - fieldHasNo: 'This field has no {{label}}', - limitReached: 'Limit reached, only {{max}} items can be added.', - required: 'This field is required.', - requiresAtLeast: 'This field requires at least {{count}} {{label}}.', - }, - version: { - aboutToPublishSelection: - 'You are about to publish all {{label}} in the selection. Are you sure?', - aboutToRestore: - 'You are about to restore this {{label}} document to the state that it was in on {{versionDate}}.', - aboutToRestoreGlobal: - 'You are about to restore the global {{label}} to the state that it was in on {{versionDate}}.', - aboutToRevertToPublished: - "You are about to revert this document's changes to its published state. Are you sure?", - aboutToUnpublish: 'You are about to unpublish this document. Are you sure?', - aboutToUnpublishSelection: - 'You are about to unpublish all {{label}} in the selection. Are you sure?', - autosave: 'Autosave', - autosavedSuccessfully: 'Autosaved successfully.', - changed: 'Changed', - compareVersion: 'Compare version against:', - confirmPublish: 'Confirm publish', - confirmRevertToSaved: 'Confirm revert to saved', - confirmUnpublish: 'Confirm unpublish', - confirmVersionRestoration: 'Confirm version Restoration', - draft: 'Draft', - draftSavedSuccessfully: 'Draft saved successfully.', - lastSavedAgo: 'Last saved {{distance}} ago', - noFurtherVersionsFound: 'No further versions found', - noRowsFound: 'No {{label}} found', - preview: 'Preview', - problemRestoringVersion: 'There was a problem restoring this version', - publish: 'Publish', - publishChanges: 'Publish changes', - published: 'Published', - publishing: 'Publishing', - restoreThisVersion: 'Restore this version', - restoredSuccessfully: 'Restored Successfully.', - restoring: 'Restoring...', - revertToPublished: 'Revert to published', - saveDraft: 'Save Draft', - selectLocales: 'Select locales to display', - selectVersionToCompare: 'Select a version to compare', - showLocales: 'Show locales:', - status: 'Status', - type: 'Type', - unpublish: 'Unpublish', - unpublishing: 'Unpublishing...', - version: 'Version', - versionCreatedOn: '{{version}} created on:', - versionID: 'Version ID', - versions: 'Versions', - viewingVersion: 'Viewing version for the {{entityLabel}} {{documentTitle}}', - viewingVersionGlobal: 'Viewing version for the global {{entityLabel}}', - viewingVersions: 'Viewing versions for the {{entityLabel}} {{documentTitle}}', - viewingVersionsGlobal: 'Viewing versions for the global {{entityLabel}}', - }, -} diff --git a/packages/translations/src/_generatedFiles_/client/es.js b/packages/translations/src/_generatedFiles_/client/es.js deleted file mode 100644 index 35988b659b..0000000000 --- a/packages/translations/src/_generatedFiles_/client/es.js +++ /dev/null @@ -1,294 +0,0 @@ -export default { - authentication: { - account: 'Cuenta', - accountOfCurrentUser: 'Cuenta del usuario actual', - alreadyActivated: 'Ya Activado', - alreadyLoggedIn: 'Sesión iniciada', - backToLogin: 'Regresar al inicio de sesión', - beginCreateFirstUser: 'Para empezar, crea tu primer usuario.', - changePassword: 'Cambiar contraseña', - confirmGeneration: 'Confirmar Generación', - confirmPassword: 'Confirmar Contraseña', - createFirstUser: 'Crear al primer usuario', - emailNotValid: 'El correo proporcionado es inválido', - emailSent: 'Correo Enviado', - enableAPIKey: 'Habilitar Clave API', - failedToUnlock: 'Desbloqueo Fallido', - forceUnlock: 'Forzar Desbloqueo', - forgotPassword: 'Olvidé mi contraseña', - forgotPasswordEmailInstructions: - 'Por favor introduce tu correo electrónico. Recibirás un mensaje con las instrucciones para restablecer tu contraseña.', - forgotPasswordQuestion: '¿Olvidaste tu contraseña?', - generate: 'Generar', - generateNewAPIKey: 'Generar Nueva Clave de API', - logBackIn: 'Volver a iniciar sesión', - logOut: 'Cerrar sesión', - loggedOutInactivity: 'Tú sesión se cerró debido a inactividad.', - loggedOutSuccessfully: 'Tú sesión se cerró correctamente.', - login: 'Iniciar sesión', - logout: 'Cerrar sesión', - logoutUser: 'Cerrar sesión de usuario', - newAPIKeyGenerated: 'Nueva Clave de API Generada.', - newPassword: 'Nueva Contraseña', - resetPassword: 'Restablecer Contraseña', - stayLoggedIn: 'Mantener sesión abierta', - successfullyUnlocked: 'Desbloqueado correctamente', - unableToVerify: 'No se pudo Verificar', - verified: 'Verificado', - verifiedSuccessfully: 'Verificación Correcta', - verify: 'Verificar', - verifyUser: 'Verificar Usuario', - youAreInactive: - 'Has estado inactivo por un tiempo y por tu seguridad se cerrará tu sesión automáticamente. ¿Deseas mantener tu sesión activa?', - }, - error: { - autosaving: 'Ocurrió un problema al autoguardar este documento.', - correctInvalidFields: 'Por favor corrige los campos inválidos.', - deletingTitle: - 'Ocurrió un error al eliminar {{title}}. Por favor revisa tu conexión y vuelve a intentarlo.', - loadingDocument: 'Ocurrió un problema al cargar el documento con la ID {{id}}.', - noMatchedField: 'No se encontró un campo para "{{label}}"', - notAllowedToAccessPage: 'No tienes permiso para acceder a esta página.', - previewing: 'Ocurrió un problema al previsualizar este documento.', - 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.', - unknown: 'Ocurrió un error desconocido.', - unspecific: 'Ocurrió un error.', - }, - fields: { - addLabel: 'Añadir {{label}}', - addLink: 'Añadir Enlace', - addNew: 'Añadir nuevo', - addNewLabel: 'Añadir {{label}}', - addRelationship: 'Añadir Relación', - addUpload: 'Añadir Carga', - block: 'bloque', - blockType: 'Tipo de bloque', - blocks: 'bloques', - chooseFromExisting: 'Elegir existente', - collapseAll: 'Colapsar todo', - editLink: 'Editar Enlace', - editRelationship: 'Editar Relación', - itemsAndMore: '{{items}} y {{count}} más', - labelRelationship: 'Relación de {{label}}', - latitude: 'Latitud', - linkedTo: 'Enlazado a <0>{{label}}', - longitude: 'Longitud', - passwordsDoNotMatch: 'Las contraseñas no coinciden.', - removeRelationship: 'Eliminar relación', - removeUpload: 'Quitar Carga', - saveChanges: 'Guardar cambios', - searchForBlock: 'Buscar bloque', - selectFieldsToEdit: 'Seleccionar campos para editar', - showAll: 'Mostrar Todo', - swapRelationship: 'Cambiar Relación', - swapUpload: 'Cambiar carga', - toggleBlock: 'Alternar bloque', - uploadNewLabel: 'Subir nuevo {{label}}', - }, - general: { - aboutToDelete: 'Estás por eliminar el {{label}} <1>{{title}}. ¿Estás seguro?', - aboutToDeleteCount_many: 'Está a punto de eliminar {{count}} {{label}}', - aboutToDeleteCount_one: 'Está a punto de eliminar {{count}} {{label}}', - aboutToDeleteCount_other: 'Está a punto de eliminar {{count}} {{label}}', - addBelow: 'Agrega abajo', - addFilter: 'Añadir filtro', - adminTheme: 'Tema del admin', - and: 'Y', - applyChanges: 'Aplicar Cambios', - ascending: 'Ascendente', - automatic: 'Automático', - backToDashboard: 'Volver al Tablero', - cancel: 'Cancelar', - changesNotSaved: - 'Tus cambios no han sido guardados. Si te sales ahora, se perderán tus cambios.', - close: 'Cerrar', - collapse: 'Colapsar', - collections: 'Colecciones', - columnToSort: 'Columna de ordenado', - columns: 'Columnas', - confirm: 'Confirmar', - confirmDeletion: 'Confirmar eliminación', - confirmDuplication: 'Confirmar duplicado', - copied: 'Copiado', - copy: 'Copiar', - create: 'Crear', - createNew: 'Crear nuevo', - createNewLabel: 'Crear nuevo {{label}}', - created: 'Creado', - creating: 'Creando', - creatingNewLabel: 'Creando nuevo {{label}}', - dark: 'Oscuro', - dashboard: 'Tablero', - delete: 'Eliminar', - deletedCountSuccessfully: 'Se eliminó {{count}} {{label}} con éxito.', - deleting: 'Eliminando...', - descending: 'Descendente', - deselectAllRows: 'Deselecciona todas las filas', - duplicate: 'Duplicar', - duplicateWithoutSaving: 'Duplicar sin guardar cambios', - edit: 'Editar', - editLabel: 'Editar {{label}}', - editing: 'Editando', - editingLabel_many: 'Edición de {{count}} {{label}}', - editingLabel_one: 'Editando {{count}} {{label}}', - editingLabel_other: 'Edición de {{count}} {{label}}', - email: 'Correo electrónico', - emailAddress: 'Dirección de Correo Electrónico', - enterAValue: 'Introduce un valor', - error: 'Error', - errors: 'Errores', - fallbackToDefaultLocale: 'Volver a la configuración regional por defecto', - filterWhere: 'Filtrar {{label}} donde', - filters: 'Filtros', - globals: 'Globales', - language: 'Idioma', - lastModified: 'Última modificación', - leaveAnyway: 'Salir de todos modos', - leaveWithoutSaving: 'Salir sin guardar', - light: 'Claro', - livePreview: 'Previsualizar', - loading: 'Cargando', - locale: 'Regional', - menu: 'Menú', - moveDown: 'Mover abajo', - moveUp: 'Mover arriba', - noFiltersSet: 'No hay filtros establecidos', - noLabel: '', - noOptions: 'Sin opciones', - noResults: - 'No encontramos {{label}}. Puede que no existan {{label}} todavía o no hay coincidencias con los filtros introducidos arriba.', - noValue: 'Sin valor', - none: 'Ninguna', - notFound: 'No encontrado', - nothingFound: 'No se encontró nada', - of: 'de', - open: 'Abrir', - or: 'O', - order: 'Orden', - pageNotFound: 'Página no encontrada', - password: 'Contraseña', - payloadSettings: 'Configuración de la carga', - perPage: 'Por página: {{limit}}', - remove: 'Remover', - reset: 'Reiniciar', - row: 'Fila', - rows: 'Filas', - save: 'Guardar', - saving: 'Guardando...', - searchBy: 'Buscar por {{label}}', - selectAll: 'Seleccionar todo {{count}} {{label}}', - selectAllRows: 'Selecciona todas las filas', - selectValue: 'Selecciona un valor', - selectedCount: '{{count}} {{label}} seleccionado', - showAllLabel: 'Muestra todas {{label}}', - sorryNotFound: 'Lo sentimos. No hay nada que corresponda con tu solicitud.', - sort: 'Ordenar', - sortByLabelDirection: 'Ordenar por {{label}} {{direction}}', - stayOnThisPage: 'Permanecer en esta página', - submissionSuccessful: 'Envío realizado correctamente.', - submit: 'Enviar', - successfullyCreated: '{{label}} creado correctamente.', - thisLanguage: 'Español', - titleDeleted: '{{label}} {{title}} eliminado correctamente.', - unauthorized: 'No autorizado', - unsavedChangesDuplicate: 'Tienes cambios sin guardar. ¿Deseas continuar para duplicar?', - untitled: 'Sin título', - updatedAt: 'Fecha de modificado', - updatedCountSuccessfully: '{{count}} {{label}} actualizado con éxito.', - updatedSuccessfully: 'Actualizado con éxito.', - updating: 'Actualizando', - welcome: 'Bienvenido', - }, - operators: { - contains: 'contiene', - equals: 'igual', - exists: 'existe', - isGreaterThan: 'es mayor que', - isGreaterThanOrEqualTo: 'es mayor o igual que', - isIn: 'está en', - isLessThan: 'es menor que', - isLessThanOrEqualTo: 'es menor o igual que', - isLike: 'es como', - isNotEqualTo: 'no es igual a', - isNotIn: 'no está en', - near: 'cerca', - }, - upload: { - crop: 'Cultivo', - cropToolDescription: - 'Arrastra las esquinas del área seleccionada, dibuja un nuevo área o ajusta los valores a continuación.', - dragAndDrop: 'Arrastra y suelta un archivo', - editImage: 'Editar imagen', - focalPoint: 'Punto Focal', - focalPointDescription: - 'Arrastra el punto focal directamente en la vista previa o ajusta los valores a continuación.', - height: 'Alto', - previewSizes: 'Tamaños de Vista Previa', - selectCollectionToBrowse: 'Selecciona una Colección', - selectFile: 'Selecciona un archivo', - setCropArea: 'Establecer área de cultivo', - setFocalPoint: 'Establecer punto focal', - sizesFor: 'Tamaños para {{label}}', - width: 'Ancho', - }, - validation: { - fieldHasNo: 'Este campo no tiene {{label}}', - limitReached: 'Se ha alcanzado el límite, solo se pueden agregar {{max}} elementos.', - required: 'Este campo es obligatorio.', - requiresAtLeast: 'Este campo require al menos {{count}} {{label}}.', - }, - version: { - aboutToPublishSelection: - 'Está a punto de publicar todas las {{etiquetas}} de la selección. ¿Está seguro?', - aboutToRestore: - 'Estás a punto de restaurar este documento de {{label}} al estado en el que estaba en la fecha {{versionDate}}.', - aboutToRestoreGlobal: - 'Estás a punto de restaurar el {{label}} global al estado en el que estaba en la fecha {{versionDate}}.', - aboutToRevertToPublished: - 'Estás a punto de revertir los cambios de este documento a su estado publicado. ¿Estás seguro?', - aboutToUnpublish: 'Estás a punto de despublicar este documento. ¿Estás seguro?', - aboutToUnpublishSelection: - 'Está a punto de anular la publicación de todos los {{label}} de la selección. ¿Está seguro?', - autosave: 'Autoguardar', - autosavedSuccessfully: 'Guardado automáticamente con éxito.', - changed: 'Modificado', - compareVersion: 'Comparar versión con:', - confirmPublish: 'Confirmar publicación', - confirmRevertToSaved: 'Confirmar revertir a guardado', - confirmUnpublish: 'Confirmar despublicado', - confirmVersionRestoration: 'Confirmar restauración de versión', - draft: 'Borrador', - draftSavedSuccessfully: 'Borrador guardado con éxito.', - lastSavedAgo: 'Guardado por última vez hace {{distance}}', - noFurtherVersionsFound: 'No se encontraron más versiones', - noRowsFound: 'No encontramos {{label}}', - preview: 'Previsualizar', - problemRestoringVersion: 'Ocurrió un problema al restaurar esta versión', - publish: 'Publicar', - publishChanges: 'Publicar cambios', - published: 'Publicado', - publishing: 'Publicación', - restoreThisVersion: 'Restaurar esta versión', - restoredSuccessfully: 'Restaurado éxito.', - restoring: 'Restaurando...', - revertToPublished: 'Revertir a publicado', - saveDraft: 'Guardar Borrador', - selectLocales: 'Selecciona idiomas a mostrar', - selectVersionToCompare: 'Selecciona versión a comparar', - showLocales: 'Mostrar idiomas:', - status: 'Estado', - type: 'Tipo', - unpublish: 'Despublicar', - unpublishing: 'Despublicando...', - version: 'Versión', - versionCreatedOn: '{{version}} creada el:', - versionID: 'ID de Versión', - versions: 'Versiones', - viewingVersion: 'Viendo versión para {{entityLabel}} {{documentTitle}}', - viewingVersionGlobal: 'Viendo versión para el global {{entityLabel}}', - viewingVersions: 'Viendo versiones para {{entityLabel}} {{documentTitle}}', - viewingVersionsGlobal: 'Viendo versiones para el global {{entityLabel}}', - }, -} diff --git a/packages/translations/src/_generatedFiles_/client/fa.js b/packages/translations/src/_generatedFiles_/client/fa.js deleted file mode 100644 index 2010a79df5..0000000000 --- a/packages/translations/src/_generatedFiles_/client/fa.js +++ /dev/null @@ -1,291 +0,0 @@ -export default { - authentication: { - account: 'نمایه', - accountOfCurrentUser: 'نمایه کاربر فعلی', - alreadyActivated: 'قبلاً فعال شده است', - alreadyLoggedIn: 'قبلاً وارد شده‌اید', - backToLogin: 'بازگشت به برگه ورود', - beginCreateFirstUser: 'برای آغاز، نخستین کاربر خود را بسازید.', - changePassword: 'تغییر گذرواژه', - confirmGeneration: 'تأیید ساخت', - confirmPassword: 'تأیید گذرواژه', - createFirstUser: 'ایجاد کاربر نخست', - emailNotValid: 'رایانامه ارائه‌شده درست نیست', - emailSent: 'رایانامه فرستاده شد', - enableAPIKey: 'فعال‌سازی کلید اِی‌پی‌آی', - failedToUnlock: 'باز کردن قفل ناموفق بود', - forceUnlock: 'باز کردن قفل اجباری', - forgotPassword: 'بازیابی گذرواژه', - forgotPasswordEmailInstructions: - 'لطفا نام کاربری یا نشانی رایانامه خود را وارد نمایید. شما یک پیام با دستورالعمل راه‌اندازی مجدد گذرواژه خود دریافت خواهید کرد.', - forgotPasswordQuestion: 'بازیابی گذرواژه؟', - generate: 'ساخت', - generateNewAPIKey: 'ساخت کلید اِی‌پی‌آی تازه', - logBackIn: 'دوباره وارد شوید', - logOut: 'خروج', - loggedOutInactivity: 'شما به دلیل عدم فعالیت از سیستم خارج شده اید.', - loggedOutSuccessfully: 'شما با موفقیت از سیستم خارج شدید.', - login: 'وارد شدن', - logout: 'خروج', - logoutUser: 'خروج از کاربر', - newAPIKeyGenerated: 'کلید اِی‌پی‌آی تازه ساخته شد.', - newPassword: 'گذرواژه تازه', - resetPassword: 'بازنشانی گذرواژه', - stayLoggedIn: 'وارد سیستم بمانید', - successfullyUnlocked: 'با موفقیت باز شد', - unableToVerify: 'امکان تأیید نیست', - verified: 'تأیید شده', - verifiedSuccessfully: 'با موفقیت تأیید شد', - verify: 'تأیید', - verifyUser: 'تأیید کاربر', - youAreInactive: - 'مدتی است که فعال نبوده‌اید و به زودی جهت حفظ امنیت شما به صورت خودکار از سیستم خارج خواهید شد. ادامه می‌دهید؟', - }, - error: { - autosaving: 'هنگام ذخیره خودکار این سند خطایی رخ داد.', - correctInvalidFields: 'لطفا کادرهای نامعتبر را تصحیح کنید.', - deletingTitle: 'هنگام حذف {{title}} خطایی رخ داد. لطفاً وضعیت اتصال اینترنت خود را بررسی کنید.', - loadingDocument: 'مشکلی در بارگیری رسانه با شناسه {{id}} پیش آمد.', - noMatchedField: 'کادر منطبقی با"{{label}}" یافت نشد', - notAllowedToAccessPage: 'شما اجازه دسترسی به این برگه را ندارید.', - previewing: 'مشکلی در پیش‌نمایش این رسانه رخ داد.', - unableToDeleteCount: 'نمی‌توان {{count}} از {{total}} {{label}} را حذف کرد.', - unableToUpdateCount: 'امکان به روز رسانی {{count}} خارج از {{total}} {{label}} وجود ندارد.', - unauthorized: 'درخواست نامعتبر، جهت فرستادن این درخواست باید وارد شوید.', - unknown: 'یک خطای ناشناخته رخ داد.', - unspecific: 'خطایی رخ داد.', - }, - fields: { - addLabel: 'افزودن {{label}}', - addLink: 'افزودن پیوند', - addNew: 'افزودن', - addNewLabel: 'افزودن {{label}} تازه', - addRelationship: 'افزودن پیوستگی', - addUpload: 'افزودن بارگذار', - block: 'بلوک', - blockType: 'نوع بلوک', - blocks: 'بلوک‌ها', - chooseFromExisting: 'برگزیدن از بین ورودی‌ها', - collapseAll: 'بستن همه', - editLink: 'نگارش پیوند', - editRelationship: 'نگارش پیوستگی', - itemsAndMore: '{{items}} و {{count}} بیش‌تر', - labelRelationship: '{{label}} پیوستگی', - latitude: 'عرض جغرافیایی', - linkedTo: 'مرتبط با <0>{{label}}', - longitude: 'طول جغرافیایی', - passwordsDoNotMatch: 'گذرواژه‌های وارد شده مطابقت ندارند.', - removeRelationship: 'حذف پیوستگی', - removeUpload: 'حذف بارگذار', - saveChanges: 'ذخیره تغییرات', - searchForBlock: 'جست‌وجو برای بلوک', - selectFieldsToEdit: 'انتخاب کادرها برای نگارش', - showAll: 'نمایش کل', - swapRelationship: 'تبادل پیوستگی', - swapUpload: 'تبادل بارگذار', - toggleBlock: 'کارگذاری بلوک', - uploadNewLabel: 'بارگذاری تازه {{label}}', - }, - general: { - aboutToDelete: 'شما در حال پاک کردن {{label}} <1>{{title}} هستید. اطمینان دارید؟', - aboutToDeleteCount_many: 'شما در حال پاک کردن {{count}} تعداد {{label}} هستید', - aboutToDeleteCount_one: 'شما در حال پاک کردن {{count}} تعداد {{label}} هستید', - aboutToDeleteCount_other: 'شما در شرف حذف هستید {{count}} {{label}}', - addBelow: 'افزودن به زیر', - addFilter: 'افزودن علامت', - adminTheme: 'پوسته پیشخوان', - and: 'و', - applyChanges: 'اعمال تغییرات', - ascending: 'صعودی', - automatic: 'خودکار', - backToDashboard: 'بازگشت به پیشخوان', - cancel: 'لغو', - changesNotSaved: - 'تغییرات شما ذخیره نشده، اگر این برگه را ترک کنید. تمام تغییرات از دست خواهد رفت.', - close: 'بستن', - collapse: 'بستن', - collections: 'مجموعه‌ها', - columnToSort: 'ستون برای مرتب‌سازی', - columns: 'ستون‌ها', - confirm: 'تأیید', - confirmDeletion: 'تأئید عملیات حذف', - confirmDuplication: 'تأئید رونوشت', - copied: 'رونوشت شده', - copy: 'رونوشت', - create: 'ساختن', - createNew: 'ساختن تازه', - createNewLabel: 'ساختن {{label}} تازه', - created: 'ساخته شده', - creating: 'در حال ساخت', - creatingNewLabel: 'در حال ساختن {{label}} تازه', - dark: 'تاریک', - dashboard: 'پیشخوان', - delete: 'حذف', - deletedCountSuccessfully: 'تعداد {{count}} {{label}} با موفقیت پاک گردید.', - deleting: 'در حال حذف...', - descending: 'رو به پایین', - deselectAllRows: 'تمام سطرها را از انتخاب خارج کنید', - duplicate: 'تکراری', - duplicateWithoutSaving: 'رونوشت بدون ذخیره کردن تغییرات', - edit: 'نگارش', - editLabel: 'نگارش {{label}}', - editing: 'در حال نگارش', - editingLabel_many: 'در حال نگارش {{count}} از {{label}}', - editingLabel_one: 'در حال نگارش {{count}} از {{label}}', - editingLabel_other: 'در حال نگارش {{count}} از {{label}}', - email: 'رایانامه', - emailAddress: 'نشانی رایانامه', - enterAValue: 'یک مقدار وارد کنید', - error: 'خطا', - errors: 'خطاها', - fallbackToDefaultLocale: 'بازگردان پیشفرض زبان', - filterWhere: 'علامت گذاری کردن {{label}} جایی که', - filters: 'علامت‌گذاری‌ها', - globals: 'سراسری', - language: 'زبان', - lastModified: 'آخرین نگارش', - leaveAnyway: 'به هر حال ترک کن', - leaveWithoutSaving: 'ترک کردن بدون ذخیره', - light: 'روشن', - livePreview: 'پیش‌نمایش', - loading: 'در حال بارگذاری', - locale: 'زبان', - menu: 'منو', - moveDown: 'حرکت به پایین', - moveUp: 'حرکت به بالا', - noFiltersSet: 'هیچ علامت‌گذاری تنظیم نشده', - noLabel: '', - noOptions: 'بدون گزینه', - noResults: - 'هیچ {{label}} یافت نشد. {{label}} یا هنوز وجود ندارد یا هیچ کدام با علامت‌گذاری‌هایی که در بالا مشخص کرده اید مطابقت ندارد.', - noValue: 'بدون مقدار', - none: 'هیچ یک', - notFound: 'یافت نشد', - nothingFound: 'چیزی یافت نشد', - of: 'از', - open: 'باز کردن', - or: 'یا', - order: 'چیدمان', - pageNotFound: 'برگه یافت نشد', - password: 'گذرواژه', - payloadSettings: 'تنظیمات پی‌لود', - perPage: 'هر برگه: {{limit}}', - remove: 'برداشتن', - reset: 'بازنشانی', - row: 'ردیف', - rows: 'ردیف‌ها', - save: 'ذخیره', - saving: 'در حال ذخیره...', - searchBy: 'جستجو بر اساس {{label}}', - selectAll: 'انتخاب همه {{count}} {{label}}', - selectAllRows: 'انتخاب تمام سطرها', - selectValue: 'یک مقدار را انتخاب کنید', - selectedCount: '{{count}} {{label}} انتخاب شد', - showAllLabel: 'نمایش همه {{label}}', - sorryNotFound: 'متأسفانه چیزی برای مطابقت با درخواست شما وجود ندارد.', - sort: 'مرتب‌سازی', - sortByLabelDirection: 'مرتب کردن بر اساس {{label}} {{direction}}', - stayOnThisPage: 'ماندن در این برگه', - submissionSuccessful: 'با موفقیت ثبت شد.', - submit: 'فرستادن', - successfullyCreated: '{{label}} با موفقیت ساخته شد.', - thisLanguage: 'فارسی', - titleDeleted: '{{label}} "{{title}}" با موفقیت پاک شد.', - unauthorized: 'غیرمجاز', - unsavedChangesDuplicate: 'شما تغییرات ذخیره نشده دارید. مطمئنید میخواهید به رونوشت ادامه دهید؟', - untitled: 'بدون عنوان', - updatedAt: 'بروز شده در', - updatedCountSuccessfully: 'تعداد {{count}} با عنوان {{label}} با موفقیت بروزرسانی شدند.', - updatedSuccessfully: 'با موفقیت به‌روز شد.', - updating: 'در حال به‌روزرسانی', - welcome: 'خوش‌آمدید', - }, - operators: { - contains: 'شامل', - equals: 'برابر با', - exists: 'وجود دارد', - isGreaterThan: 'بزرگتر است از', - isGreaterThanOrEqualTo: 'بزرگتر یا مساوی است', - isIn: 'هست در', - isLessThan: 'کمتر است از', - isLessThanOrEqualTo: 'کمتر یا مساوی است', - isLike: 'مانند این است', - isNotEqualTo: 'برابر نیست', - isNotIn: 'در این نیست', - near: 'نزدیک', - }, - upload: { - crop: 'محصول', - cropToolDescription: - 'گوشه‌های منطقه انتخاب شده را بکشید، یک منطقه جدید رسم کنید یا مقادیر زیر را تنظیم کنید.', - dragAndDrop: 'یک سند را بکشید و رها کنید', - editImage: 'ویرایش تصویر', - focalPoint: 'نقطه متمرکز', - focalPointDescription: - 'نقطه کانونی را مستقیماً روی پیش نمایش بکشید یا مقادیر زیر را تنظیم کنید.', - height: 'ارتفاع', - previewSizes: 'اندازه های پیش نمایش', - selectCollectionToBrowse: 'یک مجموعه را برای مرور انتخاب کنید', - selectFile: 'برگزیدن رسانه', - setCropArea: 'تنظیم ناحیه برش', - setFocalPoint: 'تنظیم نقطه کانونی', - sizesFor: 'اندازه‌ها برای {{label}}', - width: 'پهنا', - }, - validation: { - fieldHasNo: 'این کادر شامل هیچ {{label}} نمی‌شود', - limitReached: 'محدودیت رسیده است، فقط {{max}} مورد می تواند اضافه شود.', - required: 'این کادر اجباری است.', - requiresAtLeast: 'این رشته حداقل نیازمند {{count}} {{label}}.', - }, - version: { - aboutToPublishSelection: - 'شما در حال انتشار همه {{label}} برگزیده هستید از این کار اطمینان دارید؟', - aboutToRestore: - 'شما در شرف بازیابی این هستید {{label}} سند به ایالتی که در آن بود {{versionDate}}.', - aboutToRestoreGlobal: 'شما در حال بازگردانی کلی {{label}} در این {{versionDate}} هستید.', - aboutToRevertToPublished: - 'شما در حال بازگردانی تغییرات این رسانه به وضعیت منتشر شده آن هستید. از این کار اطمینان دارید؟', - aboutToUnpublish: 'شما در حال لغو انتشار این سند هستید، آیا از این کار اطمینان دارید؟', - aboutToUnpublishSelection: 'شما در شرف لغو انتشار {{label}} برگزیده هستید. ایا اطمینان دارید؟', - autosave: 'ذخیره خودکار', - autosavedSuccessfully: 'با موفقیت ذخیره خودکار شد.', - changed: 'تغییر کرد', - compareVersion: 'مقایسه نگارش با:', - confirmPublish: 'تأیید انتشار', - confirmRevertToSaved: 'تأیید بازگردانی نگارش ذخیره شده', - confirmUnpublish: 'تأیید لغو انتشار', - confirmVersionRestoration: 'تأیید بازیابی نگارش', - draft: 'پیش‌نویس', - draftSavedSuccessfully: 'پیش‌نویس با موفقیت ذخیره شد.', - lastSavedAgo: 'آخرین بار {{distance}} پیش ذخیره شد', - noFurtherVersionsFound: 'نگارش دیگری یافت نشد', - noRowsFound: 'هیچ {{label}} یافت نشد', - preview: 'پیش‌نمایش', - problemRestoringVersion: 'مشکلی در بازیابی این نگارش وجود دارد', - publish: 'انتشار', - publishChanges: 'انتشار تغییرات', - published: 'انتشار یافته', - publishing: 'انتشار', - restoreThisVersion: 'این نگارش را بازیابی کنید', - restoredSuccessfully: 'با موفقیت بازیابی شد.', - restoring: 'در حال بازیابی...', - revertToPublished: 'بازگردانی به انتشار یافته', - saveDraft: 'ذخیره پیش‌نویس', - selectLocales: 'زبان‌ها را برای نمایش انتخاب کنید', - selectVersionToCompare: 'نگارشی را برای مقایسه انتخاب کنید', - showLocales: 'نمایش زبان‌ها:', - status: 'وضعیت', - type: 'تایپ کنید', - unpublish: 'لغو انتشار', - unpublishing: 'در حال لغو انتشار...', - version: 'نگارش', - versionCreatedOn: '{{version}} ساخته شده در:', - versionID: 'شناسه نگارش', - versions: 'نگارش‌ها', - viewingVersion: 'در حال مشاهده نگارش برای {{entityLabel}} {{documentTitle}}', - viewingVersionGlobal: 'در حال مشاهده نگارش‌های کلی {{entityLabel}}', - viewingVersions: 'مشاهده نگارش‌ها برای {{entityLabel}} {{documentTitle}}', - viewingVersionsGlobal: 'مشاهده نگارش‌های کلی {{entityLabel}}', - }, -} diff --git a/packages/translations/src/_generatedFiles_/client/fr.js b/packages/translations/src/_generatedFiles_/client/fr.js deleted file mode 100644 index ce04cf7856..0000000000 --- a/packages/translations/src/_generatedFiles_/client/fr.js +++ /dev/null @@ -1,298 +0,0 @@ -export default { - authentication: { - account: 'Compte', - accountOfCurrentUser: "Compte de l'utilisateur actuel", - alreadyActivated: 'Déjà activé', - alreadyLoggedIn: 'Déjà connecté', - backToLogin: 'Retour à la connexion', - beginCreateFirstUser: 'Pour commencer, créez votre premier utilisateur.', - changePassword: 'Changer le mot de passe', - confirmGeneration: 'Confirmer la génération', - confirmPassword: 'Confirmez le mot de passe', - createFirstUser: 'Créer le premier utilisateur', - emailNotValid: "L'adresse e-mail fourni n'est pas valide", - emailSent: 'E-mail envoyé', - enableAPIKey: 'Activer la clé API', - failedToUnlock: 'Déverrouillage échoué', - forceUnlock: 'Forcer le déverrouillage', - forgotPassword: 'Mot de passe oublié', - forgotPasswordEmailInstructions: - 'Veuillez saisir votre e-mail ci-dessous. Vous recevrez un e-mail avec des instructions concernant comment réinitialiser votre mot de passe.', - forgotPasswordQuestion: 'Mot de passe oublié ?', - generate: 'Générer', - generateNewAPIKey: 'Générer une nouvelle clé API', - logBackIn: 'Se reconnecter', - logOut: 'Se déconnecter', - loggedOutInactivity: "Vous avez été déconnecté pour cause d'inactivité.", - loggedOutSuccessfully: 'Vous avez été déconnecté avec succès.', - login: 'Se connecter', - logout: 'Se déconnecter', - logoutUser: "Déconnecter l'utilisateur", - newAPIKeyGenerated: 'Nouvelle clé API générée.', - newPassword: 'Nouveau mot de passe', - resetPassword: 'Réinitialiser le mot de passe', - stayLoggedIn: 'Rester connecté', - successfullyUnlocked: 'Déverrouillé avec succès', - unableToVerify: 'Vérification échoué', - verified: 'Vérifié', - verifiedSuccessfully: 'Vérifié avec succès', - verify: 'Vérifier', - verifyUser: "Vérifier l'utilisateur", - youAreInactive: - "Vous n'avez pas été actif depuis un moment alors vous serez bientôt automatiquement déconnecté pour votre propre sécurité. Souhaitez-vous rester connecté ?", - }, - error: { - autosaving: "Un problème est survenu lors de l'enregistrement automatique de ce document.", - correctInvalidFields: 'Veuillez corriger les champs invalides.', - deletingTitle: - "Une erreur s'est produite lors de la suppression de {{title}}. Veuillez vérifier votre connexion puis réessayer.", - loadingDocument: - 'Un problème est survenu lors du chargement du document qui a pour identifiant {{id}}.', - noMatchedField: 'Aucun champ correspondant n\'a été trouvé pour "{{label}}"', - notAllowedToAccessPage: "Vous n'êtes pas autorisé à accéder à cette page.", - previewing: "Un problème est survenu lors de l'aperçu de ce document.", - 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.', - unknown: "Une erreur inconnue s'est produite.", - unspecific: 'Une erreur est survenue.', - }, - fields: { - addLabel: 'Ajouter {{label}}', - addLink: 'Ajouter un Lien', - addNew: 'Ajouter nouveau ou nouvelle', - addNewLabel: 'Ajouter nouveau ou nouvelle {{label}}', - addRelationship: 'Ajouter une relation', - addUpload: 'Ajouter le téléchargement', - block: 'bloc', - blockType: 'Type de bloc', - blocks: 'blocs', - chooseFromExisting: 'Choisir parmi les existant(e)s', - collapseAll: 'Tout réduire', - editLink: 'Modifier le lien', - editRelationship: 'Modifier la relation', - itemsAndMore: '{{items}} et {{count}} de plus', - labelRelationship: 'Relation de ou du {{label}} ', - latitude: 'Latitude', - linkedTo: 'Lié à <0>{{label}}', - longitude: 'Longitude', - passwordsDoNotMatch: 'Les mots de passe ne correspondent pas.', - removeRelationship: 'Supprimer la relation', - removeUpload: 'Supprimer le Téléversement', - saveChanges: 'Sauvegarder les modifications', - searchForBlock: 'Rechercher un bloc', - selectFieldsToEdit: 'Sélectionnez les champs à modifier', - showAll: 'Afficher tout', - swapRelationship: 'Changer de relation', - swapUpload: 'Changer de Fichier', - toggleBlock: 'Bloc bascule', - uploadNewLabel: 'Téléverser un(e) nouveau ou nouvelle {{label}}', - }, - general: { - aboutToDelete: - 'Vous êtes sur le point de supprimer ce ou cette {{label}} <1>{{title}}. Êtes-vous sûr ?', - aboutToDeleteCount_many: 'Vous êtes sur le point de supprimer {{count}} {{label}}', - aboutToDeleteCount_one: 'Vous êtes sur le point de supprimer {{count}} {{label}}', - aboutToDeleteCount_other: 'Vous êtes sur le point de supprimer {{count}} {{label}}', - addBelow: 'Ajoutez ci-dessous', - addFilter: 'Ajouter un filtre', - adminTheme: "Thème d'administration", - and: 'Et', - applyChanges: 'Appliquer les modifications', - ascending: 'Ascendant', - automatic: 'Automatique', - backToDashboard: 'Retour au tableau de bord', - cancel: 'Annuler', - changesNotSaved: - "Vos modifications n'ont pas été enregistrées. Vous perdrez vos modifications si vous quittez maintenant.", - close: 'Fermer', - collapse: 'Réduire', - collections: 'Collections', - columnToSort: 'Colonne à trier', - columns: 'Colonnes', - confirm: 'Confirmer', - confirmDeletion: 'Confirmer la suppression', - confirmDuplication: 'Confirmer la duplication', - copied: 'Copié', - copy: 'Copie', - create: 'Créer', - createNew: 'Créer un(e) nouveau ou nouvelle', - createNewLabel: 'Créer un(e) nouveau ou nouvelle {{label}}', - created: 'Créé(e)', - creating: 'création en cours', - creatingNewLabel: "Création d'un(e) nouveau ou nouvelle {{label}}", - dark: 'Nuit', - dashboard: 'Tableau de bord', - delete: 'Supprimer', - deletedCountSuccessfully: '{{count}} {{label}} supprimé avec succès.', - deleting: 'Suppression en cours...', - descending: 'Descendant(e)', - deselectAllRows: 'Désélectionner toutes les lignes', - duplicate: 'Dupliquer', - duplicateWithoutSaving: 'Dupliquer sans enregistrer les modifications', - edit: 'Éditer', - editLabel: 'Modifier {{label}}', - editing: 'Modification en cours', - editingLabel_many: 'Modification des {{count}} {{label}}', - editingLabel_one: 'Modification de {{count}} {{label}}', - editingLabel_other: 'Modification des {{count}} {{label}}', - email: 'E-mail', - emailAddress: 'Adresse e-mail', - enterAValue: 'Entrez une valeur', - error: 'Erreur', - errors: 'Erreurs', - fallbackToDefaultLocale: 'Retour à la locale par défaut', - filterWhere: 'Filtrer {{label}} où', - filters: 'Filtres', - globals: 'Globals(es)', - language: 'Langue', - lastModified: 'Dernière modification', - leaveAnyway: 'Quitter quand même', - leaveWithoutSaving: 'Quitter sans sauvegarder', - light: 'Lumière ou Jour', - livePreview: 'Aperçu', - loading: 'Chargement en cours', - locale: 'Paramètres régionaux', - menu: 'Menu', - moveDown: 'Déplacer vers le bas', - moveUp: 'Déplacer vers le haut', - noFiltersSet: 'Aucun filtre défini', - noLabel: '', - noOptions: 'Aucune option', - noResults: - "Aucun(e) {{label}} trouvé(e). Soit aucun(e) {{label}} n'existe encore, soit aucun(e) ne correspond aux filtres que vous avez spécifiés ci-dessus", - noValue: 'Aucune valeur', - none: 'Aucun(e)', - notFound: 'Pas trouvé', - nothingFound: "Rien n'a été trouvé", - of: 'de', - open: 'Ouvrir', - or: 'ou', - order: 'Ordre', - pageNotFound: 'Page non trouvée', - password: 'Mot de passe', - payloadSettings: 'Paramètres de Payload', - perPage: 'Par Page: {{limit}}', - remove: 'Retirer', - reset: 'Réinitialiser', - row: 'Ligne', - rows: 'Lignes', - save: 'Sauvegarder', - saving: 'Sauvegarde en cours...', - searchBy: 'Rechercher par {{label}}', - selectAll: 'Tout sélectionner {{count}} {{label}}', - selectAllRows: 'Sélectionnez toutes les lignes', - selectValue: 'Sélectionnez une valeur', - selectedCount: '{{count}} {{label}} sélectionné', - showAllLabel: 'Afficher tous les {{label}}', - sorryNotFound: 'Désolé, rien ne correspond à votre demande.', - sort: 'Trier', - sortByLabelDirection: 'Trier par {{label}} {{direction}}', - stayOnThisPage: 'Rester sur cette page', - submissionSuccessful: 'Soumission réussie.', - submit: 'Soumettre', - successfullyCreated: '{{label}} créé(e) avec succès.', - thisLanguage: 'Français', - titleDeleted: '{{label}} "{{title}}" supprimé(e) avec succès.', - unauthorized: 'Non autorisé', - unsavedChangesDuplicate: - 'Vous avez des changements non enregistrés. Souhaitez-vous continuer la duplication ?', - untitled: 'Sans titre', - updatedAt: 'Modifié le', - updatedCountSuccessfully: '{{count}} {{label}} mis à jour avec succès.', - updatedSuccessfully: 'Mis à jour avec succés.', - updating: 'Mise à jour', - welcome: 'Bienvenu(e)', - }, - operators: { - contains: 'contient', - equals: 'est égal à', - exists: 'existe', - isGreaterThan: 'est supérieur à', - isGreaterThanOrEqualTo: 'est supérieur ou égal à', - isIn: 'est dans', - isLessThan: 'est inférieur à', - isLessThanOrEqualTo: 'est inférieur ou égal à', - isLike: 'est comme', - isNotEqualTo: "n'est pas égal à", - isNotIn: "n'est pas dans", - near: 'proche', - }, - upload: { - crop: 'Récolte', - cropToolDescription: - 'Faites glisser les coins de la zone sélectionnée, dessinez une nouvelle zone ou ajustez les valeurs ci-dessous.', - dragAndDrop: 'Glisser-déposer un fichier', - editImage: "Modifier l'image", - focalPoint: 'Point focal', - focalPointDescription: - "Faites glisser le point focal directement sur l'aperçu ou ajustez les valeurs ci-dessous.", - height: 'Hauteur', - previewSizes: "Tailles d'aperçu", - selectCollectionToBrowse: 'Sélectionnez une collection à parcourir', - selectFile: 'Sélectionnez un fichier', - setCropArea: 'Définir la zone de recadrage', - setFocalPoint: 'Définir le point focal', - sizesFor: 'Tailles pour {{label}}', - width: 'Largeur', - }, - validation: { - fieldHasNo: "Ce champ n'a pas de {{label}}", - limitReached: 'Limite atteinte, seulement {{max}} éléments peuvent être ajoutés.', - required: 'Ce champ est requis.', - requiresAtLeast: 'Ce champ doit avoir au moins {{count}} {{label}}.', - }, - version: { - aboutToPublishSelection: - 'Vous êtes sur le point de publier tous les {{label}} de la sélection. Es-tu sûr?', - aboutToRestore: - "Vous êtes sur le point de restaurer le document {{label}} à l'état où il se trouvait le {{versionDate}}.", - aboutToRestoreGlobal: - "Vous êtes sur le point de restaurer le ou la {{label}} global(e) à l'état où il ou elle se trouvait le {{versionDate}}.", - aboutToRevertToPublished: - 'Vous êtes sur le point de rétablir les modifications apportées à ce document à la version publiée. Êtes-vous sûr ?', - aboutToUnpublish: - "Vous êtes sur le point d'annuler la publication de ce document. Êtes-vous sûr ?", - aboutToUnpublishSelection: - 'Vous êtes sur le point de dépublier tous les {{label}} de la sélection. Es-tu sûr?', - autosave: 'Enregistrement automatique', - autosavedSuccessfully: 'Enregistrement automatique réussi.', - changed: 'Modifié', - compareVersion: 'Comparez cette version à :', - confirmPublish: 'Confirmer la publication', - confirmRevertToSaved: 'Confirmer la restauration', - confirmUnpublish: "Confirmer l'annulation", - confirmVersionRestoration: 'Confirmer la restauration de la version', - draft: 'Brouillon', - draftSavedSuccessfully: 'Brouillon enregistré avec succès.', - lastSavedAgo: 'Dernière sauvegarde il y a {{distance}}', - noFurtherVersionsFound: 'Aucune autre version trouvée', - noRowsFound: 'Aucun(e) {{label}} trouvé(e)', - preview: 'Aperçu', - problemRestoringVersion: 'Un problème est survenu lors de la restauration de cette version', - publish: 'Publier', - publishChanges: 'Publier les modifications', - published: 'Publié', - publishing: 'Publication', - restoreThisVersion: 'Restaurer cette version', - restoredSuccessfully: 'Restauré(e) avec succès.', - restoring: 'Restauration en cours...', - revertToPublished: 'Republier', - saveDraft: 'Enregistrer le brouillon', - selectLocales: 'Sélectionnez les paramètres régionaux à afficher', - selectVersionToCompare: 'Sélectionnez une version à comparer', - showLocales: 'Afficher les paramètres régionaux :', - status: 'Statut', - type: 'Type', - unpublish: 'Annuler la publication', - unpublishing: 'Annulation en cours...', - version: 'Version', - versionCreatedOn: '{{version}} créé(e) le :', - versionID: 'Identifiant de la version', - versions: 'Versions', - viewingVersion: 'Affichage de la version de ou du {{entityLabel}} {{documentTitle}}', - viewingVersionGlobal: 'Affichage de la version globale de ou du {{entityLabel}}', - viewingVersions: 'Affichage des versions de ou du {{entityLabel}} {{documentTitle}}', - viewingVersionsGlobal: 'Affichage des versions globales de ou du {{entityLabel}}', - }, -} diff --git a/packages/translations/src/_generatedFiles_/client/hr.js b/packages/translations/src/_generatedFiles_/client/hr.js deleted file mode 100644 index a154999f6d..0000000000 --- a/packages/translations/src/_generatedFiles_/client/hr.js +++ /dev/null @@ -1,290 +0,0 @@ -export default { - authentication: { - account: 'Račun', - accountOfCurrentUser: 'Račun od trenutnog korisnika', - alreadyActivated: 'Već aktivirano', - alreadyLoggedIn: 'Već prijavljen', - backToLogin: 'Nazad na prijavu', - beginCreateFirstUser: 'Za početak, kreiraj svog prvog korisnika.', - changePassword: 'Promjeni lozinku', - confirmGeneration: 'Potvrdi kreiranje', - confirmPassword: 'Potvrdi lozinku', - createFirstUser: 'Kreiraj prvog korisnika', - emailNotValid: 'Email nije ispravan', - emailSent: 'Email poslan', - enableAPIKey: 'Omogući API ključ', - failedToUnlock: 'Neuspješno otključavanje.', - forceUnlock: 'Prisilno otključaj', - forgotPassword: 'Zaboravljena lozinka', - forgotPasswordEmailInstructions: - 'Molim unesite svoj email. Primit ćete poruku s uputama za ponovno postavljanje lozinke.', - forgotPasswordQuestion: 'Zaboravljena lozinka?', - generate: 'Generiraj', - generateNewAPIKey: 'Generiraj novi API ključ', - logBackIn: 'Ponovna prijava', - logOut: 'Odjava', - loggedOutInactivity: 'Odjavljeni se zbog neaktivnosti.', - loggedOutSuccessfully: 'Uspješno ste odjavljeni..', - login: 'Prijava', - logout: 'Odjava', - logoutUser: 'Odjava korisnika', - newAPIKeyGenerated: 'Novi API ključ generiran.', - newPassword: 'Nova lozinka', - resetPassword: 'Restartiranje lozinke', - stayLoggedIn: 'Ostani prijavljen', - successfullyUnlocked: 'Uspješno otključano', - unableToVerify: 'Nije moguće potvrditi', - verified: 'Potvrđeno', - verifiedSuccessfully: 'Uspješno potvrđeno', - verify: 'Potvrdi', - verifyUser: 'Potvrdi korisnika', - youAreInactive: - 'Neaktivni ste neko vrijeme i uskoro ćete biti automatski odjavljeni zbog vlastite sigurnosti. Želite li ostati prijavljeni?', - }, - error: { - autosaving: 'Nastao je problem pri automatskom spremanju ovog dokumenta.', - correctInvalidFields: 'Molim ispravite nevaljana polja.', - deletingTitle: - 'Dogodila se pogreška pri brisanju {{title}}. Molim provjerite svoju internetsku vezu i pokušajte ponovno.', - loadingDocument: 'Pojavio se problem pri učitavanju dokumenta čiji je ID {{id}}.', - noMatchedField: 'Nema podudarajućih polja za "{{label}}"', - notAllowedToAccessPage: 'Nemate dopuštenje pristupiti ovoj stranici.', - previewing: 'Pojavio se problem pri pregledavanju ovog dokumenta.', - unableToDeleteCount: 'Nije moguće izbrisati {{count}} od {{total}} {{label}}.', - unableToUpdateCount: 'Nije moguće ažurirati {{count}} od {{total}} {{label}}.', - unauthorized: 'Neovlašten, morate biti prijavljeni da biste uputili ovaj zahtjev.', - unknown: 'Došlo je do nepoznate pogreške.', - unspecific: 'Došlo je do pogreške.', - }, - fields: { - addLabel: 'Dodaj {{label}}', - addLink: 'Dodaj poveznicu', - addNew: 'Dodaj novi', - addNewLabel: 'Dodaj novi {{label}}', - addRelationship: 'Dodaj odnos', - addUpload: 'Dodaj učitavanje', - block: 'blokiranje', - blockType: 'Vrsta blokiranja', - blocks: 'blokiranja', - chooseFromExisting: 'Odaberite iz postojećih.', - collapseAll: 'Sažmi sve', - editLink: 'Uredi poveznicu', - editRelationship: 'Uredi odnos', - itemsAndMore: '{{items}} i {{count}} više', - labelRelationship: '{{label}} veza', - latitude: 'Zemljopisna širina', - linkedTo: 'Povezabi sa <0>{{label}}', - longitude: 'Zemljopisna dužina', - passwordsDoNotMatch: 'Lozinke nisu iste.', - removeRelationship: 'Ukloni vezu', - removeUpload: 'Ukloni prijenos', - saveChanges: 'Spremi promjene', - searchForBlock: 'Potraži blok', - selectFieldsToEdit: 'Odaberite polja za uređivanje', - showAll: 'Pokaži sve', - swapRelationship: 'Zamijeni vezu', - swapUpload: 'Zamijeni prijenos', - toggleBlock: 'Prebaci blok', - uploadNewLabel: 'Učitaj novi {{label}}', - }, - general: { - aboutToDelete: 'Izbrisat ćete {{label}} <1>{{title}}. Jeste li sigurni?', - aboutToDeleteCount_many: 'Upravo ćete izbrisati {{count}} {{label}}', - aboutToDeleteCount_one: 'Upravo ćete izbrisati {{count}} {{label}}', - aboutToDeleteCount_other: 'Upravo ćete izbrisati {{count}} {{label}}', - addBelow: 'Dodaj ispod', - addFilter: 'Dodaj filter', - adminTheme: 'Administratorska tema', - and: 'I', - applyChanges: 'Primijeni promjene', - ascending: 'Uzlazno', - automatic: 'Automatsko', - backToDashboard: 'Natrag na nadzornu ploču', - cancel: 'Otkaži', - changesNotSaved: 'Vaše promjene nisu spremljene. Ako izađete sada, izgubit ćete promjene.', - close: 'Zatvori', - collapse: 'Sažmi', - collections: 'Kolekcije', - columnToSort: 'Stupac za sortiranje', - columns: 'Stupci', - confirm: 'Potvrdi', - confirmDeletion: 'Potvrdi brisanje', - confirmDuplication: 'Potvrdi duplikaciju', - copied: 'Kopirano', - copy: 'Kopiraj', - create: 'Kreiraj', - createNew: 'Kreiraj novo', - createNewLabel: 'Kreiraj novo {{label}}', - created: 'Kreirano', - creating: 'Kreira se', - creatingNewLabel: 'Kreiranje novog {{label}}', - dark: 'Tamno', - dashboard: 'Nadzorna ploča', - delete: 'Obriši', - deletedCountSuccessfully: 'Uspješno izbrisano {{count}} {{label}}.', - deleting: 'Brisanje...', - descending: 'Silazno', - deselectAllRows: 'Odznači sve redove', - duplicate: 'Duplikat', - duplicateWithoutSaving: 'Dupliciraj bez spremanja promjena', - edit: 'Uredi', - editLabel: 'Uredi {{label}}', - editing: 'Uređivanje', - editingLabel_many: 'Uređivanje {{count}} {{label}}', - editingLabel_one: 'Uređivanje {{count}} {{label}}', - editingLabel_other: 'Uređivanje {{count}} {{label}}', - email: 'Email', - emailAddress: 'Email adresa', - enterAValue: 'Unesi vrijednost', - error: 'Greška', - errors: 'Greške', - fallbackToDefaultLocale: 'Vraćanje na zadani jezik', - filterWhere: 'Filter {{label}} gdje', - filters: 'Filteri', - globals: 'Globali', - language: 'Jezik', - lastModified: 'Zadnja promjena', - leaveAnyway: 'Svejedno napusti', - leaveWithoutSaving: 'Napusti bez spremanja', - light: 'Svijetlo', - livePreview: 'Pregled', - loading: 'Učitavanje', - locale: 'Jezik', - menu: 'Izbornik', - moveDown: 'Pomakni dolje', - moveUp: 'Pomakni gore', - noFiltersSet: 'Nema postavljenih filtera', - noLabel: '', - noOptions: 'Nema opcija', - noResults: - 'Nema pronađenih {{label}}. Ili {{label}} još uvijek ne postoji ili nijedan od odgovara postavljenim filterima.', - noValue: 'Bez vrijednosti', - none: 'Nijedan', - notFound: 'Nije pronađeno', - nothingFound: 'Ništa nije pronađeno', - of: 'Od', - open: 'Otvori', - or: 'Ili', - order: 'Poredak', - pageNotFound: 'Stranica nije pronađena', - password: 'Lozinka', - payloadSettings: 'Payload postavke', - perPage: 'Po stranici: {{limit}}', - remove: 'Ukloni', - reset: 'Ponovno postavi', - row: 'Red', - rows: 'Redovi', - save: 'Spremi', - saving: 'Spremanje...', - searchBy: 'Traži po {{label}}', - selectAll: 'Odaberite sve {{count}} {{label}}', - selectAllRows: 'Odaberite sve redove', - selectValue: 'Odaberi vrijednost', - selectedCount: '{{count}} {{label}} odabrano', - showAllLabel: 'Prikaži sve {{label}}', - sorryNotFound: 'Nažalost, ne postoji ništa što odgovara vašem zahtjevu.', - sort: 'Sortiraj', - sortByLabelDirection: 'Sortiraj prema {{label}} {{direction}}', - stayOnThisPage: 'Ostani na ovoj stranici', - submissionSuccessful: 'Uspješno slanje', - submit: 'Podnesi', - successfullyCreated: '{{label}} uspješno kreirano.', - thisLanguage: 'Hrvatski', - titleDeleted: '{{label}} "{{title}}" uspješno obrisano.', - unauthorized: 'Neovlašteno', - unsavedChangesDuplicate: 'Imate nespremljene promjene. Želite li nastaviti s dupliciranjem?', - untitled: 'Bez naslova', - updatedAt: 'Ažurirano u', - updatedCountSuccessfully: 'Uspješno ažurirano {{count}} {{label}}.', - updatedSuccessfully: 'Uspješno ažurirano.', - updating: 'Ažuriranje', - welcome: 'Dobrodošli', - }, - operators: { - contains: 'sadrži', - equals: 'jednako', - exists: 'postoji', - isGreaterThan: 'je veće od', - isGreaterThanOrEqualTo: 'je veće od ili jednako', - isIn: 'je u', - isLessThan: 'manje je od', - isLessThanOrEqualTo: 'manje je ili jednako', - isLike: 'je kao', - isNotEqualTo: 'nije jednako', - isNotIn: 'nije unutra', - near: 'blizu', - }, - upload: { - crop: 'Usjev', - cropToolDescription: - 'Povucite kutove odabranog područja, nacrtajte novo područje ili prilagodite vrijednosti ispod.', - dragAndDrop: 'Povucite i ispustite datoteku', - editImage: 'Uredi sliku', - focalPoint: 'Središnja točka', - focalPointDescription: - 'Povucite središnju točku izravno na pregledu ili prilagodite vrijednosti ispod.', - height: 'Visina', - previewSizes: 'Veličine pregleda', - selectCollectionToBrowse: 'Odaberite kolekciju za pregled', - selectFile: 'Odaberite datoteku', - setCropArea: 'Postavi područje usjeva', - setFocalPoint: 'Postavi fokusnu točku', - sizesFor: 'Veličine za {{label}}', - width: 'Širina', - }, - validation: { - fieldHasNo: 'Ovo polje nema {{label}}', - limitReached: 'Dosegnut je limit, može se dodati samo {{max}} stavki.', - required: 'Ovo polje je obvezno.', - requiresAtLeast: 'Ovo polje zahtjeva minimalno {{count}} {{label}}.', - }, - version: { - aboutToPublishSelection: 'Upravo ćete objaviti sve {{label}} u izboru. Jesi li siguran?', - aboutToRestore: 'Vratit ćete {{label}} dokument u stanje u kojem je bio {{versionDate}}', - aboutToRestoreGlobal: 'Vratit ćete globalni {{label}} u stanje u kojem je bio {{versionDate}}.', - aboutToRevertToPublished: - 'Vratit ćete promjene u dokumentu u objavljeno stanje. Jeste li sigurni? ', - aboutToUnpublish: 'Poništit ćete objavu ovog dokumenta. Jeste li sigurni?', - aboutToUnpublishSelection: - 'Upravo ćete poništiti objavu svih {{label}} u odabiru. Jesi li siguran?', - autosave: 'Automatsko spremanje', - autosavedSuccessfully: 'Automatsko spremanje uspješno.', - changed: 'Promijenjeno', - compareVersion: 'Usporedi verziju sa:', - confirmPublish: 'Potvrdi objavu', - confirmRevertToSaved: 'Potvrdite vraćanje na spremljeno', - confirmUnpublish: 'Potvrdite poništavanje objave', - confirmVersionRestoration: 'Potvrdite vraćanje verzije', - draft: 'Nacrt', - draftSavedSuccessfully: 'Nacrt uspješno spremljen.', - lastSavedAgo: 'Zadnji put spremljeno prije {{distance}', - noFurtherVersionsFound: 'Nisu pronađene daljnje verzije', - noRowsFound: '{{label}} nije pronađeno', - preview: 'Pregled', - problemRestoringVersion: 'Nastao je problem pri vraćanju ove verzije', - publish: 'Objaviti', - publishChanges: 'Objavi promjene', - published: 'Objavljeno', - publishing: 'Objavljivanje', - restoreThisVersion: 'Vrati ovu verziju', - restoredSuccessfully: 'Uspješno vraćeno.', - restoring: 'Vraćanje...', - revertToPublished: 'Vrati na objavljeno', - saveDraft: 'Sačuvaj nacrt', - selectLocales: 'Odaberite jezike', - selectVersionToCompare: 'Odaberite verziju za usporedbu', - showLocales: 'Prikaži jezike:', - status: 'Status', - type: 'Tip', - unpublish: 'Poništi objavu', - unpublishing: 'Poništavanje objave...', - version: 'Verzija', - versionCreatedOn: '{{version}} kreiranih:', - versionID: 'ID verzije', - versions: 'Verzije', - viewingVersion: 'Pregled verzije za {{entityLabel}} {{documentTitle}}', - viewingVersionGlobal: 'Pregled verzije za globalni {{entityLabel}}', - viewingVersions: 'Pregled verzija za {{entityLabel}} {{documentTitle}}', - viewingVersionsGlobal: 'Pregled verzije za globalni {{entityLabel}}', - }, -} diff --git a/packages/translations/src/_generatedFiles_/client/hu.js b/packages/translations/src/_generatedFiles_/client/hu.js deleted file mode 100644 index c5784a2cd1..0000000000 --- a/packages/translations/src/_generatedFiles_/client/hu.js +++ /dev/null @@ -1,294 +0,0 @@ -export default { - authentication: { - account: 'Fiók', - accountOfCurrentUser: 'Az aktuális felhasználó fiókja', - alreadyActivated: 'Már aktiválva van', - alreadyLoggedIn: 'Már bejelentkezett', - backToLogin: 'Vissza a bejelentkezéshez', - beginCreateFirstUser: 'Kezdésként hozza létre az első felhasználót.', - changePassword: 'Jelszó módosítása', - confirmGeneration: 'Generálás megerősítése', - confirmPassword: 'Jelszó megerősítése', - createFirstUser: 'Első felhasználó létrehozása', - emailNotValid: 'A megadott e-mail cím érvénytelen', - emailSent: 'E-mail elküldve', - enableAPIKey: 'API-kulcs engedélyezése', - failedToUnlock: 'Nem sikerült feloldani', - forceUnlock: 'Kényszerített feloldás', - forgotPassword: 'Elfelejtett jelszó', - forgotPasswordEmailInstructions: - 'Kérjük, adja meg e-mail címét alább. Kapni fog egy e-mail üzenetet a jelszó visszaállításához szükséges utasításokkal.', - forgotPasswordQuestion: 'Elfelejtette jelszavát?', - generate: 'Generálás', - generateNewAPIKey: 'Új API-kulcs generálása', - logBackIn: 'Jelentkezzen be újra', - logOut: 'Kijelentkezés', - loggedOutInactivity: 'Inaktivitás miatt kijelentkeztünk.', - loggedOutSuccessfully: 'Sikeresen kijelentkezett.', - login: 'Bejelentkezés', - logout: 'Kijelentkezés', - logoutUser: 'Felhasználó kijelentkezése', - newAPIKeyGenerated: 'Új API-kulcs generálva.', - newPassword: 'Új jelszó', - resetPassword: 'Jelszó visszaállítása', - stayLoggedIn: 'Maradjon bejelentkezve', - successfullyUnlocked: 'Sikeresen feloldva', - unableToVerify: 'Sikertelen megerősítés', - verified: 'Megerősítve', - verifiedSuccessfully: 'Sikeresen megerősítve', - verify: 'Megerősítés', - verifyUser: 'Felhasználó megerősítése', - youAreInactive: - 'Már egy ideje nem volt aktív, és hamarosan automatikusan kijelentkeztetjük saját biztonsága érdekében. Szeretne bejelentkezve maradni?', - }, - error: { - autosaving: 'Hiba történt a dokumentum automatikus mentése közben.', - correctInvalidFields: 'Kérjük, javítsa ki az érvénytelen mezőket.', - deletingTitle: - 'Hiba történt a {{title}} törlése közben. Kérjük, ellenőrizze a kapcsolatot, és próbálja meg újra.', - loadingDocument: 'Hiba történt a {{id}} azonosítójú dokumentum betöltésekor.', - noMatchedField: 'Nem található egyező mező a következőhöz: "{{label}}"', - notAllowedToAccessPage: 'Ehhez az oldalhoz nem férhet hozzá.', - previewing: 'Hiba történt a dokumentum előnézetének megtekintése közben.', - unableToDeleteCount: 'Nem sikerült törölni {{count}}/{{total}} {{label}}.', - unableToUpdateCount: 'Nem sikerült frissíteni {{count}}/{{total}} {{label}}.', - unauthorized: 'Jogosulatlan, a kéréshez be kell jelentkeznie.', - unknown: 'Ismeretlen hiba történt.', - unspecific: 'Hiba történt.', - }, - fields: { - addLabel: '{{label}} hozzáadása', - addLink: 'Link hozzáadása', - addNew: 'Új hozzáadása', - addNewLabel: 'Új {{label}} hozzáadása', - addRelationship: 'Kapcsolat hozzáadása', - addUpload: 'Feltöltés hozzáadása', - block: 'blokk', - blockType: 'Blokk típusa', - blocks: 'blokkok', - chooseFromExisting: 'Válasszon a meglévők közül', - collapseAll: 'Mindet összecsuk', - editLink: 'Link szerkesztése', - editRelationship: 'Kapcsolat hozzáadása', - itemsAndMore: '{{items}} és további {{count}}', - labelRelationship: '{{label}} Kapcsolat', - latitude: 'Szélesség', - linkedTo: 'Kapcsolódik a <0>{{label}}', - longitude: 'Hosszúság', - passwordsDoNotMatch: 'A jelszavak nem egyeznek.', - removeRelationship: 'Kapcsolat eltávolítása', - removeUpload: 'Feltöltés eltávolítása', - saveChanges: 'Módosítások mentése', - searchForBlock: 'Blokk keresése', - selectFieldsToEdit: 'Válassza ki a szerkeszteni kívánt mezőket', - showAll: 'Az összes megjelenítése', - swapRelationship: 'Kapcsolat csere', - swapUpload: 'Feltöltés csere', - toggleBlock: 'Blokk kinyitása', - uploadNewLabel: 'Új {{label}} feltöltése', - }, - general: { - aboutToDelete: 'A {{label}} <1>{{title}} törlésére készül. Biztos benne?', - aboutToDeleteCount_many: 'Törölni készül {{count}} {{label}}', - aboutToDeleteCount_one: 'Törölni készül {{count}} {{label}}', - aboutToDeleteCount_other: 'Törölni készül {{count}} {{label}}', - addBelow: 'Hozzáadás lent', - addFilter: 'Szűrő hozzáadása', - adminTheme: 'Admin téma', - and: 'És', - applyChanges: 'Változtatások alkalmazása', - ascending: 'Növekvő', - automatic: 'Automatikus', - backToDashboard: 'Vissza az irányítópultra', - cancel: 'Mégsem', - changesNotSaved: - 'A módosítások nem lettek mentve. Ha most távozik, elveszíti a változtatásokat.', - close: 'Bezárás', - collapse: 'Összecsukás', - collections: 'Gyűjtemények', - columnToSort: 'Rendezendő oszlop', - columns: 'Oszlopok', - confirm: 'Megerősítés', - confirmDeletion: 'Törlés megerősítése', - confirmDuplication: 'Duplikáció megerősítése', - copied: 'Másolva', - copy: 'Másolás', - create: 'Létrehozás', - createNew: 'Új létrehozása', - createNewLabel: 'Új {{label}} létrehozása', - created: 'Létrehozva', - creating: 'Létrehozás', - creatingNewLabel: 'Új {{label}} létrehozása', - dark: 'Sötét', - dashboard: 'Irányítópult', - delete: 'Törlés', - deletedCountSuccessfully: '{{count}} {{label}} sikeresen törölve.', - deleting: 'Törlés...', - descending: 'Csökkenő', - deselectAllRows: 'Jelölje ki az összes sort', - duplicate: 'Duplikálás', - duplicateWithoutSaving: 'Duplikálás a módosítások mentése nélkül', - edit: 'Szerkesztés', - editLabel: '{{label}} szerkesztése', - editing: 'Szerkesztés', - editingLabel_many: '{{count}} {{label}} szerkesztése', - editingLabel_one: '{{count}} {{label}} szerkesztése', - editingLabel_other: '{{count}} {{label}} szerkesztése', - email: 'E-mail', - emailAddress: 'E-mail cím', - enterAValue: 'Adjon meg egy értéket', - error: 'Hiba', - errors: 'Hibák', - fallbackToDefaultLocale: 'Visszatérés az alapértelmezett nyelvhez', - filterWhere: 'Szűrő {{label}} ahol', - filters: 'Szűrők', - globals: 'Globálisok', - language: 'Nyelv', - lastModified: 'Utoljára módosítva', - leaveAnyway: 'Távozás mindenképp', - leaveWithoutSaving: 'Távozás mentés nélkül', - light: 'Világos', - livePreview: 'Előnézet', - loading: 'Betöltés', - locale: 'Nyelv', - menu: 'Menü', - moveDown: 'Mozgatás lefelé', - moveUp: 'Mozgatás felfelé', - noFiltersSet: 'Nincs beállítva szűrő', - noLabel: '', - noOptions: 'Nincs lehetőség', - noResults: - 'Nem találtunk {{label}}. Vagy még nem létezik {{label}}, vagy egyik sem felel meg a fent megadott szűrőknek.', - noValue: 'Nincs érték', - none: 'Semmi', - notFound: 'Nem található', - nothingFound: 'Nincs találat', - of: 'a', - open: 'Megnyitás', - or: 'Vagy', - order: 'Sorrend', - pageNotFound: 'Az oldal nem található', - password: 'Jelszó', - payloadSettings: 'Payload beállítások', - perPage: 'Oldalanként: {{limit}}', - remove: 'Törlés', - reset: 'Visszaállítás', - row: 'Sor', - rows: 'Sorok', - save: 'Mentés', - saving: 'Mentés...', - searchBy: 'Keresés a következő szerint: {{label}}', - selectAll: 'Az összes kijelölése: {{count}} {{label}}', - selectAllRows: 'Válassza ki az összes sort', - selectValue: 'Válasszon ki egy értéket', - selectedCount: '{{count}} {{label}} kiválasztva', - showAllLabel: 'Mutasd az összes {{címke}}', - sorryNotFound: 'Sajnáljuk – nincs semmi, ami megfelelne a kérésének.', - sort: 'Rendezés', - sortByLabelDirection: 'Rendezés {{label}} {{direction}} szerint', - stayOnThisPage: 'Maradjon ezen az oldalon', - submissionSuccessful: 'Beküldés sikeres.', - submit: 'Beküldés', - successfullyCreated: '{{label}} sikeresen létrehozva.', - thisLanguage: 'Magyar', - titleDeleted: '{{label}} "{{title}}" sikeresen törölve.', - unauthorized: 'Jogosulatlan', - unsavedChangesDuplicate: 'Nem mentett módosításai vannak. Szeretné folytatni a duplikációt?', - untitled: 'Névtelen', - updatedAt: 'Frissítve:', - updatedCountSuccessfully: '{{count}} {{label}} sikeresen frissítve.', - updatedSuccessfully: 'Sikeresen frissítve.', - updating: 'Frissítés', - welcome: 'Üdvözöljük', - }, - operators: { - contains: 'tartalmaz', - equals: 'egyenlő', - exists: 'létezik', - isGreaterThan: 'nagyobb, mint', - isGreaterThanOrEqualTo: 'nagyobb vagy egyenlő, mint', - isIn: 'benne van', - isLessThan: 'kisebb, mint', - isLessThanOrEqualTo: 'kisebb vagy egyenlő, mint', - isLike: 'olyan, mint', - isNotEqualTo: 'nem egyenlő', - isNotIn: 'nincs benne', - near: 'közel', - }, - upload: { - crop: 'Termés', - cropToolDescription: - 'Húzza a kijelölt terület sarkait, rajzoljon új területet, vagy igazítsa a lentebb található értékeket.', - dragAndDrop: 'Húzzon ide egy fájlt', - editImage: 'Kép szerkesztése', - focalPoint: 'Fókuszpont', - focalPointDescription: - 'Húzza az érdekes pontot közvetlenül az előnézetre, vagy állítsa be az alábbi értékeket.', - height: 'Magasság', - previewSizes: 'Előnézeti méretek', - selectCollectionToBrowse: 'Válassza ki a böngészni kívánt gyűjteményt', - selectFile: 'Válasszon ki egy fájlt', - setCropArea: 'Állítsa be a vágási területet', - setFocalPoint: 'Állítsa be a fókuszpontot', - sizesFor: 'Méretek a {{címke}} számára', - width: 'Szélesség', - }, - validation: { - fieldHasNo: 'Ennek a mezőnek nincs {{label}}', - limitReached: 'Elérte a korlátot, csak {{max}} elem adható hozzá.', - required: 'Ez a mező kötelező.', - requiresAtLeast: 'Ehhez a mezőhöz legalább {{count}} {{label}} szükséges.', - }, - version: { - aboutToPublishSelection: - 'Arra készül, hogy az összes {{label}} elemet közzétegye a kijelölésben. biztos vagy ebben?', - aboutToRestore: - 'Arra készül, hogy visszaállítsa ezt a {{label}} dokumentumot arra az állapotra, amelyben {{versionDate}} napon volt.', - aboutToRestoreGlobal: - 'Arra készül, hogy visszaállítsa a {{label}} arra az állapotra, amelyben {{versionDate}} napon volt.', - aboutToRevertToPublished: - 'Arra készül, hogy visszaállítsa a dokumentum módosításait a közzétett állapotába. Biztos benne?', - aboutToUnpublish: 'A dokumentum közzétételének visszavonására készül. Biztos benne?', - aboutToUnpublishSelection: - 'Arra készül, hogy visszavonja a kijelölésben szereplő összes {{label}} közzétételét. biztos vagy ebben?', - autosave: 'Automatikus mentés', - autosavedSuccessfully: 'Automatikus mentés sikeres.', - changed: 'Megváltozott', - compareVersion: 'Hasonlítsa össze a verziót a következőkkel:', - confirmPublish: 'A közzététel megerősítése', - confirmRevertToSaved: 'Erősítse meg a mentett verzióra való visszatérést', - confirmUnpublish: 'A közzététel visszavonásának megerősítése', - confirmVersionRestoration: 'Verzió-visszaállítás megerősítése', - draft: 'Piszkozat', - draftSavedSuccessfully: 'A piszkozat sikeresen mentve.', - lastSavedAgo: 'Utoljára mentve {{distance}} órája', - noFurtherVersionsFound: 'További verziók nem találhatók', - noRowsFound: 'Nem található {{label}}', - preview: 'Előnézet', - problemRestoringVersion: 'Hiba történt a verzió visszaállításakor', - publish: 'Közzététel', - publishChanges: 'Módosítások közzététele', - published: 'Közzétett', - publishing: 'Közzététel', - restoreThisVersion: 'A verzió visszaállítása', - restoredSuccessfully: 'Sikeresen visszaállítva.', - restoring: 'Visszaállítás...', - revertToPublished: 'Visszatérés a közzétetthez', - saveDraft: 'Piszkozat mentése', - selectLocales: 'Megjelenítendő nyelvek kiválasztása', - selectVersionToCompare: 'Válassza ki az összehasonlítani kívánt verziót', - showLocales: 'Nyelvek megjelenítése:', - status: 'Állapot', - type: 'Típus', - unpublish: 'Közzététel visszavonása', - unpublishing: 'Közzététel visszavonása...', - version: 'Verzió', - versionCreatedOn: '{{version}} létrehozva:', - versionID: 'Verzióazonosító', - versions: 'Verziók', - viewingVersion: 'A(z) {{entityLabel}} {{documentTitle}} verziójának megtekintése', - viewingVersionGlobal: 'A globális {{entityLabel}} verziójának megtekintése', - viewingVersions: 'A {{entityLabel}} {{documentTitle}} verzióinak megtekintése', - viewingVersionsGlobal: 'A globális {{entityLabel}} verzióinak megtekintése', - }, -} diff --git a/packages/translations/src/_generatedFiles_/client/index.ts b/packages/translations/src/_generatedFiles_/client/index.ts deleted file mode 100644 index 0deeb35d53..0000000000 --- a/packages/translations/src/_generatedFiles_/client/index.ts +++ /dev/null @@ -1,65 +0,0 @@ -import ar from './ar.js' -import az from './az.js' -import bg from './bg.js' -import cs from './cs.js' -import de from './de.js' -import en from './en.js' -import es from './es.js' -import fa from './fa.js' -import fr from './fr.js' -import hr from './hr.js' -import hu from './hu.js' -import it from './it.js' -import ja from './ja.js' -import ko from './ko.js' -import my from './my.js' -import nb from './nb.js' -import nl from './nl.js' -import pl from './pl.js' -import pt from './pt.js' -import ro from './ro.js' -import rs from './rs.js' -import rsLatin from './rs-latin.js' -import ru from './ru.js' -import sv from './sv.js' -import th from './th.js' -import tr from './tr.js' -import ua from './ua.js' -import vi from './vi.js' -import zh from './zh.js' -import zhTw from './zh-tw.js' - -export const translations = { - ar, - az, - bg, - cs, - de, - en, - es, - fa, - fr, - hr, - hu, - it, - ja, - ko, - my, - nb, - nl, - pl, - pt, - ro, - rs, - 'rs-latin': rsLatin, - ru, - sv, - th, - tr, - ua, - vi, - zh, - 'zh-tw': zhTw, -} as { - [locale: string]: Record> -} diff --git a/packages/translations/src/_generatedFiles_/client/it.js b/packages/translations/src/_generatedFiles_/client/it.js deleted file mode 100644 index 8faded0309..0000000000 --- a/packages/translations/src/_generatedFiles_/client/it.js +++ /dev/null @@ -1,294 +0,0 @@ -export default { - authentication: { - account: 'Account', - accountOfCurrentUser: "Account dell'utente corrente", - alreadyActivated: 'Già Attivato', - alreadyLoggedIn: 'Sei già loggato', - backToLogin: 'Torna al login', - beginCreateFirstUser: 'Per iniziare, crea il tuo primo utente.', - changePassword: 'Cambia Password', - confirmGeneration: 'Conferma Generazione', - confirmPassword: 'Conferma Password', - createFirstUser: 'Crea il primo utente', - emailNotValid: "L'email fornita non è valida", - emailSent: 'Email Inviata', - enableAPIKey: 'Abilita la Chiave API', - failedToUnlock: 'Lo sblocco è fallito', - forceUnlock: 'Forza Sblocco', - forgotPassword: 'Cambia Password', - forgotPasswordEmailInstructions: - 'Inserisci la tua mail qui sotto. Riceverai un messaggio email con le istruzioni su come cambiare la tua password.', - forgotPasswordQuestion: 'Password dimenticata?', - generate: 'Genera', - generateNewAPIKey: 'Genera una nuova Chiave API', - logBackIn: 'Vai al Log in', - logOut: 'Log out', - loggedOutInactivity: 'Sei stato disconnesso automaticamente per inattività.', - loggedOutSuccessfully: 'Sei stato disconnesso con successo.', - login: 'Login', - logout: 'Logout', - logoutUser: 'Logout utente', - newAPIKeyGenerated: 'Nuova Chiave API Generata.', - newPassword: 'Nuova Password', - resetPassword: 'Modifica Password', - stayLoggedIn: 'Rimani connesso', - successfullyUnlocked: 'Sbloccato con successo', - unableToVerify: 'Impossibile verificare', - verified: 'Verificato', - verifiedSuccessfully: 'Verificato con successo', - verify: 'Verifica', - verifyUser: 'Verifica Utente', - youAreInactive: - "Non sei attivo da un po' di tempo e a breve verrai disconnesso automaticamente per la tua sicurezza. Vuoi rimanere connesso?", - }, - error: { - autosaving: - 'Si è verificato un problema durante il salvataggio automatico di questo documento.', - correctInvalidFields: 'Per favore correggi i campi non validi.', - deletingTitle: - "Si è verificato un errore durante l'eliminazione di {{title}}. Per favore controlla la tua connessione e riprova.", - loadingDocument: - 'Si è verificato un problema durante il caricamento del documento con ID {{id}}.', - noMatchedField: 'Nessun campo corrispondente trovato per "{{label}}"', - notAllowedToAccessPage: 'Non sei autorizzato ad accedere a questa pagina.', - previewing: "Si è verificato un problema durante l'anteprima di questo documento.", - unableToDeleteCount: 'Impossibile eliminare {{count}} su {{total}} {{label}}.', - unableToUpdateCount: 'Impossibile aggiornare {{count}} su {{total}} {{label}}.', - unauthorized: 'Non autorizzato, devi essere loggato per effettuare questa richiesta.', - unknown: 'Si è verificato un errore sconosciuto.', - unspecific: 'Si è verificato un errore.', - }, - fields: { - addLabel: 'Aggiungi {{label}}', - addLink: 'Aggiungi Collegamento', - addNew: 'Aggiungi nuovo', - addNewLabel: 'Aggiungi nuovo {{label}}', - addRelationship: 'Aggiungi Relazione', - addUpload: 'aggiungi Carica', - block: 'blocco', - blockType: 'Tipo di Blocco', - blocks: 'blocchi', - chooseFromExisting: 'Scegli tra esistente', - collapseAll: 'Comprimi tutto', - editLink: 'Modifica Collegamento', - editRelationship: 'Modifica Relazione', - itemsAndMore: '{{items}} e altri {{count}}', - labelRelationship: 'Relazione {{label}}', - latitude: 'Latitudine', - linkedTo: 'Collegato a <0>{{label}}', - longitude: 'Longitudine', - passwordsDoNotMatch: 'Le password non corrispondono.', - removeRelationship: 'Rimuovi Relazione', - removeUpload: 'Rimuovi Upload', - saveChanges: 'Salva modifiche', - searchForBlock: 'Cerca un blocco', - selectFieldsToEdit: 'Seleziona i campi da modificare', - showAll: 'Mostra tutto', - swapRelationship: 'Cambia Relationship', - swapUpload: 'Cambia Upload', - toggleBlock: 'Apri/chiudi blocco', - uploadNewLabel: 'Carica nuovo {{label}}', - }, - general: { - aboutToDelete: 'Stai per eliminare {{label}} <1>{{title}}. Sei sicuro?', - aboutToDeleteCount_many: 'Stai per eliminare {{count}} {{label}}', - aboutToDeleteCount_one: 'Stai per eliminare {{count}} {{label}}', - aboutToDeleteCount_other: 'Stai per eliminare {{count}} {{label}}', - addBelow: 'Aggiungi sotto', - addFilter: 'Aggiungi Filtro', - adminTheme: 'Tema Admin', - and: 'E', - applyChanges: 'Applica modifiche', - ascending: 'Ascendente', - automatic: 'Automatico', - backToDashboard: 'Torna alla Dashboard', - cancel: 'Cancella', - changesNotSaved: 'Le tue modifiche non sono state salvate. Se esci ora, verranno perse.', - close: 'Chiudere', - collapse: 'Comprimi', - collections: 'Collezioni', - columnToSort: 'Colonna da Ordinare', - columns: 'Colonne', - confirm: 'Conferma', - confirmDeletion: "Conferma l'eliminazione", - confirmDuplication: 'Conferma la duplicazione', - copied: 'Copiato', - copy: 'Copia', - create: 'Crea', - createNew: 'Crea Nuovo', - createNewLabel: 'Crea nuovo {{label}}', - created: 'Data di creazione', - creating: 'Crea nuovo', - creatingNewLabel: 'Creazione di un nuovo {{label}}', - dark: 'Scuro', - dashboard: 'Dashboard', - delete: 'Elimina', - deletedCountSuccessfully: '{{count}} {{label}} eliminato con successo.', - deleting: 'Sto eliminando...', - descending: 'Decrescente', - deselectAllRows: 'Deseleziona tutte le righe', - duplicate: 'Duplica', - duplicateWithoutSaving: 'Duplica senza salvare le modifiche', - edit: 'Modificare', - editLabel: 'Modifica {{label}}', - editing: 'Modifica', - editingLabel_many: 'Modificare {{count}} {{label}}', - editingLabel_one: 'Modifica {{count}} {{label}}', - editingLabel_other: 'Modificare {{count}} {{label}}', - email: 'Email', - emailAddress: 'Indirizzo Email', - enterAValue: 'Inserisci un valore', - error: 'Errore', - errors: 'Errori', - fallbackToDefaultLocale: 'Fallback al locale predefinito', - filterWhere: 'Filtra {{label}} se', - filters: 'Filtri', - globals: 'Globali', - language: 'Lingua', - lastModified: 'Ultima modifica', - leaveAnyway: 'Esci comunque', - leaveWithoutSaving: 'Esci senza salvare', - light: 'Chiaro', - livePreview: 'Anteprima dal vivo', - loading: 'Caricamento', - locale: 'Locale', - menu: 'Menù', - moveDown: 'Sposta sotto', - moveUp: 'Sposta sopra', - noFiltersSet: 'Nessun filtro impostato', - noLabel: '', - noOptions: 'Nessuna opzione', - noResults: - 'Nessun {{label}} trovato. Non esiste ancora nessun {{label}} oppure nessuno corrisponde ai filtri che hai specificato sopra.', - noValue: 'Nessun valore', - none: 'Nessuno', - notFound: 'Non Trovato', - nothingFound: 'Non è stato trovato nulla', - of: 'di', - open: 'Apri', - or: 'Oppure', - order: 'Ordine', - pageNotFound: 'Pagina non trovata', - password: 'Password', - payloadSettings: 'Impostazioni di Payload', - perPage: 'Per Pagina: {{limit}}', - remove: 'Rimuovi', - reset: 'Ripristina', - row: 'Riga', - rows: 'Righe', - save: 'Salva', - saving: 'Salvo...', - searchBy: 'Cerca per {{label}}', - selectAll: 'Seleziona tutto {{count}} {{label}}', - selectAllRows: 'Seleziona tutte le righe', - selectValue: 'Seleziona un valore', - selectedCount: '{{count}} {{label}} selezionato', - showAllLabel: 'Mostra tutti {{label}}', - sorryNotFound: "Siamo spiacenti, non c'è nulla che corrisponda alla tua richiesta.", - sort: 'Ordina', - sortByLabelDirection: 'Ordina per {{label}} {{direction}}', - stayOnThisPage: 'Rimani su questa pagina', - submissionSuccessful: 'Invio riuscito.', - submit: 'Invia', - successfullyCreated: '{{label}} creato con successo.', - thisLanguage: 'Italiano', - titleDeleted: '{{label}} {{title}} eliminato con successo.', - unauthorized: 'Non autorizzato', - unsavedChangesDuplicate: 'Sono presenti modifiche non salvate. Vuoi continuare a duplicare?', - untitled: 'Senza titolo', - updatedAt: 'Aggiornato il', - updatedCountSuccessfully: '{{count}} {{label}} aggiornato con successo.', - updatedSuccessfully: 'Aggiornato con successo.', - updating: 'Aggiornamento', - welcome: 'Benvenuto', - }, - operators: { - contains: 'contiene', - equals: 'uguale', - exists: 'esiste', - isGreaterThan: 'è maggiore di', - isGreaterThanOrEqualTo: 'è maggiore o uguale a', - isIn: 'è in', - isLessThan: 'è minore di', - isLessThanOrEqualTo: 'è minore o uguale a', - isLike: 'è come', - isNotEqualTo: 'non è uguale a', - isNotIn: 'non è in', - near: 'vicino', - }, - upload: { - crop: 'Raccolto', - cropToolDescription: - "Trascina gli angoli dell'area selezionata, disegna una nuova area o regola i valori qui sotto.", - dragAndDrop: 'Trascina e rilascia un file', - editImage: 'Modifica immagine', - focalPoint: 'Punto Focale', - focalPointDescription: - "Trascina il punto focale direttamente sull'anteprima o regola i valori sottostanti.", - height: 'Altezza', - previewSizes: 'Anteprime Dimensioni', - selectCollectionToBrowse: 'Seleziona una Collezione da Sfogliare', - selectFile: 'Seleziona un file', - setCropArea: 'Imposta area di ritaglio', - setFocalPoint: 'Imposta punto focale', - sizesFor: 'Dimensioni per {{label}}', - width: 'Larghezza', - }, - validation: { - fieldHasNo: 'Questo campo non ha {{label}}', - limitReached: 'Raggiunto il limite, possono essere aggiunti solo {{max}} elementi.', - required: 'Questo campo è obbligatorio.', - requiresAtLeast: 'Questo campo richiede almeno {{count}} {{label}}.', - }, - version: { - aboutToPublishSelection: 'Stai per pubblicare tutte le {{label}} nella selezione. Sei sicuro?', - aboutToRestore: - 'Stai per ripristinare questo documento {{label}} allo stato in cui si trovava il {{versionDate}}.', - aboutToRestoreGlobal: - 'Stai per ripristinare {{label}} allo stato in cui si trovava il {{versionDate}}.', - aboutToRevertToPublished: - 'Stai per ripristinare le modifiche di questo documento al suo stato pubblicato. Sei sicuro?', - aboutToUnpublish: 'Stai per annullare la pubblicazione di questo documento. Sei sicuro?', - aboutToUnpublishSelection: - 'Stai per annullare la pubblicazione di tutte le {{label}} nella selezione. Sei sicuro?', - autosave: 'Salvataggio automatico', - autosavedSuccessfully: 'Salvataggio automatico riuscito.', - changed: 'Modificato', - compareVersion: 'Confronta versione con:', - confirmPublish: 'Conferma la pubblicazione', - confirmRevertToSaved: 'Conferma il ripristino dei salvataggi', - confirmUnpublish: 'Conferma annullamento della pubblicazione', - confirmVersionRestoration: 'Conferma il ripristino della versione', - draft: 'Bozza', - draftSavedSuccessfully: 'Bozza salvata con successo.', - lastSavedAgo: 'Ultimo salvataggio {{distance}} fa', - noFurtherVersionsFound: 'Non sono state trovate ulteriori versioni', - noRowsFound: 'Nessun {{label}} trovato', - preview: 'Anteprima', - problemRestoringVersion: 'Si è verificato un problema durante il ripristino di questa versione', - publish: 'Pubblicare', - publishChanges: 'Pubblica modifiche', - published: 'Pubblicato', - publishing: 'Pubblicazione', - restoreThisVersion: 'Ripristina questa versione', - restoredSuccessfully: 'Ripristinato con successo.', - restoring: 'Ripristino...', - revertToPublished: 'Ritorna alla versione pubblicata', - saveDraft: 'Salva Bozza', - selectLocales: 'Seleziona le lingue da visualizzare', - selectVersionToCompare: 'Seleziona una versione da confrontare', - showLocales: 'Mostra localizzazioni:', - status: 'Stato', - type: 'Tipo', - unpublish: 'Annulla pubblicazione', - unpublishing: 'Annullamento pubblicazione...', - version: 'Versione', - versionCreatedOn: '{{version}} creata il:', - versionID: 'ID Versione', - versions: 'Versioni', - viewingVersion: 'Visualizzazione della versione per {{entityLabel}} {{documentTitle}}', - viewingVersionGlobal: '`Visualizzazione della versione per {{entityLabel}}', - viewingVersions: 'Visualizzazione delle versioni per {{entityLabel}} {{documentTitle}}', - viewingVersionsGlobal: '`Visualizzazione delle versioni per {{entityLabel}}', - }, -} diff --git a/packages/translations/src/_generatedFiles_/client/ja.js b/packages/translations/src/_generatedFiles_/client/ja.js deleted file mode 100644 index 205e4466b7..0000000000 --- a/packages/translations/src/_generatedFiles_/client/ja.js +++ /dev/null @@ -1,291 +0,0 @@ -export default { - authentication: { - account: 'アカウント', - accountOfCurrentUser: '現在のユーザーアカウント', - alreadyActivated: 'すでに有効です', - alreadyLoggedIn: 'すでにログインしています', - backToLogin: 'ログイン画面へ戻る', - beginCreateFirstUser: 'まずは、最初のユーザーを作成します。', - changePassword: 'パスワードを変更', - confirmGeneration: '生成の確認', - confirmPassword: 'パスワードの確認', - createFirstUser: '最初のユーザーを作成', - emailNotValid: '入力されたメールアドレスは無効です。', - emailSent: 'Emailが送信されました。', - enableAPIKey: 'API Keyを許可', - failedToUnlock: 'ロックの解除に失敗しました。', - forceUnlock: '強制的にロックを解除', - forgotPassword: 'パスワード再設定', - forgotPasswordEmailInstructions: - 'アカウントのメールアドレスを以下に入力してください。パスワードの再設定方法が記載されたメールが届きます。', - forgotPasswordQuestion: 'パスワードをお忘れですか?', - generate: '生成', - generateNewAPIKey: '新しいAPI Keyを生成', - logBackIn: '改めてログイン', - logOut: 'ログアウト', - loggedOutInactivity: 'しばらく操作を行わなかったため、管理画面からログアウトしました。', - loggedOutSuccessfully: '管理画面からログアウトしました。', - login: 'ログイン', - logout: 'ログアウト', - logoutUser: 'ログアウトユーザー', - newAPIKeyGenerated: '新しいAPI Keyを生成しました。', - newPassword: '新しいパスワード', - resetPassword: 'パスワード再発行', - stayLoggedIn: 'ログイン状態を維持', - successfullyUnlocked: 'ロックの解除に成功しました。', - unableToVerify: '検証ができません', - verified: '検証済み', - verifiedSuccessfully: '検証が成功しました', - verify: '検証', - verifyUser: 'ユーザーの確認', - youAreInactive: - 'しばらく操作を行わなかったため、セキュリティのために自動的にログアウトします。ログイン状態を維持しますか?', - }, - error: { - autosaving: 'このデータを自動保存する際に問題が発生しました。', - correctInvalidFields: '無効なフィールドを修正してください。', - deletingTitle: - '{{title}} を削除する際にエラーが発生しました。接続を確認してからもう一度お試しください。', - loadingDocument: 'IDが {{id}} のデータを読み込む際に問題が発生しました。', - noMatchedField: '"{{label}}" に該当するフィールドがありません。', - notAllowedToAccessPage: 'この画面へのアクセスは許可されていません。', - previewing: 'このデータをプレビューする際に問題が発生しました。', - unableToDeleteCount: '{{total}} {{label}} から {{count}} を削除できません。', - unableToUpdateCount: '{{total}} {{label}} のうち {{count}} 個を更新できません。', - unauthorized: '認証されていません。このリクエストを行うにはログインが必要です。', - unknown: '不明なエラーが発生しました。', - unspecific: 'エラーが発生しました。', - }, - fields: { - addLabel: '{{label}} を追加', - addLink: 'リンクを追加', - addNew: '新規追加', - addNewLabel: '{{label}} を新規追加', - addRelationship: 'リレーションシップを追加', - addUpload: 'アップロードを追加', - block: 'ブロック', - blockType: 'ブロックタイプ', - blocks: 'ブロック', - chooseFromExisting: '既存から選択', - collapseAll: 'すべて閉じる', - editLink: 'リンクを編集', - editRelationship: 'リレーションシップを編集', - itemsAndMore: '{{items}} 他{{count}}件', - labelRelationship: '{{label}} リレーションシップ', - latitude: '緯度', - linkedTo: '<0>{{label}} にリンク', - longitude: '経度', - passwordsDoNotMatch: 'パスワードが一致しません', - removeRelationship: '関係を削除', - removeUpload: '削除', - saveChanges: '変更を保存', - searchForBlock: 'ブロックを検索', - selectFieldsToEdit: '編集するフィールドを選択', - showAll: 'すべて開く', - swapRelationship: 'スワップ関係', - swapUpload: '差し替え', - toggleBlock: 'ブロックを切り替え', - uploadNewLabel: '新規 {{label}} アップロード', - }, - general: { - aboutToDelete: '{{label}} <1>{{title}} を削除します。よろしいですか?', - aboutToDeleteCount_many: '{{label}}を{{count}}つ削除しようとしています', - aboutToDeleteCount_one: '{{label}}を{{count}}つ削除しようとしています', - aboutToDeleteCount_other: '{{label}}を{{count}}つ削除しようとしています', - addBelow: '下に追加', - addFilter: '絞り込みを追加', - adminTheme: '管理画面のテーマ', - and: 'かつ', - applyChanges: '変更を適用する', - ascending: '昇順', - automatic: '自動設定', - backToDashboard: 'ダッシュボードに戻る', - cancel: 'キャンセル', - changesNotSaved: '未保存の変更があります。このまま画面を離れると内容が失われます。', - close: '閉じる', - collapse: '閉じる', - collections: 'コレクション', - columnToSort: '並び替え対象の行', - columns: '行の表示', - confirm: '実行', - confirmDeletion: '削除の確認', - confirmDuplication: '複製の確認', - copied: 'コピーしました', - copy: 'コピー', - create: '作成', - createNew: '新規作成', - createNewLabel: '{{label}} を新規作成', - created: '作成', - creating: '作成中', - creatingNewLabel: '{{label}} を新規作成しています', - dark: 'ダークモード', - dashboard: 'ダッシュボード', - delete: '削除', - deletedCountSuccessfully: '{{count}}つの{{label}}を正常に削除しました。', - deleting: '削除しています...', - descending: '降順', - deselectAllRows: 'すべての行の選択を解除します', - duplicate: '複製', - duplicateWithoutSaving: '変更を保存せずに複製', - edit: '編集', - editLabel: '{{label}} を編集', - editing: '編集', - editingLabel_many: '{{count}}つの{{label}}を編集しています', - editingLabel_one: '{{count}}つの{{label}}を編集しています', - editingLabel_other: '{{count}}つの{{label}}を編集しています', - email: 'メールアドレス', - emailAddress: 'メールアドレス', - enterAValue: '値を入力', - error: 'エラー', - errors: 'エラー', - fallbackToDefaultLocale: 'デフォルトロケールへのフォールバック', - filterWhere: '{{label}} の絞り込み', - filters: '絞り込み', - globals: 'グローバル', - language: '言語', - lastModified: '最終更新', - leaveAnyway: 'すぐに画面を離れる', - leaveWithoutSaving: '内容が保存されていません', - light: 'ライトモード', - livePreview: 'プレビュー', - loading: 'ローディング中', - locale: 'ロケール', - menu: 'メニュー', - moveDown: '下へ移動', - moveUp: '上へ移動', - noFiltersSet: '絞り込みが未設定です。', - noLabel: '', - noOptions: '選択肢なし', - noResults: - '{{label}} データが見つかりませんでした。データが存在しない、または、絞り込みに一致するものがありません。', - noValue: '未設定', - none: 'なし', - notFound: 'Not Found', - nothingFound: 'Nothing found', - of: '/', - open: '開く', - or: 'または', - order: '表示順', - pageNotFound: 'ページが見つかりません', - password: 'パスワード', - payloadSettings: 'Payload 設定', - perPage: '表示件数: {{limit}}', - remove: '削除', - reset: 'リセット', - row: '列', - rows: '列', - save: '保存', - saving: '保存しています...', - searchBy: '{{label}} で検索', - selectAll: 'すべての{{count}}つの{{label}}を選択', - selectAllRows: 'すべての行を選択します', - selectValue: '値を選択', - selectedCount: '{{count}}つの{{label}}を選択中', - showAllLabel: 'すべての{{label}}を表示する', - sorryNotFound: '申し訳ありません。リクエストに対応する内容が見つかりませんでした。', - sort: '並び替え', - sortByLabelDirection: '{{label}}により並べ替え {{direction}}', - stayOnThisPage: 'この画面にとどまる', - submissionSuccessful: '送信が成功しました。', - submit: '送信', - successfullyCreated: '{{label}} が作成されました。', - thisLanguage: 'Japanese', - titleDeleted: '{{label}} "{{title}}" が削除されました。', - unauthorized: '未認証', - unsavedChangesDuplicate: '未保存の変更があります。複製を続けますか?', - untitled: 'Untitled', - updatedAt: '更新日', - updatedCountSuccessfully: '{{count}}つの{{label}}を正常に更新しました。', - updatedSuccessfully: '更新成功。', - updating: '更新中', - welcome: 'ようこそ', - }, - operators: { - contains: '含む', - equals: '等しい', - exists: '存在す', - isGreaterThan: 'より大きい', - isGreaterThanOrEqualTo: '以上', - isIn: 'あります', - isLessThan: 'より小さい', - isLessThanOrEqualTo: '以下', - isLike: 'のような', - isNotEqualTo: '等しくない', - isNotIn: '入っていません', - near: '近く', - }, - upload: { - crop: 'クロップ', - cropToolDescription: - '選択したエリアのコーナーをドラッグしたり、新たなエリアを描画したり、下記の値を調整してください。', - dragAndDrop: 'ファイルをドラッグ アンド ドロップする', - editImage: '画像を編集する', - focalPoint: '焦点', - focalPointDescription: 'プレビュー上で焦点を直接ドラッグするか、下の値を調整してください。', - height: '高さ', - previewSizes: 'プレビューサイズ', - selectCollectionToBrowse: '閲覧するコレクションを選択', - selectFile: 'ファイルを選択', - setCropArea: 'クロップエリアを設定する', - setFocalPoint: '焦点を設定する', - sizesFor: '{{label}}のサイズ', - width: '横幅', - }, - validation: { - fieldHasNo: '{{label}} が必要です。', - limitReached: '制限に達しました、{{max}}個以上のアイテムを追加することはできません。', - required: '必須フィールドです。', - requiresAtLeast: '少なくとも {{count}} {{label}} 以上が必要です。', - }, - version: { - aboutToPublishSelection: '選択中のすべての{{label}}を公開しようとしています。よろしいですか?', - aboutToRestore: - 'この {{label}} データを {{versionDate}} 時点のバージョンに復元しようとしています。', - aboutToRestoreGlobal: - 'グローバルな {{label}} データを {{versionDate}} 時点のバージョンに復元しようとしています。', - aboutToRevertToPublished: - 'このデータの変更を公開時の状態に戻そうとしています。よろしいですか?', - aboutToUnpublish: 'このデータを非公開にしようとしています。よろしいですか?', - aboutToUnpublishSelection: - '選択したすべての{{label}}の公開を取り消そうとしています。よろしいですか?', - autosave: '自動保存', - autosavedSuccessfully: '自動保存に成功しました。', - changed: '変更済み', - compareVersion: 'バージョンを比較:', - confirmPublish: '公開を確認する', - confirmRevertToSaved: '保存された状態に戻す確認', - confirmUnpublish: '非公開の確認', - confirmVersionRestoration: 'バージョン復元の確認', - draft: 'ドラフト', - draftSavedSuccessfully: '下書きは正常に保存されました。', - lastSavedAgo: '{{distance}}前に最後に保存されました', - noFurtherVersionsFound: 'その他のバージョンは見つかりませんでした。', - noRowsFound: '{{label}} は未設定です', - preview: 'プレビュー', - problemRestoringVersion: 'このバージョンの復元に問題がありました。', - publish: '公開する', - publishChanges: '変更内容を公開', - published: '公開済み', - publishing: '公開', - restoreThisVersion: 'このバージョンを復元', - restoredSuccessfully: '正常に復元されました。', - restoring: '復元しています...', - revertToPublished: '公開時の内容に戻す', - saveDraft: 'ドラフトを保存', - selectLocales: '表示するロケールを選択', - selectVersionToCompare: '比較するバージョンを選択', - showLocales: 'ロケールを表示:', - status: 'ステータス', - type: 'タイプ', - unpublish: '非公開', - unpublishing: '非公開中...', - version: 'バージョン', - versionCreatedOn: '{{version}} 作成日時:', - versionID: 'バージョンID', - versions: 'バージョン', - viewingVersion: '表示バージョン: {{entityLabel}} {{documentTitle}}', - viewingVersionGlobal: '表示バージョン: グローバルな {{entityLabel}}', - viewingVersions: '表示バージョン: {{entityLabel}} {{documentTitle}}', - viewingVersionsGlobal: '表示バージョン: グローバルな {{entityLabel}}', - }, -} diff --git a/packages/translations/src/_generatedFiles_/client/ko.js b/packages/translations/src/_generatedFiles_/client/ko.js deleted file mode 100644 index 4a6635c390..0000000000 --- a/packages/translations/src/_generatedFiles_/client/ko.js +++ /dev/null @@ -1,288 +0,0 @@ -export default { - authentication: { - account: '계정', - accountOfCurrentUser: '현재 사용자의 계정', - alreadyActivated: '이미 활성화됨', - alreadyLoggedIn: '이미 로그인됨', - backToLogin: '로그인 화면으로 돌아가기', - beginCreateFirstUser: '시작하려면 첫 번째 사용자를 생성하세요.', - changePassword: '비밀번호 변경', - confirmGeneration: '생성 확인', - confirmPassword: '비밀번호 확인', - createFirstUser: '첫 번째 사용자 생성', - emailNotValid: '입력한 이메일은 유효하지 않습니다.', - emailSent: '이메일 전송됨', - enableAPIKey: 'API 키 활성화', - failedToUnlock: '잠금 해제 실패', - forceUnlock: '강제 잠금 해제', - forgotPassword: '비밀번호를 잊으셨나요?', - forgotPasswordEmailInstructions: - '아래에 이메일을 입력하세요. 비밀번호를 재설정하는 방법에 대한 안내가 포함된 이메일 메시지를 받게 될 것입니다.', - forgotPasswordQuestion: '비밀번호를 잊으셨나요?', - generate: '생성', - generateNewAPIKey: '새로운 API 키 생성', - logBackIn: '다시 로그인', - logOut: '로그아웃', - loggedOutInactivity: '보안을 위해 일정 시간 동안 활동하지 않아 로그아웃되었습니다.', - loggedOutSuccessfully: '로그아웃되었습니다.', - login: '로그인', - logout: '로그아웃', - logoutUser: '현재 사용자 로그아웃', - newAPIKeyGenerated: '새로운 API 키가 생성되었습니다.', - newPassword: '새로운 비밀번호', - resetPassword: '비밀번호 재설정', - stayLoggedIn: '로그인 상태 유지', - successfullyUnlocked: '잠금 해제 성공', - unableToVerify: '확인할 수 없음', - verified: '확인됨', - verifiedSuccessfully: '성공적으로 확인됨', - verify: '확인', - verifyUser: '현재 사용자 확인', - youAreInactive: - '잠시 활동하지 않았으며 보안을 위해 곧 자동 로그아웃됩니다. 로그인 상태를 유지하시겠습니까?', - }, - error: { - autosaving: '이 문서를 자동 저장하는 중에 문제가 발생했습니다.', - correctInvalidFields: '입력하신 내용을 확인해주세요.', - deletingTitle: - '{{title}} 삭제하는 중에 오류가 발생했습니다. 인터넷 연결을 확인하고 다시 시도하세요.', - loadingDocument: 'ID가 {{id}}인 문서를 불러오는 중에 문제가 발생했습니다.', - noMatchedField: '"{{label}}"에 대한 일치하는 입력란이 없습니다.', - notAllowedToAccessPage: '이 페이지에 접근할 권한이 없습니다.', - previewing: '이 문서를 미리보는 중에 문제가 발생했습니다.', - unableToDeleteCount: '총 {{total}}개 중 {{count}}개의 {{label}}을(를) 삭제할 수 없습니다.', - unableToUpdateCount: '총 {{total}}개 중 {{count}}개의 {{label}}을(를) 업데이트할 수 없습니다.', - unauthorized: '권한 없음, 이 요청을 수행하려면 로그인해야 합니다.', - unknown: '알 수 없는 오류가 발생했습니다.', - unspecific: '오류가 발생했습니다.', - }, - fields: { - addLabel: '{{label}} 추가', - addLink: '링크 추가', - addNew: '새로 추가', - addNewLabel: '새로운 {{label}} 추가', - addRelationship: '관계 추가', - addUpload: '업로드 추가', - block: '블록', - blockType: '블록 유형', - blocks: '블록', - chooseFromExisting: '기존 항목 중 선택', - collapseAll: '모두 접기', - editLink: '링크 수정', - editRelationship: '관계 수정', - itemsAndMore: '{{items}} 및 {{count}}개 더', - labelRelationship: '{{label}} 관계', - latitude: '위도', - linkedTo: '<0>{{label}}에 연결됨', - longitude: '경도', - passwordsDoNotMatch: '비밀번호가 일치하지 않습니다.', - removeRelationship: '관계 제거', - removeUpload: '제거', - saveChanges: '변경 사항 저장', - searchForBlock: '블록 검색', - selectFieldsToEdit: '수정할 입력란 선택', - showAll: '모두 표시', - swapRelationship: '관계 교체', - swapUpload: '업로드 교체', - toggleBlock: '블록 토글', - uploadNewLabel: '새로운 {{label}} 업로드', - }, - general: { - aboutToDelete: '{{label}} <1>{{title}}를 삭제하려고 합니다. 계속하시겠습니까?', - aboutToDeleteCount_many: '{{label}}를 {{count}}개 삭제하려고 합니다.', - aboutToDeleteCount_one: '{{label}}를 {{count}}개 삭제하려고 합니다.', - aboutToDeleteCount_other: '{{label}}를 {{count}}개 삭제하려고 합니다.', - addBelow: '아래에 추가', - addFilter: '필터 추가', - adminTheme: '관리자 테마', - and: '및', - applyChanges: '변경 사항 적용', - ascending: '오름차순', - automatic: '자동 설정', - backToDashboard: '대시보드로 돌아가기', - cancel: '취소', - changesNotSaved: '변경 사항이 저장되지 않았습니다. 지금 떠나면 변경 사항을 잃게 됩니다.', - close: '닫기', - collapse: '접기', - collections: '컬렉션', - columnToSort: '정렬할 열', - columns: '열', - confirm: '확인', - confirmDeletion: '삭제하시겠습니까?', - confirmDuplication: '복제하시겠습니까?', - copied: '복사됨', - copy: '복사', - create: '생성', - createNew: '새로 생성', - createNewLabel: '새로운 {{label}} 생성', - created: '생성됨', - creating: '생성 중', - creatingNewLabel: '{{label}} 생성 중', - dark: '다크', - dashboard: '대시보드', - delete: '삭제', - deletedCountSuccessfully: '{{count}}개의 {{label}}를 삭제했습니다.', - deleting: '삭제 중...', - descending: '내림차순', - deselectAllRows: '모든 행 선택 해제', - duplicate: '복제', - duplicateWithoutSaving: '변경 사항 저장 없이 복제', - edit: '수정', - editLabel: '{{label}} 수정', - editing: '수정 중', - editingLabel_many: '{{count}}개의 {{label}} 수정 중', - editingLabel_one: '{{count}}개의 {{label}} 수정 중', - editingLabel_other: '{{count}}개의 {{label}} 수정 중', - email: '이메일', - emailAddress: '이메일 주소', - enterAValue: '값을 입력하세요', - error: '오류', - errors: '오류', - fallbackToDefaultLocale: '기본 locale로 대체', - filterWhere: '{{label}} 필터링 조건', - filters: '필터', - globals: '글로벌', - language: '언어', - lastModified: '마지막 수정 일시', - leaveAnyway: '그래도 나가시겠습니까?', - leaveWithoutSaving: '저장하지 않고 나가기', - light: '라이트', - livePreview: '실시간 미리보기', - loading: '불러오는 중', - locale: 'locale', - menu: '메뉴', - moveDown: '아래로 이동', - moveUp: '위로 이동', - noFiltersSet: '설정된 필터 없음', - noLabel: '<{{label}} 없음>', - noOptions: '옵션 없음', - noResults: - '{{label}}를 찾을 수 없습니다. 아직 {{label}}이 없거나 설정한 필터와 일치하는 것이 없습니다.', - noValue: '값 없음', - none: '없음', - notFound: '찾을 수 없음', - nothingFound: '찾을 수 없습니다', - of: '의', - open: '열기', - or: '또는', - order: '순서', - pageNotFound: '페이지를 찾을 수 없음', - password: '비밀번호', - payloadSettings: 'Payload 설정', - perPage: '페이지당 개수: {{limit}}', - remove: '제거', - reset: '초기화', - row: '행', - rows: '행', - save: '저장', - saving: '저장 중...', - searchBy: '{{label}}로 검색', - selectAll: '{{count}}개 {{label}} 모두 선택', - selectAllRows: '모든 행 선택', - selectValue: '값 선택', - selectedCount: '{{count}}개의 {{label}} 선택됨', - showAllLabel: '{{label}} 모두 표시', - sorryNotFound: '죄송합니다. 요청과 일치하는 항목이 없습니다.', - sort: '정렬', - sortByLabelDirection: '{{label}} {{direction}}으로 정렬', - stayOnThisPage: '이 페이지에 머무르기', - submissionSuccessful: '제출이 완료되었습니다.', - submit: '제출', - successfullyCreated: '{{label}}이(가) 생성되었습니다.', - thisLanguage: '한국어', - titleDeleted: '{{label}} "{{title}}"을(를) 삭제했습니다.', - unauthorized: '권한 없음', - unsavedChangesDuplicate: '저장되지 않은 변경 사항이 있습니다. 복제를 계속하시겠습니까?', - untitled: '제목 없음', - updatedAt: '업데이트 일시', - updatedCountSuccessfully: '{{count}}개의 {{label}}을(를) 업데이트했습니다.', - updatedSuccessfully: '성공적으로 업데이트되었습니다.', - updating: '업데이트 중', - welcome: '환영합니다', - }, - operators: { - contains: '포함', - equals: '같음', - exists: '존재', - isGreaterThan: '보다 큼', - isGreaterThanOrEqualTo: '보다 크거나 같음', - isIn: '포함됨', - isLessThan: '보다 작음', - isLessThanOrEqualTo: '보다 작거나 같음', - isLike: '유사', - isNotEqualTo: '같지 않음', - isNotIn: '포함되지 않음', - near: '근처', - }, - upload: { - crop: '자르기', - cropToolDescription: - '선택한 영역의 모퉁이를 드래그하거나 새로운 영역을 그리거나 아래의 값을 조정하세요.', - dragAndDrop: '파일을 끌어다 놓으세요', - editImage: '이미지 수정', - focalPoint: '초점', - focalPointDescription: '미리보기에서 초점을 직접 드래그하거나 아래의 값을 조정하세요.', - height: '높이', - previewSizes: '미리보기 크기', - selectCollectionToBrowse: '찾을 컬렉션 선택', - selectFile: '파일 선택', - setCropArea: '자르기 영역 설정', - setFocalPoint: '초점 설정', - sizesFor: '{{label}} 크기', - width: '너비', - }, - validation: { - fieldHasNo: '이 입력란에는 {{label}}이(가) 없습니다.', - limitReached: '제한에 도달했습니다. {{max}}개 항목만 추가할 수 있습니다.', - required: '이 입력란은 필수입니다.', - requiresAtLeast: '이 입력란운 최소한 {{count}} {{label}}이 필요합니다.', - }, - version: { - aboutToPublishSelection: '선택한 {{label}}을(를) 게시하려고 합니다. 계속하시겠습니까?', - aboutToRestore: '이 {{label}} 문서를 {{versionDate}}기준 버전으로 복원하려고 합니다.', - aboutToRestoreGlobal: '글로벌 {{label}}을(를) {{versionDate}}기준 버전으로 복원하려고 합니다.', - aboutToRevertToPublished: - '이 문서의 변경 사항을 게시된 상태로 되돌리려고 합니다. 계속하시겠습니까?', - aboutToUnpublish: '이 문서를 게시 해제하려고 합니다. 계속하시겠습니까?', - aboutToUnpublishSelection: '선택한 {{label}}을(를) 게시 해제하려고 합니다. 계속하시겠습니까?', - autosave: '자동 저장', - autosavedSuccessfully: '자동 저장이 완료되었습니다.', - changed: '변경됨', - compareVersion: '비교할 버전 선택:', - confirmPublish: '게시하기', - confirmRevertToSaved: '저장된 상태로 되돌리기', - confirmUnpublish: '게시 해제하기', - confirmVersionRestoration: '버전 복원하기', - draft: '초안', - draftSavedSuccessfully: '초안이 저장되었습니다.', - lastSavedAgo: '마지막으로 저장한지 {{distance}} 전', - noFurtherVersionsFound: '더 이상의 버전을 찾을 수 없습니다.', - noRowsFound: '{{label}}을(를) 찾을 수 없음', - preview: '미리보기', - problemRestoringVersion: '이 버전을 복원하는 중 문제가 발생했습니다.', - publish: '게시', - publishChanges: '변경 사항 게시', - published: '게시됨', - publishing: '게시', - restoreThisVersion: '이 버전 복원', - restoredSuccessfully: '복원이 완료되었습니다.', - restoring: '복원 중...', - revertToPublished: '게시된 상태로 되돌리기', - saveDraft: '초안 저장', - selectLocales: '표시할 locale 선택', - selectVersionToCompare: '비교할 버전 선택', - showLocales: 'locale 표시:', - status: '상태', - type: '유형', - unpublish: '게시 해제', - unpublishing: '게시 해제 중...', - version: '버전', - versionCreatedOn: '{{version}} 생성 날짜:', - versionID: '버전 ID', - versions: '버전', - viewingVersion: '{{entityLabel}} {{documentTitle}}의 버전 보기', - viewingVersionGlobal: '글로벌 {{entityLabel}}의 버전 보기', - viewingVersions: '{{entityLabel}} {{documentTitle}}에 대한 버전 보기', - viewingVersionsGlobal: '글로벌 {{entityLabel}}에 대한 버전 보기', - }, -} diff --git a/packages/translations/src/_generatedFiles_/client/my.js b/packages/translations/src/_generatedFiles_/client/my.js deleted file mode 100644 index e0522b2ddb..0000000000 --- a/packages/translations/src/_generatedFiles_/client/my.js +++ /dev/null @@ -1,297 +0,0 @@ -export default { - authentication: { - account: 'အကောင့်', - accountOfCurrentUser: 'သင့် အကောင့်', - alreadyActivated: 'အတည်ပြုပြီး', - alreadyLoggedIn: 'ဝင်ရောက်ပြီးသား', - backToLogin: 'အကောင့်ထဲ ပြန်ဝင်မည်။', - beginCreateFirstUser: 'စတင်နိုင်ရန် ပထမဦးစွာ အသုံးပြုသူအား ဖန်တီးပါ။', - changePassword: 'စကားဝှက် ပြောင်းလဲမည်။', - confirmGeneration: 'Generation အတည်ပြု', - confirmPassword: 'စကားဝှက်အား ထပ်မံ ရိုက်ထည့်ပါ။', - createFirstUser: 'ပထမဆုံး အသုံးပြုသူကို ဖန်တီးပါ။', - emailNotValid: 'ထည့်သွင်းထားသော အီးမေလ်မှာ မှားယွင်းနေပါသည်။', - emailSent: 'မေးလ် ပို့ထားပါသည်။', - enableAPIKey: 'API Key ကိုဖွင့်ရန်', - failedToUnlock: 'လော့ခ်ဖွင့်၍မရပါ။', - forceUnlock: 'လော့ခ်ဖွင့်ရန်', - forgotPassword: 'စကားဝှက် မေ့နေပါသလား။', - forgotPasswordEmailInstructions: - 'ကျေးဇူးပြု၍ သင့်အီးမေးလ်ကို ထည့်သွင်းပါ။ သင့်စကားဝှက်ကို ပြန်လည်သတ်မှတ်နိုင်ရန် အီးမေးလ်စာတစ်စောင်ကို သင်လက်ခံရရှိမည်ဖြစ်သည်။', - forgotPasswordQuestion: 'စကားဝှက် မေ့နေပါသလား။', - generate: 'Generate', - generateNewAPIKey: 'API key အသစ်ဖန်တီးရန်', - logBackIn: 'အကောင့်ထဲ ပြန်ဝင်မည်။', - logOut: 'အကောင့်ထဲက ထွက်မည်။', - loggedOutInactivity: 'လုပ်ဆောင်ချက်မရှိခြင်းကြောင့် သင်သည် ထွက်လိုက်ပါသည်။', - loggedOutSuccessfully: 'သင်သည် အောင်မြင်စွာ ထွက်ပြီးပါပြီ။', - login: 'အကောင့်ထဲ ဝင်မည်။', - logout: 'အကောင့်မှ ထွက်မည်၊', - logoutUser: 'လော့ဂ်အောက် အသုံးပြုသူ', - newAPIKeyGenerated: 'New API Key Generated.', - newPassword: 'စကားဝှက် အသစ်', - resetPassword: 'စကားဝှက် ပြန်လည်သတ်မှတ်', - stayLoggedIn: 'အကောင့်ထဲ ဝင်ထားသည်။', - successfullyUnlocked: 'အောင်မြင်စွာသော့ဖွင့်ခဲ့သည်။', - unableToVerify: 'စိစစ်၍မရပါ။', - verified: 'စိစစ်ပြီး', - verifiedSuccessfully: 'အတည်ပြုပြီးပါပြီ။', - verify: 'စိစစ်ခြင်း', - verifyUser: 'အသုံးပြုသူ စီစစ်ခြင်း', - youAreInactive: - 'သင်သည် အချိန်အနည်းငယ်အတွင်း active မဖြစ်ပါက သင့်အကောင့် လုံခြုံရေးအတွက် မကြာမီ အလိုအလျောက် လော့ဂ်အောက်ဖြစ်ပါမည်။ အကောင့်ထဲ ဆက်နေလိုပါသလား။', - }, - error: { - autosaving: 'ဖိုင်ကို အလိုအလျောက်သိမ်းဆည်းရာတွင် ပြဿနာတစ်ခုရှိနေသည်။', - correctInvalidFields: 'ကျေးဇူးပြု၍ အချက်အလက်များကို ပြန်လည် စစ်ဆေးပါ။', - deletingTitle: - '{{title}} ကို ဖျက်ရာတွင် အမှားအယွင်းရှိခဲ့သည်။ သင့် အင်တာနက်လိုင်းအား စစ်ဆေးပြီး ထပ်မံကြို့စားကြည့်ပါ။', - loadingDocument: '{{id}} ID ဖြင့် ဖိုင်ကို ဖွင့်ရာတွင် ပြဿနာရှိနေသည်။', - noMatchedField: '"{{label}}" အတွက် ကိုက်ညီသောအပိုင်းကို ရှာမတွေ့ပါ။', - notAllowedToAccessPage: 'ဤစာမျက်နှာကို ဝင်ရောက်ခွင့်မပြုပါ။', - previewing: 'ဖိုင်ကို အစမ်းကြည့်ရန် ပြဿနာရှိနေသည်။', - unableToDeleteCount: '{{total}} {{label}} မှ {{count}} ကို ဖျက်၍မရပါ။', - unableToUpdateCount: '{{total}} {{label}} မှ {{count}} ကို အပ်ဒိတ်လုပ်၍မရပါ။', - unauthorized: 'အခွင့်မရှိပါ။ ဤတောင်းဆိုချက်ကို လုပ်ဆောင်နိုင်ရန် သင်သည် လော့ဂ်အင်ဝင်ရပါမည်။', - unknown: 'ဘာမှန်းမသိသော error တက်သွားပါသည်။', - unspecific: 'Error တက်နေပါသည်။', - }, - fields: { - addLabel: '{{label}} ထည့်သွင်းမည်။', - addLink: 'လင့်ခ်ထည့်ပါ။', - addNew: 'အသစ် ထည့်သွင်းမည်။', - addNewLabel: '{{label}} အားအသစ် ထည့်သွင်းမည်။', - addRelationship: 'Relationship အသစ်ထည့်သွင်းမည်။', - addUpload: 'Upload ထည့်ပါ။', - block: 'ဘလောက်', - blockType: 'ဘလောက် အမျိုးအစား', - blocks: 'ဘလောက်များ', - chooseFromExisting: 'ရှိပြီးသားထဲကပဲ ရွေးချယ်ပါ။', - collapseAll: 'အားလုံးကို ခေါက်သိမ်းပါ။', - editLink: 'လင့်ခ်ကို တည်းဖြတ်ပါ။', - editRelationship: 'ဆက်ဆံရေးကို တည်းဖြတ်ပါ။', - itemsAndMore: '{{items}} နှင့် နောက်ထပ် {{count}} ခု', - labelRelationship: '{{label}} Relationship', - latitude: 'vĩ độ', - linkedTo: '<0>{{label}} ချိတ်ဆက်ထားသည်။', - longitude: 'လောင်ဂျီကျု', - passwordsDoNotMatch: 'စကားဝှက်များနှင့် မကိုက်ညီပါ။', - removeRelationship: 'ဆက်ဆံရေးကို ဖယ်ရှားပါ။', - removeUpload: 'အပ်လုဒ်ကို ဖယ်ရှားပါ။', - saveChanges: 'သိမ်းဆည်းမည်။', - searchForBlock: 'ဘလောက်တစ်ခုရှာမည်။', - selectFieldsToEdit: 'တည်းဖြတ်ရန် အကွက်များကို ရွေးပါ။', - showAll: 'အကုန် ကြည့်မည်။', - swapRelationship: 'လဲလှယ်ဆက်ဆံရေး', - swapUpload: 'အပ်လုဒ်ဖလှယ်ပါ။', - toggleBlock: 'ဘလောက်ကို ပြောင်းပါ။', - uploadNewLabel: '{{label}} အသစ်တင်မည်။', - }, - general: { - aboutToDelete: - '{{label}} <1>{{title}} ကို ဖျက်ပါတော့မည်။ သေချာပြီလား။ ဖျက်ပြီးရင် ပြန်မရဘူးနော်။', - aboutToDeleteCount_many: 'သင်သည် {{count}} {{label}} ကို ဖျက်ပါတော့မည်။', - aboutToDeleteCount_one: 'သင်သည် {{count}} {{label}} ကို ဖျက်ပါတော့မည်။', - aboutToDeleteCount_other: 'သင်သည် {{count}} {{label}} ကို ဖျက်ပါတော့မည်။', - addBelow: 'အောက်တွင်ထည့်ပါ။', - addFilter: 'ဇကာထည့်ပါ။', - adminTheme: 'အက်ပ်ဒိုင်များစပ်စွာ', - and: 'နှင့်', - applyChanges: 'ပြောင်းလဲမှုများ အသုံးပြုပါ', - ascending: 'တက်နေသည်', - automatic: 'အော်တို', - backToDashboard: 'ပင်မစာမျက်နှာသို့ ပြန်သွားမည်။', - cancel: 'မလုပ်တော့ပါ။', - changesNotSaved: - 'သင်၏ပြောင်းလဲမှုများကို မသိမ်းဆည်းရသေးပါ။ ယခု စာမျက်နှာက ထွက်လိုက်ပါက သင်၏ပြောင်းလဲမှုများ အကုန် ဆုံးရှုံးသွားပါမည်။ အကုန်နော်။', - close: 'ပိတ်', - collapse: 'ခေါက်သိမ်းပါ။', - collections: 'စုစည်းမှူများ', - columnToSort: 'ကော်လံ စီရန်', - columns: 'ကော်လံများ', - confirm: 'သေချာပါပြီ။', - confirmDeletion: 'ဖျက်တော့မယ်နော်။', - confirmDuplication: 'ပုံတူပွားခြင်းကို အတည်ပြုပါ။', - copied: 'ကူးယူပြီးပြီ။', - copy: 'ကူးယူမည်။', - create: 'ဖန်တီးမည်။', - createNew: 'အသစ် ဖန်တီးမည်။', - createNewLabel: '{{label}} အသစ် ဖန်တီးမည်။', - created: 'ဖန်တီးခဲ့သည်။', - creating: 'ဖန်တီးနေသည်။', - creatingNewLabel: '{{label}} အသစ် ဖန်တီးနေသည်။', - dark: 'အမှောင်', - dashboard: 'ပင်မစာမျက်နှာ', - delete: 'ဖျက်မည်။', - deletedCountSuccessfully: '{{count}} {{label}} ကို အောင်မြင်စွာ ဖျက်လိုက်ပါပြီ။', - deleting: 'ဖျက်နေဆဲ ...', - descending: 'ဆင်းသက်လာသည်။', - deselectAllRows: 'အားလုံးကို မရွေးနိုင်ပါ', - duplicate: 'ပုံတူပွားမည်။', - duplicateWithoutSaving: 'သေချာပါပြီ။', - edit: 'တည်းဖြတ်ပါ။', - editLabel: '{{label}} ပြင်ဆင်မည်။', - editing: 'ပြင်ဆင်နေသည်။', - editingLabel_many: 'တည်းဖြတ်ခြင်း {{count}} {{label}}', - editingLabel_one: 'တည်းဖြတ်ခြင်း {{count}} {{label}}', - editingLabel_other: 'တည်းဖြတ်ခြင်း {{count}} {{label}}', - email: 'အီးမေးလ်', - emailAddress: 'အီးမေးလ် လိပ်စာ', - enterAValue: 'တန်ဖိုးတစ်ခုထည့်ပါ။', - error: 'အမှား', - errors: 'အမှားများ', - fallbackToDefaultLocale: 'မူရင်းဒေသသို့ ပြန်ပြောင်းပါ။', - filterWhere: 'နေရာတွင် စစ်ထုတ်ပါ။', - filters: 'စစ်ထုတ်မှုများ', - globals: 'Globals', - language: 'ဘာသာစကား', - lastModified: 'နောက်ဆုံးပြင်ဆင်ထားသည်။', - leaveAnyway: 'ဘာဖြစ်ဖြစ် ထွက်မည်။', - leaveWithoutSaving: 'မသိမ်းဘဲ ထွက်မည်။', - light: 'အလင်း', - livePreview: 'အစမ်းကြည့်ရန်', - loading: 'ဖွင့်နေသည်', - locale: 'ဒေသ', - menu: 'မီနူး', - moveDown: 'Move Down', - moveUp: 'Move Up', - noFiltersSet: 'စစ်ထုတ်မှုများ မသတ်မှတ်ထားပါ။', - noLabel: '<မရှိ {{label}}>', - noOptions: 'ရွေးချယ်မှုမရှိပါ', - noResults: - '{{label}} မတွေ့ပါ။ {{label}} မရှိသေးသည်ဖြစ်စေ အထက်တွင်ဖော်ပြထားသော စစ်ထုတ်မှုများနှင့် ကိုက်ညီမှုမရှိပါ။', - noValue: 'တန်ဖိုး မရှိပါ။', - none: 'တစ်ခုမှ', - notFound: 'ဘာမှ မရှိတော့ဘူး။', - nothingFound: 'ဘာမှလည်း မတွေ့ဘူး။', - of: '၏', - open: 'ဖွင့်မည်။', - or: 'သို့မဟုတ်', - order: 'အစဉ်လိုက်', - pageNotFound: 'ရောက်ရှိနေသော စာမျက်နှာသည် မရှိပါ။', - password: 'စကားဝှက်', - payloadSettings: 'ရွေးချယ်စရာများ', - perPage: 'စာမျက်နှာ အလိုက်: {{limit}}', - remove: 'ဖယ်ရှားမည်။', - reset: 'Tetapkan semula', - row: 'အတန်း', - rows: 'Rows', - save: 'သိမ်းဆည်းမည်။', - saving: 'သိမ်းနေဆဲ ...', - searchBy: 'ရှာဖွေပါ။', - selectAll: '{{count}} {{label}} အားလုံးကို ရွေးပါ', - selectAllRows: 'အားလုံးကိုရွေးချယ်ပါ', - selectValue: 'တစ်ခုခုကို ရွေးချယ်ပါ။', - selectedCount: '{{count}} {{label}} ကို ရွေးထားသည်။', - showAllLabel: 'Tunjukkan semua {{label}}', - sorryNotFound: 'ဝမ်းနည်းပါသည်။ သင်ရှာနေတဲ့ဟာ ဒီမှာမရှိပါ။', - sort: 'အစဉ်လိုက်', - sortByLabelDirection: 'အစဉ်အလိုက် စီမံခန့်ခွဲထားသည် {{label}} {{direction}}', - stayOnThisPage: 'ဒီမှာပဲ ဆက်နေမည်။', - submissionSuccessful: 'သိမ်းဆည်းမှု အောင်မြင်ပါသည်။', - submit: 'သိမ်းဆည်းမည်။', - successfullyCreated: '{{label}} အောင်မြင်စွာဖန်တီးခဲ့သည်။', - thisLanguage: 'မြန်မာစာ', - titleDeleted: '{{label}} {{title}} အောင်မြင်စွာ ဖျက်သိမ်းခဲ့သည်။', - unauthorized: 'အခွင့်မရှိပါ။', - unsavedChangesDuplicate: - 'သင့်တွင် မသိမ်းဆည်းရသေးသော ပြောင်းလဲမှုများ ရှိနေပါသည်။ ပုံတူပွားမှာ သေချာပြီလား။', - untitled: 'ခေါင်းစဥ်မဲ့', - updatedAt: 'ပြင်ဆင်ခဲ့သည့်အချိန်', - updatedCountSuccessfully: '{{count}} {{label}} ကို အောင်မြင်စွာ အပ်ဒိတ်လုပ်ခဲ့သည်။', - updatedSuccessfully: 'အပ်ဒိတ်လုပ်ပြီးပါပြီ။', - updating: 'ပြင်ဆင်ရန်', - welcome: 'ကြိုဆိုပါတယ်။', - }, - operators: { - contains: 'ပါဝင်သည်', - equals: 'ညီမျှ', - exists: 'တည်ရှိသည်', - isGreaterThan: 'ထက်ကြီးသည်', - isGreaterThanOrEqualTo: 'ထက်ကြီးသည် သို့မဟုတ် ညီမျှသည်', - isIn: 'ရှိ', - isLessThan: 'ထက်နည်းသည်', - isLessThanOrEqualTo: 'ထက်နည်းသည် သို့မဟုတ် ညီမျှသည်', - isLike: 'တူသည်', - isNotEqualTo: 'ညီမျှသည်', - isNotIn: 'မဝင်ပါ', - near: 'နီး', - }, - upload: { - crop: 'သုန်း', - cropToolDescription: - 'ရွေးထားသည့်ဧရိယာတွင်မွေးလျှက်မှုများကိုဆွဲပြီး, အသစ်တည်ပြီးသို့မဟုတ်အောက်ပါတ', - dragAndDrop: 'ဖိုင်တစ်ဖိုင်ကို ဆွဲချလိုက်ပါ။', - editImage: 'ပုံပြင်ပြောင်းရန်', - focalPoint: 'အကန့်အသတ်ချုပ်', - focalPointDescription: - 'ပြသနားရထားသည့်ပုံအားထိန်းသိမ်းရန် ဖိုကယ်ပိုင်းကို တိုက်ရိုက်ပွဲ့နိုင်သည် သို', - height: 'Height', - previewSizes: 'Saiz Pratonton', - selectCollectionToBrowse: 'စုစည်းမှု တစ်ခုခုကို ရွေးချယ်ပါ။', - selectFile: 'ဖိုင်ရွေးပါ။', - setCropArea: 'စပြန်းနယ်မြေထားပါ', - setFocalPoint: 'အစေခံဖောက်ရေစနစ်ကိုသတ်မှတ်ပါ', - sizesFor: '{{label}} အတွက် အရွယ်အစားများ', - width: 'အကျယ်', - }, - validation: { - fieldHasNo: 'ဤအကွက်တွင် {{label}} မရှိပါ။', - limitReached: - 'Had yang dibenarkan telah dicapai, hanya {{max}} item sahaja yang boleh ditambah.', - required: 'ဤအကွက်ကို လိုအပ်သည်။', - requiresAtLeast: 'ဤအကွက်သည် အနည်းဆုံး {{count}} {{label}} လိုအပ်သည်', - }, - version: { - aboutToPublishSelection: - 'သင်သည် ရွေးချယ်မှုတွင် {{label}} အားလုံးကို ထုတ်ဝေပါတော့မည်။ သေချာလား?', - aboutToRestore: - 'သင်သည် ဤ {{label}} စာရွက်စာတမ်းကို {{versionDate}} တွင် ပါရှိသည့် အခြေအနေသို့ ပြန်ယူတော့မည်။', - aboutToRestoreGlobal: - 'သင်သည် ဂလိုဘယ် {{label}} ကို {{versionDate}} တွင် ပါရှိသည့် အခြေအနေသို့ ပြန်လည်ရောက်ရှိတော့မည်ဖြစ်သည်။', - aboutToRevertToPublished: - 'သင်သည် အပြောင်းအလဲများကို အများဆိုင် အခြေအနေသို့ ပြန်ပြောင်းပါတော့မည်။ သေချာလား?', - aboutToUnpublish: 'အများဆိုင်မှ ပြန်ဖြုတ်တော့မည်။ သေချာလား', - aboutToUnpublishSelection: - 'သင်သည် ရွေးချယ်မှုတွင် {{label}} အားလုံးကို ထုတ်ဝေတော့မည် ဖြစ်သည်။ သေချာလား?', - autosave: 'အလိုအလျောက်သိမ်းဆည်းပါ။', - autosavedSuccessfully: 'အလိုအလျောက် သိမ်းဆည်းပြီးပါပြီ။', - changed: 'ပြောင်းခဲ့သည်။', - compareVersion: 'ဗားရှင်းနှင့် နှိုင်းယှဉ်ချက်:', - confirmPublish: 'ထုတ်ဝေအတည်ပြုပါ။', - confirmRevertToSaved: 'သိမ်းဆည်းပြီးကြောင်း အတည်ပြုပါ။', - confirmUnpublish: 'အများဆိုင်ကို ဖျက်ရန် အတည်ပြုပါ။', - confirmVersionRestoration: 'ဗားရှင်းပြန်လည် အသုံးပြုခြင်းကို အတည်ပြုပါ။', - draft: 'မူကြမ်း', - draftSavedSuccessfully: 'မူကြမ်းကို အောင်မြင်စွာ သိမ်းဆည်းပြီးပါပြီ။', - lastSavedAgo: 'နောက်ဆုံး သိမ်းချက် {{distance}} ကြာပြီး', - noFurtherVersionsFound: 'နောက်ထပ်ဗားရှင်းများ မတွေ့ပါ။', - noRowsFound: '{{label}} အားမတွေ့ပါ။', - preview: 'နမူနာပြရန်', - problemRestoringVersion: 'ဤဗားရှင်းကို ပြန်လည်ရယူရာတွင် ပြဿနာရှိနေသည်။', - publish: 'ထုတ်ဝေသည်။', - publishChanges: 'အပြောင်းအလဲများကို တင်ခဲ့သည်။', - published: 'တင်ပြီးပြီ။', - publishing: 'ထုတ်ဝေခြင်း', - restoreThisVersion: 'ဤဗားရှင်းကိုကို ပြန်ယူမည်။', - restoredSuccessfully: 'အောင်မြင်စွာ ပြန်လည်ရယူခဲ့သည်။', - restoring: 'ပြန်ယူနေဆဲ...', - revertToPublished: 'အများဆိုင်သို့ ပြန်ပြောင်းပါ။', - saveDraft: 'မှုကြမ်းကို သိမ်းဆည်းမည်။', - selectLocales: 'ပြသရန် ဒေသန္တရများကို ရွေးပါ။', - selectVersionToCompare: 'နှိုင်းယှဉ်ရန် ဗားရှင်းကို ရွေးပါ။', - showLocales: 'ဒေသန္တရများကိုပြပါ။:', - status: 'အခြေအနေ', - type: 'အမျိုးအစား', - unpublish: 'ပြန်ဖြုတ်မည်။', - unpublishing: 'ပြန်ဖြုတ်နေဆဲ ...', - version: 'ဗားရှင်း', - versionCreatedOn: '{{version}} အား ဖန်တီးခဲ့သည်။', - versionID: 'ဗားရှင်း ID', - versions: 'ဗားရှင်းများ', - viewingVersion: '{{entityLabel}} {{documentTitle}} အတွက် ဗားရှင်းကို ကြည့်ရှုနေသည်', - viewingVersionGlobal: '`ဂလိုဘယ်ဆိုင်ရာ {entityLabel}} အတွက် ဗားရှင်းကို ကြည့်ရှုနေသည်', - viewingVersions: '{{entityLabel}} {{documentTitle}} အတွက် ဗားရှင်းများကို ကြည့်ရှုခြင်း', - viewingVersionsGlobal: '`ဂလိုဘယ်ဆိုင်ရာ {{entityLabel}} အတွက် ဗားရှင်းများကို ကြည့်ရှုနေသည်', - }, -} diff --git a/packages/translations/src/_generatedFiles_/client/nb.js b/packages/translations/src/_generatedFiles_/client/nb.js deleted file mode 100644 index b7b71d5deb..0000000000 --- a/packages/translations/src/_generatedFiles_/client/nb.js +++ /dev/null @@ -1,294 +0,0 @@ -export default { - authentication: { - account: 'Konto', - accountOfCurrentUser: 'Konto til nåværende bruker', - alreadyActivated: 'Allerede aktivert', - alreadyLoggedIn: 'Allerede logget inn', - backToLogin: 'Tilbake til innlogging', - beginCreateFirstUser: 'Opprett din første bruker for å fortsette.', - changePassword: 'Endre passord', - confirmGeneration: 'Bekreft generering', - confirmPassword: 'Bekreft passord', - createFirstUser: 'Opprett første bruker', - emailNotValid: 'E-posten er ikke gyldig', - emailSent: 'E-post sendt', - enableAPIKey: 'Aktiver API-nøkkel', - failedToUnlock: 'Kunne ikke låse opp', - forceUnlock: 'Tving opplåsing', - forgotPassword: 'Glemt passord', - forgotPasswordEmailInstructions: - 'Skriv inn e-postadressen din nedenfor, og vi vil sende deg en e-post med instruksjoner om hvordan du tilbakestiller passordet ditt.', - forgotPasswordQuestion: 'Glemt passord?', - generate: 'Generer', - generateNewAPIKey: 'Generer ny API-nøkkel', - logBackIn: 'Logg inn igjen', - logOut: 'Logg ut', - loggedOutInactivity: 'Du har blitt logget ut på grunn av inaktivitet.', - loggedOutSuccessfully: 'Du har blitt logget ut.', - login: 'Logg inn', - logout: 'Logg ut', - logoutUser: 'Logg ut bruker', - newAPIKeyGenerated: 'Ny API-nøkkel generert.', - newPassword: 'Nytt passord', - resetPassword: 'Tilbakestill passord', - stayLoggedIn: 'Forbli logget inn', - successfullyUnlocked: 'Låst opp', - unableToVerify: 'Kunne ikke bekrefte', - verified: 'Bekreftet', - verifiedSuccessfully: 'Bekreftet', - verify: 'Bekreft', - verifyUser: 'Bekreft bruker', - youAreInactive: - 'Du har ikke vært aktiv i en stund, og vil snart bli logget ut automatisk for din egen sikkerhet. Vil du forbli innlogget?', - }, - error: { - autosaving: 'Det oppstod et problem under automatisk lagring av dokumentet.', - correctInvalidFields: 'Korriger ugyldige felt.', - deletingTitle: - 'Det oppstod en feil under sletting av {{title}}. Sjekk tilkoblingen og prøv igjen.', - loadingDocument: 'Det oppstod et problem under lasting av dokumentet med ID {{id}}.', - noMatchedField: 'Ingen matchende felt funnet for "{{label}}"', - notAllowedToAccessPage: 'Du har ikke tilgang til denne siden.', - previewing: 'Det oppstod et problem under forhåndsvisning av dokumentet.', - unableToDeleteCount: 'Kan ikke slette {{count}} av {{total}} {{label}}.', - unableToUpdateCount: 'Kan ikke oppdatere {{count}} av {{total}} {{label}}.', - unauthorized: 'Uautorisert, du må være innlogget for å gjøre denne forespørselen.', - unknown: 'En ukjent feil har oppstått.', - unspecific: 'En feil har oppstått.', - }, - fields: { - addLabel: 'Legg til {{label}}', - addLink: 'Legg til Lenke', - addNew: 'Legg til ny', - addNewLabel: 'Legg til ny {{label}}', - addRelationship: 'Legg til Relasjon', - addUpload: 'Legg til Opplasting', - block: 'blokk', - blockType: 'Blokktype', - blocks: 'blokker', - chooseFromExisting: 'Velg fra eksisterende', - collapseAll: 'Skjul alle', - editLink: 'Rediger lenke', - editRelationship: 'Rediger relasjon', - itemsAndMore: '{{items}} og {{count}} flere', - labelRelationship: '{{label}}-relasjon', - latitude: 'Breddegrad', - linkedTo: 'Lenket til <0>{{label}}', - longitude: 'Lengdegrad', - passwordsDoNotMatch: 'Passordene er ikke like.', - removeRelationship: 'Fjern Forhold', - removeUpload: 'Fjern Opplasting', - saveChanges: 'Lagre endringer', - searchForBlock: 'Søk etter en blokk', - selectFieldsToEdit: 'Velg felt som skal redigeres', - showAll: 'Vis alle', - swapRelationship: 'Bytte Forhold', - swapUpload: 'Bytt Opplasting', - toggleBlock: 'Veksle blokk', - uploadNewLabel: 'Last opp ny {{label}}', - }, - general: { - aboutToDelete: 'Du er i ferd med å slette {{label}} <1>{{title}}. Er du sikker?', - aboutToDeleteCount_many: 'Du er i ferd med å slette {{count}} {{label}}', - aboutToDeleteCount_one: 'Du er i ferd med å slette {{count}} {{label}}', - aboutToDeleteCount_other: 'Du er i ferd med å slette {{count}} {{label}}', - addBelow: 'Legg til under', - addFilter: 'Legg til filter', - adminTheme: 'Admin-tema', - and: 'Og', - applyChanges: 'Bruk endringer', - ascending: 'Stigende', - automatic: 'Automatisk', - backToDashboard: 'Tilbake til kontrollpanel', - cancel: 'Avbryt', - changesNotSaved: - 'Endringene dine er ikke lagret. Hvis du forlater nå, vil du miste endringene dine.', - close: 'Lukk', - collapse: 'Skjul', - collections: 'Samlinger', - columnToSort: 'Kolonne å sortere', - columns: 'Kolonner', - confirm: 'Bekreft', - confirmDeletion: 'Bekreft sletting', - confirmDuplication: 'Bekreft duplisering', - copied: 'Kopiert', - copy: 'Kopiér', - create: 'Opprett', - createNew: 'Opprett ny', - createNewLabel: 'Opprett ny {{label}}', - created: 'Opprettet', - creating: 'Oppretter', - creatingNewLabel: 'Oppretter ny {{label}}', - dark: 'Mørk', - dashboard: 'Kontrollpanel', - delete: 'Slett', - deletedCountSuccessfully: 'Slettet {{count}} {{label}}.', - deleting: 'Sletter...', - descending: 'Synkende', - deselectAllRows: 'Fjern markeringen fra alle rader', - duplicate: 'Dupliser', - duplicateWithoutSaving: 'Dupliser uten å lagre endringer', - edit: 'Redigere', - editLabel: 'Rediger {{label}}', - editing: 'Redigerer', - editingLabel_many: 'Redigerer {{count}} {{label}}', - editingLabel_one: 'Redigerer {{count}} {{label}}', - editingLabel_other: 'Redigerer {{count}} {{label}}', - email: 'E-post', - emailAddress: 'E-postadresse', - enterAValue: 'Skriv inn en verdi', - error: 'Feil', - errors: 'Feil', - fallbackToDefaultLocale: 'Tilbakestilling til standard lokalitet', - filterWhere: 'Filtrer {{label}} der', - filters: 'Filter', - globals: 'Globale variabler', - language: 'Språk', - lastModified: 'Sist endret', - leaveAnyway: 'Forlat likevel', - leaveWithoutSaving: 'Forlat uten å lagre', - light: 'Lys', - livePreview: 'Forhåndsvisning', - loading: 'Laster', - locale: 'Lokalitet', - menu: 'Meny', - moveDown: 'Flytt ned', - moveUp: 'Flytt opp', - noFiltersSet: 'Ingen filtre satt', - noLabel: '', - noOptions: 'Ingen alternativer', - noResults: - 'Ingen {{label}} funnet. Enten finnes det ingen {{label}} enda eller ingen matcher filterne du har spesifisert ovenfor.', - noValue: 'Ingen verdi', - none: 'Ingen', - notFound: 'Ikke funnet', - nothingFound: 'Ingenting funnet', - of: 'av', - open: 'Åpne', - or: 'Eller', - order: 'Rekkefølge', - pageNotFound: 'Siden ble ikke funnet', - password: 'Passord', - payloadSettings: 'Payload-innstillinger', - perPage: 'Per side: {{limit}}', - remove: 'Fjern', - reset: 'Tilbakestill', - row: 'Rad', - rows: 'Rader', - save: 'Lagre', - saving: 'Lagrer...', - searchBy: 'Søk etter {{label}}', - selectAll: 'Velg alle {{count}} {{label}}', - selectAllRows: 'Velg alle rader', - selectValue: 'Velg en verdi', - selectedCount: '{{count}} {{label}} valgt', - showAllLabel: 'Vis alle {{label}}', - sorryNotFound: 'Beklager, det er ingenting som samsvarer med forespørselen din.', - sort: 'Sortér', - sortByLabelDirection: 'Sorter etter {{label}} {{direction}}', - stayOnThisPage: 'Bli på denne siden', - submissionSuccessful: 'Innsending vellykket.', - submit: 'Send inn', - successfullyCreated: '{{label}} ble opprettet.', - thisLanguage: 'Norsk', - titleDeleted: '{{label}} "{{title}}" ble slettet.', - unauthorized: 'Ikke autorisert', - unsavedChangesDuplicate: 'Du har ulagrede endringer. Vil du fortsette å duplisere?', - untitled: 'Uten tittel', - updatedAt: 'Oppdatert', - updatedCountSuccessfully: 'Oppdaterte {{count}} {{label}} vellykket.', - updatedSuccessfully: 'Oppdatert.', - updating: 'Oppdatering', - welcome: 'Velkommen', - }, - operators: { - contains: 'contains', - equals: 'lik', - exists: 'eksisterer', - isGreaterThan: 'er større enn', - isGreaterThanOrEqualTo: 'er større enn eller lik', - isIn: 'er i', - isLessThan: 'er mindre enn', - isLessThanOrEqualTo: 'er mindre enn eller lik', - isLike: 'er som', - isNotEqualTo: 'er ikke lik', - isNotIn: 'er ikke med', - near: 'nær', - }, - upload: { - crop: 'Beskjær', - cropToolDescription: - 'Dra hjørnene av det valgte området, tegn et nytt område eller juster verdiene nedenfor.', - dragAndDrop: 'Dra og slipp en fil', - editImage: 'Rediger bilde', - focalPoint: 'Fokuspunkt', - focalPointDescription: - 'Dra fokuspunktet direkte på forhåndsvisningen eller juster verdiene nedenfor.', - height: 'Høyde', - previewSizes: 'Forhåndsvisningsstørrelser', - selectCollectionToBrowse: 'Velg en samling å bla i', - selectFile: 'Velg en fil', - setCropArea: 'Angi beskjæringsområde', - setFocalPoint: 'Angi fokuspunkt', - sizesFor: 'Størrelser for {{label}}', - width: 'Bredde', - }, - validation: { - fieldHasNo: 'Dette feltet har ingen {{label}}', - limitReached: 'Begrensning nådd, bare {{max}} elementer kan legges til.', - required: 'Dette feltet er påkrevd.', - requiresAtLeast: 'Dette feltet krever minst {{count}} {{label}}.', - }, - version: { - aboutToPublishSelection: - 'Du er i ferd med å publisere alle {{label}} i utvalget. Er du sikker?', - aboutToRestore: - 'Du er i ferd med å gjenopprette denne {{label}} dokumentet til tilstanden det var i på {{versionDate}}.', - aboutToRestoreGlobal: - 'Du er i ferd med å gjenopprette den globale variabelen {{label}} til tilstanden det var i på {{versionDate}}.', - aboutToRevertToPublished: - 'Du er i ferd med å tilbakestille endringene i dette dokumentet til den publiserte tilstanden. Er du sikker?', - aboutToUnpublish: 'Du er i ferd med å avpublisere dette dokumentet. Er du sikker?', - aboutToUnpublishSelection: - 'Du er i ferd med å oppheve publiseringen av alle {{label}} i utvalget. Er du sikker?', - autosave: 'Lagre automatisk', - autosavedSuccessfully: 'Lagret automatisk.', - changed: 'Endret', - compareVersion: 'Sammenlign versjon mot:', - confirmPublish: 'Bekreft publisering', - confirmRevertToSaved: 'Bekreft tilbakestilling til lagret', - confirmUnpublish: 'Bekreft avpublisering', - confirmVersionRestoration: 'Bekreft versjon-gjenoppretting', - draft: 'Utkast', - draftSavedSuccessfully: 'Utkast lagret.', - lastSavedAgo: 'Sist lagret {{distance}} siden', - noFurtherVersionsFound: 'Ingen flere versjoner funnet', - noRowsFound: 'Ingen {{label}} funnet', - preview: 'Forhåndsvisning', - problemRestoringVersion: 'Det oppstod et problem med gjenoppretting av denne versjonen', - publish: 'Publisere', - publishChanges: 'Publiser endringer', - published: 'Publisert', - publishing: 'Publisering', - restoreThisVersion: 'Gjenopprett denne versjonen', - restoredSuccessfully: 'Gjenopprettet.', - restoring: 'Gjenoppretter...', - revertToPublished: 'Tilbakestill til publisert', - saveDraft: 'Lagre utkast', - selectLocales: 'Velg språk å vise', - selectVersionToCompare: 'Velg en versjon å sammenligne', - showLocales: 'Vis språk:', - status: 'Status', - type: 'Type', - unpublish: 'Avpubliser', - unpublishing: 'Avpubliserer...', - version: 'Versjon', - versionCreatedOn: '{{version}} opprettet:', - versionID: 'Versjons-ID', - versions: 'Versjoner', - viewingVersion: 'Viser versjon for {{entityLabel}} {{documentTitle}}', - viewingVersionGlobal: 'Viser versjon for den globale variabelen {{entityLabel}}', - viewingVersions: 'Viser versjoner for {{entityLabel}} {{documentTitle}}', - viewingVersionsGlobal: 'Viser versjoner for den globale variabelen {{entityLabel}}', - }, -} diff --git a/packages/translations/src/_generatedFiles_/client/nl.js b/packages/translations/src/_generatedFiles_/client/nl.js deleted file mode 100644 index 68cb075a13..0000000000 --- a/packages/translations/src/_generatedFiles_/client/nl.js +++ /dev/null @@ -1,296 +0,0 @@ -export default { - authentication: { - account: 'Account', - accountOfCurrentUser: 'Account van huidige gebruiker', - alreadyActivated: 'Al geactiveerd', - alreadyLoggedIn: 'Al ingelogd', - backToLogin: 'Terug naar inloggen', - beginCreateFirstUser: 'Om te beginnen maakt u uw eerste gebruiker aan.', - changePassword: 'Wachtwoord wijzigen', - confirmGeneration: 'Bevestigen', - confirmPassword: 'Wachtwoord bevestigen', - createFirstUser: 'Eerste gebruiker aanmaken', - emailNotValid: 'Het ingevoerde e-mailadres is niet geldig', - emailSent: 'E-mail verzonden', - enableAPIKey: 'Activeer API-sleutel', - failedToUnlock: 'Ontgrendeling mislukt', - forceUnlock: 'Forceer ontgrendeling', - forgotPassword: 'Wachtwoord vergeten', - forgotPasswordEmailInstructions: - 'Vul hieronder uw e-mailadres in. U ontvangt een e-mailbericht met instructies om uw wachtwoord opnieuw in te stellen.', - forgotPasswordQuestion: 'Wachtwoord vergeten?', - generate: 'Genereren', - generateNewAPIKey: 'Genereer nieuwe API-sleutel', - logBackIn: 'Opnieuw inloggen', - logOut: 'Uitloggen', - loggedOutInactivity: 'U bent uitgelogd wegens inactiviteit.', - loggedOutSuccessfully: 'U bent succesvol uitgelogd.', - login: 'Inloggen', - logout: 'Uitloggen', - logoutUser: 'Gebruiker uitloggen', - newAPIKeyGenerated: 'Nieuwe API-sleutel is gegenereerd.', - newPassword: 'Nieuw wachtwoord', - resetPassword: 'Wachtwoord herstellen', - stayLoggedIn: 'Ingelogd blijven', - successfullyUnlocked: 'Succesvol ontgrendeld', - unableToVerify: 'Verificatie niet mogelijk', - verified: 'Geverifieerd', - verifiedSuccessfully: 'Succesvol geverifieerd', - verify: 'Verifiëren', - verifyUser: 'Gebruiker verifiëren', - youAreInactive: - 'U bent al een tijdje niet meer actief geweest en wordt binnenkort voor uw eigen veiligheid automatisch uitgelogd. Wilt u ingelogd blijven?', - }, - error: { - autosaving: 'Er is een probleem opgetreden bij het automatisch bewaren van dit document.', - correctInvalidFields: 'Gelieve de ongeldige velden te corrigeren.', - deletingTitle: - 'Er is een fout opgetreden tijdens het verwijderen van {{title}}. Controleer uw verbinding en probeer het opnieuw.', - loadingDocument: 'Er was een probleem met het laden van het document met ID {{id}}.', - noMatchedField: 'Geen overeenkomend veld gevonden voor "{{label}}"', - notAllowedToAccessPage: 'U hebt geen toegang tot deze pagina.', - previewing: 'Er was een probleem met het voorvertonen van dit document.', - unableToDeleteCount: 'Kan {{count}} van {{total}} {{label}} niet verwijderen.', - unableToUpdateCount: 'Kan {{count}} van {{total}} {{label}} niet updaten.', - unauthorized: 'Ongeautoriseerd, u moet ingelogd zijn om dit verzoek te doen.', - unknown: 'Er is een onbekende fout opgetreden.', - unspecific: 'Er is een fout opgetreden.', - }, - fields: { - addLabel: 'Voeg {{label}} toe', - addLink: 'Voeg een link toe', - addNew: 'Nieuw(e)', - addNewLabel: 'Nieuw(e) {{label}} toevoegen', - addRelationship: 'Nieuwe Relatie', - addUpload: 'Upload Toevoegen', - block: 'blok', - blockType: 'Bloktype', - blocks: 'blokken', - chooseFromExisting: 'Kies uit bestaande', - collapseAll: 'Alles samenvouwen', - editLink: 'Link bewerken', - editRelationship: 'Relatie Relatie', - itemsAndMore: '{{items}} en {{count}} meer', - labelRelationship: '{{label}} relatie', - latitude: 'Breedtegraad', - linkedTo: 'Gekoppeld aan aan <0>{{label}}', - longitude: 'Lengtegraad', - passwordsDoNotMatch: 'Wachtwoorden komen niet overeen.', - removeRelationship: 'Relatie Verwijderen', - removeUpload: 'Verwijder Upload', - saveChanges: 'Bewaar aanpassingen', - searchForBlock: 'Zoeken naar een blok', - selectFieldsToEdit: 'Selecteer velden om te bewerken', - showAll: 'Alles tonen', - swapRelationship: 'Relatie Wisselen', - swapUpload: 'Upload Verwisselen', - toggleBlock: 'Blok togglen', - uploadNewLabel: 'Upload nieuw(e) {{label}}', - }, - general: { - aboutToDelete: - 'U staat op het punt om {{label}} <1>{{title}} te verwijderen. Weet u het zeker?', - aboutToDeleteCount_many: 'Je staat op het punt {{count}} {{label}} te verwijderen', - aboutToDeleteCount_one: 'Je staat op het punt {{count}} {{label}} te verwijderen', - aboutToDeleteCount_other: 'Je staat op het punt {{count}} {{label}} te verwijderen', - addBelow: 'Onderaan toevoegen', - addFilter: 'Filter toevoegen', - adminTheme: 'Adminthema', - and: 'En', - applyChanges: 'Breng wijzigingen aan', - ascending: 'Oplopend', - automatic: 'Automatisch', - backToDashboard: 'Terug naar dashboard', - cancel: 'Annuleren', - changesNotSaved: - 'Uw wijzigingen zijn niet bewaard. Als u weggaat zullen de wijzigingen verloren gaan.', - close: 'Dichtbij', - collapse: 'Samenvouwen', - collections: 'Collecties', - columnToSort: 'Kolom om te sorteren', - columns: 'Kolommen', - confirm: 'Bevestigen', - confirmDeletion: 'Bevestig verwijdering', - confirmDuplication: 'Bevestig duplicatie', - copied: 'Gekopieerd', - copy: 'Kopiëren', - create: 'Aanmaken', - createNew: 'Nieuw aanmaken', - createNewLabel: 'Nieuw(e) {{label}} aanmaken', - created: 'Aangemaakt', - creating: 'Aanmaken', - creatingNewLabel: 'Nieuw(e) {{label}} aanmaken', - dark: 'Donker', - dashboard: 'Dashboard', - delete: 'Verwijderen', - deletedCountSuccessfully: '{{count}} {{label}} succesvol verwijderd.', - deleting: 'Verwijderen...', - descending: 'Aflopend', - deselectAllRows: 'Deselecteer alle rijen', - duplicate: 'Dupliceren', - duplicateWithoutSaving: 'Dupliceren zonder wijzigingen te bewaren', - edit: 'Bewerk', - editLabel: 'Bewerk {{label}}', - editing: 'Bewerken', - editingLabel_many: 'Bewerken {{count}} {{label}}', - editingLabel_one: 'Bewerken {{count}} {{label}}', - editingLabel_other: 'Bewerken {{count}} {{label}}', - email: 'E-mail', - emailAddress: 'E-maildres', - enterAValue: 'Waarde invoeren', - error: 'Fout', - errors: 'Fouten', - fallbackToDefaultLocale: 'Terugval naar standaardtaal', - filterWhere: 'Filter {{label}} waar', - filters: 'Filters', - globals: 'Globalen', - language: 'Taal', - lastModified: 'Laatst gewijzigd', - leaveAnyway: 'Toch weggaan', - leaveWithoutSaving: 'Verlaten zonder op te slaan', - light: 'Licht', - livePreview: 'Voorbeeld', - loading: 'Laden', - locale: 'Taal', - menu: 'Menu', - moveDown: 'Verplaats naar beneden', - moveUp: 'Verplaats naar boven', - noFiltersSet: 'Geen filters ingesteld', - noLabel: 'Geen "{{label}}"', - noOptions: 'Geen opties', - noResults: - 'Geen {{label}} gevonden. Of er bestaat nog geen {{label}}, of niets komt overeen met de hierboven gespecifieerde filters.', - noValue: 'Geen waarde', - none: 'Niets', - notFound: 'Niet gevonden', - nothingFound: 'Niets gevonden', - of: 'van', - open: 'Open', - or: 'Of', - order: 'Volgorde', - pageNotFound: 'Pagina niet gevonden', - password: 'Wachtwoord', - payloadSettings: 'Payload Instellingen', - perPage: 'Per pagina: {{limit}}', - remove: 'Verwijderen', - reset: 'Resetten', - row: 'Rij', - rows: 'Rijen', - save: 'Bewaar', - saving: 'Bewaren...', - searchBy: 'Zoeken op {{label}}', - selectAll: 'Alles selecteren {{count}} {{label}}', - selectAllRows: 'Selecteer alle rijen', - selectValue: 'Selecteer een waarde', - selectedCount: '{{count}} {{label}} geselecteerd', - showAllLabel: 'Toon alle {{label}}', - sorryNotFound: 'Sorry, er is niets dat overeen komt met uw verzoek.', - sort: 'Sorteer', - sortByLabelDirection: 'Sorteer op {{label}} {{direction}}', - stayOnThisPage: 'Blijf op deze pagina', - submissionSuccessful: 'Indiening succesvol.', - submit: 'Indienen', - successfullyCreated: '{{label}} succesvol aangemaakt.', - thisLanguage: 'Nederlands', - titleDeleted: '{{label}} "{{title}}" succesvol verwijderd.', - unauthorized: 'Onbevoegd', - unsavedChangesDuplicate: 'U heeft onbewaarde wijzigingen. Wilt u doorgaan met dupliceren?', - untitled: 'Zonder titel', - updatedAt: 'Aangepast op', - updatedCountSuccessfully: '{{count}} {{label}} succesvol bijgewerkt.', - updatedSuccessfully: 'Succesvol aangepast.', - updating: 'Bijwerken', - welcome: 'Welkom', - }, - operators: { - contains: 'bevat', - equals: 'is gelijk aan', - exists: 'bestaat', - isGreaterThan: 'is groter dan', - isGreaterThanOrEqualTo: 'is groter dan of gelijk aan', - isIn: 'is binnen', - isLessThan: 'is kleiner dan', - isLessThanOrEqualTo: 'is kleiner dan of gelijk aan', - isLike: 'is als', - isNotEqualTo: 'is niet gelijk aan', - isNotIn: 'zit er niet in', - near: 'nabij', - }, - upload: { - crop: 'Bijsnijden', - cropToolDescription: - 'Sleep de hoeken van het geselecteerde gebied, teken een nieuw gebied of pas de waarden hieronder aan.', - dragAndDrop: 'Sleep een bestand', - editImage: 'Afbeelding bewerken', - focalPoint: 'Focuspunt', - focalPointDescription: - 'Sleep het focuspunt rechtstreeks op de voorvertoning of pas de waarden hieronder aan.', - height: 'Hoogte', - previewSizes: 'Voorbeeldgroottes', - selectCollectionToBrowse: 'Selecteer een collectie om door te bladeren', - selectFile: 'Selecteer een bestand', - setCropArea: 'Stel bijsnijdgebied in', - setFocalPoint: 'Stel het brandpunt in', - sizesFor: 'Maten voor {{label}}', - width: 'Breedte', - }, - validation: { - fieldHasNo: 'Dit veld heeft geen {{label}}', - limitReached: 'Limiet bereikt, er kunnen slechts {{max}} items worden toegevoegd.', - required: 'Dit veld is verplicht.', - requiresAtLeast: 'Dit veld vereist minstens {{count}} {{label}}.', - }, - version: { - aboutToPublishSelection: - 'Je staat op het punt om alle {{label}} in de selectie te publiceren. Weet je het zeker?', - aboutToRestore: - 'U staat op het punt dit {{label}} document te herstellen in de staat waarin het zich bevond op {{versionDate}}.', - aboutToRestoreGlobal: - 'U staat op het punt om de global {{label}} te herstellen in de staat waarin het zich bevond op {{versionDate}}.', - aboutToRevertToPublished: - 'U staat op het punt om de wijzigingen van dit document terug te draaien naar de gepubliceerde staat. Weet u het zeker?', - aboutToUnpublish: - 'U staat op het punt om de publicatie van dit document ongedaan te maken. Weet u het zeker?', - aboutToUnpublishSelection: - 'You are about to unpublish all {{label}} in the selection. Are you sure?', - autosave: 'Automatisch bewaren', - autosavedSuccessfully: 'Succesvol automatisch bewaard.', - changed: 'Gewijzigd', - compareVersion: 'Vergelijk versie met:', - confirmPublish: 'Bevestig publiceren', - confirmRevertToSaved: 'Bevestig terugdraaien naar bewaarde versie', - confirmUnpublish: 'Bevestig depubliceren', - confirmVersionRestoration: 'Bevestig te herstellen versie', - draft: 'Concept', - draftSavedSuccessfully: 'Concept succesvol bewaard.', - lastSavedAgo: 'Laatst opgeslagen {{distance}} geleden', - noFurtherVersionsFound: 'Geen verdere versies gevonden', - noRowsFound: 'Geen {{label}} gevonden', - preview: 'Voorbeeld', - problemRestoringVersion: 'Er was een probleem bij het herstellen van deze versie', - publish: 'Publiceren', - publishChanges: 'Publiceer wijzigingen', - published: 'Gepubliceerd', - publishing: 'Publicatie', - restoreThisVersion: 'Herstel deze versie', - restoredSuccessfully: 'Herstelling succesvol.', - restoring: 'Herstellen...', - revertToPublished: 'Terugdraaien naar gepubliceerde versie', - saveDraft: 'Bewaar concept', - selectLocales: 'Selecteer locales om weer te geven', - selectVersionToCompare: 'Selecteer een versie om te vergelijken', - showLocales: 'Toon locales:', - status: 'Status', - type: 'Type', - unpublish: 'Publicatie ongedaan maken', - unpublishing: 'Publicatie ongedaan maken...', - version: 'Versie', - versionCreatedOn: '{{version}} aangemaakt op:', - versionID: 'Versie-ID', - versions: 'Versies', - viewingVersion: 'Bekijk versie voor {{entityLabel}} {{documentTitle}}', - viewingVersionGlobal: 'Bekijk versie voor global {{entityLabel}}', - viewingVersions: 'Bekijk versies voor {{entityLabel}} {{documentTitle}}', - viewingVersionsGlobal: '`Bekijk versies voor global {{entityLabel}}', - }, -} diff --git a/packages/translations/src/_generatedFiles_/client/pl.js b/packages/translations/src/_generatedFiles_/client/pl.js deleted file mode 100644 index 2803e81de4..0000000000 --- a/packages/translations/src/_generatedFiles_/client/pl.js +++ /dev/null @@ -1,293 +0,0 @@ -export default { - authentication: { - account: 'Konto', - accountOfCurrentUser: 'Konto bieżącego użytkownika', - alreadyActivated: 'Już aktywowano', - alreadyLoggedIn: 'Już zalogowano', - backToLogin: 'Powrót do logowania', - beginCreateFirstUser: 'Aby rozpocząć, utwórz pierwszego użytkownika', - changePassword: 'Zmień hasło', - confirmGeneration: 'Potwierdź wygenerowanie', - confirmPassword: 'Potwierdź hasło', - createFirstUser: 'Utwórz pierwszego użytkownika', - emailNotValid: 'Podany email jest nieprawidłowy', - emailSent: 'Wysłano email', - enableAPIKey: 'Aktywuj klucz API', - failedToUnlock: 'Nie udało się odblokować', - forceUnlock: 'Wymuś odblokowanie', - forgotPassword: 'Zresetuj hasło', - forgotPasswordEmailInstructions: - 'Proszę podaj swój email. Otrzymasz wiadomość z instrukcjami, jak zresetować hasło.', - forgotPasswordQuestion: 'Nie pamiętasz hasła?', - generate: 'Wygeneruj', - generateNewAPIKey: 'Wygeneruj nowy klucz API', - logBackIn: 'Zaloguj się ponownie', - logOut: 'Wyloguj', - loggedOutInactivity: 'Zostałeś wylogowany z powodu braku aktywności.', - loggedOutSuccessfully: 'Zostałeś pomyślnie wylogowany.', - login: 'Zaloguj', - logout: 'Wyloguj', - logoutUser: 'Wyloguj użytkownika', - newAPIKeyGenerated: 'Wygenerowano nowy klucz API.', - newPassword: 'Nowe hasło', - resetPassword: 'Zresetuj hasło', - stayLoggedIn: 'Pozostań zalogowany', - successfullyUnlocked: 'Pomyślnie odblokowano', - unableToVerify: 'Nie można zweryfikować', - verified: 'Zweryfikowano', - verifiedSuccessfully: 'Pomyślnie zweryfikowany', - verify: 'Zweryfikuj', - verifyUser: 'Zweryfikuj użytkownika', - youAreInactive: - 'Nie byłeś aktywny od dłuższego czasu i wkrótce zostaniesz automatycznie wylogowany dla własnego bezpieczeństwa. Czy chcesz pozostać zalogowany?', - }, - error: { - autosaving: 'Wystąpił problem podczas automatycznego zapisywania tego dokumentu.', - correctInvalidFields: 'Popraw nieprawidłowe pola.', - deletingTitle: - 'Wystąpił błąd podczas usuwania {{title}}. Proszę, sprawdź swoje połączenie i spróbuj ponownie.', - loadingDocument: 'Wystapił problem podczas ładowania dokumentu o ID {{id}}.', - noMatchedField: 'Nie znaleziono pasującego pola dla "{{label}}"', - notAllowedToAccessPage: 'Nie masz dostępu do tej strony.', - previewing: 'Wystąpił problem podczas podglądu tego dokumentu.', - unableToDeleteCount: 'Nie można usunąć {{count}} z {{total}} {{label}}.', - unableToUpdateCount: 'Nie można zaktualizować {{count}} z {{total}} {{label}}.', - unauthorized: 'Brak dostępu, musisz być zalogowany.', - unknown: 'Wystąpił nieznany błąd.', - unspecific: 'Wystąpił błąd', - }, - fields: { - addLabel: 'Dodaj {{label}}', - addLink: 'Dodaj Link', - addNew: 'Dodaj nowy', - addNewLabel: 'Dodaj nowy {{label}}', - addRelationship: 'Dodaj Relację', - addUpload: 'Dodaj ładowanie', - block: 'Blok', - blockType: 'Typ Bloku', - blocks: 'Bloki', - chooseFromExisting: 'Wybierz z istniejących', - collapseAll: 'Zwiń wszystko', - editLink: 'Edytuj Link', - editRelationship: 'Edytuj Relację', - itemsAndMore: '{{items}} i {{count}} więcej', - labelRelationship: 'Relacja {{label}}', - latitude: 'Szerokość', - linkedTo: 'Połączony z <0>{{label}}', - longitude: 'Długość geograficzna', - passwordsDoNotMatch: 'Hasła nie pasują', - removeRelationship: 'Usuń Relację', - removeUpload: 'Usuń Wrzucone', - saveChanges: 'Zapisz zmiany', - searchForBlock: 'Szukaj bloku', - selectFieldsToEdit: 'Wybierz pola do edycji', - showAll: 'Pokaż wszystkie', - swapRelationship: 'Zamiana Relacji', - swapUpload: 'Zamień Wrzucone', - toggleBlock: 'Przełącz blok', - uploadNewLabel: 'Wrzuć nowy {{label}}', - }, - general: { - aboutToDelete: 'Zamierzasz usunąć {{label}} <1>{{title}}. Jesteś pewien?', - aboutToDeleteCount_many: 'Zamierzasz usunąć {{count}} {{label}}', - aboutToDeleteCount_one: 'Zamierzasz usunąć {{count}} {{label}}', - aboutToDeleteCount_other: 'Zamierzasz usunąć {{count}} {{label}}', - addBelow: 'Dodaj poniżej', - addFilter: 'Dodaj filtr', - adminTheme: 'Motyw administratora', - and: 'i', - applyChanges: 'Zastosuj zmiany', - ascending: 'Rosnąco', - automatic: 'Automatyczny', - backToDashboard: 'Powrót do panelu', - cancel: 'Anuluj', - changesNotSaved: - 'Twoje zmiany nie zostały zapisane. Jeśli teraz wyjdziesz, stracisz swoje zmiany.', - close: 'Zamknij', - collapse: 'Zwiń', - collections: 'Kolekcje', - columnToSort: 'Kolumna sortowania', - columns: 'Kolumny', - confirm: 'Potwierdź', - confirmDeletion: 'Potwierdź usunięcie', - confirmDuplication: 'Potwierdź duplikację', - copied: 'Skopiowano', - copy: 'Skopiuj', - create: 'Stwórz', - createNew: 'Stwórz nowy', - createNewLabel: 'Stwórz nowy {{label}}', - created: 'Utworzono', - creating: 'Tworzenie', - creatingNewLabel: 'Tworzenie nowego {{label}}', - dark: 'Ciemny', - dashboard: 'Panel', - delete: 'Usuń', - deletedCountSuccessfully: 'Pomyślnie usunięto {{count}} {{label}}.', - deleting: 'Usuwanie...', - descending: 'Malejąco', - deselectAllRows: 'Odznacz wszystkie wiersze', - duplicate: 'Zduplikuj', - duplicateWithoutSaving: 'Zduplikuj bez zapisywania zmian', - edit: 'Edytuj', - editLabel: 'Edytuj {{label}}', - editing: 'Edycja', - editingLabel_many: 'Edytowanie {{count}} {{label}}', - editingLabel_one: 'Edytowanie {{count}} {{label}}', - editingLabel_other: 'Edytowanie {{count}} {{label}}', - email: 'Email', - emailAddress: 'Adres email', - enterAValue: 'Wpisz wartość', - error: 'Błąd', - errors: 'Błędy', - fallbackToDefaultLocale: 'Powrót do domyślnych ustawień regionalnych', - filterWhere: 'Filtruj gdzie', - filters: 'Filtry', - globals: 'Globalne', - language: 'Język', - lastModified: 'Ostatnio zmodyfikowany', - leaveAnyway: 'Wyjdź mimo to', - leaveWithoutSaving: 'Wyjdź bez zapisywania', - light: 'Jasny', - livePreview: 'Podgląd', - loading: 'Ładowanie', - locale: 'Ustawienia regionalne', - menu: 'Menu', - moveDown: 'Przesuń niżej', - moveUp: 'Przesuń wyżej', - noFiltersSet: 'Brak ustawionych filtrów', - noLabel: '', - noOptions: 'Brak opcji', - noResults: - 'Nie znaleziono {{label}}. Być może {{label}} jeszcze nie istnieje, albo żaden nie pasuje do filtrów określonych powyżej.', - noValue: 'Brak wartości', - none: 'Nic', - notFound: 'Nie znaleziono', - nothingFound: 'Nic nie znaleziono', - of: 'z', - open: 'Otwórz', - or: 'lub', - order: 'Kolejność', - pageNotFound: 'Strona nie znaleziona', - password: 'Hasło', - payloadSettings: 'Ustawienia Payload', - perPage: 'Na stronę: {{limit}}', - remove: 'Usuń', - reset: 'Zresetuj', - row: 'Wiersz', - rows: 'Wiersze', - save: 'Zapisz', - saving: 'Zapisywanie...', - searchBy: 'Szukaj według', - selectAll: 'Wybierz wszystkie {{count}} {{label}}', - selectAllRows: 'Wybierz wszystkie wiersze', - selectValue: 'Wybierz wartość', - selectedCount: 'Wybrano {{count}} {{label}}', - showAllLabel: 'Pokaż wszystkie {{label}}', - sorryNotFound: 'Przepraszamy — nie ma nic, co odpowiadałoby twojemu zapytaniu.', - sort: 'Sortuj', - sortByLabelDirection: 'Sortuj według {{label}} {{direction}}', - stayOnThisPage: 'Pozostań na stronie', - submissionSuccessful: 'Zgłoszenie zakończone powodzeniem.', - submit: 'Zatwierdź', - successfullyCreated: 'Pomyślnie utworzono {{label}}.', - thisLanguage: 'Polski', - titleDeleted: 'Pomyślnie usunięto {{label}} {{title}}', - unauthorized: 'Brak autoryzacji', - unsavedChangesDuplicate: 'Masz niezapisane zmiany. Czy chcesz kontynuować duplikowanie?', - untitled: 'Bez nazwy', - updatedAt: 'Data edycji', - updatedCountSuccessfully: 'Pomyślnie zaktualizowano {{count}} {{label}}.', - updatedSuccessfully: 'Aktualizacja zakończona sukcesem.', - updating: 'Aktualizacja', - welcome: 'Witaj', - }, - operators: { - contains: 'zawiera', - equals: 'równe', - exists: 'istnieje', - isGreaterThan: 'jest większy niż', - isGreaterThanOrEqualTo: 'jest większe lub równe', - isIn: 'jest w', - isLessThan: 'jest mniejsze niż', - isLessThanOrEqualTo: 'jest mniejsze lub równe', - isLike: 'jest jak', - isNotEqualTo: 'nie jest równe', - isNotIn: 'nie ma go w', - near: 'blisko', - }, - upload: { - crop: 'Przytnij', - cropToolDescription: - 'Przeciągnij narożniki wybranego obszaru, narysuj nowy obszar lub dostosuj poniższe wartości.', - dragAndDrop: 'Przeciągnij i upuść plik', - editImage: 'Edytuj obraz', - focalPoint: 'Punkt centralny', - focalPointDescription: - 'Przeciągnij punkt centralny bezpośrednio na podglądzie lub dostosuj wartości poniżej.', - height: 'Wysokość', - previewSizes: 'Rozmiary podglądu', - selectCollectionToBrowse: 'Wybierz kolekcję aby przejrzeć', - selectFile: 'Wybierz plik', - setCropArea: 'Ustaw obszar kadrowania', - setFocalPoint: 'Ustawić punkt ogniskowy', - sizesFor: 'Rozmiary dla {{label}}', - width: 'Szerokość', - }, - validation: { - fieldHasNo: 'To pole nie posiada {{label}}', - limitReached: 'Osiągnięto limit, można dodać tylko {{max}} elementów.', - required: 'To pole jest wymagane.', - requiresAtLeast: 'To pole wymaga co najmniej {{count}} {{label}}.', - }, - version: { - aboutToPublishSelection: - 'Za chwilę opublikujesz wszystkie {{label}} w zaznaczeniu. Jesteś pewny?', - aboutToRestore: - 'Zamierzasz przywrócić dokument {{label}} do stanu, w jakim znajdował się w dniu {{versionDate}}.', - aboutToRestoreGlobal: - 'Zamierzasz przywrócić globalny rekord {{label}} do stanu, w którym znajdował się w dniu {{versionDate}}.', - aboutToRevertToPublished: - 'Zamierzasz przywrócić zmiany w tym dokumencie do stanu opublikowanego. Jesteś pewien?', - aboutToUnpublish: 'Zamierzasz cofnąć publikację tego dokumentu. Jesteś pewien?', - aboutToUnpublishSelection: - 'Zamierzasz cofnąć publikację wszystkich {{label}} w zaznaczeniu. Jesteś pewny?', - autosave: 'Autozapis', - autosavedSuccessfully: 'Pomyślnie zapisano automatycznie.', - changed: 'Zmieniono', - compareVersion: 'Porównaj wersję z:', - confirmPublish: 'Potwierdź publikację', - confirmRevertToSaved: 'Potwierdź powrót do zapisanego', - confirmUnpublish: 'Potwierdź cofnięcie publikacji', - confirmVersionRestoration: 'Potwierdź przywrócenie wersji', - draft: 'Szkic', - draftSavedSuccessfully: 'Wersja robocza została pomyślnie zapisana.', - lastSavedAgo: 'Ostatnio zapisane {{distance}} temu', - noFurtherVersionsFound: 'Nie znaleziono dalszych wersji', - noRowsFound: 'Nie znaleziono {{label}}', - preview: 'Podgląd', - problemRestoringVersion: 'Wystąpił problem podczas przywracania tej wersji', - publish: 'Publikuj', - publishChanges: 'Opublikuj zmiany', - published: 'Opublikowano', - restoreThisVersion: 'Przywróć tę wersję', - restoredSuccessfully: 'Przywrócono pomyślnie.', - restoring: 'Przywracanie...', - revertToPublished: 'Przywróć do opublikowanego', - saveDraft: 'Zapisz szkic', - selectLocales: 'Wybierz ustawienia regionalne do wyświetlenia', - selectVersionToCompare: 'Wybierz wersję do porównania', - showLocales: 'Pokaż ustawienia regionalne:', - status: 'Status', - type: 'Typ', - unpublish: 'Cofnij publikację', - unpublishing: 'Cofanie publikacji...', - version: 'Wersja', - versionCreatedOn: 'Wersja {{version}} utworzona:', - versionID: 'ID wersji', - versions: 'Wersje', - viewingVersion: 'Przeglądanie wersji dla {{entityLabel}} {{documentTitle}}', - viewingVersionGlobal: 'Przeglądanie wersji dla globalnej kolekcji {{entityLabel}}', - viewingVersions: 'Przeglądanie wersji {{entityLabel}} {{documentTitle}}', - viewingVersionsGlobal: 'Przeglądanie wersji dla globalnej kolekcji {{entityLabel}}', - }, -} diff --git a/packages/translations/src/_generatedFiles_/client/pt.js b/packages/translations/src/_generatedFiles_/client/pt.js deleted file mode 100644 index 410c18a14a..0000000000 --- a/packages/translations/src/_generatedFiles_/client/pt.js +++ /dev/null @@ -1,294 +0,0 @@ -export default { - authentication: { - account: 'Conta', - accountOfCurrentUser: 'Conta do usuário ativo', - alreadyActivated: 'Conta já ativada', - alreadyLoggedIn: 'Login já realizado', - backToLogin: 'Voltar para login', - beginCreateFirstUser: 'Para começar, crie seu primeiro usuário.', - changePassword: 'Mudar senha', - confirmGeneration: 'Confirmar Geração', - confirmPassword: 'Confirmar Senha', - createFirstUser: 'Criar primeiro usuário', - emailNotValid: 'O email fornecido não é válido', - emailSent: 'Email Enviado', - enableAPIKey: 'Habilitar Chave API', - failedToUnlock: 'Falha ao desbloquear', - forceUnlock: 'Forçar Desbloqueio', - forgotPassword: 'Esqueci a senha', - forgotPasswordEmailInstructions: - 'Por favor, preencha seu email abaixo. Você receberá um email com instruções para gerar uma nova senha', - forgotPasswordQuestion: 'Esqueceu a senha?', - generate: 'Gerar', - generateNewAPIKey: 'Gerar nova chave API', - logBackIn: 'Fazer login novamente', - logOut: 'Log out', - loggedOutInactivity: 'Você foi desconectado devido a inatividade.', - loggedOutSuccessfully: 'Log out efetuado com sucesso.', - login: 'Login', - logout: 'Logout', - logoutUser: 'Encerrar sessão', - newAPIKeyGenerated: 'Nova Chave API Gerada.', - newPassword: 'Nova Senha', - resetPassword: 'Redefinir Senha', - stayLoggedIn: 'Manter sessão ativa', - successfullyUnlocked: 'Desbloqueado com sucesso', - unableToVerify: 'Não foi possível verificar', - verified: 'Verificado', - verifiedSuccessfully: 'Verificado com Sucesso', - verify: 'Verificar', - verifyUser: 'Verificar Usuário', - youAreInactive: - 'Você não está ativo há algum tempo e sua sessão será automaticamente finalizada em breve, para sua própria segurança. Você gostaria de manter a sessão ativa?', - }, - error: { - autosaving: 'Ocorreu um problema ao salvar automaticamente esse documento.', - correctInvalidFields: 'Por favor, corrija os campos inválidos.', - deletingTitle: - 'Ocorreu um erro ao excluir {{title}}. Por favor, verifique sua conexão e tente novamente.', - loadingDocument: 'Ocorreu um problema ao carregar o documento com ID {{id}}.', - noMatchedField: 'Não foi encontrado nenhum campo correspondente a "{{label}}"', - notAllowedToAccessPage: 'Você não tem permissão para acessar essa página.', - previewing: 'Ocorreu um problema ao visualizar esse documento.', - unableToDeleteCount: 'Não é possível excluir {{count}} de {{total}} {{label}}.', - unableToUpdateCount: 'Não foi possível atualizar {{count}} de {{total}} {{label}}.', - unauthorized: 'Não autorizado. Você deve estar logado para fazer essa requisição', - unknown: 'Ocorreu um erro desconhecido.', - unspecific: 'Ocorreu um erro.', - }, - fields: { - addLabel: 'Adicionar {{label}}', - addLink: 'Adicionar Link', - addNew: 'Adicionar novo', - addNewLabel: 'Adicionar novo {{label}}', - addRelationship: 'Adicionar Relação', - addUpload: 'Adicionar Upload', - block: 'bloco', - blockType: 'Tipo de bloco', - blocks: 'blocos', - chooseFromExisting: 'Escolher entre os existentes', - collapseAll: 'Recolher todos', - editLink: 'Editar Link', - editRelationship: 'Editar Relacionamento', - itemsAndMore: '{{items}} e mais {{count}}', - labelRelationship: 'Relacionado a {{label}}', - latitude: 'Latitude', - linkedTo: 'Ligado a <0>{{label}}', - longitude: 'Longitude', - passwordsDoNotMatch: 'Senhas não coincidem.', - removeRelationship: 'Remover Relacionamento', - removeUpload: 'Remover Upload', - saveChanges: 'Salvar alterações', - searchForBlock: 'Procurar bloco', - selectFieldsToEdit: 'Selecione os campos para editar', - showAll: 'Mostrar Tudo', - swapRelationship: 'Relação de Troca', - swapUpload: 'Substituir Upload', - toggleBlock: 'Alternar bloco', - uploadNewLabel: 'Carregar novo(a) {{label}}', - }, - general: { - aboutToDelete: 'Você está prestes a excluir o/a {{label}} <1>{{title}}. Tem certeza?', - aboutToDeleteCount_many: 'Você está prestes a deletar {{count}} {{label}}', - aboutToDeleteCount_one: 'Você está prestes a deletar {{count}} {{label}}', - aboutToDeleteCount_other: 'Você está prestes a deletar {{count}} {{label}}', - addBelow: 'Adicionar abaixo', - addFilter: 'Adicionar Filtro', - adminTheme: 'Tema do Admin', - and: 'E', - applyChanges: 'Aplicar alterações', - ascending: 'Ascendente', - automatic: 'Automático', - backToDashboard: 'Voltar para Painel de Controle', - cancel: 'Cancelar', - changesNotSaved: - 'Suas alterações não foram salvas. Se você sair agora, essas alterações serão perdidas.', - close: 'Fechar', - collapse: 'Recolher', - collections: 'Coleções', - columnToSort: 'Coluna para Ordenar', - columns: 'Colunas', - confirm: 'Confirmar', - confirmDeletion: 'Confirmar exclusão', - confirmDuplication: 'Confirmar duplicação', - copied: 'Copiado', - copy: 'Copiar', - create: 'Criar', - createNew: 'Criar Novo', - createNewLabel: 'Criar novo(a) {{label}}', - created: 'Criado', - creating: 'Criando', - creatingNewLabel: 'Criando novo(a) {{label}}', - dark: 'Escuro', - dashboard: 'Painel de Controle', - delete: 'Excluir', - deletedCountSuccessfully: 'Excluído {{count}} {{label}} com sucesso.', - deleting: 'Excluindo...', - descending: 'Decrescente', - deselectAllRows: 'Desmarcar todas as linhas', - duplicate: 'Duplicar', - duplicateWithoutSaving: 'Duplicar sem salvar alterações', - edit: 'Editar', - editLabel: 'Editar {{label}}', - editing: 'Editando', - editingLabel_many: 'Editando {{count}} {{label}}', - editingLabel_one: 'Editando {{count}} {{label}}', - editingLabel_other: 'Editando {{count}} {{label}}', - email: 'Email', - emailAddress: 'Endereço de Email', - enterAValue: 'Insira um valor', - error: 'Erro', - errors: 'Erros', - fallbackToDefaultLocale: 'Recuo para o local padrão', - filterWhere: 'Filtrar {{label}} em que', - filters: 'Filtros', - globals: 'Globais', - language: 'Idioma', - lastModified: 'Última modificação', - leaveAnyway: 'Sair mesmo assim', - leaveWithoutSaving: 'Sair sem salvar', - light: 'Claro', - livePreview: 'Pré-visualização', - loading: 'Carregando', - locale: 'Local', - menu: 'Cardápio', - moveDown: 'Mover para Baixo', - moveUp: 'Mover para Cima', - noFiltersSet: 'Nenhum filtro definido', - noLabel: '', - noOptions: 'Sem opções', - noResults: - 'Nenhum {{label}} encontrado. Ou nenhum(a) {{label}} existe ainda, ou nenhum(a) corresponde aos filtros que você especificou acima.', - noValue: 'Nenhum valor', - none: 'Nenhum', - notFound: 'Não Encontrado', - nothingFound: 'Nada encontrado', - of: 'de', - open: 'Abrir', - or: 'Ou', - order: 'Ordem', - pageNotFound: 'Página não encontrada', - password: 'Senha', - payloadSettings: 'Configurações do Payload', - perPage: 'Itens por Página: {{limit}}', - remove: 'Remover', - reset: 'Redefinir', - row: 'Linha', - rows: 'Linhas', - save: 'Salvar', - saving: 'Salvando...', - searchBy: 'Buscar por {{label}}', - selectAll: 'Selecione tudo {{count}} {{label}}', - selectAllRows: 'Selecione todas as linhas', - selectValue: 'Selecione um valor', - selectedCount: '{{count}} {{label}} selecionado', - showAllLabel: 'Mostre todos {{label}}', - sorryNotFound: 'Desculpe—não há nada que corresponda à sua requisição.', - sort: 'Ordenar', - sortByLabelDirection: 'Ordenar por {{label}} {{direction}}', - stayOnThisPage: 'Permanecer nessa página', - submissionSuccessful: 'Envio bem-sucedido.', - submit: 'Enviar', - successfullyCreated: '{{label}} criado com sucesso.', - thisLanguage: 'Português', - titleDeleted: '{{label}} {{title}} excluído com sucesso.', - unauthorized: 'Não autorizado', - unsavedChangesDuplicate: 'Você tem mudanças não salvas. Você gostaria de continuar a duplicar?', - untitled: 'Sem título', - updatedAt: 'Atualizado Em', - updatedCountSuccessfully: 'Atualizado {{count}} {{label}} com sucesso.', - updatedSuccessfully: 'Atualizado com sucesso.', - updating: 'Atualizando', - welcome: 'Boas vindas', - }, - operators: { - contains: 'contém', - equals: 'igual', - exists: 'existe', - isGreaterThan: 'é maior que', - isGreaterThanOrEqualTo: 'é maior ou igual a', - isIn: 'está em', - isLessThan: 'é menor que', - isLessThanOrEqualTo: 'é menor ou igual a', - isLike: 'é como', - isNotEqualTo: 'não é igual a', - isNotIn: 'não está em', - near: 'perto', - }, - upload: { - crop: 'Cultura', - cropToolDescription: - 'Arraste as bordas da área selecionada, desenhe uma nova área ou ajuste os valores abaixo.', - dragAndDrop: 'Arraste e solte um arquivo', - editImage: 'Editar imagem', - focalPoint: 'Ponto Focal', - focalPointDescription: - 'Arraste o ponto focal diretamente na pré-visualização ou ajuste os valores abaixo.', - height: 'Altura', - previewSizes: 'Tamanhos de Pré-visualização', - selectCollectionToBrowse: 'Selecione uma Coleção para Navegar', - selectFile: 'Selecione um arquivo', - setCropArea: 'Definir área de corte', - setFocalPoint: 'Definir ponto focal', - sizesFor: 'Tamanhos para {{label}}', - width: 'Largura', - }, - validation: { - fieldHasNo: 'Esse campo não contém {{label}}', - limitReached: 'Limite atingido, apenas {{max}} itens podem ser adicionados.', - required: 'Esse campo é obrigatório.', - requiresAtLeast: 'Esse campo requer no máximo {{count}} {{label}}.', - }, - version: { - aboutToPublishSelection: - 'Você está prestes a publicar todos os {{label}} da seleção. Tem certeza?', - aboutToRestore: - 'Você está prestes a restaurar o documento {{label}} para o estado em que ele se encontrava em {{versionDate}}.', - aboutToRestoreGlobal: - 'Você está prestes a restaurar o Global {{label}} para o estado em que ele se encontrava em {{versionDate}}.', - aboutToRevertToPublished: - 'Você está prestes a reverter as alterações desse documento para seu estado de publicação. Tem certeza?', - aboutToUnpublish: 'Você está prestes a despublicar esse documento. Tem certeza?', - aboutToUnpublishSelection: - 'Você está prestes a cancelar a publicação de todos os {{label}} na seleção. Tem certeza?', - autosave: 'Salvamento automático', - autosavedSuccessfully: 'Salvamento automático com sucesso.', - changed: 'Alterado', - compareVersion: 'Comparar versão com:', - confirmPublish: 'Confirmar publicação', - confirmRevertToSaved: 'Confirmar a reversão para o salvo', - confirmUnpublish: 'Confirmar despublicação', - confirmVersionRestoration: 'Confirmar Restauração de versão', - draft: 'Rascunho', - draftSavedSuccessfully: 'Rascunho salvo com sucesso.', - lastSavedAgo: 'Última gravação há {{distance}}', - noFurtherVersionsFound: 'Nenhuma outra versão encontrada', - noRowsFound: 'Nenhum(a) {{label}} encontrado(a)', - preview: 'Pré-visualização', - problemRestoringVersion: 'Ocorreu um problema ao restaurar essa versão', - publish: 'Publicar', - publishChanges: 'Publicar alterações', - published: 'Publicado', - publishing: 'Publicação', - restoreThisVersion: 'Restaurar essa versão', - restoredSuccessfully: 'Restaurado com sucesso.', - restoring: 'Restaurando...', - revertToPublished: 'Reverter para publicado', - saveDraft: 'Salvar rascunho', - selectLocales: 'Selecione as localizações para exibir', - selectVersionToCompare: 'Selecione uma versão para comparar', - showLocales: 'Exibir localizações:', - status: 'Status', - type: 'Tipo', - unpublish: 'Despublicar', - unpublishing: 'Despublicando...', - version: 'Versão', - versionCreatedOn: '{{version}} criada em:', - versionID: 'ID da versão', - versions: 'Versões', - viewingVersion: 'Visualizando versão para o/a {{entityLabel}} {{documentTitle}}', - viewingVersionGlobal: '`Visualizando versão para o global {{entityLabel}}', - viewingVersions: 'Visualizando versões para o/a {{entityLabel}} {{documentTitle}}', - viewingVersionsGlobal: '`Visualizando versões para o global {{entityLabel}}', - }, -} diff --git a/packages/translations/src/_generatedFiles_/client/ro.js b/packages/translations/src/_generatedFiles_/client/ro.js deleted file mode 100644 index 1cad047bb5..0000000000 --- a/packages/translations/src/_generatedFiles_/client/ro.js +++ /dev/null @@ -1,293 +0,0 @@ -export default { - authentication: { - account: 'Cont', - accountOfCurrentUser: 'Contul utilizatorului curent', - alreadyActivated: 'Deja activat', - alreadyLoggedIn: 'Deja autorizat', - backToLogin: 'Înapoi la login', - beginCreateFirstUser: 'Pentru a începe, creați primul utilizator.', - changePassword: 'Schimbați parola', - confirmGeneration: 'Confirmați generarea', - confirmPassword: 'Confirmați parola', - createFirstUser: 'Creați primul utilizator', - emailNotValid: 'Emailul furnizat nu este valid', - emailSent: 'Email trimis', - enableAPIKey: 'Activați cheia API', - failedToUnlock: 'Nu s-a reușit deblocarea', - forceUnlock: 'Forțați deblocarea', - forgotPassword: 'Am uitat parola', - forgotPasswordEmailInstructions: - 'Vă rugăm să introduceți emailul dumneavoastră mai jos. Veți primi un mesaj de email cu instrucțiuni despre cum să vă resetați parola.', - forgotPasswordQuestion: 'Ați uitat parola?', - generate: 'Generează', - generateNewAPIKey: 'Generează o nouă cheie API', - logBackIn: 'Autentificați-vă din nou', - logOut: 'Deconectează-te', - loggedOutInactivity: 'Ați fost deconectat din cauza inactivității.', - loggedOutSuccessfully: 'Ați fost deconectat cu succes.', - login: 'Autentificare', - logout: 'Ieșire', - logoutUser: 'Deconectați utilizatorul', - newAPIKeyGenerated: 'Cheie nouă API generată.', - newPassword: 'Parolă nouă', - resetPassword: 'Resetează parola', - stayLoggedIn: 'Rămâneți conectat', - successfullyUnlocked: 'Deblocat cu succes', - unableToVerify: 'Nu se poate verifica', - verified: 'Verificat', - verifiedSuccessfully: 'Verificat cu succes', - verify: 'Verifică', - verifyUser: 'Verifică utilizatorul', - youAreInactive: - 'Nu ați mai fost activ de ceva timp și în scurt timp veți fi deconectat automat pentru propria dvs. securitate. Doriți să rămâneți conectat(ă)?', - }, - error: { - autosaving: 'A existat o problemă în timpul salvării automate a acestui document.', - correctInvalidFields: 'Vă rugăm să corectați datele invalide.', - deletingTitle: - 'S-a produs o eroare în timpul ștergerii {{title}}. Vă rugăm să verificați conexiunea și să încercați din nou.', - loadingDocument: 'A existat o problemă la încărcarea documentului cu ID-ul de {{id}}.', - noMatchedField: 'Nu s-a găsit niciun câmp corespunzător pentru "{{label}}"', - notAllowedToAccessPage: 'Nu aveți voie să accesați această pagină.', - previewing: 'A existat o problemă la previzualizarea acestui document.', - unableToDeleteCount: 'Nu se poate șterge {{count}} din {{total}} {{label}}.', - unableToUpdateCount: 'Nu se poate șterge {{count}} din {{total}} {{label}}.', - unauthorized: 'neautorizat, trebuie să vă conectați pentru a face această cerere.', - unknown: 'S-a produs o eroare necunoscută.', - unspecific: 'S-a produs o eroare.', - }, - fields: { - addLabel: 'Adăugați {{label}}', - addLink: 'Adăugați un link', - addNew: 'Adăugați un nou', - addNewLabel: 'Adăugați un nou {{label}}', - addRelationship: 'Adăugați o relație', - addUpload: 'Adăugați un fișier', - block: 'bloc', - blockType: 'Tip de bloc', - blocks: 'Blocuri', - chooseFromExisting: 'Alegeți dintre cele existente', - collapseAll: 'Colapsează toate', - editLink: 'Editați Link-ul', - editRelationship: 'Editați relația', - itemsAndMore: '{{items}} şi {{count}} mai multe', - labelRelationship: 'Relația cu {{label}}', - latitude: 'Latitudine', - linkedTo: 'Legat de <0>{{label}}', - longitude: 'Longitudine', - passwordsDoNotMatch: 'Parolele nu corespund.', - removeRelationship: 'Eliminați relația', - removeUpload: 'Eliminați încărcarea', - saveChanges: 'Salvați modificările', - searchForBlock: 'Căutați un bloc', - selectFieldsToEdit: 'Selectați câmpurile de editat', - showAll: 'Afișați toate', - swapRelationship: 'Schimbați relația', - swapUpload: 'Schimbați Încărcarea', - toggleBlock: 'Toggle bloc', - uploadNewLabel: 'Încărcați un nou {{label}}', - }, - general: { - aboutToDelete: 'Sunteți pe cale să ștergeți {{label}} <1>{{title}}. Sunteți sigur?', - aboutToDeleteCount_many: 'Sunteți pe cale să ștergeți {{count}} {{label}}', - aboutToDeleteCount_one: 'Sunteți pe cale să ștergeți {{count}} {{label}}', - aboutToDeleteCount_other: 'Sunteți pe cale să ștergeți {{count}} {{label}}', - addBelow: 'Adaugă mai jos', - addFilter: 'Adaugă filtru', - adminTheme: 'Tema Admin', - and: 'Şi', - applyChanges: 'Aplicați modificările', - ascending: 'Ascendant', - automatic: 'Automat', - backToDashboard: 'Înapoi la panoul de bord', - cancel: 'Anulați', - changesNotSaved: - 'Modificările dvs. nu au fost salvate. Dacă plecați acum, vă veți pierde modificările.', - close: 'Închide', - collapse: 'Colaps', - collections: 'Colecții', - columnToSort: 'Coloana de sortat', - columns: 'Coloane', - confirm: 'Confirmați', - confirmDeletion: 'Confirmați ștergerea', - confirmDuplication: 'Confirmați duplicarea', - copied: 'Copiat', - copy: 'Copiați', - create: 'Creează', - createNew: 'Creați unul nou', - createNewLabel: 'Creați un nou {{label}}', - created: 'Creat', - creating: 'Creare', - creatingNewLabel: 'Crearea unui nou {{label}}', - dark: 'Dark', - dashboard: 'Panoul de bord', - delete: 'Șterge', - deletedCountSuccessfully: 'Șterse cu succes {{count}} {{label}}.', - deleting: 'Deleting...', - descending: 'Descendentă', - deselectAllRows: 'Deselectează toate rândurile', - duplicate: 'Duplicați', - duplicateWithoutSaving: 'Duplicați fără salvarea modificărilor', - edit: 'Editează', - editLabel: 'Editați {{label}}', - editing: 'Editare', - editingLabel_many: 'Editare {{count}} {{label}}', - editingLabel_one: 'Editare {{count}} {{label}}', - editingLabel_other: 'Editare {{count}} {{label}}', - email: 'Email', - emailAddress: 'Adresa de email', - enterAValue: 'Introduceți o valoare', - error: 'Eroare', - errors: 'Erori', - fallbackToDefaultLocale: 'Revenire la locația implicită', - filterWhere: 'Filtrează {{label}} unde', - filters: 'Filtre', - globals: 'Globale', - language: 'Limba', - lastModified: 'Ultima modificare', - leaveAnyway: 'Pleacă oricum', - leaveWithoutSaving: 'Plecare fără a salva', - light: 'Light', - livePreview: 'Previzualizare', - loading: 'Încărcare', - locale: 'Localitate', - menu: 'Meniu', - moveDown: 'Mutați în jos', - moveUp: 'Mutați în sus', - noFiltersSet: 'Nici un filtru setat', - noLabel: '', - noOptions: 'Fără opțiuni', - noResults: - 'Nici un {{label}} găsit. Fie nu există încă niciun {{label}}, fie niciunul nu se potrivește cu filtrele pe care le-ați specificat mai sus..', - noValue: 'Nici o valoare', - none: 'Nici unul', - notFound: 'Nu a fost găsit', - nothingFound: 'Nimic găsit', - of: 'de', - open: 'Deschide', - or: 'Sau', - order: 'ORdine', - pageNotFound: 'Pagina nu a fost găsită', - password: 'Parola', - payloadSettings: 'Setări de Payload', - perPage: 'Pe pagină: {{limit}}', - remove: 'Eliminați', - reset: 'Resetare', - row: 'Rând', - rows: 'Rânduri', - save: 'Salvează', - saving: 'Salvare...', - searchBy: 'Căutați după {{label}}', - selectAll: 'Selectați toate {{count}} {{label}}', - selectAllRows: 'Selectează toate rândurile', - selectValue: 'Selectați o valoare', - selectedCount: '{{count}} {{label}} selectate', - showAllLabel: 'Afișează toate {{eticheta}}', - sorryNotFound: 'Ne pare rău - nu există nimic care să corespundă cu cererea dvs.', - sort: 'Sortează', - sortByLabelDirection: 'Sortează după {{etichetă}} {{direcţie}}', - stayOnThisPage: 'Rămâneți pe această pagină', - submissionSuccessful: 'Trimitere cu succes.', - submit: 'Trimite', - successfullyCreated: '{{label}} creat(ă) cu succes.', - thisLanguage: 'Română', - titleDeleted: '{{label}} "{{title}}" șters cu succes.', - unauthorized: 'neautorizat(ă)', - unsavedChangesDuplicate: 'Aveți modificări nesalvate. Doriți să continuați să duplicați?', - untitled: 'Fără titlu', - updatedAt: 'Actualizat la', - updatedCountSuccessfully: 'Actualizate {{count}} {{label}} cu succes.', - updatedSuccessfully: 'Actualizat cu succes.', - updating: 'Actualizare', - welcome: 'Bine ați venit', - }, - operators: { - contains: 'conține', - equals: 'egal cu', - exists: 'există', - isGreaterThan: 'este mai mare decât', - isGreaterThanOrEqualTo: 'este mai mare sau egal cu', - isIn: 'este în', - isLessThan: 'este mai mic decât', - isLessThanOrEqualTo: 'este mai mic decât sau egal cu', - isLike: 'este ca', - isNotEqualTo: 'nu este egal cu', - isNotIn: 'nu este în', - near: 'în apropiere de', - }, - upload: { - crop: 'Cultură', - cropToolDescription: - 'Trageți colțurile zonei selectate, desenați o nouă zonă sau ajustați valorile de mai jos.', - dragAndDrop: 'Trageți și plasați un fișier', - editImage: 'Editează imaginea', - focalPoint: 'Punct central', - focalPointDescription: - 'Trageți punctul focal direct pe previzualizare sau ajustați valorile de mai jos.', - height: 'Înălțime', - previewSizes: 'Dimensiuni Previzualizare', - selectCollectionToBrowse: 'Selectați o colecție pentru navigare', - selectFile: 'Selectați un fișier', - setCropArea: 'Setați zona de decupare', - setFocalPoint: 'Setează punctul focal', - sizesFor: 'Mărimi pentru {{label}}', - width: 'Lățime', - }, - validation: { - fieldHasNo: 'Acest câmp nu are un {{label}}', - limitReached: 'Limita atinsă, doar {{max}} elemente pot fi adăugate.', - required: 'Acest câmp este obligatoriu.', - requiresAtLeast: 'Acest domeniu necesită cel puțin {{count}} {{label}}.', - }, - version: { - aboutToPublishSelection: - 'Sunteți pe cale să publicați toate {{label}} din selecție. Sunteți sigur?', - aboutToRestore: - 'Sunteți pe cale să readuceți acest document {{label}} în starea în care se afla la data de {{versionDate}}.', - aboutToRestoreGlobal: - 'Sunteți pe cale să readuceți {{label}} global în starea în care se afla la data de {{versionDate}}.', - aboutToRevertToPublished: - 'Sunteți pe cale să readuceți modificările aduse acestui document la starea sa publicată. Sunteți sigur?', - aboutToUnpublish: 'Sunteți pe cale să nepublicați acest document. Sunteți sigur?', - aboutToUnpublishSelection: - 'Sunteți pe punctul de a nepublica toate {{label}} din selecție. Sunteți sigur?', - autosave: 'Autosalvare', - autosavedSuccessfully: 'Autosalvare cu succes.', - changed: 'Schimbat', - compareVersion: 'Comparați versiunea cu:', - confirmPublish: 'Confirmați publicarea', - confirmRevertToSaved: 'Confirmați revenirea la starea salvată', - confirmUnpublish: 'Confirmați nepublicarea', - confirmVersionRestoration: 'Confirmați restaurarea versiunii', - draft: 'Proiect', - draftSavedSuccessfully: 'Proiect salvat cu succes.', - lastSavedAgo: 'Ultima salvare acum {{distance}}', - noFurtherVersionsFound: 'Nu s-au găsit alte versiuni', - noRowsFound: 'Nu s-a găsit niciun {{label}}', - preview: 'Previzualizare', - problemRestoringVersion: 'A existat o problemă la restaurarea acestei versiuni', - publish: 'Publicați', - publishChanges: 'Publicați modificările', - published: 'Publicat', - restoreThisVersion: 'Restaurați această versiune', - restoredSuccessfully: 'Restaurat cu succes.', - restoring: 'Restaurare...', - revertToPublished: 'Reveniți la publicat', - saveDraft: 'Salvați proiectul', - selectLocales: 'Selectați localitățile de afișat', - selectVersionToCompare: 'Selectați o versiune pentru a compara', - showLocales: 'Afișați localitățile:', - status: 'Status', - type: 'Tip', - unpublish: 'Dezpublicare', - unpublishing: 'Dezpublicare...', - version: 'Versiune', - versionCreatedOn: '{{version}} creată pe:', - versionID: 'ID-ul versiunii', - versions: 'Versiuni', - viewingVersion: 'Vizualizarea versiunii pentru {{entityLabel}} {{documentTitle}}', - viewingVersionGlobal: 'Vizualizarea versiunii pentru globala {{entityLabel}}', - viewingVersions: 'Vizualizarea versiunilor pentru {{entityLabel}} {{documentTitle}}', - viewingVersionsGlobal: 'Vizualizarea versiunilor pentru globala {{entityLabel}}', - }, -} diff --git a/packages/translations/src/_generatedFiles_/client/rs-latin.js b/packages/translations/src/_generatedFiles_/client/rs-latin.js deleted file mode 100644 index d40a5682ab..0000000000 --- a/packages/translations/src/_generatedFiles_/client/rs-latin.js +++ /dev/null @@ -1,290 +0,0 @@ -export default { - authentication: { - account: 'Nalog', - accountOfCurrentUser: 'Nalog trenutnog korisnika', - alreadyActivated: 'Već aktivirano', - alreadyLoggedIn: 'Već prijavljen', - backToLogin: 'Nazad na prijavu', - beginCreateFirstUser: 'Na samom početku kreiraj svog prvog korisnika', - changePassword: 'Promeni lozinku', - confirmGeneration: 'Potvrdi kreiranje', - confirmPassword: 'Potvrdi lozinku', - createFirstUser: 'Kreiraj prvog korisnika', - emailNotValid: 'Adresa e-pošte nije validna', - emailSent: 'Poruka e-pošte prosleđena', - enableAPIKey: 'Omogući API ključ', - failedToUnlock: 'Neuspešno otključavanje.', - forceUnlock: 'Prinudno otključaj', - forgotPassword: 'Zaboravljena lozinka', - forgotPasswordEmailInstructions: - 'Molimo Vas da unesete svoj adresu e-pošte. Primićete poruku sa uputstvom za ponovno postavljanje lozinke.', - forgotPasswordQuestion: 'Zaboravljena lozinka?', - generate: 'Generiši', - generateNewAPIKey: 'Generiši novi API ključ', - logBackIn: 'Ponovna prijava', - logOut: 'Odjava', - loggedOutInactivity: 'Odjavljeni se zbog neaktivnosti.', - loggedOutSuccessfully: 'Uspešno ste odjavljeni', - login: 'Prijava', - logout: 'Odjava', - logoutUser: 'Odjava korisnika', - newAPIKeyGenerated: 'Novi API ključ generisan.', - newPassword: 'Nova lozinka', - resetPassword: 'Promena lozinke', - stayLoggedIn: 'Ostani prijavljen', - successfullyUnlocked: 'Uspešno otključano', - unableToVerify: 'Nije moguće potvrditi', - verified: 'Potvrđeno', - verifiedSuccessfully: 'Uspešno potvrđeno', - verify: 'Potvrdi', - verifyUser: 'Potvrdi korisnika', - youAreInactive: - 'Neaktivni ste već neko vreme i uskoro ćete biti automatski odjavljeni zbog sigurnosti. Da li želite ostati prijavljeni?', - }, - error: { - autosaving: 'Nastao je problem pri automatskom čuvanju ovog dokumenta.', - correctInvalidFields: 'Molimo ispravite nevalidna polja.', - deletingTitle: - 'Dogodila se greška pri brisanju {{title}}. Proverite internet konekciju i pokušajte ponovo.', - loadingDocument: 'Postoji problem pri učitavanju dokumenta čiji je ID {{id}}.', - noMatchedField: 'Nema podudarajućih polja za "{{label}}"', - notAllowedToAccessPage: 'Nemate dozvolu za pristup ovoj stranici.', - previewing: 'Postoji problem pri pregledu ovog dokumenta.', - unableToDeleteCount: 'Nije moguće izbrisati {{count}} od {{total}} {{label}}.', - unableToUpdateCount: 'Nije moguće ažurirati {{count}} od {{total}} {{label}}.', - unauthorized: 'Niste autorizovani da biste uputili ovaj zahtev.', - unknown: 'Došlo je do nepoznate greške.', - unspecific: 'Došlo je do greške.', - }, - fields: { - addLabel: 'Dodaj {{label}}', - addLink: 'Dodaj link', - addNew: 'Dodaj novi', - addNewLabel: 'Dodaj novi {{label}}', - addRelationship: 'Dodaj relaciju', - addUpload: 'Dodaj učitavanje', - block: 'blokiranje', - blockType: 'Vrsta blokiranja', - blocks: 'blokiranja', - chooseFromExisting: 'Odaberite iz postojećih.', - collapseAll: 'Skupi sve', - editLink: 'Izmeni link', - editRelationship: 'Izmeni odnos', - itemsAndMore: '{{items}} i {{count}} više', - labelRelationship: '{{label}} veza', - latitude: 'Geografska širina', - linkedTo: 'Povezani sa <0>{{label}}', - longitude: 'Geografska dužina', - passwordsDoNotMatch: 'Lozinke nisu iste.', - removeRelationship: 'Ukloni vezu', - removeUpload: 'Ukloni prenos', - saveChanges: 'Sačuvaj promene', - searchForBlock: 'Pretraži blok', - selectFieldsToEdit: 'Odaberite polja za promenu', - showAll: 'Pokaži sve', - swapRelationship: 'Zameni vezu', - swapUpload: 'Zameni prenos', - toggleBlock: 'Prebaci blok', - uploadNewLabel: 'Učitaj novi {{label}}', - }, - general: { - aboutToDelete: 'Izbrisaćete {{label}} <1>{{title}}. Da li ste sigurni?', - aboutToDeleteCount_many: 'Izbrisaćete {{count}} {{label}}', - aboutToDeleteCount_one: 'Izbrisaćete {{count}} {{label}}', - aboutToDeleteCount_other: 'Izbrisaćete {{count}} {{label}}', - addBelow: 'Dodaj ispod', - addFilter: 'Dodaj filter', - adminTheme: 'Administratorska tema', - and: 'I', - applyChanges: 'Primeni promene', - ascending: 'Uzlazno', - automatic: 'Automatsko', - backToDashboard: 'Nazad na kontrolni panel', - cancel: 'Otkaži', - changesNotSaved: 'Vaše promene nisu sačuvane. Ako izađete sada, izgubićete promene.', - close: 'Zatvori', - collapse: 'Skupi', - collections: 'Kolekcije', - columnToSort: 'Kolona za sortiranje', - columns: 'Kolone', - confirm: 'Potvrdi', - confirmDeletion: 'Potvrdi brisanje', - confirmDuplication: 'Potvrdi duplikaciju', - copied: 'Kopirano', - copy: 'Kopiraj', - create: 'Kreiraj', - createNew: 'Kreiraj novo', - createNewLabel: 'Kreiraj novo {{label}}', - created: 'Kreirano', - creating: 'Kreira se', - creatingNewLabel: 'Kreiranje novog {{label}}', - dark: 'Tamno', - dashboard: 'Kontrolni panel', - delete: 'Obriši', - deletedCountSuccessfully: 'Uspešno izbrisano {{count}} {{label}}.', - deleting: 'Brisanje...', - descending: 'Opadajuće', - deselectAllRows: 'Deselektujte sve redove', - duplicate: 'Duplikat', - duplicateWithoutSaving: 'Ponovi bez čuvanja promena', - edit: 'Uredi', - editLabel: 'Uredi {{label}}', - editing: 'Uređivanje', - editingLabel_many: 'Uređivanje {{count}} {{label}}', - editingLabel_one: 'Uređivanje {{count}} {{label}}', - editingLabel_other: 'Uređivanje {{count}} {{label}}', - email: 'E-pošta', - emailAddress: 'Аdresa e-pošte', - enterAValue: 'Unesi vrednost', - error: 'Greška', - errors: 'Greške', - fallbackToDefaultLocale: 'Vraćanje na zadati jezik', - filterWhere: 'Filter {{label}} gde', - filters: 'Filteri', - globals: 'Globali', - language: 'Jezik', - lastModified: 'Zadnja promena', - leaveAnyway: 'Svejedno napusti', - leaveWithoutSaving: 'Napusti bez čuvanja', - light: 'Svetlo', - livePreview: 'Pregled', - loading: 'Učitavanje', - locale: 'Jezik', - menu: 'Meni', - moveDown: 'Pomeri dole', - moveUp: 'Pomeri gore', - noFiltersSet: 'Nema postavljenih filtera', - noLabel: '', - noOptions: 'Nema opcija', - noResults: - 'Nema pronađenih {{label}}. Moguće da {{label}} još uvek ne postoji ili nema rezultata u skladu sa postavljenim filterima.', - noValue: 'Bez vrednosti', - none: 'Nijedan', - notFound: 'Nije pronađeno', - nothingFound: 'Ništa nije pronađeno', - of: 'Od', - open: 'Otvori', - or: 'Ili', - order: 'Redosled', - pageNotFound: 'Stranica nije pronađena', - password: 'Lozinka', - payloadSettings: 'Payload postavke', - perPage: 'Po stranici: {{limit}}', - remove: 'Ukloni', - reset: 'Ponovo postavi', - row: 'Red', - rows: 'Redovi', - save: 'Sačuvaj', - saving: 'Čuvanje u toku...', - searchBy: 'Traži po {{label}}', - selectAll: 'Odaberite sve {{count}} {{label}}', - selectAllRows: 'Odaberite sve redove', - selectValue: 'Odaberi vrednost', - selectedCount: '{{count}} {{label}} odabrano', - showAllLabel: 'Prikaži sve {{label}}', - sorryNotFound: 'Nažalost, ne postoji ništa što odgovara vašem zahtevu.', - sort: 'Sortiraj', - sortByLabelDirection: 'Sortiraj prema {{label}} {{direction}}', - stayOnThisPage: 'Ostani na ovoj stranici', - submissionSuccessful: 'Uspešno slanje', - submit: 'Potvrdi', - successfullyCreated: '{{label}} uspešno kreirano.', - thisLanguage: 'Srpski (latinica)', - titleDeleted: '{{label}} "{{title}}" uspešno obrisano.', - unauthorized: 'Niste autorizovani', - unsavedChangesDuplicate: 'Imate nesačuvane promene. Da li želite nastaviti sa dupliciranjem?', - untitled: 'Bez naslova', - updatedAt: 'Ažurirano u', - updatedCountSuccessfully: 'Uspešno ažurirano {{count}} {{label}}.', - updatedSuccessfully: 'Uspešno ažurirano.', - updating: 'Ažuriranje', - welcome: 'Dobrodošli', - }, - operators: { - contains: 'sadrži', - equals: 'jednako', - exists: 'postoji', - isGreaterThan: 'je veće od', - isGreaterThanOrEqualTo: 'je veće od ili jednako', - isIn: 'je u', - isLessThan: 'manje je od', - isLessThanOrEqualTo: 'manje je ili jednako', - isLike: 'je kao', - isNotEqualTo: 'nije jednako', - isNotIn: 'nije unutra', - near: 'blizu', - }, - upload: { - crop: 'Isecite sliku', - cropToolDescription: - 'Prevucite uglove izabranog područja, nacrtajte novo područje ili prilagodite vrednosti ispod.', - dragAndDrop: 'Prevucite i ispustite datoteku', - editImage: 'Uredi sliku', - focalPoint: 'Centralna tačka', - focalPointDescription: - 'Prevucite središnju tačku direktno na pregled ili prilagodite vrednosti ispod.', - height: 'Visina', - previewSizes: 'Veličine pregleda', - selectCollectionToBrowse: 'Odaberite kolekciju za pregled', - selectFile: 'Odaberite datoteku', - setCropArea: 'Postavite područje za isečenu sliku', - setFocalPoint: 'Postavite centralnu tačku', - sizesFor: 'Veličine za {{label}}', - width: 'Širina', - }, - validation: { - fieldHasNo: 'Ovo polje nema {{label}}', - limitReached: 'Dosegnut je limit, može se dodati samo {{max}} stavki.', - required: 'Ovo polje je obavezno.', - requiresAtLeast: 'Ovo polje zahteva minimalno {{count}} {{label}}.', - }, - version: { - aboutToPublishSelection: 'Upravo ćete objaviti sve {{label}} u izboru. Da li ste sigurni?', - aboutToRestore: 'Vratićete {{label}} dokument u stanje u kojem je bio {{versionDate}}', - aboutToRestoreGlobal: 'Vratićete globalni {{label}} u stanje u kojem je bio {{versionDate}}.', - aboutToRevertToPublished: - 'Vratićete promene u dokumentu u objavljeno stanje. Da li ste sigurni?', - aboutToUnpublish: 'Poništićete objavu ovog dokumenta. Da li ste sigurni?', - aboutToUnpublishSelection: - 'Upravo ćete poništiti objavu svih {{label}} u odabiru. Da li ste sigurni?', - autosave: 'Automatsko čuvanje', - autosavedSuccessfully: 'Automatsko čuvanje uspešno.', - changed: 'Promenjeno', - compareVersion: 'Uporedi verziju sa:', - confirmPublish: 'Potvrdi objavu', - confirmRevertToSaved: 'Potvrdite vraćanje na sačuvano', - confirmUnpublish: 'Potvrdite poništavanje objave', - confirmVersionRestoration: 'Potvrdite vraćanje verzije', - draft: 'Nacrt', - draftSavedSuccessfully: 'Nacrt uspešno sačuvan.', - lastSavedAgo: 'Zadnji put sačuvano pre {{distance}', - noFurtherVersionsFound: 'Nisu pronađene naredne verzije', - noRowsFound: '{{label}} nije pronađeno', - preview: 'Pregled', - problemRestoringVersion: 'Nastao je problem pri vraćanju ove verzije', - publish: 'Objaviti', - publishChanges: 'Objavljivanje', - published: 'Objavljeno', - publishing: 'Objavljivanje', - restoreThisVersion: 'Vrati ovu verziju', - restoredSuccessfully: 'Uspešno vraćeno.', - restoring: 'Vraćanje...', - revertToPublished: 'Vrati na objavljeno', - saveDraft: 'Sačuvaj nacrt', - selectLocales: 'Odaberite jezike', - selectVersionToCompare: 'Odaberite verziju za upoređivanje', - showLocales: 'Prikaži jezike:', - status: 'Status', - type: 'Tip', - unpublish: 'Poništi objavu', - unpublishing: 'Poništavanje objave...', - version: 'Verzija', - versionCreatedOn: '{{version}} kreiranih:', - versionID: 'ID verzije', - versions: 'Verzije', - viewingVersion: 'Pregled verzije za {{entityLabel}} {{documentTitle}}', - viewingVersionGlobal: 'Pregled verzije za globalni {{entityLabel}}', - viewingVersions: 'Pregled verzija za {{entityLabel}} {{documentTitle}}', - viewingVersionsGlobal: 'Pregled verzije za globalni {{entityLabel}}', - }, -} diff --git a/packages/translations/src/_generatedFiles_/client/rs.js b/packages/translations/src/_generatedFiles_/client/rs.js deleted file mode 100644 index e019d13ec8..0000000000 --- a/packages/translations/src/_generatedFiles_/client/rs.js +++ /dev/null @@ -1,289 +0,0 @@ -export default { - authentication: { - account: 'Налог', - accountOfCurrentUser: 'Налог тренутног корисника', - alreadyActivated: 'Већ активирано', - alreadyLoggedIn: 'Већ пријављен', - backToLogin: 'Назад на пријаву', - beginCreateFirstUser: 'На самом почетку креирај свог првог корисника', - changePassword: 'Промени лозинку', - confirmGeneration: 'Потврди креирање', - confirmPassword: 'Потврди лозинку', - createFirstUser: 'Креирај првог корисника', - emailNotValid: 'Адреса е-поште није валидна', - emailSent: 'Порука е-поште прослеђена', - enableAPIKey: 'Омогући API кључ', - failedToUnlock: 'Неуспешно откључавање.', - forceUnlock: 'Принудно откључај', - forgotPassword: 'Заборављена лозинка', - forgotPasswordEmailInstructions: - 'Молимо Вас да унесете својy адресy е-поште. Примићете поруку са упутством за поновно постављање лозинке.', - forgotPasswordQuestion: 'Заборављена лозинка?', - generate: 'Генериши', - generateNewAPIKey: 'Генериши нови АПИ кључ', - logBackIn: 'Поновна пријава', - logOut: 'Одјава', - loggedOutInactivity: 'Одјављени се због неактивности.', - loggedOutSuccessfully: 'Успешно сте одјављени', - login: 'Пријава', - logout: 'Одјава', - logoutUser: 'Одјава корисника', - newAPIKeyGenerated: 'Нови АПИ кључ генерисан.', - newPassword: 'Нова лозинка', - resetPassword: 'Промена лозинке', - stayLoggedIn: 'Остани пријављен', - successfullyUnlocked: 'Успешно откључано', - unableToVerify: 'Није могуће потврдити', - verified: 'Потврђено', - verifiedSuccessfully: 'Успешно потврђено', - verify: 'Потврди', - verifyUser: 'Потврди корисника', - youAreInactive: - 'Неактивни сте већ неко време и ускоро ћете бити аутоматски одјављени због сигурности. Да ли желите остати пријављени?', - }, - error: { - autosaving: 'Настао је проблем при аутоматском чувању овог документа.', - correctInvalidFields: 'Молимо исправите невалидна поља.', - deletingTitle: - 'Догодила се грешка при брисању {{title}}. Проверите интернет конекцију и покушајте поново.', - loadingDocument: 'Постоји проблем при учитавању документа чији је ИД {{id}}.', - noMatchedField: 'Нема подударајућих поља за "{{label}}"', - notAllowedToAccessPage: 'Немате дозволу за приступ овој страници.', - previewing: 'Постоји проблем при прегледу овог документа.', - unableToDeleteCount: 'Није могуће избрисати {{count}} од {{total}} {{label}}.', - unableToUpdateCount: 'Није могуће ажурирати {{count}} од {{total}} {{label}}.', - unauthorized: 'Нисте ауторизовани да бисте упутили овај захтев.', - unknown: 'Дошло је до непознате грешке.', - unspecific: 'Дошло је до грешке.', - }, - fields: { - addLabel: 'Додај {{label}}', - addLink: 'Додај линк', - addNew: 'Додај нови', - addNewLabel: 'Додај нови {{label}}', - addRelationship: 'Додај релацију', - addUpload: 'Додај учитавање', - block: 'блокирање', - blockType: 'Врста блокирања', - blocks: 'блокирања', - chooseFromExisting: 'Одаберите из постојећих.', - collapseAll: 'Скупи све', - editLink: 'Измени линк', - editRelationship: 'Измени однос', - itemsAndMore: '{{items}} и {{count}} више', - labelRelationship: '{{label}} веза', - latitude: 'Географска ширина', - linkedTo: 'Повезани са <0>{{label}}', - longitude: 'Географска дужина', - passwordsDoNotMatch: 'Лозинке нису исте.', - removeRelationship: 'Уклони везу', - removeUpload: 'Уклони пренос', - saveChanges: 'Сачувај промене', - searchForBlock: 'Претражи блок', - selectFieldsToEdit: 'Одаберите поља за промену', - showAll: 'Покажи све', - swapRelationship: 'Замени везу', - swapUpload: 'Замени пренос', - toggleBlock: 'Пребаци блок', - uploadNewLabel: 'Учитај нови {{label}}', - }, - general: { - aboutToDelete: 'Избрисаћете {{label}} <1>{{title}}. Да ли сте сигурни?', - aboutToDeleteCount_many: 'Избрисаћете {{count}} {{label}}', - aboutToDeleteCount_one: 'Избрисаћете {{count}} {{label}}', - aboutToDeleteCount_other: 'Избрисаћете {{count}} {{label}}', - addBelow: 'Додај испод', - addFilter: 'Додај филтер', - adminTheme: 'Администраторска тема', - and: 'И', - applyChanges: 'Примени промене', - ascending: 'Узлазно', - automatic: 'Аутоматско', - backToDashboard: 'Назад на контролни панел', - cancel: 'Откажи', - changesNotSaved: 'Ваше промене нису сачуване. Ако изађете сада, изгубићете промене.', - close: 'Затвори', - collapse: 'Скупи', - collections: 'Колекције', - columnToSort: 'Колона за сортирање', - columns: 'Колоне', - confirm: 'Потврди', - confirmDeletion: 'Потврди брисање', - confirmDuplication: 'Потврди дупликацију', - copied: 'Копирано', - copy: 'Копирај', - create: 'Креирај', - createNew: 'Креирај ново', - createNewLabel: 'Креирај ново {{label}}', - created: 'Креирано', - creating: 'Креира се', - creatingNewLabel: 'Креирање новог {{label}}', - dark: 'Тамно', - dashboard: 'Контролни панел', - delete: 'Обриши', - deletedCountSuccessfully: 'Успешно избрисано {{count}} {{label}}.', - deleting: 'Брисање...', - descending: 'Опадајуће', - deselectAllRows: 'Деселектујте све редове', - duplicate: 'Дупликат', - duplicateWithoutSaving: 'Понови без чувања промена', - edit: 'Уреди', - editLabel: 'Уреди {{label}}', - editing: 'Уређивање', - editingLabel_many: 'Уређивање {{count}} {{label}}', - editingLabel_one: 'Уређивање {{count}} {{label}}', - editingLabel_other: 'Уређивање {{count}} {{label}}', - email: 'Е-пошта', - emailAddress: 'Адреса е-поште', - enterAValue: 'Унеси вредност', - error: 'Грешка', - errors: 'Грешке', - fallbackToDefaultLocale: 'Враћање на задати језик', - filterWhere: 'Филтер {{label}} где', - filters: 'Филтери', - globals: 'Глобали', - language: 'Језик', - lastModified: 'Задња промена', - leaveAnyway: 'Свеједно напусти', - leaveWithoutSaving: 'Напусти без чувања', - light: 'Светло', - livePreview: 'Преглед', - loading: 'Учитавање', - locale: 'Језик', - menu: 'Мени', - moveDown: 'Помери доле', - moveUp: 'Помери горе', - noFiltersSet: 'Нема постављених филтера', - noLabel: '<Нема {{label}}>', - noOptions: 'Нема опција', - noResults: - 'Нема пронађених {{label}}. Могуће да {{label}} још увек не постоји или нема резултата у складу са постављеним филтерима.', - noValue: 'Без вредности', - none: 'Ниједан', - notFound: 'Није пронађено', - nothingFound: 'Ништа није пронађено', - of: 'Од', - open: 'Отвори', - or: 'Или', - order: 'Редослед', - pageNotFound: 'Страница није пронађена', - password: 'Лозинка', - payloadSettings: 'Payload поставке', - perPage: 'По страници: {{limit}}', - remove: 'Уклони', - reset: 'Поново постави', - row: 'Ред', - rows: 'Редови', - save: 'Сачувај', - saving: 'Чување у току...', - searchBy: 'Тражи по {{label}}', - selectAll: 'Одаберите све {{count}} {{label}}', - selectAllRows: 'Одаберите све редове', - selectValue: 'Одабери вредност', - selectedCount: '{{count}} {{label}} одабрано', - showAllLabel: 'Прикажи све {{label}}', - sorryNotFound: 'Нажалост, не постоји ништа што одговара вашем захтеву.', - sort: 'Сортирај', - sortByLabelDirection: 'Сортирај према {{label}} {{дирецтион}}', - stayOnThisPage: 'Остани на овој страници', - submissionSuccessful: 'Успешно слање', - submit: 'Потврди', - successfullyCreated: '{{label}} успешно креирано.', - thisLanguage: 'Српски (ћирилица)', - titleDeleted: '{{label}} "{{title}}" успешно обрисано.', - unauthorized: 'Нисте ауторизовани', - unsavedChangesDuplicate: 'Имате несачуване промене. Да ли желите наставити са дуплицирањем?', - untitled: 'Без наслова', - updatedAt: 'Ажурирано у', - updatedCountSuccessfully: 'Успешно ажурирано {{count}} {{label}}.', - updatedSuccessfully: 'Успешно ажурирано.', - updating: 'Ажурирање', - welcome: 'Добродошли', - }, - operators: { - contains: 'садржи', - equals: 'једнако', - exists: 'постоји', - isGreaterThan: 'је веће од', - isGreaterThanOrEqualTo: 'је веће од или једнако', - isIn: 'је у', - isLessThan: 'мање је од', - isLessThanOrEqualTo: 'мање је или једнако', - isLike: 'је као', - isNotEqualTo: 'није једнако', - isNotIn: 'није у', - near: 'близу', - }, - upload: { - crop: 'Исеците слику', - cropToolDescription: - 'Превуците углове изабраног подручја, нацртајте ново подручје или прилагодите вредности испод.', - dragAndDrop: 'Превуците и испустите датотеку', - editImage: 'Уреди слику', - focalPoint: 'Централна тачка', - focalPointDescription: - 'Превуците средишњу тачку директно на преглед или прилагодите вредности испод.', - height: 'Висина', - previewSizes: 'Величине прегледа', - selectCollectionToBrowse: 'Одаберите колекцију за преглед', - selectFile: 'Одаберите датотеку', - setCropArea: 'Поставите подручје за исечену слику', - setFocalPoint: 'Поставите централну тачку', - sizesFor: 'Величине за {{label}}', - width: 'Ширина', - }, - validation: { - fieldHasNo: 'Ово поље нема {{label}}', - limitReached: 'Досегнут је лимит, може се додати само {{max}} ставки.', - required: 'Ово поље је обавезно.', - requiresAtLeast: 'Ово поље захтева минимално {{count}} {{label}}.', - }, - version: { - aboutToPublishSelection: 'Управо ћете објавити све {{label}} у избору. Да ли сте сигурни?', - aboutToRestore: 'Вратићете {{label}} документ у стање у којем је био {{versionDate}}', - aboutToRestoreGlobal: 'Вратићете глобални {{label}} у стање у којем је био {{versionDate}}.', - aboutToRevertToPublished: 'Вратићете промене у документу у објављено стање. Да ли сте сигурни?', - aboutToUnpublish: 'Поништићете објаву овог документа. Да ли сте сигурни?', - aboutToUnpublishSelection: - 'Управо ћете поништити објаву свих {{label}} у одабиру. Да ли сте сигурни?', - autosave: 'Аутоматско чување', - autosavedSuccessfully: 'Аутоматско чување успешно.', - changed: 'Промењено', - compareVersion: 'Упореди верзију са:', - confirmPublish: 'Потврди објаву', - confirmRevertToSaved: 'Потврдите враћање на сачувано', - confirmUnpublish: 'Потврдите поништавање објаве', - confirmVersionRestoration: 'Потврдите враћање верзије', - draft: 'Нацрт', - draftSavedSuccessfully: 'Нацрт успешно сачуван.', - lastSavedAgo: 'Задњи пут сачувано пре {{distance}', - noFurtherVersionsFound: 'Нису пронађене наредне верзије', - noRowsFound: '{{label}} није пронађено', - preview: 'Преглед', - problemRestoringVersion: 'Настао је проблем при враћању ове верзије', - publish: 'Објавити', - publishChanges: 'Објави промене', - published: 'Објављено', - publishing: 'Objavljivanje', - restoreThisVersion: 'Врати ову верзију', - restoredSuccessfully: 'Успешно враћено.', - restoring: 'Враћање...', - revertToPublished: 'Врати на објављено', - saveDraft: 'Сачувај нацрт', - selectLocales: 'Одаберите језике', - selectVersionToCompare: 'Одаберите верзију за упоређивање', - showLocales: 'Прикажи језике:', - status: 'Статус', - type: 'Тип', - unpublish: 'Поништи објаву', - unpublishing: 'Поништавање објаве...', - version: 'Верзија', - versionCreatedOn: '{{version}} креираних:', - versionID: 'Идентификатор верзије', - versions: 'Верзије', - viewingVersion: 'Преглед верзије за {{entityLabel}} {{documentTitle}}', - viewingVersionGlobal: 'Преглед верзије за глобални {{entityLabel}}', - viewingVersions: 'Преглед верзија за {{entityLabel}} {{documentTitle}}', - viewingVersionsGlobal: 'Преглед верзије за глобални {{entityLabel}}', - }, -} diff --git a/packages/translations/src/_generatedFiles_/client/ru.js b/packages/translations/src/_generatedFiles_/client/ru.js deleted file mode 100644 index 9812504e52..0000000000 --- a/packages/translations/src/_generatedFiles_/client/ru.js +++ /dev/null @@ -1,294 +0,0 @@ -export default { - authentication: { - account: 'Аккаунт', - accountOfCurrentUser: 'Аккаунт текущего пользователя', - alreadyActivated: 'Уже активирован', - alreadyLoggedIn: 'Уже вошли в систему', - backToLogin: 'Вернуться к входу', - beginCreateFirstUser: 'Чтобы начать - создайте первого пользователя.', - changePassword: 'Сменить пароль', - confirmGeneration: 'Подтвердить генерацию', - confirmPassword: 'Подтверждение пароля', - createFirstUser: 'Создание первого пользователя', - emailNotValid: 'Указанный адрес электронной почты неверен', - emailSent: 'Email отправлен', - enableAPIKey: 'Активировать API ключ', - failedToUnlock: 'Не удалось разблокировать', - forceUnlock: 'Принудительная разблокировка', - forgotPassword: 'Забыли пароль', - forgotPasswordEmailInstructions: - 'Пожалуйста, введите ваш email. Вы получите письмо с инструкцией по восстановлению пароля.', - forgotPasswordQuestion: 'Забыли пароль?', - generate: 'Сгенерировать', - generateNewAPIKey: 'Сгенерировать новый API ключ', - logBackIn: 'Войти снова', - logOut: 'Выйти', - loggedOutInactivity: 'Вы вышли из системы из-за неактивности.', - loggedOutSuccessfully: 'Вы успешно вышли из системы.', - login: 'Войти', - logout: 'Выйти', - logoutUser: 'Вход из системы', - newAPIKeyGenerated: 'Новый API ключ сгенерирован.', - newPassword: 'Новый пароль', - resetPassword: 'Сброс пароля', - stayLoggedIn: 'Остаться в системе', - successfullyUnlocked: 'Успешно разблокирован', - unableToVerify: 'Невозможно подтвердить', - verified: 'Подтверждено', - verifiedSuccessfully: 'Успешно подтверждено', - verify: 'Подтвердить', - verifyUser: 'Подтвердить пользователя', - youAreInactive: - 'Вы не были активны в течение некоторого времени и скоро автоматически выйдете из системы в целях вашей безопасности. Вы хотите остаться в системе?', - }, - error: { - autosaving: 'При автосохранении этого документа возникла проблема.', - correctInvalidFields: 'Пожалуйста, исправьте неправильные поля.', - deletingTitle: - 'При удалении {{title}} произошла ошибка. Пожалуйста, проверьте соединение и повторите попытку.', - loadingDocument: 'Возникла проблема при загрузке документа с ID {{id}}.', - noMatchedField: 'Не найдено подходящего поля для "{{label}}"', - notAllowedToAccessPage: 'Вы не имеете права доступа к этой странице.', - previewing: 'При предварительном просмотре этого документа возникла проблема.', - unableToDeleteCount: 'Не удалось удалить {{count}} из {{total}} {{label}}.', - unableToUpdateCount: 'Не удалось обновить {{count}} из {{total}} {{label}}.', - unauthorized: 'Нет доступа, вы должны войти, чтобы сделать этот запрос.', - unknown: 'Произошла неизвестная ошибка.', - unspecific: 'Произошла ошибка.', - }, - fields: { - addLabel: 'Добавить {{label}}', - addLink: 'Добавить ссылку', - addNew: 'Добавить новый', - addNewLabel: 'Добавить {{label}}', - addRelationship: 'Добавить Отношения', - addUpload: 'Добавить загрузку', - block: 'Блок', - blockType: 'Тип Блока', - blocks: 'Блоки', - chooseFromExisting: 'Выбрать из существующих', - collapseAll: 'Свернуть все', - editLink: 'Редактировать ссылку', - editRelationship: 'Редактировать Отношения', - itemsAndMore: '{{items}} и ещё {{count}}', - labelRelationship: '{{label}} Отношения', - latitude: 'Широта', - linkedTo: 'Связано с <0>{{label}}', - longitude: 'Долгота', - passwordsDoNotMatch: 'Пароли не совпадают.', - removeRelationship: 'Удалить связь', - removeUpload: 'Удалить загруженное', - saveChanges: 'Сохранить изменения', - searchForBlock: 'Найти Блок', - selectFieldsToEdit: 'Выберите поля для редактирования', - showAll: 'Показать все', - swapRelationship: 'Поменять отношения', - swapUpload: 'Заменить загруженное', - toggleBlock: 'Переключить Блок', - uploadNewLabel: 'Загрузить новый {{label}}', - }, - general: { - aboutToDelete: 'Вы собираетесь удалить {{label}} <1>{{title}}. Вы уверены?', - aboutToDeleteCount_many: 'Вы собираетесь удалить {{count}} {{label}}', - aboutToDeleteCount_one: 'Вы собираетесь удалить {{count}} {{label}}', - aboutToDeleteCount_other: 'Вы собираетесь удалить {{count}} {{label}}', - addBelow: 'Добавить ниже', - addFilter: 'Добавить фильтр', - adminTheme: 'Тема Панели', - and: 'А также', - applyChanges: 'Применить изменения', - ascending: 'Восходящий', - automatic: 'Автоматически', - backToDashboard: 'Назад к Панели', - cancel: 'Отмена', - changesNotSaved: - 'Ваши изменения не были сохранены. Если вы сейчас уйдете, то потеряете свои изменения.', - close: 'Закрыть', - collapse: 'Свернуть', - collections: 'Коллекции', - columnToSort: 'Колонка для сортировки', - columns: 'Колонки', - confirm: 'Подтвердить', - confirmDeletion: 'Подтвердить удаление', - confirmDuplication: 'Подтвердить копирование', - copied: 'Скопировано', - copy: 'Скопировать', - create: 'Создать', - createNew: 'Создать', - createNewLabel: 'Создать новый {{label}}', - created: 'Создано', - creating: 'Создание', - creatingNewLabel: 'Создание нового {{label}}', - dark: 'Тёмная', - dashboard: 'Панель', - delete: 'Удалить', - deletedCountSuccessfully: 'Удалено {{count}} {{label}} успешно.', - deleting: 'Удаление...', - descending: 'Уменьшение', - deselectAllRows: 'Снять выделение со всех строк', - duplicate: 'Дублировать', - duplicateWithoutSaving: 'Дублирование без сохранения изменений', - edit: 'Редактировать', - editLabel: 'Редактировать {{label}}', - editing: 'Редактирование', - editingLabel_many: 'Редактирование {{count}} {{label}}', - editingLabel_one: 'Редактирование {{count}} {{label}}', - editingLabel_other: 'Редактирование {{count}} {{label}}', - email: 'Email', - emailAddress: 'Email', - enterAValue: 'Введите значение', - error: 'Ошибка', - errors: 'Ошибки', - fallbackToDefaultLocale: 'Возврат к локали по умолчанию', - filterWhere: 'Где фильтровать', - filters: 'Фильтры', - globals: 'Глобальные', - language: 'Язык', - lastModified: 'Последнее изменение', - leaveAnyway: 'Все равно уйти', - leaveWithoutSaving: 'Выход без сохранения', - light: 'Светлая', - livePreview: 'Предпросмотр', - loading: 'Загрузка', - locale: 'Локаль', - menu: 'Меню', - moveDown: 'Сдвинуть вниз', - moveUp: 'Сдвинуть вверх', - noFiltersSet: 'Фильтры не установлены', - noLabel: 'Без метки', - noOptions: 'Нет вариантов', - noResults: - 'Не найдено ни одной {{label}}. Либо {{label}} еще не существует, либо ни одна из них не соответствует фильтрам, которые вы указали выше.', - noValue: 'Нет значения', - none: 'Никто', - notFound: 'Не найдено', - nothingFound: 'Ничего не найдено', - of: 'из', - open: 'Открыть', - or: 'Или же', - order: 'Порядок', - pageNotFound: 'Страница не найдена', - password: 'Пароль', - payloadSettings: 'Настройки Payload', - perPage: 'На странице: {{limit}}', - remove: 'Удалить', - reset: 'Сброс', - row: 'Строка', - rows: 'Строки', - save: 'Сохранить', - saving: 'Сохранение...', - searchBy: 'Искать по', - selectAll: 'Выбрать все {{count}} {{label}}', - selectAllRows: 'Выбрать все строки', - selectValue: 'Выбрать значение', - selectedCount: '{{count}} {{label}} выбрано', - showAllLabel: 'Показать все {{label}}', - sorryNotFound: 'К сожалению, ничего подходящего под ваш запрос нет.', - sort: 'Сортировать', - sortByLabelDirection: 'Сортировать по {{label}} {{direction}}', - stayOnThisPage: 'Остаться на этой странице', - submissionSuccessful: 'Успешно отправлено.', - submit: 'Отправить', - successfullyCreated: '{{label}} успешно создан.', - thisLanguage: 'Русский', - titleDeleted: '{{label}} {{title}} успешно удалено.', - unauthorized: 'Нет доступа', - unsavedChangesDuplicate: - 'У вас есть несохраненные изменения. Вы хотите продолжить дублирование?', - untitled: 'Без названия', - updatedAt: 'Дата правки', - updatedCountSuccessfully: 'Обновлено {{count}} {{label}} успешно.', - updatedSuccessfully: 'Успешно Обновлено.', - updating: 'Обновление', - welcome: 'Добро пожаловать', - }, - operators: { - contains: 'содержит', - equals: 'равно', - exists: 'существует', - isGreaterThan: 'больше чем', - isGreaterThanOrEqualTo: 'больше или равно', - isIn: 'находится', - isLessThan: 'меньше чем', - isLessThanOrEqualTo: 'меньше или равно', - isLike: 'похоже', - isNotEqualTo: 'не равно', - isNotIn: 'нет в', - near: 'рядом', - }, - upload: { - crop: 'Обрезать', - cropToolDescription: - 'Перетащите углы выбранной области, нарисуйте новую область или отрегулируйте значения ниже.', - dragAndDrop: 'Перетащите файл', - editImage: 'Редактировать изображение', - focalPoint: 'Центральная точка', - focalPointDescription: - 'Перетащите фокусное расстояние прямо на предварительный просмотр или отрегулируйте значения ниже.', - height: 'Высота', - previewSizes: 'Предварительный просмотр размеров', - selectCollectionToBrowse: 'Выберите Коллекцию для просмотра', - selectFile: 'Выберите файл', - setCropArea: 'Установите область обрезки', - setFocalPoint: 'Установить фокусное расстояние', - sizesFor: 'Размеры для {{label}}', - width: 'Ширина', - }, - validation: { - fieldHasNo: 'У этого поля нет {{label}}', - limitReached: 'Достигнут лимит, можно добавить только {{max}} элементов.', - required: 'Это обязательное поле.', - requiresAtLeast: 'Это поле требует не менее {{count}} {{label}}', - }, - version: { - aboutToPublishSelection: 'Вы собираетесь опубликовать все {{label}} в выборе. Вы уверены?', - aboutToRestore: - 'Вы собираетесь восстановить этот документ {{label}} в состояние, в котором он находился {{versionDate}}.', - aboutToRestoreGlobal: - 'Вы собираетесь восстановить глобальную запись {{label}} в состояние, в котором она находилась {{versionDate}}.', - aboutToRevertToPublished: - 'Вы собираетесь вернуть изменения этого документа к его опубликованному состоянию. Вы уверены?', - aboutToUnpublish: 'Вы собираетесь отменить публикацию этого документа. Вы уверены?', - aboutToUnpublishSelection: - 'Вы собираетесь отменить публикацию всех выбранных {{label}}. Вы уверены?', - autosave: 'Автосохранение', - autosavedSuccessfully: 'Автосохранение успешно.', - changed: 'Изменено', - compareVersion: 'Сравнить версию с:', - confirmPublish: 'Подтвердить публикацию', - confirmRevertToSaved: 'Подтвердить возврат к сохраненному', - confirmUnpublish: 'Подтвердить отмену публикации', - confirmVersionRestoration: 'Подтвердить восстановление версии', - draft: 'Черновик', - draftSavedSuccessfully: 'Черновик успешно сохранен.', - lastSavedAgo: 'Последний раз сохранено {{distance}} назад', - noFurtherVersionsFound: 'Другие версии не найдены', - noRowsFound: 'Не найдено {{label}}', - preview: 'Предпросмотр', - problemRestoringVersion: 'Возникла проблема с восстановлением этой версии', - publish: 'Публиковать', - publishChanges: 'Опубликовать изменения', - published: 'Опубликовано', - publishing: 'Публикация', - restoreThisVersion: 'Восстановить эту версию', - restoredSuccessfully: 'Восстановлен успешно.', - restoring: 'Восстановление...', - revertToPublished: 'Вернуться к опубликованному', - saveDraft: 'Сохранить черновик', - selectLocales: 'Выберите локали для отображения', - selectVersionToCompare: 'Выбрать версию для сравнения', - showLocales: 'Показать локали:', - status: 'Статус', - type: 'Тип', - unpublish: 'Отменить публикацию', - unpublishing: 'Отмена публикации...', - version: 'Версия', - versionCreatedOn: '{{version}} создана:', - versionID: 'ID версии', - versions: 'Версии', - viewingVersion: 'Просмотр версии для {{entityLabel}} {{documentTitle}}', - viewingVersionGlobal: '`Просмотр версии для глобальной Коллекции {{entityLabel}}', - viewingVersions: 'Просмотр версий для {{entityLabel}} {{documentTitle}}', - viewingVersionsGlobal: '`Просмотр версии для глобальной Коллекции {{entityLabel}}', - }, -} diff --git a/packages/translations/src/_generatedFiles_/client/sv.js b/packages/translations/src/_generatedFiles_/client/sv.js deleted file mode 100644 index e23e88ac0b..0000000000 --- a/packages/translations/src/_generatedFiles_/client/sv.js +++ /dev/null @@ -1,293 +0,0 @@ -export default { - authentication: { - account: 'Konto', - accountOfCurrentUser: 'Konto för nuvarande användare', - alreadyActivated: 'Redan aktiverad', - alreadyLoggedIn: 'Redan inloggad', - backToLogin: 'Tillbaka till inloggningen', - beginCreateFirstUser: 'För att börja, skapa din första användare.', - changePassword: 'Byt Lösenord', - confirmGeneration: 'Bekräfta Generering', - confirmPassword: 'Bekräfta Lösenord', - createFirstUser: 'Skapa första användaren', - emailNotValid: 'Angiven e-postadress är inte giltig', - emailSent: 'E-posten Skickad', - enableAPIKey: 'Aktivera API nyckel', - failedToUnlock: 'Det gick inte att låsa upp', - forceUnlock: 'Tvinga Upplåsning', - forgotPassword: 'Glömt Lösenord', - forgotPasswordEmailInstructions: - 'Vänligen ange din e-postadress nedan. Du kommer att få ett e-postmeddelande med instruktioner om hur du återställer ditt lösenord.', - forgotPasswordQuestion: 'Glömt lösenordet?', - generate: 'Generera', - generateNewAPIKey: 'Generera ny API nyckel', - logBackIn: 'Logga in igen', - logOut: 'Logga ut', - loggedOutInactivity: 'Du har blivit utloggad på grund av inaktivitet.', - loggedOutSuccessfully: 'Du har loggat ut framgångsrikt.', - login: 'Logga in', - logout: 'Logga ut', - logoutUser: 'Logga ut användare', - newAPIKeyGenerated: 'Ny API Nyckel Genererad.', - newPassword: 'Nytt Lösenord', - resetPassword: 'Återställ Lösenord', - stayLoggedIn: 'Stanna inloggad', - successfullyUnlocked: 'Låst upp framgångsrikt', - unableToVerify: 'Det går inte att Verifiera', - verified: 'Verifierad', - verifiedSuccessfully: 'Framgångsrikt Verifierad', - verify: 'Verifiera', - verifyUser: 'Verifiera Användare', - youAreInactive: - 'Du har inte varit aktiv på ett tag och kommer inom kort att automatiskt loggas ut för din egen säkerhet. Vill du forsätta att vara inloggad?', - }, - error: { - autosaving: 'Det uppstod ett problem när det här dokumentet skulle sparas automatiskt.', - correctInvalidFields: 'Vänligen korrigera ogiltiga fält.', - deletingTitle: - 'Det uppstod ett fel vid borttagningen av {{title}}. Vänligen kontrollera din anslutning och försök igen.', - loadingDocument: 'Det gick inte att läsa in dokumentet med ID {{id}}.', - noMatchedField: 'Inget matchande fält hittades för "{{label}}"', - notAllowedToAccessPage: 'Du får inte komma åt den här sidan.', - previewing: 'Det uppstod ett problem när det här dokumentet skulle förhandsgranskas.', - unableToDeleteCount: 'Det gick inte att ta bort {{count}} av {{total}} {{label}}.', - unableToUpdateCount: 'Det gick inte att uppdatera {{count}} av {{total}} {{label}}.', - unauthorized: 'Obehörig, du måste vara inloggad för att göra denna begäran.', - unknown: 'Ett okänt fel har uppstått.', - unspecific: 'Ett fel har uppstått.', - }, - fields: { - addLabel: 'Lägg till {{label}}', - addLink: 'Lägg till Länk', - addNew: 'Lägg till ny', - addNewLabel: 'Lägg till ny {{label}}', - addRelationship: 'Lägg till Relation', - addUpload: 'Lägg till Uppladdning', - block: 'block', - blockType: 'Block Typ', - blocks: 'block', - chooseFromExisting: 'Välj bland befintliga', - collapseAll: 'kollapsa Alla', - editLink: 'Redigera Länk', - editRelationship: 'Redigera Relation', - itemsAndMore: '{{items}} och {{count}} mer', - labelRelationship: '{{label}} Relation', - latitude: 'Latitud', - linkedTo: 'Länkad till <0>{{label}}', - longitude: 'Longitud', - passwordsDoNotMatch: 'Lösenorden matchar inte.', - removeRelationship: 'Ta Bort Relation', - removeUpload: 'Ta Bort Uppladdning', - saveChanges: 'Spara ändringar', - searchForBlock: 'Sök efter ett block', - selectFieldsToEdit: 'Välj fält att redigera', - showAll: 'Visa Alla', - swapRelationship: 'Byt Förhållande', - swapUpload: 'Byt Uppladdning', - toggleBlock: 'Växla block', - uploadNewLabel: 'Ladda upp ny {{label}}', - }, - general: { - aboutToDelete: 'Du är på väg att ta bort {{label}} <1>{{title}}. Är du säker?', - aboutToDeleteCount_many: 'Du är på väg att ta bort {{count}} {{label}}', - aboutToDeleteCount_one: 'Du är på väg att ta bort {{count}} {{label}}', - aboutToDeleteCount_other: 'Du är på väg att ta bort {{count}} {{label}}', - addBelow: 'Lägg Till Nedanför', - addFilter: 'Lägg Till Filter', - adminTheme: 'Admin Tema', - and: 'Och', - applyChanges: 'Verkställ ändringar', - ascending: 'Stigande', - automatic: 'Automatisk', - backToDashboard: 'Tillbaka till Manöverpanelen', - cancel: 'Avbryt', - changesNotSaved: - 'Dina ändringar har inte sparats. Om du lämnar nu kommer du att förlora dina ändringar.', - close: 'Stänga', - collapse: 'Kollapsa', - collections: 'Samlingar', - columnToSort: 'Kolumn att Sortera', - columns: 'Kolumner', - confirm: 'Bekräfta', - confirmDeletion: 'Bekräfta radering', - confirmDuplication: 'Bekräfta dubblering', - copied: 'Kopierad', - copy: 'Kopiera', - create: 'Skapa', - createNew: 'Skapa Ny', - createNewLabel: 'Skapa ny {{label}}', - created: 'Skapad', - creating: 'Skapar', - creatingNewLabel: 'Skapar ny {{label}}', - dark: 'Mörk', - dashboard: 'Manöverpanel', - delete: 'Ta bort', - deletedCountSuccessfully: 'Raderade {{count}} {{label}} framgångsrikt.', - deleting: 'Tar bort...', - descending: 'Fallande', - deselectAllRows: 'Avmarkera alla rader', - duplicate: 'Duplicera', - duplicateWithoutSaving: 'Duplicera utan att spara ändringar', - edit: 'Redigera', - editLabel: 'Redigera {{label}}', - editing: 'Redigerar', - editingLabel_many: 'Redigerar {{count}} {{label}}', - editingLabel_one: 'Redigerar {{count}} {{label}}', - editingLabel_other: 'Redigerar {{count}} {{label}}', - email: 'E-post', - emailAddress: 'E-postadress', - enterAValue: 'Ange ett värde', - error: 'Fel', - errors: 'Fel', - fallbackToDefaultLocale: 'Återgång till standardlokalspråk', - filterWhere: 'Filtrera {{label}} där', - filters: 'Filter', - globals: 'Globala', - language: 'Språk', - lastModified: 'Senast Ändrad', - leaveAnyway: 'Lämna ändå', - leaveWithoutSaving: 'Lämna utan att spara', - light: 'Ljus', - livePreview: 'Förhandsvisa', - loading: 'Läser in', - locale: 'Lokal', - menu: 'Meny', - moveDown: 'Flytta Ner', - moveUp: 'Flytta Upp', - noFiltersSet: 'Inga filter inställda', - noLabel: '', - noOptions: 'Inga alternativ', - noResults: - 'Inga {{label}} hittades. Antingen finns inga {{label}} ännu eller matchar ingen filtren du har angett ovan.', - noValue: 'Inget värde', - none: 'Ingen', - notFound: 'Hittades inte', - nothingFound: 'Inget hittades', - of: 'av', - open: 'Öppna', - or: 'Eller', - order: 'Ordning', - pageNotFound: 'Sidan hittas inte', - password: 'Lösenord', - payloadSettings: 'Payload Inställningar', - perPage: 'Per Sida: {{limit}}', - remove: 'Ta bort', - reset: 'Återställ', - row: 'Rad', - rows: 'Rader', - save: 'Spara', - saving: 'Sparar...', - searchBy: 'Sök efter {{label}}', - selectAll: 'Välj alla {{count}} {{label}}', - selectAllRows: 'Välj alla rader', - selectValue: 'Välj ett värde', - selectedCount: '{{count}} {{label}} har valts', - showAllLabel: 'Visa alla {{label}}', - sorryNotFound: 'Tyvärr–det finns inget som motsvarar din begäran.', - sort: 'Sortera', - sortByLabelDirection: 'Sortera efter {{label}} {{direction}}', - stayOnThisPage: 'Stanna på denna sida', - submissionSuccessful: 'Inlämningen Lyckades.', - submit: 'Lämna in', - successfullyCreated: '{{label}} skapades framgångsrikt.', - thisLanguage: 'Svenska', - titleDeleted: '{{label}} "{{title}}" togs bort framgångsrikt.', - unauthorized: 'Obehörig', - unsavedChangesDuplicate: 'Du har osparade ändringar. Vill du fortsätta att duplicera?', - untitled: 'Namnlös', - updatedAt: 'Uppdaterades Vid', - updatedCountSuccessfully: 'Uppdaterade {{count}} {{label}} framgångsrikt.', - updatedSuccessfully: 'Uppdaterades framgångsrikt.', - updating: 'Uppdatering', - welcome: 'Välkommen', - }, - operators: { - contains: 'innehåller', - equals: 'likar med', - exists: 'finns', - isGreaterThan: 'är större än', - isGreaterThanOrEqualTo: 'är större än eller lika med', - isIn: 'är med', - isLessThan: 'är mindre än', - isLessThanOrEqualTo: 'är mindre än eller lika med', - isLike: 'är som', - isNotEqualTo: 'är inte lika med', - isNotIn: 'är inte med', - near: 'nära', - }, - upload: { - crop: 'Skörd', - cropToolDescription: - 'Dra i hörnen på det valda området, rita ett nytt område eller justera värdena nedan.', - dragAndDrop: 'Dra och släpp en fil', - editImage: 'Redigera bild', - focalPoint: 'Fokuspunkt', - focalPointDescription: - 'Dra fokuspunkten direkt på förhandsgranskningen eller justera värdena nedan.', - height: 'Höjd', - previewSizes: 'Förhandsgranska Storlekar', - selectCollectionToBrowse: 'Välj en Samling att Bläddra i', - selectFile: 'Välj en fil', - setCropArea: 'Ange skärpområde', - setFocalPoint: 'Ställ in fokuspunkt', - sizesFor: 'Storlekar för {{label}}', - width: 'Bredd', - }, - validation: { - fieldHasNo: 'Detta fält har ingen {{label}}', - limitReached: 'Gränsen nådd, endast {{max}} objekt kan läggas till.', - required: 'Detta fält är obligatoriskt.', - requiresAtLeast: 'Detta fält kräver minst {{count}} {{label}}.', - }, - version: { - aboutToPublishSelection: 'Du är på väg att publicera alla {{label}} i urvalet. Är du säker?', - aboutToRestore: - 'Du är på väg att återställa detta {{label}} dokumentet till det tillståndet som det var den {{versionDate}}.', - aboutToRestoreGlobal: - 'Du är på väg att återställa det globala {{label}} till det tillståndet som det var den {{versionDate}}.', - aboutToRevertToPublished: - 'Du är på väg att återställa det här dokumentets ändringar till dess publicerade tillstånd. Är du säker?', - aboutToUnpublish: 'Du håller på att avpublicera detta dokumentet. Är du säker?', - aboutToUnpublishSelection: - 'Du är på väg att avpublicera alla {{label}} i urvalet. Är du säker?', - autosave: 'Automatisk sparning', - autosavedSuccessfully: 'Autosparades framgångsrikt.', - changed: 'Ändrad', - compareVersion: 'Jämför version med:', - confirmPublish: 'Bekräfta publicering', - confirmRevertToSaved: 'Bekräfta återgång till sparad', - confirmUnpublish: 'Bekräfta avpublicering', - confirmVersionRestoration: 'Bekräfta Versionsåterställning', - draft: 'Utkast', - draftSavedSuccessfully: 'Utkastet sparades framgångsrikt.', - lastSavedAgo: 'Senast sparad för {{distance}} sedan', - noFurtherVersionsFound: 'Inga fler versioner hittades', - noRowsFound: 'Inga {{label}} hittades', - preview: 'Förhandsvisa', - problemRestoringVersion: 'Det uppstod ett problem när den här versionen skulle återställas', - publish: 'Publicera', - publishChanges: 'Publicera ändringar', - published: 'Publicerad', - publishing: 'Publicering', - restoreThisVersion: 'Återställ den här versionen', - restoredSuccessfully: 'Återställd framgångsrikt.', - restoring: 'Återställer...', - revertToPublished: 'Återgå till publicerad', - saveDraft: 'Spara Utkast', - selectLocales: 'Välj språk att visa', - selectVersionToCompare: 'Välj en version att jämföra', - showLocales: 'Visa språk:', - status: 'Status', - type: 'Typ', - unpublish: 'Avpublicera', - unpublishing: 'Avpublicerar...', - version: 'Version', - versionCreatedOn: '{{version}} skapad den:', - versionID: 'Versions-ID', - versions: 'Versioner', - viewingVersion: 'Visar version för {{entityLabel}} {{documentTitle}}', - viewingVersionGlobal: 'Visa version för den globala {{entityLabel}}', - viewingVersions: 'Visar versioner för {{entityLabel}} {{documentTitle}}', - viewingVersionsGlobal: 'Visa versioner för den globala {{entityLabel}}', - }, -} diff --git a/packages/translations/src/_generatedFiles_/client/th.js b/packages/translations/src/_generatedFiles_/client/th.js deleted file mode 100644 index a902bf4f74..0000000000 --- a/packages/translations/src/_generatedFiles_/client/th.js +++ /dev/null @@ -1,288 +0,0 @@ -export default { - authentication: { - account: 'บัญชี', - accountOfCurrentUser: 'บัญชีปัจจุบัน', - alreadyActivated: 'เปิดใช้งานแล้ว', - alreadyLoggedIn: 'ลงชื่อเข้าใช้แล้ว', - backToLogin: 'กลับไปหน้าเข้าสู่ระบบ', - beginCreateFirstUser: 'สร้างผู้ใช้แรกเพื่อเริ่มใช้งาน', - changePassword: 'เปลี่ยนรหัสผ่าน', - confirmGeneration: 'ยืนยันการสร้าง', - confirmPassword: 'ยืนยันรหัสผ่าน', - createFirstUser: 'สร้างผู้ใช้แรก', - emailNotValid: 'อีเมลไม่ถูกต้อง', - emailSent: 'ส่งอีเมลเรียบร้อยแล้ว', - enableAPIKey: 'เปิดใช้ API Key', - failedToUnlock: 'ไม่สามารถปลดล็อกได้', - forceUnlock: 'ปลดล็อกบัญชี', - forgotPassword: 'ลืมรหัสผ่าน', - forgotPasswordEmailInstructions: - 'กรุณาใส่อีเมลของคุณ ระบบจะส่งวิธีการเปลี่ยนรหัสผ่านไปให้คุณทางอีเมล', - forgotPasswordQuestion: 'ลืมรหัสผ่าน?', - generate: 'สร้าง', - generateNewAPIKey: 'สร้าง API Key', - logBackIn: 'เข้าสู่ระบบอีกครั้ง', - logOut: 'ออกจากระบบ', - loggedOutInactivity: 'คุณได้ออกจากระบบเนื่องจากไม่มีการใช้งาน', - loggedOutSuccessfully: 'ออกจากระบบเรียบร้อยแล้ว', - login: 'เข้าสู่ระบบ', - logout: 'ออกจากระบบ', - logoutUser: 'ออกจากระบบ', - newAPIKeyGenerated: 'สร้าง API Key ใหม่แล้ว', - newPassword: 'รหัสผ่านใหม่', - resetPassword: 'รีเซ็ตรหัสผ่าน', - stayLoggedIn: 'เข้าสู่ระบบต่อไป', - successfullyUnlocked: 'ปลดล็อกบัญชีสำเร็จ', - unableToVerify: 'ไม่สามารถยืนยันบัญชีได้', - verified: 'ยืนยันบััญชีแล้ว', - verifiedSuccessfully: 'ยืนยันบัญชีสำเร็จ', - verify: 'ยืนยันบัญชี', - verifyUser: 'ยืนยันบัญชี', - youAreInactive: - 'คุณกำลังจะถูกให้ออกจากระบบในเร็ว ๆ นี้เนื่องจากไม่มีการใช้งานระบบมาสักพักหนึ่ง คุณต้องการเข้าสู่ระบบต่อหรือไม่?', - }, - error: { - autosaving: 'เกิดปัญหาระหว่างการบันทึกเอกสารอัตโนมัติ', - correctInvalidFields: 'โปรดแก้ไขช่องที่ไม่ถูกต้อง', - deletingTitle: 'เกิดปัญหาระหว่างการลบ {{title}} โปรดตรวจสอบการเชื่อมต่อของคุณแล้วลองอีกครั้ง', - loadingDocument: 'เกิดปัญหาระหว่างการโหลดเอกสารที่มี ID {{id}}', - noMatchedField: 'ไม่พบช่อง "{{label}}"', - notAllowedToAccessPage: 'คุณไม่ได้รับอนุญาตให้เข้าถึงหน้านี้', - previewing: 'เกิดปัญหาระหว่างการแสดงตัวอย่างเอกสาร', - unableToDeleteCount: 'ไม่สามารถลบ {{count}} จาก {{total}} {{label}}', - unableToUpdateCount: 'ไม่สามารถอัปเดต {{count}} จาก {{total}} {{label}}', - unauthorized: 'คุณไม่ได้รับอนุญาต กรุณาเข้าสู่ระบบเพื่อทำคำขอนี้', - unknown: 'เกิดปัญหาบางอย่างที่ไม่ทราบสาเหตุ', - unspecific: 'เกิดปัญหาบางอย่าง', - }, - fields: { - addLabel: 'เพิ่ม {{label}}', - addLink: 'เพิ่มลิงค์', - addNew: 'เพิ่ม', - addNewLabel: 'เพิ่ม {{label}} ใหม่', - addRelationship: 'เพิ่มความสัมพันธ์', - addUpload: 'เพิ่มการอัปโหลด', - block: 'Block', - blockType: 'ประเภท Block', - blocks: 'Blocks', - chooseFromExisting: 'เลือกจากที่มีอยู่', - collapseAll: 'ยุบทั้งหมด', - editLink: 'แก้ไขลิงก์', - editRelationship: 'แก้ไขความสัมพันธ์', - itemsAndMore: '{{items}} และเพิ่มเติมอีก {{count}}', - labelRelationship: 'ความสัมพันธ์กับ {{label}}', - latitude: 'ละติจูด', - linkedTo: 'เชื่อมกับ <0>{{label}} สำเร็จ', - longitude: 'ลองติจูด', - passwordsDoNotMatch: 'รหัสผ่านไม่ตรงกัน', - removeRelationship: 'ลบความสัมพันธ์', - removeUpload: 'ลบอัปโหลด', - saveChanges: 'บันทึก', - searchForBlock: 'ค้นหา Block', - selectFieldsToEdit: 'เลือกช่องที่จะแก้ไข', - showAll: 'แสดงทั้งหมด', - swapRelationship: 'สลับความสัมพันธ์', - swapUpload: 'สลับอัปโหลด', - toggleBlock: 'เปิด/ปิด Block', - uploadNewLabel: 'อัปโหลด {{label}} ใหม่', - }, - general: { - aboutToDelete: 'คุณกำลังจะลบ {{label}} <1>{{title}} ต้องการดำเนินการต่อหรือไม่?', - aboutToDeleteCount_many: 'คุณกำลังจะลบ {{count}} {{label}}', - aboutToDeleteCount_one: 'คุณกำลังจะลบ {{count}} {{label}}', - aboutToDeleteCount_other: 'คุณกำลังจะลบ {{count}} {{label}}', - addBelow: 'เพิ่มด้านล่าง', - addFilter: 'เพิ่มการกรอง', - adminTheme: 'ธีมผู้ดูแลระบบ', - and: 'และ', - applyChanges: 'ใช้การเปลี่ยนแปลง', - ascending: 'น้อยไปมาก', - automatic: 'อัตโนมัติ', - backToDashboard: 'กลับไปหน้าแดชบอร์ด', - cancel: 'ยกเลิก', - changesNotSaved: 'การเปลี่ยนแปลงยังไม่ได้ถูกบันทึก ถ้าคุณออกตอนนี้ สิ่งที่แก้ไขไว้จะหายไป', - close: 'ปิด', - collapse: 'ยุบ', - collections: 'Collections', - columnToSort: 'คอลัมน์ที่ต้องการเรียง', - columns: 'คอลัมน์', - confirm: 'ยืนยัน', - confirmDeletion: 'ยืนยันการลบ', - confirmDuplication: 'ยืนยันการสำเนา', - copied: 'คัดลอกแล้ว', - copy: 'คัดลอก', - create: 'สร้าง', - createNew: 'สร้างใหม่', - createNewLabel: 'สร้าง {{label}} ใหม่', - created: 'ถูกสร้างเมื่อ', - creating: 'กำลังสร้าง', - creatingNewLabel: 'กำลังสร้าง {{label}} ใหม่', - dark: 'มืด', - dashboard: 'แดชบอร์ด', - delete: 'ลบ', - deletedCountSuccessfully: 'Deleted {{count}} {{label}} successfully.', - deleting: 'กำลังลบ...', - descending: 'มากไปน้อย', - deselectAllRows: 'ยกเลิกการเลือกทุกแถว', - duplicate: 'สำเนา', - duplicateWithoutSaving: 'สำเนาโดยไม่บันทึกการแก้ไข', - edit: 'แก้ไข', - editLabel: 'แก้ไข {{label}}', - editing: 'แก้ไข', - editingLabel_many: 'กำลังแก้ไข {{count}} {{label}}', - editingLabel_one: 'กำลังแก้ไข {{count}} {{label}}', - editingLabel_other: 'กำลังแก้ไข {{count}} {{label}}', - email: 'อีเมล', - emailAddress: 'อีเมล', - enterAValue: 'ระบุค่า', - error: 'ข้อผิดพลาด', - errors: 'ข้อผิดพลาด', - fallbackToDefaultLocale: 'สำรองไปยังตำแหน่งที่ตั้งเริ่มต้น', - filterWhere: 'กรอง {{label}} เฉพาะ', - filters: 'กรอง', - globals: 'Globals', - language: 'ภาษา', - lastModified: 'แก้ไขล่าสุดเมื่อ', - leaveAnyway: 'ออกจากหน้านี้', - leaveWithoutSaving: 'ออกโดยไม่บันทึก', - light: 'สว่าง', - livePreview: 'แสดงตัวอย่าง', - loading: 'กำลังโหลด', - locale: 'ตำแหน่งที่ตั้ง', - menu: 'เมนู', - moveDown: 'ขยับขึ้น', - moveUp: 'ขยับลง', - noFiltersSet: 'ไม่มีการกรอง', - noLabel: '<ไม่มี {{label}}>', - noOptions: 'ไม่มีตัวเลือก', - noResults: - 'ไม่พบ {{label}} เนื่องจากยังไม่มี {{label}} หรือไม่มี {{label}} ใดตรงกับการกรองด้านบน', - noValue: 'ไม่มีค่า', - none: 'ไม่มี', - notFound: 'ไม่พบ', - nothingFound: 'ไม่พบสิ่งใด', - of: 'จาก', - open: 'เปิด', - or: 'หรือ', - order: 'เรียงตาม', - pageNotFound: 'ไม่พบหน้าที่ต้องการ', - password: 'รหัสผ่าน', - payloadSettings: 'การตั้งค่า Payload', - perPage: 'จำนวนต่อหน้า: {{limit}}', - remove: 'ลบ', - reset: 'รีเซ็ต', - row: 'แถว', - rows: 'แถว', - save: 'บันทึก', - saving: 'กำลังบันทึก...', - searchBy: 'ค้นหาด้วย {{label}}', - selectAll: 'เลือกทั้งหมด {{count}} {{label}}', - selectAllRows: 'เลือกทุกแถว', - selectValue: 'เลือกค่า', - selectedCount: 'เลือก {{count}} {{label}} แล้ว', - showAllLabel: 'แสดง {{label}} ทั้งหมด', - sorryNotFound: 'ขออภัย ไม่สามารถทำตามคำขอของคุณได้', - sort: 'เรียง', - sortByLabelDirection: 'เรียงลำดับตาม {{label}} {{direction}}', - stayOnThisPage: 'อยู่หน้านี้ต่อ', - submissionSuccessful: 'ส่งสำเร็จ', - submit: 'ส่ง', - successfullyCreated: 'สร้าง {{label}} สำเร็จ', - thisLanguage: 'ไทย', - titleDeleted: 'ลบ {{label}} "{{title}}" สำเร็จ', - unauthorized: 'ไม่ได้รับอนุญาต', - unsavedChangesDuplicate: 'คุณมีการแก้ไขที่ยังไม่ถูกบันทึก คุณต้องการทำสำเนาต่อหรือไม่?', - untitled: 'ไม่มีชื่อ', - updatedAt: 'แก้ไขเมื่อ', - updatedCountSuccessfully: 'อัปเดต {{count}} {{label}} เรียบร้อยแล้ว', - updatedSuccessfully: 'แก้ไขสำเร็จ', - updating: 'กำลังอัปเดต', - welcome: 'ยินดีต้อนรับ', - }, - operators: { - contains: 'มี', - equals: 'เท่ากับ', - exists: 'มีอยู่', - isGreaterThan: 'มากกว่า', - isGreaterThanOrEqualTo: 'มากกว่าหรือเท่ากับ', - isIn: 'อยู่ใน', - isLessThan: 'น้อยกว่า', - isLessThanOrEqualTo: 'น้อยกว่าหรือเท่ากับ', - isLike: 'เหมือน', - isNotEqualTo: 'ไม่เท่ากับ', - isNotIn: 'ไม่ได้อยู่ใน', - near: 'ใกล้', - }, - upload: { - crop: 'พืชผล', - cropToolDescription: 'ลากมุมของพื้นที่ที่เลือก, วาดพื้นที่ใหม่หรือปรับค่าด้านล่าง', - dragAndDrop: 'ลากและวางไฟล์', - editImage: 'แก้ไขรูปภาพ', - focalPoint: 'จุดสนใจ', - focalPointDescription: 'ลากจุดโฟกัสตรงบนภาพตัวอย่างหรือปรับค่าที่อยู่ด้านล่าง', - height: 'ความสูง', - previewSizes: 'ขนาดตัวอย่าง', - selectCollectionToBrowse: 'เลือก Collection ที่ต้องการค้นหา', - selectFile: 'เลือกไฟล์', - setCropArea: 'ตั้งค่าพื้นที่การครอบตัด', - setFocalPoint: 'ตั้งจุดโฟกัส', - sizesFor: 'ขนาดสำหรับ {{label}}', - width: 'ความกว้าง', - }, - validation: { - fieldHasNo: 'ช่องนี้ไม่มี {{label}}', - limitReached: 'ถึงขีดจำกัดแล้ว, สามารถเพิ่มไอเทมได้เพียง {{max}} ไอเทมเท่านั้น', - required: 'จำเป็นต้องระบุค่า', - requiresAtLeast: 'ต้องมีอย่างน้อย {{count}} {{label}}', - }, - version: { - aboutToPublishSelection: 'คุณกำลังจะเผยแพร่ {{label}} ทั้งหมดในส่วนที่เลือก คุณแน่ใจไหม?', - aboutToRestore: - 'คุณกำลังจะคืนค่าเอกสาร {{label}} นี้กลับไปอยู่ในเวอร์ชันเมื่อวันที่ {{versionDate}}', - aboutToRestoreGlobal: - 'คุณกำลังจะคืนค่า global {{label}} กลับไปอยู่ในเวอร์ชันเมื่อวันที่ {{versionDate}}.', - aboutToRevertToPublished: - 'คุณกำลังจะย้อนการเปลี่ยนแปลงของเอกสารนี้ไปยังเวอร์ชันที่เผยแพร่อยู่ คุณต้องการดำเนินการต่อหรือไม่?', - aboutToUnpublish: 'คุณกำลังจะยกเลิกเผยแพร่เอกสารนี้ คุณต้องการดำเนินการต่อหรือไม่?', - aboutToUnpublishSelection: 'คุณกำลังจะเลิกเผยแพร่ {{label}} ทั้งหมดในส่วนที่เลือก คุณแน่ใจไหม?', - autosave: 'บันทึกอัตโนมัติ', - autosavedSuccessfully: 'บันทึกอัตโนมัติสำเร็จ', - changed: 'มีการแก้ไข', - compareVersion: 'เปรียบเทียบเวอร์ชันกับ:', - confirmPublish: 'ยืนยันการเผยแพร่', - confirmRevertToSaved: 'ยืนยันย้อนการแก้ไข', - confirmUnpublish: 'ยืนยันการยกเลิกการเผยแพร่', - confirmVersionRestoration: 'ยืนยันการกู้คืนเวอร์ชัน', - draft: 'ฉบับร่าง', - draftSavedSuccessfully: 'บันทึกร่างสำเร็จ', - lastSavedAgo: 'บันทึกครั้งล่าสุด {{distance}} ที่ผ่านมา', - noFurtherVersionsFound: 'ไม่พบเวอร์ชันอื่น ๆ', - noRowsFound: 'ไม่พบ {{label}}', - preview: 'ตัวอย่าง', - problemRestoringVersion: 'เกิดปัญหาระหว่างการกู้คืนเวอร์ชันนี้', - publish: 'เผยแพร่', - publishChanges: 'เผยแพร่การแก้ไข', - published: 'เผยแพร่แล้ว', - publishing: 'การเผยแพร่', - restoreThisVersion: 'กู้คืนเวอร์ชันนี้', - restoredSuccessfully: 'กู้คืนเวอร์ชันสำเร็จ', - restoring: 'กำลังกู้คืน...', - revertToPublished: 'ย้อนกลับไปเวอร์ชันที่เผยแพร่อยู่', - saveDraft: 'บันทึกร่าง', - selectLocales: 'เลือกภาษาที่ต้องการแสดง', - selectVersionToCompare: 'เลือกเวอร์ชันที่ต้องการเปรียบเทียบ', - showLocales: 'แสดงภาษา:', - status: 'สถานะ', - type: 'ประเภท', - unpublish: 'หยุดเผยแพร่', - unpublishing: 'กำลังหยุดการเผยแพร่...', - version: 'เวอร์ชัน', - versionCreatedOn: '{{version}} ถูกสร้างเมื่อ:', - versionID: 'ID ของเวอร์ชัน', - versions: 'เวอร์ชัน', - viewingVersion: 'กำลังดูเวอร์ชันของ {{entityLabel}} {{documentTitle}}', - viewingVersionGlobal: 'กำลังดูเวอร์ชันของ global {{entityLabel}}', - viewingVersions: 'กำลังดูเวอร์ชันของ {{entityLabel}} {{documentTitle}}', - viewingVersionsGlobal: 'กำลังดูเวอร์ชันของ global {{entityLabel}}', - }, -} diff --git a/packages/translations/src/_generatedFiles_/client/tr.js b/packages/translations/src/_generatedFiles_/client/tr.js deleted file mode 100644 index a7c90d04de..0000000000 --- a/packages/translations/src/_generatedFiles_/client/tr.js +++ /dev/null @@ -1,293 +0,0 @@ -export default { - authentication: { - account: 'Hesap', - accountOfCurrentUser: 'Şu anki kullanıcının hesabı', - alreadyActivated: 'Hesap zaten etkinleştirildi', - alreadyLoggedIn: 'Hesaba zaten giriş yapıldı', - backToLogin: 'Giriş ekranına geri dön', - beginCreateFirstUser: 'Başlamak için ilk kullanıcı hesabını oluşturun.', - changePassword: 'Parolayı Değiştir', - confirmGeneration: 'Oluştumayı Onayla', - confirmPassword: 'Parolayı Onayla', - createFirstUser: 'İlk kullanıcı oluştur', - emailNotValid: 'Girilen e-posta geçersiz', - emailSent: 'E-posta gönderildi', - enableAPIKey: 'Api anahtarını etkinleştir', - failedToUnlock: 'Hesabı aktifleştirme başarısız oldu', - forceUnlock: 'Hesabı Etkinleştir', - forgotPassword: 'Parolamı Unuttum', - forgotPasswordEmailInstructions: - 'Lütfen e-posta adresinizi aşağıdaki alana girin. Parolanızı nasıl sıfırlayacağınızı gösteren bir e-posta adresi alacaksınız.', - forgotPasswordQuestion: 'Parolanızı mı unuttunuz?', - generate: 'Oluştur', - generateNewAPIKey: 'Yeni bir API anahtarı oluştur', - logBackIn: 'Tekrar giriş yapın', - logOut: 'Çıkış', - loggedOutInactivity: 'Uzun süre işlem yapmadığınız için oturumunuz kapatıldı.', - loggedOutSuccessfully: 'Başarıyla çıkış yaptınız.', - login: 'Giriş', - logout: 'Çıkış', - logoutUser: 'Kullanıcıyı çıkış yapmaya zorla', - newAPIKeyGenerated: 'Yeni API anahtarı oluşturuldu.', - newPassword: 'Yeni Parola', - resetPassword: 'Parolayı Sıfırla', - stayLoggedIn: 'Oturumu açık tut', - successfullyUnlocked: 'Hesabın kilidi başarıyla açıldı', - unableToVerify: 'Doğrulama başarısız', - verified: 'Doğrulandı', - verifiedSuccessfully: 'Hesap başarıyla doğrulandı', - verify: 'Doğrula', - verifyUser: 'Kullanıcıyı doğrula', - youAreInactive: - 'Bir süredir işlem yapmadığınız için yakında oturumunuz kapatılacak. Oturumunuzun açık kalmasını istiyor musunuz?', - }, - error: { - autosaving: 'Otomatik kaydetme başarısız oldu', - correctInvalidFields: 'Lütfen geçersiz alanları düzeltin.', - deletingTitle: - '{{title}} silinirken bir sorun yaşandı. Lütfen internet bağlantınızı kontrol edip tekrar deneyin.', - loadingDocument: "{{id}} ID'ye sahip döküman yüklenirken bir sorun oluştu.", - noMatchedField: '"{{label}}" ile eşleşen alan bulunamadı.', - notAllowedToAccessPage: 'Bu sayfaya erişim izniniz yok.', - previewing: 'Önizleme başarısız oldu', - unableToDeleteCount: '{{total}} {{label}} içinden {{count}} silinemiyor.', - unableToUpdateCount: '{{total}} {{label}} içinden {{count}} güncellenemiyor.', - unauthorized: 'Bu işlemi gerçekleştirmek için lütfen giriş yapın.', - unknown: 'Bilinmeyen bir hata oluştu.', - unspecific: 'Bir hata oluştu.', - }, - fields: { - addLabel: '{{label}} ekle', - addLink: 'Link Ekle', - addNew: 'Yeni', - addNewLabel: 'Yeni {{label}}', - addRelationship: 'İlişki Ekle', - addUpload: 'Yükleme Ekle', - block: 'blok', - blockType: 'Blok tipi', - blocks: 'blok', - chooseFromExisting: 'Varolanlardan seç', - collapseAll: 'Tümünü daralt', - editLink: 'Bağlantıyı Düzenle', - editRelationship: 'İlişkiyi Ekle', - itemsAndMore: '{{items}} and {{count}} more', - labelRelationship: '{{label}} Relationship', - latitude: 'Enlem', - linkedTo: '<0>label için bağlantı verildi', - longitude: 'Boylam', - passwordsDoNotMatch: 'Parolalar eşleşmiyor.', - removeRelationship: 'İlişkiyi Kaldır', - removeUpload: 'Dosyayı Sil', - saveChanges: 'Değişiklikleri kaydet', - searchForBlock: 'Blok ara', - selectFieldsToEdit: 'Düzenlenecek alanları seçin', - showAll: 'Tümünü göster', - swapRelationship: 'Takas Ilişkisi', - swapUpload: 'Karşıya Yüklemeyi Değiştir', - toggleBlock: 'Bloğu aç/kapat', - uploadNewLabel: 'Karşıya {{label}} yükle', - }, - general: { - aboutToDelete: - '<1>{{title}} {{label}} silinmek üzere. Silme işlemine devam etmek istiyor musunuz?', - aboutToDeleteCount_many: '{{count}} {{label}} silmek üzeresiniz', - aboutToDeleteCount_one: '{{count}} {{label}} silmek üzeresiniz', - aboutToDeleteCount_other: '{{count}} {{label}} silmek üzeresiniz', - addBelow: 'Altına ekle', - addFilter: 'Filtre ekle', - adminTheme: 'Admin arayüzü', - and: 've', - applyChanges: 'Değişiklikleri Uygula', - ascending: 'artan', - automatic: 'Otomatik', - backToDashboard: 'Anasayfaya geri dön', - cancel: 'İptal', - changesNotSaved: - 'Değişiklikleriniz henüz kaydedilmedi. Eğer bu sayfayı terk ederseniz değişiklikleri kaybedeceksiniz.', - close: 'Kapat', - collapse: 'Daralt', - collections: 'Koleksiyonlar', - columnToSort: 'Sıralanacak Sütunlar', - columns: 'Sütunlar', - confirm: 'Onayla', - confirmDeletion: 'Silmeyi onayla', - confirmDuplication: 'Çoğaltmayı onayla', - copied: 'Kopyalandı', - copy: 'Kopyala', - create: 'Oluştur', - createNew: 'Yeni oluştur', - createNewLabel: 'Yeni bir {{label}} oluştur', - created: 'Oluşturma tarihi', - creating: 'Oluşturuluyor', - creatingNewLabel: 'Yeni bir {{label}} oluşturuluyor', - dark: 'Karanlık', - dashboard: 'Anasayfa', - delete: 'Sil', - deletedCountSuccessfully: '{{count}} {{label}} başarıyla silindi.', - deleting: 'Siliniyor...', - descending: 'Azalan', - deselectAllRows: 'Tüm satırların seçimini kaldır', - duplicate: 'Çoğalt', - duplicateWithoutSaving: 'Ayarları kaydetmeden çoğalt', - edit: 'Düzenle', - editLabel: '{{label}} düzenle', - editing: 'Düzenleniyor', - editingLabel_many: '{{count}} {{label}} düzenleniyor', - editingLabel_one: '{{count}} {{label}} düzenleniyor', - editingLabel_other: '{{count}} {{label}} düzenleniyor', - email: 'E-posta', - emailAddress: 'E-posta adresi', - enterAValue: 'Değer girin', - error: 'Hata', - errors: 'Hatalar', - fallbackToDefaultLocale: 'Varsayılan yerel ayara geri dönme', - filterWhere: '{{label}} filtrele:', - filters: 'Filtreler', - globals: 'Globaller', - language: 'Dil', - lastModified: 'Son değiştirme', - leaveAnyway: 'Yine de ayrıl', - leaveWithoutSaving: 'Kaydetmeden ayrıl', - light: 'Aydınlık', - livePreview: 'Önizleme', - loading: 'Yükleniyor', - locale: 'Yerel ayar', - menu: 'Menü', - moveDown: 'Aşağı taşı', - moveUp: 'Yukarı taşı', - noFiltersSet: 'Tanımlı filtre yok', - noLabel: '<{{label}} yok>', - noOptions: 'Seçenek yok', - noResults: - '{{label}} bulunamadı. Henüz bir {{label}} eklenmemiş olabilir veya seçtiğiniz filtrelerle eşleşen bir sonuç bulunamamış olabilir.', - noValue: 'Değer yok', - none: 'Hiç', - notFound: 'Bulunamadı', - nothingFound: 'Hiçbir şey bulunamadı', - of: 'of', - open: 'Aç', - or: 'Or', - order: 'Order', - pageNotFound: 'Sayfa bulunamadı', - password: 'Parola', - payloadSettings: 'Ayarlar', - perPage: 'Sayfa başına: {{limit}}', - remove: 'Kaldır', - reset: 'Sıfırla', - row: 'Satır', - rows: 'Satır', - save: 'Kaydet', - saving: 'Kaydediliyor...', - searchBy: 'Şuna göre sırala: {{label}}', - selectAll: "Tüm {{count}} {{label}}'ı seçin", - selectAllRows: 'Tüm satırları seçin', - selectValue: 'Bir değer seçin', - selectedCount: '{{count}} {{label}} seçildi', - showAllLabel: 'Tüm {{label}} göster', - sorryNotFound: 'Üzgünüz, isteğinizle eşleşen bir sonuç bulunamadı.', - sort: 'Sırala', - sortByLabelDirection: '{{label}} göre sırala {{direction}}', - stayOnThisPage: 'Bu sayfada kal', - submissionSuccessful: 'Gönderme başarılı', - submit: 'Gönder', - successfullyCreated: '{{label}} başarıyla oluşturuldu.', - thisLanguage: 'Türkçe', - titleDeleted: '{{label}} {{title}} başarıyla silindi.', - unauthorized: 'Yetkisiz', - unsavedChangesDuplicate: - 'Kaydedilmemiş değişiklikler var. Çoğaltma işlemine devam etmek istiyor musunuz?', - untitled: 'Başlıksız', - updatedAt: 'Güncellenme tarihi', - updatedCountSuccessfully: '{{count}} {{label}} başarıyla güncellendi.', - updatedSuccessfully: 'Başarıyla güncellendi.', - updating: 'Güncelleniyor', - welcome: 'Hoşgeldiniz', - }, - operators: { - contains: 'içerir', - equals: 'eşittir', - exists: 'var', - isGreaterThan: 'şundan büyüktür', - isGreaterThanOrEqualTo: 'büyüktür veya eşittir', - isIn: 'içinde', - isLessThan: 'küçüktür', - isLessThanOrEqualTo: 'küçüktür veya eşittir', - isLike: 'gibidir', - isNotEqualTo: 'eşit değildir', - isNotIn: 'içinde değil', - near: 'yakın', - }, - upload: { - crop: 'Mahsulat', - cropToolDescription: - 'Seçilen alanın köşelerini sürükleyin, yeni bir alan çizin ya da aşağıdaki değerleri ayarlayın.', - dragAndDrop: 'Bir dosya sürükleyip bırakabilirsiniz', - editImage: 'Görüntüyü Düzenle', - focalPoint: 'Odak Noktası', - focalPointDescription: - 'Önizlemeye odak noktasını doğrudan sürükleyin veya aşağıdaki değerleri ayarlayın.', - height: 'Yükseklik', - previewSizes: 'Önizleme Boyutları', - selectCollectionToBrowse: 'Görüntülenecek bir koleksiyon seçin', - selectFile: 'Dosya seç', - setCropArea: 'Mahsul alanını ayarla', - setFocalPoint: 'Odak noktasını ayarla', - sizesFor: '{{label}} için boyutlar', - width: 'Genişlik', - }, - validation: { - fieldHasNo: 'Bu alanda {{label}} girili değil.', - limitReached: 'Sınır aşıldı, yalnızca {{max}} öğe eklenebilir.', - required: 'Bu alan gereklidir.', - requiresAtLeast: 'Bu alan en az {{count}} adet {{label}} gerektirmektedir.', - }, - version: { - aboutToPublishSelection: "Seçimdeki tüm {{label}}'i yayınlamak üzeresiniz. Emin misin?", - aboutToRestore: 'Döküman {{label}}, {{versionDate}} tarihindeki sürümüne geri döndürülecek.', - aboutToRestoreGlobal: - 'Global {{label}}, {{versionDate}} tarihindeki sürümüne geri döndürülecek.', - aboutToRevertToPublished: - 'Bu dökümanın değişikliklerini yayınladığı haline geri getirmek üzeresiniz. Devam etmek istiyor musunuz?', - aboutToUnpublish: 'Bu dökümanı yayından kaldırmak üzeresiniz. Devam etmek istiyor musunuz?', - aboutToUnpublishSelection: 'Seçimdeki tüm {{label}} yayınını kaldırmak üzeresiniz. Emin misin?', - autosave: 'Otomatik kaydet', - autosavedSuccessfully: 'Otomatik kaydetme başarılı', - changed: 'Değişiklik yapıldı', - compareVersion: 'Sürümü şununla karşılaştır:', - confirmPublish: 'Yayınlamayı onayla', - confirmRevertToSaved: 'Confirm revert to saved', - confirmUnpublish: 'Yayından kaldırmayı onayla', - confirmVersionRestoration: 'Sürümü Geri Getirmeyi Onayla', - draft: 'Taslak', - draftSavedSuccessfully: 'Taslak başarıyla kaydedildi.', - lastSavedAgo: 'Son kaydedildi {{distance}} önce', - noFurtherVersionsFound: 'Başka sürüm bulunamadı.', - noRowsFound: '{{label}} bulunamadı', - preview: 'Önizleme', - problemRestoringVersion: 'Bu sürüme geri döndürürken bir hatayla karşılaşıldı.', - publish: 'Yayınla', - publishChanges: 'Değişiklikleri yayınla', - published: 'Yayınlandı', - publishing: 'Yayınlama', - restoreThisVersion: 'Bu sürüme geri döndür', - restoredSuccessfully: 'Geri getirme başarılı.', - restoring: 'Geri döndürülüyor...', - revertToPublished: 'Yayınlanana geri döndür', - saveDraft: 'Taslağı kaydet', - selectLocales: 'Görüntülenecek yerel ayarları seçin', - selectVersionToCompare: 'Karşılaştırılacak bir sürüm seçin', - showLocales: 'Yerel ayarları göster:', - status: 'Durum', - type: 'Tür', - unpublish: 'Yayından Kaldır', - unpublishing: 'Yayından kaldırılıyor...', - version: 'Sürüm', - versionCreatedOn: '{{version}} oluşturma tarihi:', - versionID: 'Sürüm ID', - versions: 'Sürümler', - viewingVersion: '{{entityLabel}} {{documentTitle}} için sürümler gösteriliyor', - viewingVersionGlobal: '`Global {{entityLabel}} için sürümler gösteriliyor', - viewingVersions: '{{entityLabel}} {{documentTitle}} için sürümler gösteriliyor', - viewingVersionsGlobal: '`Global {{entityLabel}} için sürümler gösteriliyor', - }, -} diff --git a/packages/translations/src/_generatedFiles_/client/ua.js b/packages/translations/src/_generatedFiles_/client/ua.js deleted file mode 100644 index 21e0ba45e6..0000000000 --- a/packages/translations/src/_generatedFiles_/client/ua.js +++ /dev/null @@ -1,292 +0,0 @@ -export default { - authentication: { - account: 'Обліковий запис', - accountOfCurrentUser: 'Обліковий запис поточного користувача', - alreadyActivated: 'Вже активований', - alreadyLoggedIn: 'Вже увійшли в систему', - backToLogin: 'Повернутися до входу', - beginCreateFirstUser: 'Щоб розпочати - створість першого користувача', - changePassword: 'Змінити пароль', - confirmGeneration: 'Підтвердити генерацію', - confirmPassword: 'Підтвердження паролю', - createFirstUser: 'Створення першого користувача', - emailNotValid: 'Вказана адреса електронної пошти недійсна', - emailSent: 'Лист відправлено', - enableAPIKey: 'Активувати API ключ', - failedToUnlock: 'Не вдалось розблокувати', - forceUnlock: 'Примусове розблокування', - forgotPassword: 'Забули пароль', - forgotPasswordEmailInstructions: - 'Будь ласка, введіть вашу адресу електронної пошти нижче. Ви отримаєте повідомлення електронною поштою з інструкціями щодо скидання пароля.', - forgotPasswordQuestion: 'Забули пароль?', - generate: 'Згенерувати', - generateNewAPIKey: 'Згенерувати новий API ключ', - logBackIn: 'Увійти знову', - logOut: 'Вийти', - loggedOutInactivity: 'Ви вийшли з системи через бездіяльність.', - loggedOutSuccessfully: 'Ви успішно вийшли з системи.', - login: 'Увійти', - logout: 'Вийти', - logoutUser: 'Вийти з системи', - newAPIKeyGenerated: 'Новий API ключ згенеровано.', - newPassword: 'Новий пароль', - resetPassword: 'Скинути пароль', - stayLoggedIn: 'Залишатись в системі', - successfullyUnlocked: 'Успішно розблоковано', - unableToVerify: 'Неможливо підтвердити', - verified: 'Підтверджено', - verifiedSuccessfully: 'Успішно Підтверджено', - verify: 'Підтвердити', - verifyUser: 'Підтвердити користувача', - youAreInactive: - 'Ви були неактивні певний час і скоро, в цілях вашої безпеки, вас буде розлогінено. Чи бажаєте ви залишитись в системі?', - }, - error: { - autosaving: 'Виникла проблема під час автозбереження цього документа.', - correctInvalidFields: 'Будь ласка, виправте невірні поля.', - deletingTitle: - "Виникла помилка під час видалення {{title}}, Будь ласка, перевірте ваше з'єднання та спробуйте ще раз.", - loadingDocument: 'Виникла помилка під час завантаження документа з ID {{id}}.', - noMatchedField: 'Не знайдено відповідного поля для "{{label}}"', - notAllowedToAccessPage: 'Ви не маєте доступу до цієї сторінки.', - previewing: 'Виникла помилка під час попереднього перегляду цього документа.', - unableToDeleteCount: 'Не вдалося видалити {{count}} із {{total}} {{label}}.', - unableToUpdateCount: 'Не вдалося оновити {{count}} із {{total}} {{label}}.', - unauthorized: 'Немає доступу, ви повинні увійти, щоб виконати цей запит.', - unknown: 'Виникла невідома помилка.', - unspecific: 'Виникла помилка.', - }, - fields: { - addLabel: 'Додати {{label}}', - addLink: 'Додати посилання', - addNew: 'Додати новий', - addNewLabel: 'Створити {{label}}', - addRelationship: "Додати взаємозв'язок", - addUpload: 'Додати завантаження', - block: 'блок', - blockType: 'Тип блока', - blocks: 'блоки', - chooseFromExisting: 'Вибрати з існуючих', - collapseAll: 'Згорнути все', - editLink: 'Редагувати посилання', - editRelationship: "Редагувати взаємозв'язок", - itemsAndMore: '{{items}} і ще {{count}}', - labelRelationship: "{{label}} Зв'язок", - latitude: 'Широта', - linkedTo: "Зв'язано з <0>{{label}}", - longitude: 'Довгота', - passwordsDoNotMatch: 'Паролі не співпадають.', - removeRelationship: "Видалити зв'язок", - removeUpload: 'Видалити завантаження', - saveChanges: 'Зберегти зміни', - searchForBlock: 'Знайти блок', - selectFieldsToEdit: 'Виберіть поля для редагування', - showAll: 'Показати все', - swapRelationship: "Замінити зв'язок", - swapUpload: 'Замінити завантаження', - toggleBlock: 'Перемкнути блок', - uploadNewLabel: 'Завантажити новий {{label}}', - }, - general: { - aboutToDelete: 'Ви бажаєте видалити {{label}} <1>{{title}}. Ви впевнені?', - aboutToDeleteCount_many: 'Ви збираєтеся видалити {{count}} {{label}}', - aboutToDeleteCount_one: 'Ви збираєтеся видалити {{count}} {{label}}', - aboutToDeleteCount_other: 'Ви збираєтеся видалити {{count}} {{label}}', - addBelow: 'Додати нижче', - addFilter: 'Додати фільтр', - adminTheme: 'Тема адмінки', - and: 'і', - applyChanges: 'Застосувати зміни', - ascending: 'В порядку зростання', - automatic: 'Автоматично', - backToDashboard: 'Повернутись до головної сторінки', - cancel: 'Скасувати', - changesNotSaved: 'Ваши зміни не були збережені. Якщо ви вийдете зараз, то втратите свої зміни.', - close: 'Закрити', - collapse: 'Згорнути', - collections: 'Колекції', - columnToSort: 'Колонка для сортування', - columns: 'Колонки', - confirm: 'Підтвердити', - confirmDeletion: 'Підтвердити видалення', - confirmDuplication: 'Підтвердити копіювання', - copied: 'Скопійовано', - copy: 'Скопіювати', - create: 'Створити', - createNew: 'Створити', - createNewLabel: 'Створити новий {{label}}', - created: 'Створено', - creating: 'Створення', - creatingNewLabel: 'Створення нового {{label}}', - dark: 'Темна', - dashboard: 'Головна', - delete: 'Видалити', - deletedCountSuccessfully: 'Успішно видалено {{count}} {{label}}.', - deleting: 'Видалення...', - descending: 'В порядку спадання', - deselectAllRows: 'Скасувати вибір всіх рядків', - duplicate: 'Дублювати', - duplicateWithoutSaving: 'Дублювання без збереження змін', - edit: 'Редагувати', - editLabel: 'Редагувати {{label}}', - editing: 'Редагування', - editingLabel_many: 'Редагування {{count}} {{label}}', - editingLabel_one: 'Редагування {{count}} {{label}}', - editingLabel_other: 'Редагування {{count}} {{label}}', - email: 'Email', - emailAddress: 'Email адреса', - enterAValue: 'Введіть значення', - error: 'Помилка', - errors: 'Помилки', - fallbackToDefaultLocale: 'Відновлення локалі за замовчуванням', - filterWhere: 'Де фільтрувати {{label}}', - filters: 'Фільтри', - globals: 'Глобальні', - language: 'Мова', - lastModified: 'Останні зміни', - leaveAnyway: 'Все одно вийти', - leaveWithoutSaving: 'Вийти без збереження', - light: 'Світла', - livePreview: 'Попередній перегляд', - loading: 'Загрузка', - locale: 'Локаль', - menu: 'Меню', - moveDown: 'Перемістити нижче', - moveUp: 'Перемістити вище', - noFiltersSet: 'Відсусті фільтри', - noLabel: '<без {{label}}>', - noOptions: 'Немає варіантів', - noResults: - 'Жодного {{label}} не знайдено. Або {{label}} ще не існує, або жодна з них не відповідає фільтрам, які ви задали више.', - noValue: 'Немає значення', - none: 'Ніхто', - notFound: 'Не знайдено', - nothingFound: 'Нічого не знайдено', - of: 'з', - open: 'Відкрити', - or: 'або', - order: 'Порядок', - pageNotFound: 'Сторінка не знайдена', - password: 'Пароль', - payloadSettings: 'Налаштування Payload', - perPage: 'На сторінці: {{limit}}', - remove: 'Видалити', - reset: 'Скидання', - row: 'Рядок', - rows: 'Рядки', - save: 'Зберегти', - saving: 'Збереження...', - searchBy: 'Шукати по {{label}}', - selectAll: 'Вибрати всі {{count}} {{label}}', - selectAllRows: 'Вибрати всі рядки', - selectValue: 'Вибрати значення', - selectedCount: 'Вибрано {{count}} {{label}}', - showAllLabel: 'Показати всі {{label}}', - sorryNotFound: 'Вибачте - немає нічого, що відповідало б Вашому запиту.', - sort: 'Сортувати', - sortByLabelDirection: 'Сортувати за {{label}} {{direction}}', - stayOnThisPage: 'Залишитись на цій сторінці', - submissionSuccessful: 'Успішно відправлено.', - submit: 'Відправити', - successfullyCreated: '{{label}} успішно створено.', - thisLanguage: 'Українська', - titleDeleted: '{{label}} "{{title}}" успішно видалено.', - unauthorized: 'Немає доступу', - unsavedChangesDuplicate: 'Ви маєте не збережені зміни. Чи бажаєте ви продовжити дублювання?', - untitled: 'Без назви', - updatedAt: 'Змінено', - updatedCountSuccessfully: 'Успішно оновлено {{count}} {{label}}.', - updatedSuccessfully: 'Успішно відредаговано.', - updating: 'оновлення', - welcome: 'Вітаю', - }, - operators: { - contains: 'містить', - equals: 'дорівнює', - exists: 'існує', - isGreaterThan: 'більше ніж', - isGreaterThanOrEqualTo: 'більше або дорівнює', - isIn: 'є в', - isLessThan: 'менше ніж', - isLessThanOrEqualTo: 'менше або дорівнює', - isLike: 'схоже', - isNotEqualTo: 'не дорівнює', - isNotIn: 'не в', - near: 'поруч', - }, - upload: { - crop: 'Обрізати', - cropToolDescription: - 'Перетягніть кути обраної області, намалюйте нову область або скоригуйте значення нижче.', - dragAndDrop: 'Перемістіть файл', - editImage: 'Редагувати зображення', - focalPoint: 'Центральна точка', - focalPointDescription: - 'Перетягніть фокусний пункт безпосередньо на попередній перегляд або налаштуйте значення нижче.', - height: 'Висота', - previewSizes: 'Розміри попереднього перегляду', - selectCollectionToBrowse: 'Виберіть колекцію для перегляду', - selectFile: 'Виберіть файл', - setCropArea: 'Встановити область обрізки', - setFocalPoint: 'Встановити фокусний пункт', - sizesFor: 'Розміри для {{label}}', - width: 'Ширина', - }, - validation: { - fieldHasNo: 'В цього поля немає {{label}}', - limitReached: 'Досягнуто межі, можна додати лише {{max}} елементів.', - required: "Це поле є обов'язковим.", - requiresAtLeast: 'Це поле потребує не менше {{count}} {{label}}.', - }, - version: { - aboutToPublishSelection: 'Ви збираєтеся опублікувати всі {{label}} у добірці. Ти впевнений?', - aboutToRestore: - 'Ви збираєтесь відновити цей документ {{label}} до стану, в якому він знаходився {{versionDate}}.', - aboutToRestoreGlobal: - 'Ви збираєтесь відновити глобальний запис {{label}} до стану, в якому він знаходився {{versionDate}}.', - aboutToRevertToPublished: - 'Ви збираєтесь вернути зміни цього документа до його опублікованого стану. Ви впевнені?', - aboutToUnpublish: 'Ви збираєтесь відмінити публікацю цього документа. Ви впевнені?', - aboutToUnpublishSelection: - 'Ви збираєтеся скасувати публікацію всіх {{label}} у вибраному. Ти впевнений?', - autosave: 'Автозбереження', - autosavedSuccessfully: 'Автозбереження успішно виконано.', - changed: 'Змінено', - compareVersion: 'Порівняти версію з:', - confirmPublish: 'Підтвердити публікацію', - confirmRevertToSaved: 'Підтвердити повернення до збереженого', - confirmUnpublish: 'Підвтердити відміну публікації', - confirmVersionRestoration: 'Підтвердити відновлення версії', - draft: 'Чернетка', - draftSavedSuccessfully: 'Чернетка успішно збережена.', - lastSavedAgo: 'Останній раз збережено {{distance}} тому', - noFurtherVersionsFound: 'Інших версій не знайдено', - noRowsFound: 'Не знайдено {{label}}', - preview: 'Попередній перегляд', - problemRestoringVersion: 'Виникла проблема з відновленням цієї версії', - publish: 'Опублікувати', - publishChanges: 'Опублікувати зміни', - published: 'Опубліковано', - publishing: 'Публікація', - restoreThisVersion: 'Відновити цю версію', - restoredSuccessfully: 'Відновлено успішно.', - restoring: 'Відеовлення...', - revertToPublished: 'Відновити до опублікованого', - saveDraft: 'Зберегти чернетку', - selectLocales: 'Виберіть переклад для відображення', - selectVersionToCompare: 'Виберіть версію для порівняння', - showLocales: 'Показати переклади:', - status: 'Статус', - type: 'Тип', - unpublish: 'Відмінити публікацію', - unpublishing: 'Відміна публікації...', - version: 'Версія', - versionCreatedOn: '{{version}} створена:', - versionID: 'ID версії', - versions: 'Версії', - viewingVersion: 'Огляд версії для {{entityLabel}} {{documentTitle}}', - viewingVersionGlobal: 'Огляд версій для глобальної колекці {{entityLabel}}', - viewingVersions: 'Огляд версій для {{entityLabel}} {{documentTitle}}', - viewingVersionsGlobal: 'Огляд версій для глобальної колекції {{entityLabel}}', - }, -} diff --git a/packages/translations/src/_generatedFiles_/client/vi.js b/packages/translations/src/_generatedFiles_/client/vi.js deleted file mode 100644 index d7217c473c..0000000000 --- a/packages/translations/src/_generatedFiles_/client/vi.js +++ /dev/null @@ -1,288 +0,0 @@ -export default { - authentication: { - account: 'Tài khoản', - accountOfCurrentUser: 'Tài khoản của người dùng hiện tại', - alreadyActivated: 'Đã được kích hoạt', - alreadyLoggedIn: 'Đã đăng nhập', - backToLogin: 'Quay lại đăng nhập.', - beginCreateFirstUser: 'Để bắt đầu, hãy tạo người dùng đầu tiên.', - changePassword: 'Đổi mật khẩu', - confirmGeneration: 'Xác nhận, tạo API Key', - confirmPassword: 'Xác nhận mật khẩu', - createFirstUser: 'Tạo người dùng đầu tiên', - emailNotValid: 'Email không chính xác', - emailSent: 'Email đã được gửi', - enableAPIKey: 'Kích hoạt API Key', - failedToUnlock: 'Mở khóa thất bại', - forceUnlock: 'Mở khóa tài khoản', - forgotPassword: 'Quên mật khẩu', - forgotPasswordEmailInstructions: 'Nhập email của bạn để nhận hướng dẫn tạo lại mật khẩu.', - forgotPasswordQuestion: 'Quên mật khẩu?', - generate: 'Tạo', - generateNewAPIKey: 'Tạo API Key mới', - logBackIn: 'Đăng nhập lại', - logOut: 'Đăng xuất', - loggedOutInactivity: 'Bạn đã tự động đăng xuất sau một khoản thời gian dài không thao tác.', - loggedOutSuccessfully: 'Đăng xuất thành công.', - login: 'Đăng nhập', - logout: 'Đăng xuất', - logoutUser: 'Đăng xuất người dùng', - newAPIKeyGenerated: 'API Key mới đã được tạo', - newPassword: 'Mật khẩu mới', - resetPassword: 'Tạo lại mật khẩu', - stayLoggedIn: 'Duy trì đăng nhập', - successfullyUnlocked: 'Mở khóa thành công', - unableToVerify: 'Không thể xác thực', - verified: 'Đã xác thực', - verifiedSuccessfully: 'Đã xác thực thành công', - verify: 'Tiến hành xác thực', - verifyUser: 'Tiến hành xác thực người dùng', - youAreInactive: - 'Bạn đã không thao tác trong một khoảng thời gian, và sẽ bị tự động đăng xuất vì lý do bảo mật. Bạn có muốn tiếp tục phiên đăng nhập.', - }, - error: { - autosaving: 'Lỗi - Đã xảy ra vấn đề khi tự động sao lưu bản tài liệu này.', - correctInvalidFields: 'Lỗi - Xin hãy sửa lại những fields không hợp lệ.', - deletingTitle: - 'Lỗi - Đã xảy ra vấn đề khi xóa {{title}}. Hãy kiểm tra kết nối mạng và thử lại.', - loadingDocument: 'Lỗi - Đã xảy ra vấn để khi tải bản tài liệu với ID {{id}}.', - noMatchedField: 'Lỗi - Không tìm thấy field trùng với "{{label}}".', - notAllowedToAccessPage: 'Lỗi - Bạn không có quyền truy cập trang này.', - previewing: 'Lỗi - Đã xảy ra vấn đề khi xem trước bản tài liệu này.', - unableToDeleteCount: 'Không thể xóa {{count}} trong số {{total}} {{label}}.', - unableToUpdateCount: 'Không thể cập nhật {{count}} trên {{total}} {{label}}.', - unauthorized: 'Lỗi - Bạn cần phải đăng nhập trước khi gửi request sau.', - unknown: 'Lỗi - Không xác định (unknown error).', - unspecific: 'Lỗi - Đã xảy ra (unspecific error).', - }, - fields: { - addLabel: 'Thêm: {{label}}', - addLink: 'Thêm liên kết', - addNew: 'Thêm mới', - addNewLabel: 'Thêm mới: {{label}}', - addRelationship: 'Thêm mối quan hệ (relationship)', - addUpload: 'Thêm tải lên (upload)', - block: 'block', - blockType: 'Block Type', - blocks: 'blocks', - chooseFromExisting: 'Chọn từ thư viện', - collapseAll: 'Ẩn toàn bộ', - editLink: 'Chỉnh sửa liên kết', - editRelationship: 'Chỉnh sửa mối quan hệ', - itemsAndMore: '{{items}} và {{count}} món nữa', - labelRelationship: 'Mối quan hệ của {{label}} (Relationship)', - latitude: 'Vĩ độ', - linkedTo: 'Được nối với <0>{{label}}', - longitude: 'Kinh độ', - passwordsDoNotMatch: 'Mật khẩu không trùng.', - removeRelationship: 'Xóa Mối quan hệ', - removeUpload: 'Xóa bản tải lên', - saveChanges: 'Luu thay đổi', - searchForBlock: 'Tìm block', - selectFieldsToEdit: 'Chọn các trường để chỉnh sửa', - showAll: 'Hiển thị toàn bộ', - swapRelationship: 'Đổi quan hệ', - swapUpload: 'Đổi bản tải lên', - toggleBlock: 'Bật/tắt block', - uploadNewLabel: 'Tải lên bản mới: {{label}}', - }, - general: { - aboutToDelete: 'Chuẩn bị xóa {{label}} <1>{{title}}. Bạn có muốn tiếp tục không?', - aboutToDeleteCount_many: 'Bạn sắp xóa {{count}} {{label}}', - aboutToDeleteCount_one: 'Bạn sắp xóa {{count}} {{label}}', - aboutToDeleteCount_other: 'Bạn sắp xóa {{count}} {{label}}', - addBelow: 'Thêm bên dưới', - addFilter: 'Thêm bộ lọc', - adminTheme: 'Giao diện bảng điều khiển', - and: 'Và', - applyChanges: 'Áp dụng Thay đổi', - ascending: 'Sắp xếp theo thứ tự tăng dần', - automatic: 'Tự động', - backToDashboard: 'Quay lại bảng điều khiển', - cancel: 'Hủy', - changesNotSaved: 'Thay đổi chưa được lưu lại. Bạn sẽ mất bản chỉnh sửa nếu thoát bây giờ.', - close: 'Gần', - collapse: 'Thu gọn', - collections: 'Collections', - columnToSort: 'Sắp xếp cột', - columns: 'Hiển thị cột', - confirm: 'Xác nhận', - confirmDeletion: 'Xác nhận xóa', - confirmDuplication: 'Xác nhận tạo bản sao', - copied: 'Đâ sao chép', - copy: 'Sao chép', - create: 'Tạo', - createNew: 'Tạo mới', - createNewLabel: 'Tạo mới {{label}}', - created: 'Đã tạo', - creating: 'Đang tạo', - creatingNewLabel: 'Đang tạo mới {{label}}', - dark: 'Nền tối', - dashboard: 'Bảng điều khiển', - delete: 'Xóa', - deletedCountSuccessfully: 'Đã xóa thành công {{count}} {{label}}.', - deleting: 'Đang xóa...', - descending: 'Xếp theo thứ tự giảm dần', - deselectAllRows: 'Bỏ chọn tất cả các hàng', - duplicate: 'Tạo bản sao', - duplicateWithoutSaving: 'Không lưu dữ liệu và tạo bản sao', - edit: 'Chỉnh sửa', - editLabel: 'Chỉnh sửa: {{label}}', - editing: 'Đang chỉnh sửa', - editingLabel_many: 'Đang chỉnh sửa {{count}} {{label}}', - editingLabel_one: 'Đang chỉnh sửa {{count}} {{label}}', - editingLabel_other: 'Đang chỉnh sửa {{count}} {{label}}', - email: 'Email', - emailAddress: 'Địa chỉ Email', - enterAValue: 'Nhập một giá trị', - error: 'Lỗi', - errors: 'Lỗi', - fallbackToDefaultLocale: 'Ngôn ngữ mặc định', - filterWhere: 'Lọc {{label}} với điều kiện:', - filters: 'Bộ lọc', - globals: 'Toàn thể (globals)', - language: 'Ngôn ngữ', - lastModified: 'Chỉnh sửa lần cuối vào lúc', - leaveAnyway: 'Tiếp tục thoát', - leaveWithoutSaving: 'Thay đổi chưa được lưu', - light: 'Nền sáng', - livePreview: 'Xem trước', - loading: 'Đang tải', - locale: 'Ngôn ngữ', - menu: 'Thực đơn', - moveDown: 'Di chuyển xuống', - moveUp: 'Di chuyển lên', - noFiltersSet: 'Không có bộ lọc nào được áp dụng', - noLabel: '', - noOptions: 'Không có lựa chọn', - noResults: - 'Danh sách rỗng: {{label}}. Có thể {{label}} chưa tồn tại hoặc không có dữ kiện trùng với bộ lọc hiện tại.', - noValue: 'Không có giá trị', - none: 'Không có', - notFound: 'Không tìm thấy', - nothingFound: 'Không tìm thấy', - of: 'trong số', - open: 'Mở', - or: 'hoặc', - order: 'Thứ tự', - pageNotFound: 'Không tìm thấy trang', - password: 'Mật khẩu', - payloadSettings: 'Cài đặt', - perPage: 'Hiển thị mỗi trang: {{limit}}', - remove: 'Loại bỏ', - reset: 'Đặt lại', - row: 'Hàng', - rows: 'Những hàng', - save: 'Luu', - saving: 'Đang lưu...', - searchBy: 'Tìm với {{label}}', - selectAll: 'Chọn tất cả {{count}} {{label}}', - selectAllRows: 'Chọn tất cả các hàng', - selectValue: 'Chọn một giá trị', - selectedCount: 'Đã chọn {{count}} {{label}}', - showAllLabel: 'Hiển thị tất cả {{label}}', - sorryNotFound: 'Xin lỗi, không có kết quả nào tương ứng với request của bạn.', - sort: 'Sắp xếp', - sortByLabelDirection: 'Sắp xếp theo {{label}} {{direction}}', - stayOnThisPage: 'Ở lại trang này', - submissionSuccessful: 'Gửi thành công.', - submit: 'Gửi', - successfullyCreated: '{{label}} đã được tạo thành công.', - thisLanguage: 'Vietnamese (Tiếng Việt)', - titleDeleted: '{{label}} {{title}} đã được xóa thành công.', - unauthorized: 'Không có quyền truy cập.', - unsavedChangesDuplicate: 'Bạn chưa lưu các thay đổi. Bạn có muốn tiếp tục tạo bản sao?', - untitled: 'Chưa có tiêu đề', - updatedAt: 'Ngày cập nhật', - updatedCountSuccessfully: 'Đã cập nhật thành công {{count}} {{label}}.', - updatedSuccessfully: 'Cập nhật thành công.', - updating: 'Đang cập nhật', - welcome: 'Xin chào', - }, - operators: { - contains: 'có chứa', - equals: 'bằng', - exists: 'tồn tại', - isGreaterThan: 'lớn hơn', - isGreaterThanOrEqualTo: 'lớn hơn hoặc bằng', - isIn: 'có trong', - isLessThan: 'nhỏ hơn', - isLessThanOrEqualTo: 'nhỏ hơn hoặc bằng', - isLike: 'gần giống', - isNotEqualTo: 'không bằng', - isNotIn: 'không có trong', - near: 'gần', - }, - upload: { - crop: 'Mùa vụ', - cropToolDescription: - 'Kéo các góc của khu vực đã chọn, vẽ một khu vực mới hoặc điều chỉnh các giá trị dưới đây.', - dragAndDrop: 'Kéo và thả một tập tin', - editImage: 'Chỉnh sửa hình ảnh', - focalPoint: 'Điểm trọng tâm', - focalPointDescription: - 'Kéo điểm tiêu cực trực tiếp trên trình xem trước hoặc điều chỉnh các giá trị bên dưới.', - height: 'Chiều cao', - previewSizes: 'Kích cỡ xem trước', - selectCollectionToBrowse: 'Chọn một Collection để tìm', - selectFile: 'Chọn một file', - setCropArea: 'Đặt khu vực cắt', - setFocalPoint: 'Đặt điểm tiêu điểm', - sizesFor: 'Kích thước cho {{label}}', - width: 'Chiều rộng', - }, - validation: { - fieldHasNo: 'Field này không có: {{label}}', - limitReached: 'Đã đạt giới hạn, chỉ có thể thêm {{max}} mục.', - required: 'Field này cần được diền.', - requiresAtLeast: 'Field này cần tối thiểu {{count}} {{label}}.', - }, - version: { - aboutToPublishSelection: 'Bạn có muốn xuất bản tất cả {{label}} không?', - aboutToRestore: 'Bạn chuẩn bị khôi phục lại {{label}} về phiên bản {{versionDate}}.', - aboutToRestoreGlobal: - 'Bạn chuẩn bị khôi phục lại bản toàn thể (global) của {{label}} về phiên bản {{versionDate}}.', - aboutToRevertToPublished: 'Bạn có muốn tái xuất bản bản nháp này không?', - aboutToUnpublish: 'Bạn có muốn ngưng xuất bản?', - aboutToUnpublishSelection: 'Bạn có muốn ngưng xuất bản tất cả {{label}} không?', - autosave: 'Tự động lưu dữ liệu', - autosavedSuccessfully: 'Đã tự động lưu thành công.', - changed: 'Đã thay đổi', - compareVersion: 'So sánh phiên bản này với:', - confirmPublish: 'Xác nhận xuất bản', - confirmRevertToSaved: 'Xác nhận, quay về trạng thái đã lưu', - confirmUnpublish: 'Xác nhận, ngưng xuất bản', - confirmVersionRestoration: 'Xác nhận, khôi phục về phiên bản trước', - draft: 'Bản nháp', - draftSavedSuccessfully: 'Bản nháp đã được lưu thành công.', - lastSavedAgo: 'Lần lưu cuối cùng {{distance}} trước đây', - noFurtherVersionsFound: 'Không tìm thấy phiên bản cũ hơn', - noRowsFound: 'Không tìm thấy: {{label}}', - preview: 'Bản xem trước', - problemRestoringVersion: 'Đã xảy ra vấn đề khi khôi phục phiên bản này', - publish: 'Công bố', - publishChanges: 'Xuất bản tài liệu', - published: 'Đã xuất bản', - publishing: 'Xuất bản', - restoreThisVersion: 'Khôi phục về phiên bản này', - restoredSuccessfully: 'Đã khôi phục thành công.', - restoring: 'Đang khôi phục...', - revertToPublished: 'Quay về trạng thái đã xuất bản', - saveDraft: 'Lưu bản nháp', - selectLocales: 'Chọn mã khu vực để hiện thị', - selectVersionToCompare: 'Chọn phiên bản để so sánh', - showLocales: 'Hiển thị mã khu vực:', - status: 'Trạng thái', - type: 'Loại', - unpublish: 'Ẩn tài liệu', - unpublishing: 'Đang ẩn tài liệu...', - version: 'Phiên bản', - versionCreatedOn: 'Phiên bản {{version}} được tạo vào lúc:', - versionID: 'ID của phiên bản', - versions: 'Danh sách phiên bản', - viewingVersion: 'Xem phiên bản của {{entityLabel}} {{documentTitle}}', - viewingVersionGlobal: '`Xem phiên bản toàn thể (global) của {{entityLabel}}', - viewingVersions: 'Xem những phiên bản của {{entityLabel}} {{documentTitle}}', - viewingVersionsGlobal: '`Xem những phiên bản toàn thể (global) của {{entityLabel}}', - }, -} diff --git a/packages/translations/src/_generatedFiles_/client/zh-tw.js b/packages/translations/src/_generatedFiles_/client/zh-tw.js deleted file mode 100644 index e7d890bdef..0000000000 --- a/packages/translations/src/_generatedFiles_/client/zh-tw.js +++ /dev/null @@ -1,284 +0,0 @@ -export default { - authentication: { - account: '帳戶', - accountOfCurrentUser: '目前使用者的帳戶', - alreadyActivated: '已經啟用了', - alreadyLoggedIn: '已經登入了', - backToLogin: '返回登入頁面', - beginCreateFirstUser: '首先,請建立您的第一個使用者。', - changePassword: '更改密碼', - confirmGeneration: '確認生成', - confirmPassword: '確認密碼', - createFirstUser: '建立第一個使用者', - emailNotValid: '提供的電子郵件無效', - emailSent: '電子郵件已寄出', - enableAPIKey: '啟用API金鑰', - failedToUnlock: '解鎖失敗', - forceUnlock: '強制解鎖', - forgotPassword: '忘記密碼', - forgotPasswordEmailInstructions: - '請在下方輸入您的電子郵件。您將收到一封有關如何重設密碼的說明電子郵件。', - forgotPasswordQuestion: '忘記密碼?', - generate: '生成', - generateNewAPIKey: '生成新的API金鑰', - logBackIn: '重新登入', - logOut: '登出', - loggedOutInactivity: '您由於不活躍而被登出了。', - loggedOutSuccessfully: '您已成功登出。', - login: '登入', - logout: '登出', - logoutUser: '登出使用者', - newAPIKeyGenerated: '新的API金鑰已生成。', - newPassword: '新的密碼', - resetPassword: '重設密碼', - stayLoggedIn: '保持登入狀態', - successfullyUnlocked: '已成功解鎖', - unableToVerify: '無法驗證', - verified: '已驗證', - verifiedSuccessfully: '成功驗證', - verify: '驗證', - verifyUser: '驗證使用者', - youAreInactive: - '您已經有一段時間沒有活動了,為了您的安全,很快就會自動登出。您想保持登入狀態嗎?', - }, - error: { - autosaving: '自動儲存該文件時出現了問題。', - correctInvalidFields: '請更正無效區塊。', - deletingTitle: '刪除{{title}}時出現了錯誤。請檢查您的網路連線並重試。', - loadingDocument: '加載ID為{{id}}的文件時出現了問題。', - noMatchedField: '找不到與"{{label}}"匹配的字串', - notAllowedToAccessPage: '您沒有權限訪問此頁面。', - previewing: '預覽文件時出現了問題。', - unableToDeleteCount: '無法從 {{total}} 個中刪除 {{count}} 個 {{label}}。', - unableToUpdateCount: '無法從 {{total}} 個中更新 {{count}} 個 {{label}}。', - unauthorized: '未經授權,您必須登錄才能提出這個請求。', - unknown: '發生了一個未知的錯誤。', - unspecific: '發生了一個錯誤。', - }, - fields: { - addLabel: '新增{{label}}', - addLink: '新增連結', - addNew: '新增', - addNewLabel: '新增{{label}}', - addRelationship: '新增關聯', - addUpload: '上傳', - block: '區塊', - blockType: '區塊類型', - blocks: '區塊', - chooseFromExisting: '從現有的選擇', - collapseAll: '全部折疊', - editLink: '編輯連結', - editRelationship: '編輯關聯', - itemsAndMore: '{{items}} 個,還有 {{count}} 個', - labelRelationship: '{{label}}關聯', - latitude: '緯度', - linkedTo: '連結到<0>{{label}}', - longitude: '經度', - passwordsDoNotMatch: '密碼不匹配。', - removeRelationship: '移除關聯', - removeUpload: '移除上傳', - saveChanges: '儲存變更', - searchForBlock: '搜尋一個區塊', - selectFieldsToEdit: '選擇要編輯的字串', - showAll: '顯示全部', - swapRelationship: '替換關聯', - swapUpload: '替換上傳', - toggleBlock: '切換區塊', - uploadNewLabel: '上傳新的{{label}}', - }, - general: { - aboutToDelete: '您即將刪除{{label}} <1>{{title}}。您確定要繼續嗎?', - aboutToDeleteCount_many: '您即將刪除 {{count}} 個 {{label}}', - aboutToDeleteCount_one: '您即將刪除 {{count}} 個 {{label}}', - aboutToDeleteCount_other: '您即將刪除 {{count}} 個 {{label}}', - addBelow: '新增到下方', - addFilter: '新增過濾器', - adminTheme: '管理頁面主題', - and: '和', - applyChanges: '套用更改', - ascending: '升冪', - automatic: '自動', - backToDashboard: '返回到控制面板', - cancel: '取消', - changesNotSaved: '您還有尚未儲存的變更。您確定要離開嗎?', - close: '關閉', - collapse: '折疊', - collections: '集合', - columnToSort: '要排序的欄位', - columns: '欄位', - confirm: '確認', - confirmDeletion: '確認刪除', - confirmDuplication: '確認複製', - copied: '已複製', - copy: '複製', - create: '建立', - createNew: '建立新的', - createNewLabel: '建立新的{{label}}', - created: '已建立', - creating: '建立中', - creatingNewLabel: '正在建立新的{{label}}', - dark: '深色', - dashboard: '控制面板', - delete: '刪除', - deletedCountSuccessfully: '已成功刪除 {{count}} 個 {{label}}。', - deleting: '刪除中...', - descending: '降冪', - deselectAllRows: '取消選擇全部', - duplicate: '複製', - duplicateWithoutSaving: '複製而不儲存變更。', - edit: '編輯', - editLabel: '編輯{{label}}', - editing: '編輯中', - editingLabel_many: '編輯 {{count}} 個 {{label}}', - editingLabel_one: '編輯 {{count}} 個 {{label}}', - editingLabel_other: '編輯 {{count}} 個 {{label}}', - email: '電子郵件', - emailAddress: '電子郵件地址', - enterAValue: '輸入一個值', - error: '錯誤', - errors: '錯誤', - fallbackToDefaultLocale: '回到預設的語言', - filterWhere: '過濾{{label}}', - filters: '過濾器', - globals: '全域', - language: '語言', - lastModified: '最後修改', - leaveAnyway: '無論如何都要離開', - leaveWithoutSaving: '不儲存直接離開', - light: '亮色', - livePreview: '預覽', - loading: '載入中...', - locale: '語言環境', - menu: '菜單', - moveDown: '向下移動', - moveUp: '向上移動', - noFiltersSet: '沒有設定過濾器', - noLabel: '<沒有{{label}}>', - noOptions: '沒有選項', - noResults: '沒有找到{{label}}。{{label}}並不存在或沒有符合您上面所指定的過濾器。', - noValue: '沒有數值', - none: '無', - notFound: '未找到', - nothingFound: '沒有找到任何東西', - of: '的', - open: '打開', - or: '或', - order: '排序', - pageNotFound: '未找到頁面', - password: '密碼', - payloadSettings: 'Payload設定', - perPage: '每一頁: {{limit}} 個', - remove: '移除', - reset: '重設', - row: '行', - rows: '行', - save: '儲存', - saving: '儲存中...', - searchBy: '搜尋{{label}}', - selectAll: '選擇所有 {{count}} 個 {{label}}', - selectAllRows: '選擇所有行', - selectValue: '選擇一個值', - selectedCount: '已選擇 {{count}} 個 {{label}}', - showAllLabel: '顯示所有{{label}}', - sorryNotFound: '對不起,沒有找到您請求的東西。', - sort: '排序', - sortByLabelDirection: '按{{label}} {{direction}}排序', - stayOnThisPage: '停留在此頁面', - submissionSuccessful: '成功送出。', - submit: '送出', - successfullyCreated: '成功建立{{label}}', - thisLanguage: '中文 (繁體)', - titleDeleted: '{{label}} "{{title}}"已被成功刪除。', - unauthorized: '未經授權', - unsavedChangesDuplicate: '您有還沒儲存的修改,確定要繼續複製嗎?', - untitled: '無標題', - updatedAt: '更新於', - updatedCountSuccessfully: '已成功更新 {{count}} 個 {{label}}。', - updatedSuccessfully: '更新成功。', - updating: '更新中', - welcome: '歡迎', - }, - operators: { - contains: '包含', - equals: '等於', - exists: '存在', - isGreaterThan: '大於', - isGreaterThanOrEqualTo: '大於等於', - isIn: '在', - isLessThan: '小於', - isLessThanOrEqualTo: '小於或等於', - isLike: '就像', - isNotEqualTo: '不等於', - isNotIn: '不在', - near: '附近', - }, - upload: { - crop: '裁剪', - cropToolDescription: '拖動所選區域的角落,繪製一個新區域或調整以下的值。', - dragAndDrop: '拖放一個檔案', - editImage: '編輯圖像', - focalPoint: '焦點', - focalPointDescription: '直接在預覽中拖動焦點或調整下面的值。', - height: '高度', - previewSizes: '預覽尺寸', - selectCollectionToBrowse: '選擇一個要瀏覽的集合', - selectFile: '選擇一個文件', - setCropArea: '設置裁剪區域', - setFocalPoint: '設置焦點', - sizesFor: '{{label}}的尺寸', - width: '寬度', - }, - validation: { - fieldHasNo: '這個字串沒有{{label}}', - limitReached: '已達限制,只能添加{{max}}個項目。', - required: '該字串為必填項目。', - requiresAtLeast: '該字串至少需要 {{count}} 個 {{label}}。', - }, - version: { - aboutToPublishSelection: '您確定即將發佈所選的 {{label}} 嗎?', - aboutToRestore: '您將把這個文件{{label}}回復到{{versionDate}}時的狀態', - aboutToRestoreGlobal: '您要將痊域的{{label}}回復到{{versionDate}}時的狀態', - aboutToRevertToPublished: '您將要將這個文件的內容還原到它的發佈狀態。您確定嗎?', - aboutToUnpublish: '您即將取消發佈這個文件。您確定嗎?', - aboutToUnpublishSelection: '您即將取消發佈所選內容中的所有 {{label}}。您確定嗎?', - autosave: '自動儲存', - autosavedSuccessfully: '自動儲存成功。', - changed: '已更改', - compareVersion: '對比版本:', - confirmPublish: '確認發佈', - confirmRevertToSaved: '確認回復到儲存狀態', - confirmUnpublish: '確認取消發佈', - confirmVersionRestoration: '確認版本回復', - draft: '草稿', - draftSavedSuccessfully: '草稿儲存成功。', - lastSavedAgo: '上次儲存在{{distance}}之前', - noFurtherVersionsFound: '沒有發現其他版本', - noRowsFound: '沒有發現{{label}}', - preview: '預覽', - problemRestoringVersion: '回復這個版本時發生了問題', - publish: '發佈', - publishChanges: '發佈修改', - published: '已發佈', - publishing: '發布', - restoreThisVersion: '回復此版本', - restoredSuccessfully: '回復成功。', - restoring: '回復中...', - revertToPublished: '還原到已發佈的版本', - saveDraft: '儲存草稿', - selectLocales: '選擇要顯示的語言', - selectVersionToCompare: '選擇要比較的版本', - showLocales: '顯示語言:', - status: '狀態', - type: '類型', - unpublish: '取消發佈', - unpublishing: '取消發佈中...', - version: '版本', - versionCreatedOn: '版本 {{version}} 建立於:', - versionID: '版本ID', - versions: '版本', - viewingVersion: '正在查看{{entityLabel}} {{documentTitle}}的版本', - viewingVersionGlobal: '正在查看全域{{entityLabel}}的版本', - viewingVersions: '正在查看{{entityLabel}} {{documentTitle}}的版本', - viewingVersionsGlobal: '正在查看全域{{entityLabel}}的版本', - }, -} diff --git a/packages/translations/src/_generatedFiles_/client/zh.js b/packages/translations/src/_generatedFiles_/client/zh.js deleted file mode 100644 index b9651f5806..0000000000 --- a/packages/translations/src/_generatedFiles_/client/zh.js +++ /dev/null @@ -1,284 +0,0 @@ -export default { - authentication: { - account: '帐户', - accountOfCurrentUser: '当前用户的帐户', - alreadyActivated: '已经激活了', - alreadyLoggedIn: '已经登入了', - backToLogin: '回到登录页面', - beginCreateFirstUser: '首先,请创建您的第一个用户。', - changePassword: '更改密码', - confirmGeneration: '确认生成', - confirmPassword: '确认密码', - createFirstUser: '创建第一个用户', - emailNotValid: '所提供的电子邮件时无效的', - emailSent: '电子邮件已发送', - enableAPIKey: '启用API密钥', - failedToUnlock: '解锁失败', - forceUnlock: '强制解锁', - forgotPassword: '忘记密码', - forgotPasswordEmailInstructions: - '请在下方输入您的电子邮件。您将会收到一封有关如何重置密码说明的电子邮件。', - forgotPasswordQuestion: '忘记密码?', - generate: '生成', - generateNewAPIKey: '生成新的API密钥', - logBackIn: '重新登入', - logOut: '登出', - loggedOutInactivity: '您由于不活跃而被登出了。', - loggedOutSuccessfully: '您已成功登出。', - login: '登录', - logout: '登出', - logoutUser: '登出用户', - newAPIKeyGenerated: '新的API密钥已经生成。', - newPassword: '新的密码', - resetPassword: '重置密码', - stayLoggedIn: '保持登录状态', - successfullyUnlocked: '已成功解锁', - unableToVerify: '无法验证', - verified: '已验证', - verifiedSuccessfully: '成功验证', - verify: '验证', - verifyUser: '验证用户', - youAreInactive: - '您已经有一段时间没有活动了,为了您的安全,很快就会自动登出。您想保持登录状态吗?', - }, - error: { - autosaving: '自动保存该文件时出现了问题。', - correctInvalidFields: '请更正无效字段。', - deletingTitle: '删除{{title}}时出现了错误。请检查您的连接并重试。', - loadingDocument: '加载ID为{{id}}的文件时出现了问题。', - noMatchedField: '找不到与"{{label}}"匹配的字段', - notAllowedToAccessPage: '您无权访问此页面。', - previewing: '预览文件时出现了问题。', - unableToDeleteCount: '无法从 {{total}} {{label}} 中删除 {{count}}。', - unableToUpdateCount: '无法更新 {{count}} 个,共 {{total}} 个 {{label}}。', - unauthorized: '未经授权,您必须登录才能提出这个请求。', - unknown: '发生了一个未知的错误。', - unspecific: '发生了一个错误。', - }, - fields: { - addLabel: '添加{{label}}', - addLink: '添加链接', - addNew: '添加新的', - addNewLabel: '添加新的{{label}}', - addRelationship: '添加关系', - addUpload: '添加上传', - block: '区块', - blockType: '区块类型', - blocks: '区块', - chooseFromExisting: '从现有中选择', - collapseAll: '全部折叠', - editLink: '编辑链接', - editRelationship: '编辑关系', - itemsAndMore: '{{items}}和{{count}}更多', - labelRelationship: '{{label}}关系', - latitude: '纬度', - linkedTo: '链接到<0>{{label}}', - longitude: '经度', - passwordsDoNotMatch: '密码不匹配。', - removeRelationship: '移除关系', - removeUpload: '移除上传', - saveChanges: '保存更改', - searchForBlock: '搜索一个区块', - selectFieldsToEdit: '选择要编辑的字段', - showAll: '显示全部', - swapRelationship: '交换关系', - swapUpload: '交换上传', - toggleBlock: '切换块', - uploadNewLabel: '上传新的{{label}}', - }, - general: { - aboutToDelete: '您即将删除{{label}} <1>{{title}}。您确定要继续吗?', - aboutToDeleteCount_many: '您即将删除 {{count}} {{label}}', - aboutToDeleteCount_one: '您即将删除 {{count}} {{label}}', - aboutToDeleteCount_other: '您即将删除 {{count}} {{label}}', - addBelow: '添加到下面', - addFilter: '添加过滤器', - adminTheme: '管理页面主题', - and: '和', - applyChanges: '应用更改', - ascending: '升序', - automatic: '自动', - backToDashboard: '返回到仪表板', - cancel: '取消', - changesNotSaved: '您的更改尚未保存。您确定要离开吗?', - close: '关闭', - collapse: '折叠', - collections: '集合', - columnToSort: '要排序的列', - columns: '列', - confirm: '确认', - confirmDeletion: '确认删除', - confirmDuplication: '确认重复', - copied: '已复制', - copy: '复制', - create: '创建', - createNew: '创建新的', - createNewLabel: '创建新的{{label}}', - created: '已创建', - creating: '创建中', - creatingNewLabel: '正在创建新的{{label}}', - dark: '深色', - dashboard: '仪表板', - delete: '删除', - deletedCountSuccessfully: '已成功删除 {{count}} {{label}}。', - deleting: '删除中...', - descending: '降序', - deselectAllRows: '取消选择所有行', - duplicate: '重复', - duplicateWithoutSaving: '重复而不保存更改。', - edit: '编辑', - editLabel: '编辑{{label}}', - editing: '编辑中', - editingLabel_many: '编辑 {{count}} {{label}}', - editingLabel_one: '编辑 {{count}} {{label}}', - editingLabel_other: '编辑 {{count}} {{label}}', - email: '电子邮件', - emailAddress: '电子邮件地址', - enterAValue: '输入一个值', - error: '错误', - errors: '错误', - fallbackToDefaultLocale: '回退到默认语言环境', - filterWhere: '过滤{{label}}', - filters: '过滤器', - globals: '全局', - language: '语言', - lastModified: '最后修改', - leaveAnyway: '无论如何都要离开', - leaveWithoutSaving: '离开而不保存', - light: '亮色', - livePreview: '预览', - loading: '加载中...', - locale: '语言环境', - menu: '菜单', - moveDown: '向下移动', - moveUp: '向上移动', - noFiltersSet: '没有设置过滤器', - noLabel: '<没有{{label}}>', - noOptions: '没有选项', - noResults: '没有找到{{label}}。{{label}}并不存在或没有符合您上面所指定的过滤器。', - noValue: '没有值', - none: '无', - notFound: '未找到', - nothingFound: '没有找到任何东西', - of: '的', - open: '打开', - or: '或', - order: '排序', - pageNotFound: '未找到页面', - password: '密码', - payloadSettings: 'Payload设置', - perPage: '每一页: {{limit}}', - remove: '移除', - reset: '重置', - row: '行', - rows: '行', - save: '保存', - saving: '保存中...', - searchBy: '搜索{{label}}', - selectAll: '选择所有 {{count}} {{label}}', - selectAllRows: '选择所有行', - selectValue: '选择一个值', - selectedCount: '已选择 {{count}} {{label}}', - showAllLabel: '显示所有{{label}}', - sorryNotFound: '对不起,没有与您的请求相对应的东西。', - sort: '排序', - sortByLabelDirection: '按{{label}} {{direction}}排序', - stayOnThisPage: '停留在此页面', - submissionSuccessful: '提交成功。', - submit: '提交', - successfullyCreated: '成功创建{{label}}', - thisLanguage: '中文 (简体)', - titleDeleted: '{{label}} "{{title}}"已被成功删除。', - unauthorized: '未经授权', - unsavedChangesDuplicate: '您有未保存的修改。您确定要继续重复吗?', - untitled: '无标题', - updatedAt: '更新于', - updatedCountSuccessfully: '已成功更新 {{count}} {{label}}。', - updatedSuccessfully: '更新成功。', - updating: '更新中', - welcome: '欢迎', - }, - operators: { - contains: '包含', - equals: '等于', - exists: '存在', - isGreaterThan: '大于', - isGreaterThanOrEqualTo: '大于等于', - isIn: '在', - isLessThan: '小于', - isLessThanOrEqualTo: '小于或等于', - isLike: '就像', - isNotEqualTo: '不等于', - isNotIn: '不在', - near: '附近', - }, - upload: { - crop: '作物', - cropToolDescription: '拖动所选区域的角落,绘制一个新区域或调整以下的值。', - dragAndDrop: '拖放一个文件', - editImage: '编辑图像', - focalPoint: '焦点', - focalPointDescription: '直接在预览中拖动焦点或调整下面的值。', - height: '高度', - previewSizes: '预览尺寸', - selectCollectionToBrowse: '选择一个要浏览的集合', - selectFile: '选择一个文件', - setCropArea: '设置裁剪区域', - setFocalPoint: '设置焦点', - sizesFor: '{{label}}的尺寸', - width: '宽度', - }, - validation: { - fieldHasNo: '这个字段没有{{label}}', - limitReached: '已达限制,只能添加{{max}}个项目。', - required: '该字段为必填项目。', - requiresAtLeast: '该字段至少需要{{count}} {{label}}。', - }, - version: { - aboutToPublishSelection: '您即将发布所选内容中的所有 {{label}}。 你确定吗?', - aboutToRestore: '您将把这个{{label}}文档恢复到{{versionDate}}时的状态', - aboutToRestoreGlobal: '您要将全局的{{label}}恢复到{{versionDate}}时的状态', - aboutToRevertToPublished: '您将要把这个文档的内容还原到它的发布状态。您确定吗?', - aboutToUnpublish: '你即将取消发布这个文档。你确定吗?', - aboutToUnpublishSelection: '您即将取消发布所选内容中的所有 {{label}}。 你确定吗?', - autosave: '自动保存', - autosavedSuccessfully: '自动保存成功。', - changed: '已更改', - compareVersion: '对比版本:', - confirmPublish: '确认发布', - confirmRevertToSaved: '确认恢复到保存状态', - confirmUnpublish: '确认取消发布', - confirmVersionRestoration: '确认版本恢复', - draft: '草稿', - draftSavedSuccessfully: '草稿成功保存。', - lastSavedAgo: '上次保存{{distance}}之前', - noFurtherVersionsFound: '没有发现其他版本', - noRowsFound: '没有发现{{label}}', - preview: '预览', - problemRestoringVersion: '恢复这个版本时发生了问题', - publish: '发布', - publishChanges: '发布修改', - published: '已发布', - publishing: '发布', - restoreThisVersion: '恢复此版本', - restoredSuccessfully: '恢复成功。', - restoring: '恢复中...', - revertToPublished: '还原到已发布的版本', - saveDraft: '保存草稿', - selectLocales: '选择要显示的语言', - selectVersionToCompare: '选择要比较的版本', - showLocales: '显示语言:', - status: '状态', - type: '类型', - unpublish: '取消发布', - unpublishing: '取消发布中...', - version: '版本', - versionCreatedOn: '{{version}}创建于:', - versionID: '版本ID', - versions: '版本', - viewingVersion: '正在查看{{entityLabel}} {{documentTitle}}的版本', - viewingVersionGlobal: '正在查看全局{{entityLabel}}的版本', - viewingVersions: '正在查看{{entityLabel}} {{documentTitle}}的版本', - viewingVersionsGlobal: '正在查看全局{{entityLabel}}的版本', - }, -} diff --git a/packages/translations/src/all/index.ts b/packages/translations/src/all/index.ts deleted file mode 100644 index 0deeb35d53..0000000000 --- a/packages/translations/src/all/index.ts +++ /dev/null @@ -1,65 +0,0 @@ -import ar from './ar.js' -import az from './az.js' -import bg from './bg.js' -import cs from './cs.js' -import de from './de.js' -import en from './en.js' -import es from './es.js' -import fa from './fa.js' -import fr from './fr.js' -import hr from './hr.js' -import hu from './hu.js' -import it from './it.js' -import ja from './ja.js' -import ko from './ko.js' -import my from './my.js' -import nb from './nb.js' -import nl from './nl.js' -import pl from './pl.js' -import pt from './pt.js' -import ro from './ro.js' -import rs from './rs.js' -import rsLatin from './rs-latin.js' -import ru from './ru.js' -import sv from './sv.js' -import th from './th.js' -import tr from './tr.js' -import ua from './ua.js' -import vi from './vi.js' -import zh from './zh.js' -import zhTw from './zh-tw.js' - -export const translations = { - ar, - az, - bg, - cs, - de, - en, - es, - fa, - fr, - hr, - hu, - it, - ja, - ko, - my, - nb, - nl, - pl, - pt, - ro, - rs, - 'rs-latin': rsLatin, - ru, - sv, - th, - tr, - ua, - vi, - zh, - 'zh-tw': zhTw, -} as { - [locale: string]: Record> -} diff --git a/packages/translations/src/clientKeys.ts b/packages/translations/src/clientKeys.ts new file mode 100644 index 0000000000..7d82d2a054 --- /dev/null +++ b/packages/translations/src/clientKeys.ts @@ -0,0 +1,272 @@ +export const clientTranslationKeys = [ + 'authentication:account', + 'authentication:accountOfCurrentUser', + 'authentication:alreadyActivated', + 'authentication:alreadyLoggedIn', + 'authentication:backToLogin', + 'authentication:beginCreateFirstUser', + 'authentication:changePassword', + 'authentication:confirmGeneration', + 'authentication:confirmPassword', + 'authentication:createFirstUser', + 'authentication:emailNotValid', + 'authentication:emailSent', + 'authentication:enableAPIKey', + 'authentication:failedToUnlock', + 'authentication:forceUnlock', + 'authentication:forgotPassword', + 'authentication:forgotPasswordEmailInstructions', + 'authentication:forgotPasswordQuestion', + 'authentication:generate', + 'authentication:generateNewAPIKey', + 'authentication:logBackIn', + 'authentication:loggedOutInactivity', + 'authentication:loggedOutSuccessfully', + 'authentication:login', + 'authentication:logOut', + 'authentication:logout', + 'authentication:logoutUser', + 'authentication:newAPIKeyGenerated', + 'authentication:newPassword', + 'authentication:resetPassword', + 'authentication:stayLoggedIn', + 'authentication:successfullyUnlocked', + 'authentication:unableToVerify', + 'authentication:verified', + 'authentication:verifiedSuccessfully', + 'authentication:verify', + 'authentication:verifyUser', + 'authentication:youAreInactive', + + 'error:autosaving', + 'error:correctInvalidFields', + 'error:deletingTitle', + 'error:loadingDocument', + 'error:noMatchedField', + 'error:notAllowedToAccessPage', + 'error:previewing', + 'error:unableToDeleteCount', + 'error:unableToUpdateCount', + 'error:unauthorized', + 'error:unknown', + 'error:unspecific', + + 'fields:addLabel', + 'fields:addLink', + 'fields:addNew', + 'fields:addNewLabel', + 'fields:addRelationship', + 'fields:addUpload', + 'fields:block', + 'fields:blocks', + 'fields:blockType', + 'fields:chooseFromExisting', + 'fields:collapseAll', + 'fields:editLink', + 'fields:editRelationship', + 'fields:itemsAndMore', + 'fields:labelRelationship', + 'fields:latitude', + 'fields:linkedTo', + 'fields:longitude', + 'fields:passwordsDoNotMatch', + 'fields:removeRelationship', + 'fields:removeUpload', + 'fields:saveChanges', + 'fields:searchForBlock', + 'fields:selectFieldsToEdit', + 'fields:showAll', + 'fields:swapRelationship', + 'fields:swapUpload', + 'fields:toggleBlock', + 'fields:uploadNewLabel', + + 'general:aboutToDeleteCount', + 'general:aboutToDelete', + 'general:addBelow', + 'general:addFilter', + 'general:adminTheme', + 'general:and', + 'general:applyChanges', + 'general:ascending', + 'general:automatic', + 'general:backToDashboard', + 'general:cancel', + 'general:changesNotSaved', + 'general:close', + 'general:collapse', + 'general:collections', + 'general:columns', + 'general:columnToSort', + 'general:confirm', + 'general:confirmDeletion', + 'general:confirmDuplication', + 'general:copied', + 'general:copy', + 'general:create', + 'general:created', + 'general:createNew', + 'general:createNewLabel', + 'general:creating', + 'general:creatingNewLabel', + 'general:dark', + 'general:dashboard', + 'general:delete', + 'general:deletedCountSuccessfully', + 'general:deleting', + 'general:descending', + 'general:deselectAllRows', + 'general:duplicate', + 'general:duplicateWithoutSaving', + 'general:edit', + 'general:editing', + 'general:editingLabel', + 'general:editLabel', + 'general:email', + 'general:emailAddress', + 'general:enterAValue', + 'general:error', + 'general:errors', + 'general:fallbackToDefaultLocale', + 'general:filters', + 'general:filterWhere', + 'general:globals', + 'general:language', + 'general:lastModified', + 'general:leaveAnyway', + 'general:leaveWithoutSaving', + 'general:light', + 'general:livePreview', + 'general:loading', + 'general:locale', + 'general:menu', + 'general:moveDown', + 'general:moveUp', + 'general:noFiltersSet', + 'general:noLabel', + 'general:none', + 'general:noOptions', + 'general:noResults', + 'general:notFound', + 'general:nothingFound', + 'general:noValue', + 'general:of', + 'general:open', + 'general:or', + 'general:order', + 'general:pageNotFound', + 'general:password', + 'general:payloadSettings', + 'general:perPage', + 'general:remove', + 'general:reset', + 'general:row', + 'general:rows', + 'general:save', + 'general:saving', + 'general:searchBy', + 'general:selectAll', + 'general:selectAllRows', + 'general:selectedCount', + 'general:selectValue', + 'general:showAllLabel', + 'general:sorryNotFound', + 'general:sort', + 'general:sortByLabelDirection', + 'general:stayOnThisPage', + 'general:submissionSuccessful', + 'general:submit', + 'general:successfullyCreated', + 'general:successfullyDeleted', + 'general:thisLanguage', + 'general:titleDeleted', + 'general:users', + 'general:user', + 'general:unauthorized', + 'general:unsavedChangesDuplicate', + 'general:untitled', + 'general:updatedAt', + 'general:updatedCountSuccessfully', + 'general:updatedSuccessfully', + 'general:updating', + 'general:welcome', + + 'operators:equals', + 'operators:exists', + 'operators:isNotIn', + 'operators:isIn', + 'operators:contains', + 'operators:isLike', + 'operators:isNotEqualTo', + 'operators:near', + 'operators:isGreaterThan', + 'operators:isLessThan', + 'operators:isGreaterThanOrEqualTo', + 'operators:isLessThanOrEqualTo', + + 'upload:crop', + 'upload:cropToolDescription', + 'upload:dragAndDrop', + 'upload:editImage', + 'upload:focalPoint', + 'upload:focalPointDescription', + 'upload:height', + 'upload:previewSizes', + 'upload:selectCollectionToBrowse', + 'upload:selectFile', + 'upload:setCropArea', + 'upload:setFocalPoint', + 'upload:sizesFor', + 'upload:width', + + 'validation:fieldHasNo', + 'validation:limitReached', + 'validation:required', + 'validation:requiresAtLeast', + + 'version:aboutToPublishSelection', + 'version:aboutToRestore', + 'version:aboutToRestoreGlobal', + 'version:aboutToRevertToPublished', + 'version:aboutToUnpublish', + 'version:aboutToUnpublishSelection', + 'version:autosave', + 'version:autosavedSuccessfully', + 'version:changed', + 'version:confirmRevertToSaved', + 'version:compareVersion', + 'version:confirmPublish', + 'version:confirmUnpublish', + 'version:confirmVersionRestoration', + 'version:draft', + 'version:draftSavedSuccessfully', + 'version:lastSavedAgo', + 'version:noFurtherVersionsFound', + 'version:noRowsFound', + 'version:preview', + 'version:problemRestoringVersion', + 'version:publish', + 'version:publishChanges', + 'version:published', + 'version:publishing', + 'version:restoredSuccessfully', + 'version:restoreThisVersion', + 'version:restoring', + 'version:revertToPublished', + 'version:saveDraft', + 'version:selectLocales', + 'version:selectVersionToCompare', + 'version:showLocales', + 'version:status', + 'version:type', + 'version:unpublish', + 'version:unpublishing', + 'version:versionCreatedOn', + 'version:versionID', + 'version:version', + 'version:versions', + 'version:viewingVersion', + 'version:viewingVersionGlobal', + 'version:viewingVersions', + 'version:viewingVersionsGlobal', +] diff --git a/packages/translations/src/exports/all.ts b/packages/translations/src/exports/all.ts new file mode 100644 index 0000000000..86b6e37b53 --- /dev/null +++ b/packages/translations/src/exports/all.ts @@ -0,0 +1,65 @@ +import ar from '../languages/ar.js' +import az from '../languages/az.js' +import bg from '../languages/bg.js' +import cs from '../languages/cs.js' +import de from '../languages/de.js' +import en from '../languages/en.js' +import es from '../languages/es.js' +import fa from '../languages/fa.js' +import fr from '../languages/fr.js' +import hr from '../languages/hr.js' +import hu from '../languages/hu.js' +import it from '../languages/it.js' +import ja from '../languages/ja.js' +import ko from '../languages/ko.js' +import my from '../languages/my.js' +import nb from '../languages/nb.js' +import nl from '../languages/nl.js' +import pl from '../languages/pl.js' +import pt from '../languages/pt.js' +import ro from '../languages/ro.js' +import rs from '../languages/rs.js' +import rsLatin from '../languages/rsLatin.js' +import ru from '../languages/ru.js' +import sv from '../languages/sv.js' +import th from '../languages/th.js' +import tr from '../languages/tr.js' +import ua from '../languages/ua.js' +import vi from '../languages/vi.js' +import zh from '../languages/zh.js' +import zhTw from '../languages/zhTw.js' + +export const translations = { + ar, + az, + bg, + cs, + de, + en, + es, + fa, + fr, + hr, + hu, + it, + ja, + ko, + my, + nb, + nl, + pl, + pt, + ro, + rs, + 'rs-latin': rsLatin, + ru, + sv, + th, + tr, + ua, + vi, + zh, + 'zh-tw': zhTw, +} as { + [locale: string]: Record> +} diff --git a/packages/translations/src/all/ar.ts b/packages/translations/src/languages/ar.ts similarity index 100% rename from packages/translations/src/all/ar.ts rename to packages/translations/src/languages/ar.ts diff --git a/packages/translations/src/all/az.ts b/packages/translations/src/languages/az.ts similarity index 100% rename from packages/translations/src/all/az.ts rename to packages/translations/src/languages/az.ts diff --git a/packages/translations/src/all/bg.ts b/packages/translations/src/languages/bg.ts similarity index 100% rename from packages/translations/src/all/bg.ts rename to packages/translations/src/languages/bg.ts diff --git a/packages/translations/src/all/cs.ts b/packages/translations/src/languages/cs.ts similarity index 100% rename from packages/translations/src/all/cs.ts rename to packages/translations/src/languages/cs.ts diff --git a/packages/translations/src/all/de.ts b/packages/translations/src/languages/de.ts similarity index 100% rename from packages/translations/src/all/de.ts rename to packages/translations/src/languages/de.ts diff --git a/packages/translations/src/all/en.ts b/packages/translations/src/languages/en.ts similarity index 100% rename from packages/translations/src/all/en.ts rename to packages/translations/src/languages/en.ts diff --git a/packages/translations/src/all/es.ts b/packages/translations/src/languages/es.ts similarity index 100% rename from packages/translations/src/all/es.ts rename to packages/translations/src/languages/es.ts diff --git a/packages/translations/src/all/fa.ts b/packages/translations/src/languages/fa.ts similarity index 100% rename from packages/translations/src/all/fa.ts rename to packages/translations/src/languages/fa.ts diff --git a/packages/translations/src/all/fr.ts b/packages/translations/src/languages/fr.ts similarity index 100% rename from packages/translations/src/all/fr.ts rename to packages/translations/src/languages/fr.ts diff --git a/packages/translations/src/all/hr.ts b/packages/translations/src/languages/hr.ts similarity index 100% rename from packages/translations/src/all/hr.ts rename to packages/translations/src/languages/hr.ts diff --git a/packages/translations/src/all/hu.ts b/packages/translations/src/languages/hu.ts similarity index 100% rename from packages/translations/src/all/hu.ts rename to packages/translations/src/languages/hu.ts diff --git a/packages/translations/src/all/it.ts b/packages/translations/src/languages/it.ts similarity index 100% rename from packages/translations/src/all/it.ts rename to packages/translations/src/languages/it.ts diff --git a/packages/translations/src/all/ja.ts b/packages/translations/src/languages/ja.ts similarity index 100% rename from packages/translations/src/all/ja.ts rename to packages/translations/src/languages/ja.ts diff --git a/packages/translations/src/all/ko.ts b/packages/translations/src/languages/ko.ts similarity index 100% rename from packages/translations/src/all/ko.ts rename to packages/translations/src/languages/ko.ts diff --git a/packages/translations/src/all/my.ts b/packages/translations/src/languages/my.ts similarity index 100% rename from packages/translations/src/all/my.ts rename to packages/translations/src/languages/my.ts diff --git a/packages/translations/src/all/nb.ts b/packages/translations/src/languages/nb.ts similarity index 100% rename from packages/translations/src/all/nb.ts rename to packages/translations/src/languages/nb.ts diff --git a/packages/translations/src/all/nl.ts b/packages/translations/src/languages/nl.ts similarity index 100% rename from packages/translations/src/all/nl.ts rename to packages/translations/src/languages/nl.ts diff --git a/packages/translations/src/all/pl.ts b/packages/translations/src/languages/pl.ts similarity index 100% rename from packages/translations/src/all/pl.ts rename to packages/translations/src/languages/pl.ts diff --git a/packages/translations/src/all/pt.ts b/packages/translations/src/languages/pt.ts similarity index 100% rename from packages/translations/src/all/pt.ts rename to packages/translations/src/languages/pt.ts diff --git a/packages/translations/src/all/rn.sh b/packages/translations/src/languages/rn.sh similarity index 100% rename from packages/translations/src/all/rn.sh rename to packages/translations/src/languages/rn.sh diff --git a/packages/translations/src/all/ro.ts b/packages/translations/src/languages/ro.ts similarity index 100% rename from packages/translations/src/all/ro.ts rename to packages/translations/src/languages/ro.ts diff --git a/packages/translations/src/all/rs.ts b/packages/translations/src/languages/rs.ts similarity index 100% rename from packages/translations/src/all/rs.ts rename to packages/translations/src/languages/rs.ts diff --git a/packages/translations/src/all/rs-latin.ts b/packages/translations/src/languages/rsLatin.ts similarity index 100% rename from packages/translations/src/all/rs-latin.ts rename to packages/translations/src/languages/rsLatin.ts diff --git a/packages/translations/src/all/ru.ts b/packages/translations/src/languages/ru.ts similarity index 100% rename from packages/translations/src/all/ru.ts rename to packages/translations/src/languages/ru.ts diff --git a/packages/translations/src/all/sv.ts b/packages/translations/src/languages/sv.ts similarity index 100% rename from packages/translations/src/all/sv.ts rename to packages/translations/src/languages/sv.ts diff --git a/packages/translations/src/all/th.ts b/packages/translations/src/languages/th.ts similarity index 100% rename from packages/translations/src/all/th.ts rename to packages/translations/src/languages/th.ts diff --git a/packages/translations/src/all/tr.ts b/packages/translations/src/languages/tr.ts similarity index 100% rename from packages/translations/src/all/tr.ts rename to packages/translations/src/languages/tr.ts diff --git a/packages/translations/src/all/ua.ts b/packages/translations/src/languages/ua.ts similarity index 100% rename from packages/translations/src/all/ua.ts rename to packages/translations/src/languages/ua.ts diff --git a/packages/translations/src/all/vi.ts b/packages/translations/src/languages/vi.ts similarity index 100% rename from packages/translations/src/all/vi.ts rename to packages/translations/src/languages/vi.ts diff --git a/packages/translations/src/all/zh.ts b/packages/translations/src/languages/zh.ts similarity index 100% rename from packages/translations/src/all/zh.ts rename to packages/translations/src/languages/zh.ts diff --git a/packages/translations/src/all/zh-tw.ts b/packages/translations/src/languages/zhTw.ts similarity index 100% rename from packages/translations/src/all/zh-tw.ts rename to packages/translations/src/languages/zhTw.ts diff --git a/packages/translations/src/types.ts b/packages/translations/src/types.ts index 202fadb214..bec2c9214b 100644 --- a/packages/translations/src/types.ts +++ b/packages/translations/src/types.ts @@ -16,7 +16,7 @@ export type I18n = { /** The language of the request */ language: string /** Translate function */ - t: (key: string, options?: Record) => string + t: TFunction translations: Translations } @@ -35,7 +35,7 @@ export type I18nOptions = { export type InitTFunction = (args: { config: I18nOptions language?: string - translations?: Translations + translations: Translations }) => { t: TFunction translations: Translations @@ -45,5 +45,4 @@ export type InitI18n = (args: { config: I18nOptions context: 'api' | 'client' language?: string - translations: Translations -}) => I18n +}) => Promise diff --git a/packages/translations/src/utilities/dynamicImport.ts b/packages/translations/src/utilities/dynamicImport.ts new file mode 100644 index 0000000000..222e478099 --- /dev/null +++ b/packages/translations/src/utilities/dynamicImport.ts @@ -0,0 +1,174 @@ +import type { Translations } from '../types.js' + +import { clientTranslationKeys } from '../clientKeys.js' + +function filterKeys(obj, parentGroupKey = '', keys) { + const result = {} + + for (const [namespaceKey, value] of Object.entries(obj)) { + // Skip $schema key + if (namespaceKey === '$schema') { + result[namespaceKey] = value + continue + } + + if (typeof value === 'object') { + const filteredObject = filterKeys(value, namespaceKey, keys) + if (Object.keys(filteredObject).length > 0) { + result[namespaceKey] = filteredObject + } + } else { + for (const key of keys) { + const [groupKey, selector] = key.split(':') + + if (parentGroupKey === groupKey) { + if (namespaceKey === selector) { + result[selector] = value + } else { + const pluralKeys = ['zero', 'one', 'two', 'few', 'many', 'other'] + pluralKeys.forEach((pluralKey) => { + if (namespaceKey === `${selector}_${pluralKey}`) { + result[`${selector}_${pluralKey}`] = value + } + }) + } + } + } + } + } + + return result +} + +function sortObject(obj) { + const sortedObject = {} + Object.keys(obj) + .sort() + .forEach((key) => { + if (typeof obj[key] === 'object') { + sortedObject[key] = sortObject(obj[key]) + } else { + sortedObject[key] = obj[key] + } + }) + return sortedObject +} + +export const dynamicallyImportLanguages = async ( + supportedLanguages: string[], + context: 'api' | 'client', +) => { + const languages: Translations = {} + + await Promise.all( + supportedLanguages.map(async (supportedLanguage) => { + let imported + switch (supportedLanguage) { + case 'ar': + imported = await import(`@payloadcms/translations/languages/ar`) + break + case 'az': + imported = await import(`@payloadcms/translations/languages/az`) + break + case 'bg': + imported = await import(`@payloadcms/translations/languages/bg`) + break + case 'cs': + imported = await import(`@payloadcms/translations/languages/cs`) + break + case 'de': + imported = await import(`@payloadcms/translations/languages/de`) + break + case 'en': + imported = await import(`@payloadcms/translations/languages/en`) + break + case 'es': + imported = await import(`@payloadcms/translations/languages/es`) + break + case 'fa': + imported = await import(`@payloadcms/translations/languages/fa`) + break + case 'fr': + imported = await import(`@payloadcms/translations/languages/fr`) + break + case 'hr': + imported = await import(`@payloadcms/translations/languages/hr`) + break + case 'hu': + imported = await import(`@payloadcms/translations/languages/hu`) + break + case 'it': + imported = await import(`@payloadcms/translations/languages/it`) + break + case 'ja': + imported = await import(`@payloadcms/translations/languages/ja`) + break + case 'ko': + imported = await import(`@payloadcms/translations/languages/ko`) + break + case 'my': + imported = await import(`@payloadcms/translations/languages/my`) + break + case 'nb': + imported = await import(`@payloadcms/translations/languages/nb`) + break + case 'nl': + imported = await import(`@payloadcms/translations/languages/nl`) + break + case 'pl': + imported = await import(`@payloadcms/translations/languages/pl`) + break + case 'pt': + imported = await import(`@payloadcms/translations/languages/pt`) + break + case 'ro': + imported = await import(`@payloadcms/translations/languages/ro`) + break + case 'rs': + imported = await import(`@payloadcms/translations/languages/rs`) + break + case 'rsLatin': + imported = await import(`@payloadcms/translations/languages/rsLatin`) + break + case 'ru': + imported = await import(`@payloadcms/translations/languages/ru`) + break + case 'sv': + imported = await import(`@payloadcms/translations/languages/sv`) + break + case 'th': + imported = await import(`@payloadcms/translations/languages/th`) + break + case 'tr': + imported = await import(`@payloadcms/translations/languages/tr`) + break + case 'ua': + imported = await import(`@payloadcms/translations/languages/ua`) + break + case 'vi': + imported = await import(`@payloadcms/translations/languages/vi`) + break + case 'zh': + imported = await import(`@payloadcms/translations/languages/zh`) + break + case 'zhTw': + imported = await import(`@payloadcms/translations/languages/zhTw`) + break + } + + if (imported) { + if (context === 'client') { + const clientTranslations = sortObject( + filterKeys(imported.default, '', clientTranslationKeys), + ) + + languages[supportedLanguage] = clientTranslations + } else { + languages[supportedLanguage] = imported.default + } + } + }), + ) + + return languages +} diff --git a/packages/translations/src/utilities/getTranslation.ts b/packages/translations/src/utilities/getTranslation.ts index 98d6aa2662..8e6b96cbe5 100644 --- a/packages/translations/src/utilities/getTranslation.ts +++ b/packages/translations/src/utilities/getTranslation.ts @@ -1,12 +1,16 @@ import type { JSX } from 'react' -import type { I18n } from '../types.js' +import type { I18n, TFunction } from '../types.js' -type LabelType = JSX.Element | Record | string +type LabelType = + | (({ t }: { t: TFunction }) => string) + | JSX.Element + | Record + | string export const getTranslation = ( label: T, - i18n: Pick, + i18n: Pick, ): T extends JSX.Element ? JSX.Element : string => { // If it's a Record, look for translation. If string or React Element, pass through if (typeof label === 'object' && !Object.prototype.hasOwnProperty.call(label, '$$typeof')) { @@ -25,6 +29,10 @@ export const getTranslation = ( return fallbackLang && label[fallbackLang] ? fallbackLang : label[Object.keys(label)[0]] } + if (typeof label === 'function') { + return label({ t: i18n.t }) as unknown as T extends JSX.Element ? JSX.Element : string + } + // If it's a React Element or string, then we should just pass it through return label as unknown as T extends JSX.Element ? JSX.Element : string } diff --git a/packages/translations/src/utilities/init.ts b/packages/translations/src/utilities/init.ts index b6e0f9b775..8476a313ac 100644 --- a/packages/translations/src/utilities/init.ts +++ b/packages/translations/src/utilities/init.ts @@ -1,6 +1,7 @@ import type { I18n, InitI18n, InitTFunction, Translations } from '../types.js' import { deepMerge } from './deepMerge.js' +import { dynamicallyImportLanguages } from './dynamicImport.js' /** * @function getTranslationString @@ -146,7 +147,7 @@ function parseAcceptLanguage(header: string): LanguagePreference[] { .sort((a, b) => b.quality - a.quality) // Sort by quality, highest to lowest } -const acceptedLanguages = [ +export const acceptedLanguages = [ 'ar', 'az', 'bg', @@ -210,14 +211,14 @@ const initTFunction: InitTFunction = (args) => { } } -function memoize(fn: Function, keys: string[]) { +function memoize(fn: (args: unknown) => Promise, keys: string[]) { const cacheMap = new Map() - const memoized = (args) => { + const memoized = async (args) => { const cacheKey = keys.reduce((acc, key) => acc + args[key], '') if (!cacheMap.has(cacheKey)) { - const result = fn(args) + const result = await fn(args) cacheMap.set(cacheKey, result) } @@ -228,11 +229,13 @@ function memoize(fn: Function, keys: string[]) { } export const initI18n: InitI18n = memoize( - ({ config, language = 'en', translations: incomingTranslations }: Parameters[0]) => { + async ({ config, context, language = 'en' }: Parameters[0]) => { + const languages = await dynamicallyImportLanguages(config.supportedLanguages, context) + const { t, translations } = initTFunction({ config, language: language || config.fallbackLanguage, - translations: incomingTranslations, + translations: languages, }) const i18n: I18n = { diff --git a/packages/translations/tsconfig.json b/packages/translations/tsconfig.json index 145f5f5566..9885eb76a4 100644 --- a/packages/translations/tsconfig.json +++ b/packages/translations/tsconfig.json @@ -12,5 +12,4 @@ "emitDeclarationOnly": false }, "include": ["src/**/*.ts", "src/**/*.js"], - "exclude": ["src/all"] } diff --git a/packages/ui/src/elements/StepNav/index.tsx b/packages/ui/src/elements/StepNav/index.tsx index f4d8794abf..645fbee4d4 100644 --- a/packages/ui/src/elements/StepNav/index.tsx +++ b/packages/ui/src/elements/StepNav/index.tsx @@ -1,4 +1,6 @@ 'use client' +import type { LabelFunction } from 'payload/config' + import { getTranslation } from '@payloadcms/translations' import React, { Fragment, createContext, useContext, useState } from 'react' @@ -10,7 +12,7 @@ import './index.scss' export { SetStepNav } from './SetStepNav.js' export type StepNavItem = { - label: Record | string + label: LabelFunction | Record | string url?: string } diff --git a/packages/ui/src/providers/ComponentMap/buildComponentMap/collections.tsx b/packages/ui/src/providers/ComponentMap/buildComponentMap/collections.tsx index be6a71a86c..b06caeaa68 100644 --- a/packages/ui/src/providers/ComponentMap/buildComponentMap/collections.tsx +++ b/packages/ui/src/providers/ComponentMap/buildComponentMap/collections.tsx @@ -1,3 +1,4 @@ +import type { I18n } from '@payloadcms/translations' import type { ViewDescriptionProps } from '@payloadcms/ui/elements/ViewDescription' import type { AdminViewProps, @@ -22,12 +23,14 @@ export const mapCollections = ({ DefaultListView, collections, config, + i18n, readOnly: readOnlyOverride, }: { DefaultEditView: React.FC DefaultListView: React.FC collections: SanitizedCollectionConfig[] config: SanitizedConfig + i18n: I18n readOnly?: boolean }): { [key: SanitizedCollectionConfig['slug']]: CollectionComponentMap @@ -152,6 +155,7 @@ export const mapCollections = ({ fieldMap: mapFields({ config, fieldSchema: fields, + i18n, readOnly: readOnlyOverride, }), isPreviewEnabled: !!collectionConfig?.admin?.preview, diff --git a/packages/ui/src/providers/ComponentMap/buildComponentMap/fields.tsx b/packages/ui/src/providers/ComponentMap/buildComponentMap/fields.tsx index 5bd1765461..1aa5c5f65a 100644 --- a/packages/ui/src/providers/ComponentMap/buildComponentMap/fields.tsx +++ b/packages/ui/src/providers/ComponentMap/buildComponentMap/fields.tsx @@ -1,3 +1,4 @@ +import type { I18n } from '@payloadcms/translations' import type { CellComponentProps, DescriptionComponent, @@ -7,6 +8,7 @@ import type { FieldDescriptionProps, FieldWithPath, LabelProps, + Option, RowLabelComponent, SanitizedConfig, } from 'payload/types' @@ -55,6 +57,7 @@ export const mapFields = (args: { disableAddingID?: boolean fieldSchema: FieldWithPath[] filter?: (field: Field) => boolean + i18n: I18n parentPath?: string readOnly?: boolean }): FieldMap => { @@ -63,6 +66,8 @@ export const mapFields = (args: { disableAddingID, fieldSchema, filter, + i18n, + i18n: { t }, parentPath, readOnly: readOnlyOverride, } = args @@ -145,7 +150,7 @@ export const mapFields = (args: { field.admin.description) || (typeof field.admin?.description === 'function' && isPlainFunction(field.admin?.description) && - field.admin?.description()))) || + field.admin?.description({ t })))) || undefined, } @@ -194,6 +199,19 @@ export const mapFields = (args: { let fieldComponentProps: FieldComponentProps + let fieldOptions: Option[] + + if ('options' in field) { + fieldOptions = field.options.map((option) => { + if (typeof option === 'object' && typeof option.label === 'function') { + return { + label: option.label({ t: i18n.t }), + value: option.value, + } + } + }) + } + const cellComponentProps: CellComponentProps = { name: 'name' in field ? field.name : undefined, fieldType: field.type, @@ -203,7 +221,7 @@ export const mapFields = (args: { ? field.label : undefined, labels: 'labels' in field ? field.labels : undefined, - options: 'options' in field ? field.options : undefined, + options: 'options' in field ? fieldOptions : undefined, relationTo: 'relationTo' in field ? field.relationTo : undefined, } @@ -232,6 +250,7 @@ export const mapFields = (args: { config, fieldSchema: field.fields, filter, + i18n, parentPath: path, readOnly: readOnlyOverride, }), @@ -254,6 +273,7 @@ export const mapFields = (args: { config, fieldSchema: block.fields, filter, + i18n, parentPath: `${path}.${block.slug}`, readOnly: readOnlyOverride, }) @@ -346,6 +366,7 @@ export const mapFields = (args: { disableAddingID: true, fieldSchema: field.fields, filter, + i18n, parentPath: path, readOnly: readOnlyOverride, }), @@ -407,6 +428,7 @@ export const mapFields = (args: { disableAddingID: true, fieldSchema: field.fields, filter, + i18n, parentPath: path, readOnly: readOnlyOverride, }), @@ -501,14 +523,14 @@ export const mapFields = (args: { className: field.admin?.className, disabled: field.admin?.disabled, label: field.label, - options: field.options, + options: fieldOptions, readOnly: field.admin?.readOnly, required: field.required, style: field.admin?.style, width: field.admin?.width, } - cellComponentProps.options = field.options + cellComponentProps.options = fieldOptions fieldComponentProps = radioField break } @@ -529,7 +551,7 @@ export const mapFields = (args: { const RichTextCellComponent = field.editor.CellComponent if (typeof field.editor.generateComponentMap === 'function') { - const result = field.editor.generateComponentMap({ config, schemaPath: path }) + const result = field.editor.generateComponentMap({ config, i18n, schemaPath: path }) richTextField.richTextComponentMap = result cellComponentProps.richTextComponentMap = result } @@ -556,6 +578,7 @@ export const mapFields = (args: { disableAddingID: true, fieldSchema: field.fields, filter, + i18n, parentPath: path, readOnly: readOnlyOverride, }), @@ -576,6 +599,7 @@ export const mapFields = (args: { disableAddingID: true, fieldSchema: tab.fields, filter, + i18n, parentPath: path, readOnly: readOnlyOverride, }) @@ -676,14 +700,14 @@ export const mapFields = (args: { hasMany: field.hasMany, isClearable: field.admin?.isClearable, label: field.label, - options: field.options, + options: fieldOptions, readOnly: field.admin?.readOnly, required: field.required, style: field.admin?.style, width: field.admin?.width, } - cellComponentProps.options = field.options + cellComponentProps.options = fieldOptions fieldComponentProps = selectField break } diff --git a/packages/ui/src/providers/ComponentMap/buildComponentMap/globals.tsx b/packages/ui/src/providers/ComponentMap/buildComponentMap/globals.tsx index 544c6b3f3b..1a78700e05 100644 --- a/packages/ui/src/providers/ComponentMap/buildComponentMap/globals.tsx +++ b/packages/ui/src/providers/ComponentMap/buildComponentMap/globals.tsx @@ -1,3 +1,4 @@ +import type { I18n } from '@payloadcms/translations' import type { EditViewProps, EntityDescriptionComponent, @@ -19,11 +20,13 @@ export const mapGlobals = ({ DefaultEditView, config, globals, + i18n, readOnly: readOnlyOverride, }: { DefaultEditView: React.FC config: SanitizedConfig globals: SanitizedGlobalConfig[] + i18n: I18n readOnly?: boolean }): { [key: SanitizedGlobalConfig['slug']]: GlobalComponentMap @@ -97,6 +100,7 @@ export const mapGlobals = ({ fieldMap: mapFields({ config, fieldSchema: fields, + i18n, readOnly: readOnlyOverride, }), isPreviewEnabled: !!globalConfig?.admin?.preview, diff --git a/packages/ui/src/providers/ComponentMap/buildComponentMap/index.tsx b/packages/ui/src/providers/ComponentMap/buildComponentMap/index.tsx index f9f669aa63..954a8c2b87 100644 --- a/packages/ui/src/providers/ComponentMap/buildComponentMap/index.tsx +++ b/packages/ui/src/providers/ComponentMap/buildComponentMap/index.tsx @@ -1,3 +1,4 @@ +import type { I18n } from '@payloadcms/translations' import type { AdminViewProps, EditViewProps, SanitizedConfig } from 'payload/types' import React from 'react' @@ -12,18 +13,20 @@ export const buildComponentMap = (args: { DefaultListView: React.FC children: React.ReactNode config: SanitizedConfig + i18n: I18n readOnly?: boolean }): { componentMap: ComponentMap wrappedChildren: React.ReactNode } => { - const { DefaultEditView, DefaultListView, children, config, readOnly } = args + const { DefaultEditView, DefaultListView, children, config, i18n, readOnly } = args const collections = mapCollections({ DefaultEditView, DefaultListView, collections: config.collections, config, + i18n, readOnly, }) @@ -31,6 +34,7 @@ export const buildComponentMap = (args: { DefaultEditView, config, globals: config.globals, + i18n, readOnly, }) diff --git a/test/_community/collections/Posts/index.ts b/test/_community/collections/Posts/index.ts index 1284ab8a27..46c29853bb 100644 --- a/test/_community/collections/Posts/index.ts +++ b/test/_community/collections/Posts/index.ts @@ -14,19 +14,19 @@ export const PostsCollection: CollectionConfig = { name: 'text', type: 'text', }, - { - type: 'row', - fields: [], - }, - { - name: 'associatedMedia', - type: 'upload', - access: { - create: () => true, - update: () => false, - }, - relationTo: mediaSlug, - }, + // { + // type: 'row', + // fields: [], + // }, + // { + // name: 'associatedMedia', + // type: 'upload', + // access: { + // create: () => true, + // update: () => false, + // }, + // relationTo: mediaSlug, + // }, ], versions: { drafts: true, diff --git a/test/_community/config.ts b/test/_community/config.ts index 5f1e814f86..b7195870ee 100644 --- a/test/_community/config.ts +++ b/test/_community/config.ts @@ -12,11 +12,14 @@ const dirname = path.dirname(filename) export default buildConfigWithDefaults({ // ...extend config here - collections: [PostsCollection, MediaCollection], - globals: [ - MenuGlobal, - // ...add more globals here + collections: [ + PostsCollection, + // MediaCollection ], + // globals: [ + // MenuGlobal, + // // ...add more globals here + // ], onInit: async (payload) => { await payload.create({ collection: 'users', @@ -33,14 +36,14 @@ export default buildConfigWithDefaults({ }, }) - // Create image - const imageFilePath = path.resolve(dirname, '../uploads/image.png') - const imageFile = await getFileByPath(imageFilePath) + // // Create image + // const imageFilePath = path.resolve(dirname, '../uploads/image.png') + // const imageFile = await getFileByPath(imageFilePath) - await payload.create({ - collection: 'media', - data: {}, - file: imageFile, - }) + // await payload.create({ + // collection: 'media', + // data: {}, + // file: imageFile, + // }) }, }) diff --git a/tsconfig.json b/tsconfig.json index cba3267bb8..5148312920 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -37,7 +37,7 @@ ], "paths": { "@payload-config": [ - "./test/admin/config.ts" + "./test/_community/config.ts" ], "@payloadcms/live-preview": [ "./packages/live-preview/src" @@ -161,4 +161,4 @@ ".next/types/**/*.ts", "scripts/**/*.ts" ] -} \ No newline at end of file +} From 53d9c4ca9547b2bb13c0f8511c54758bd57de3cc Mon Sep 17 00:00:00 2001 From: James Date: Mon, 8 Apr 2024 16:25:24 -0400 Subject: [PATCH 002/177] chore: dynamically loads translations --- .../field/features/link/plugins/floatingLinkEditor/utilities.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/richtext-lexical/src/field/features/link/plugins/floatingLinkEditor/utilities.ts b/packages/richtext-lexical/src/field/features/link/plugins/floatingLinkEditor/utilities.ts index 1ae0803a34..b7d93c2b05 100644 --- a/packages/richtext-lexical/src/field/features/link/plugins/floatingLinkEditor/utilities.ts +++ b/packages/richtext-lexical/src/field/features/link/plugins/floatingLinkEditor/utilities.ts @@ -7,6 +7,7 @@ import { getBaseFields } from '../../drawer/baseFields.js' /** * This function is run to enrich the basefields which every link has with potential, custom user-added fields. */ +// eslint-disable-next-line @typescript-eslint/require-await export async function transformExtraFields( customFieldSchema: | ((args: { config: SanitizedConfig; defaultFields: Field[]; i18n: I18n }) => Field[]) From be2134eb699e181282052568c53523b8eb5ee7d8 Mon Sep 17 00:00:00 2001 From: James Date: Mon, 8 Apr 2024 16:38:12 -0400 Subject: [PATCH 003/177] chore: requires languages to be passed to config --- packages/next/src/layouts/Root/index.tsx | 2 +- .../src/utilities/createPayloadRequest.ts | 2 +- packages/next/src/utilities/getNextI18n.ts | 4 +- packages/next/src/utilities/initPage.ts | 2 +- .../src/views/Document/getMetaBySegment.tsx | 2 +- packages/next/src/views/NotFound/index.tsx | 2 +- packages/next/src/views/Root/meta.ts | 2 +- packages/payload/src/config/sanitize.ts | 5 +- .../src/field/features/link/feature.server.ts | 2 +- .../richtext-slate/src/generateSchemaMap.ts | 4 +- packages/translations/src/types.ts | 4 +- .../src/utilities/dynamicImport.ts | 174 ------------------ packages/translations/src/utilities/init.ts | 12 +- .../src/utilities/reduceLanguages.ts | 71 +++++++ 14 files changed, 94 insertions(+), 194 deletions(-) delete mode 100644 packages/translations/src/utilities/dynamicImport.ts create mode 100644 packages/translations/src/utilities/reduceLanguages.ts diff --git a/packages/next/src/layouts/Root/index.tsx b/packages/next/src/layouts/Root/index.tsx index 0ca44eea13..f837470a48 100644 --- a/packages/next/src/layouts/Root/index.tsx +++ b/packages/next/src/layouts/Root/index.tsx @@ -40,7 +40,7 @@ export const RootLayout = async ({ headers, }) ?? config.i18n.fallbackLanguage - const i18n = await initI18n({ config: config.i18n, context: 'client', language: lang }) + const i18n = initI18n({ config: config.i18n, context: 'client', language: lang }) const clientConfig = await createClientConfig({ config, t: i18n.t }) const dir = rtlLanguages.includes(lang) ? 'RTL' : 'LTR' diff --git a/packages/next/src/utilities/createPayloadRequest.ts b/packages/next/src/utilities/createPayloadRequest.ts index 72ec72bfcd..af23366ca4 100644 --- a/packages/next/src/utilities/createPayloadRequest.ts +++ b/packages/next/src/utilities/createPayloadRequest.ts @@ -71,7 +71,7 @@ export const createPayloadRequest = async ({ headers: request.headers, }) - const i18n = await initI18n({ + const i18n = initI18n({ config: config.i18n, context: 'api', language, diff --git a/packages/next/src/utilities/getNextI18n.ts b/packages/next/src/utilities/getNextI18n.ts index 82c488c644..77f9a9723a 100644 --- a/packages/next/src/utilities/getNextI18n.ts +++ b/packages/next/src/utilities/getNextI18n.ts @@ -6,13 +6,13 @@ import { cookies, headers } from 'next/headers.js' import { getRequestLanguage } from './getRequestLanguage.js' -export const getNextI18n = async ({ +export const getNextI18n = ({ config, language, }: { config: SanitizedConfig language?: string -}): Promise => +}): I18n => initI18n({ config: config.i18n, context: 'client', diff --git a/packages/next/src/utilities/initPage.ts b/packages/next/src/utilities/initPage.ts index efcededc71..8042718c2c 100644 --- a/packages/next/src/utilities/initPage.ts +++ b/packages/next/src/utilities/initPage.ts @@ -44,7 +44,7 @@ export const initPage = async ({ const cookies = parseCookies(headers) const language = getRequestLanguage({ config: payload.config, cookies, headers }) - const i18n = await initI18n({ + const i18n = initI18n({ config: payload.config.i18n, context: 'client', language, diff --git a/packages/next/src/views/Document/getMetaBySegment.tsx b/packages/next/src/views/Document/getMetaBySegment.tsx index dde140b5f8..9a6701ca67 100644 --- a/packages/next/src/views/Document/getMetaBySegment.tsx +++ b/packages/next/src/views/Document/getMetaBySegment.tsx @@ -89,7 +89,7 @@ export const getMetaBySegment: GenerateEditViewMetadata = async ({ } } - const i18n = await getNextI18n({ + const i18n = getNextI18n({ config, }) diff --git a/packages/next/src/views/NotFound/index.tsx b/packages/next/src/views/NotFound/index.tsx index deed65366f..fa85e05002 100644 --- a/packages/next/src/views/NotFound/index.tsx +++ b/packages/next/src/views/NotFound/index.tsx @@ -19,7 +19,7 @@ export const generatePageMetadata = async ({ }): Promise => { const config = await configPromise - const i18n = await getNextI18n({ + const i18n = getNextI18n({ config, }) diff --git a/packages/next/src/views/Root/meta.ts b/packages/next/src/views/Root/meta.ts index dbbed934d6..0edcfd5319 100644 --- a/packages/next/src/views/Root/meta.ts +++ b/packages/next/src/views/Root/meta.ts @@ -49,7 +49,7 @@ export const generatePageMetadata = async ({ config: configPromise, params }: Ar const isGlobal = segmentOne === 'globals' const isCollection = segmentOne === 'collections' - const i18n = await getNextI18n({ + const i18n = getNextI18n({ config, }) diff --git a/packages/payload/src/config/sanitize.ts b/packages/payload/src/config/sanitize.ts index 57fb523112..77d350befc 100644 --- a/packages/payload/src/config/sanitize.ts +++ b/packages/payload/src/config/sanitize.ts @@ -1,3 +1,4 @@ +import en from '@payloadcms/translations/languages/en' import merge from 'deepmerge' import type { @@ -86,7 +87,9 @@ export const sanitizeConfig = (incomingConfig: Config): SanitizedConfig => { config.i18n = { fallbackLanguage: 'en', - supportedLanguages: ['en'], + supportedLanguages: { + en, + }, translations: {}, ...(incomingConfig?.i18n ?? {}), } diff --git a/packages/richtext-lexical/src/field/features/link/feature.server.ts b/packages/richtext-lexical/src/field/features/link/feature.server.ts index ce5ad9b456..b6ac76ddfc 100644 --- a/packages/richtext-lexical/src/field/features/link/feature.server.ts +++ b/packages/richtext-lexical/src/field/features/link/feature.server.ts @@ -67,7 +67,7 @@ export const LinkFeature: FeatureProviderProviderServer { - const i18n = await initI18n({ config: config.i18n, context: 'client' }) + const i18n = initI18n({ config: config.i18n, context: 'client' }) return { fields: await transformExtraFields( diff --git a/packages/richtext-slate/src/generateSchemaMap.ts b/packages/richtext-slate/src/generateSchemaMap.ts index ff2387f61f..c00932e44d 100644 --- a/packages/richtext-slate/src/generateSchemaMap.ts +++ b/packages/richtext-slate/src/generateSchemaMap.ts @@ -12,8 +12,8 @@ import { uploadFieldsSchemaPath } from './field/elements/upload/shared.js' export const getGenerateSchemaMap = (args: AdapterArguments): RichTextAdapter['generateSchemaMap'] => - async ({ config, schemaMap, schemaPath }) => { - const i18n = await initI18n({ config: config.i18n, context: 'client' }) + ({ config, schemaMap, schemaPath }) => { + const i18n = initI18n({ config: config.i18n, context: 'client' }) const validRelationships = config.collections.map((c) => c.slug) || [] ;(args?.admin?.elements || Object.values(elementTypes)).forEach((el) => { diff --git a/packages/translations/src/types.ts b/packages/translations/src/types.ts index bec2c9214b..40be0d66d0 100644 --- a/packages/translations/src/types.ts +++ b/packages/translations/src/types.ts @@ -22,7 +22,7 @@ export type I18n = { export type I18nOptions = { fallbackLanguage?: string - supportedLanguages?: string[] + supportedLanguages?: Translations translations?: { [language: string]: | { @@ -45,4 +45,4 @@ export type InitI18n = (args: { config: I18nOptions context: 'api' | 'client' language?: string -}) => Promise +}) => I18n diff --git a/packages/translations/src/utilities/dynamicImport.ts b/packages/translations/src/utilities/dynamicImport.ts deleted file mode 100644 index 222e478099..0000000000 --- a/packages/translations/src/utilities/dynamicImport.ts +++ /dev/null @@ -1,174 +0,0 @@ -import type { Translations } from '../types.js' - -import { clientTranslationKeys } from '../clientKeys.js' - -function filterKeys(obj, parentGroupKey = '', keys) { - const result = {} - - for (const [namespaceKey, value] of Object.entries(obj)) { - // Skip $schema key - if (namespaceKey === '$schema') { - result[namespaceKey] = value - continue - } - - if (typeof value === 'object') { - const filteredObject = filterKeys(value, namespaceKey, keys) - if (Object.keys(filteredObject).length > 0) { - result[namespaceKey] = filteredObject - } - } else { - for (const key of keys) { - const [groupKey, selector] = key.split(':') - - if (parentGroupKey === groupKey) { - if (namespaceKey === selector) { - result[selector] = value - } else { - const pluralKeys = ['zero', 'one', 'two', 'few', 'many', 'other'] - pluralKeys.forEach((pluralKey) => { - if (namespaceKey === `${selector}_${pluralKey}`) { - result[`${selector}_${pluralKey}`] = value - } - }) - } - } - } - } - } - - return result -} - -function sortObject(obj) { - const sortedObject = {} - Object.keys(obj) - .sort() - .forEach((key) => { - if (typeof obj[key] === 'object') { - sortedObject[key] = sortObject(obj[key]) - } else { - sortedObject[key] = obj[key] - } - }) - return sortedObject -} - -export const dynamicallyImportLanguages = async ( - supportedLanguages: string[], - context: 'api' | 'client', -) => { - const languages: Translations = {} - - await Promise.all( - supportedLanguages.map(async (supportedLanguage) => { - let imported - switch (supportedLanguage) { - case 'ar': - imported = await import(`@payloadcms/translations/languages/ar`) - break - case 'az': - imported = await import(`@payloadcms/translations/languages/az`) - break - case 'bg': - imported = await import(`@payloadcms/translations/languages/bg`) - break - case 'cs': - imported = await import(`@payloadcms/translations/languages/cs`) - break - case 'de': - imported = await import(`@payloadcms/translations/languages/de`) - break - case 'en': - imported = await import(`@payloadcms/translations/languages/en`) - break - case 'es': - imported = await import(`@payloadcms/translations/languages/es`) - break - case 'fa': - imported = await import(`@payloadcms/translations/languages/fa`) - break - case 'fr': - imported = await import(`@payloadcms/translations/languages/fr`) - break - case 'hr': - imported = await import(`@payloadcms/translations/languages/hr`) - break - case 'hu': - imported = await import(`@payloadcms/translations/languages/hu`) - break - case 'it': - imported = await import(`@payloadcms/translations/languages/it`) - break - case 'ja': - imported = await import(`@payloadcms/translations/languages/ja`) - break - case 'ko': - imported = await import(`@payloadcms/translations/languages/ko`) - break - case 'my': - imported = await import(`@payloadcms/translations/languages/my`) - break - case 'nb': - imported = await import(`@payloadcms/translations/languages/nb`) - break - case 'nl': - imported = await import(`@payloadcms/translations/languages/nl`) - break - case 'pl': - imported = await import(`@payloadcms/translations/languages/pl`) - break - case 'pt': - imported = await import(`@payloadcms/translations/languages/pt`) - break - case 'ro': - imported = await import(`@payloadcms/translations/languages/ro`) - break - case 'rs': - imported = await import(`@payloadcms/translations/languages/rs`) - break - case 'rsLatin': - imported = await import(`@payloadcms/translations/languages/rsLatin`) - break - case 'ru': - imported = await import(`@payloadcms/translations/languages/ru`) - break - case 'sv': - imported = await import(`@payloadcms/translations/languages/sv`) - break - case 'th': - imported = await import(`@payloadcms/translations/languages/th`) - break - case 'tr': - imported = await import(`@payloadcms/translations/languages/tr`) - break - case 'ua': - imported = await import(`@payloadcms/translations/languages/ua`) - break - case 'vi': - imported = await import(`@payloadcms/translations/languages/vi`) - break - case 'zh': - imported = await import(`@payloadcms/translations/languages/zh`) - break - case 'zhTw': - imported = await import(`@payloadcms/translations/languages/zhTw`) - break - } - - if (imported) { - if (context === 'client') { - const clientTranslations = sortObject( - filterKeys(imported.default, '', clientTranslationKeys), - ) - - languages[supportedLanguage] = clientTranslations - } else { - languages[supportedLanguage] = imported.default - } - } - }), - ) - - return languages -} diff --git a/packages/translations/src/utilities/init.ts b/packages/translations/src/utilities/init.ts index 8476a313ac..62ac7046d1 100644 --- a/packages/translations/src/utilities/init.ts +++ b/packages/translations/src/utilities/init.ts @@ -1,7 +1,7 @@ import type { I18n, InitI18n, InitTFunction, Translations } from '../types.js' import { deepMerge } from './deepMerge.js' -import { dynamicallyImportLanguages } from './dynamicImport.js' +import { reduceLanguages } from './reduceLanguages.js' /** * @function getTranslationString @@ -211,14 +211,14 @@ const initTFunction: InitTFunction = (args) => { } } -function memoize(fn: (args: unknown) => Promise, keys: string[]) { +function memoize(fn: (args: unknown) => I18n, keys: string[]) { const cacheMap = new Map() - const memoized = async (args) => { + const memoized = (args) => { const cacheKey = keys.reduce((acc, key) => acc + args[key], '') if (!cacheMap.has(cacheKey)) { - const result = await fn(args) + const result = fn(args) cacheMap.set(cacheKey, result) } @@ -229,8 +229,8 @@ function memoize(fn: (args: unknown) => Promise, keys: string[]) { } export const initI18n: InitI18n = memoize( - async ({ config, context, language = 'en' }: Parameters[0]) => { - const languages = await dynamicallyImportLanguages(config.supportedLanguages, context) + ({ config, context, language = 'en' }: Parameters[0]) => { + const languages = reduceLanguages(config.supportedLanguages, context) const { t, translations } = initTFunction({ config, diff --git a/packages/translations/src/utilities/reduceLanguages.ts b/packages/translations/src/utilities/reduceLanguages.ts new file mode 100644 index 0000000000..40de1ed5b4 --- /dev/null +++ b/packages/translations/src/utilities/reduceLanguages.ts @@ -0,0 +1,71 @@ +import type { Translations } from '../types.js' + +import { clientTranslationKeys } from '../clientKeys.js' + +function filterKeys(obj, parentGroupKey = '', keys) { + const result = {} + + for (const [namespaceKey, value] of Object.entries(obj)) { + // Skip $schema key + if (namespaceKey === '$schema') { + result[namespaceKey] = value + continue + } + + if (typeof value === 'object') { + const filteredObject = filterKeys(value, namespaceKey, keys) + if (Object.keys(filteredObject).length > 0) { + result[namespaceKey] = filteredObject + } + } else { + for (const key of keys) { + const [groupKey, selector] = key.split(':') + + if (parentGroupKey === groupKey) { + if (namespaceKey === selector) { + result[selector] = value + } else { + const pluralKeys = ['zero', 'one', 'two', 'few', 'many', 'other'] + pluralKeys.forEach((pluralKey) => { + if (namespaceKey === `${selector}_${pluralKey}`) { + result[`${selector}_${pluralKey}`] = value + } + }) + } + } + } + } + } + + return result +} + +function sortObject(obj) { + const sortedObject = {} + Object.keys(obj) + .sort() + .forEach((key) => { + if (typeof obj[key] === 'object') { + sortedObject[key] = sortObject(obj[key]) + } else { + sortedObject[key] = obj[key] + } + }) + return sortedObject +} + +export const reduceLanguages = (supportedLanguages: Translations, context: 'api' | 'client') => { + const languages = {} + + Object.entries(supportedLanguages).forEach(([lang, translations]) => { + if (context === 'client') { + const clientTranslations = sortObject(filterKeys(translations, '', clientTranslationKeys)) + + languages[lang] = clientTranslations + } else { + languages[lang] = translations + } + }) + + return languages +} From 3e7925e33f19175a09e3c0bf3f5bd8c4d8da2ffe Mon Sep 17 00:00:00 2001 From: James Date: Mon, 8 Apr 2024 16:48:56 -0400 Subject: [PATCH 004/177] chore: removes async nature from a few lexical things --- packages/payload/src/fields/config/client.ts | 2 ++ .../src/field/features/link/feature.server.ts | 4 ++-- .../link/plugins/floatingLinkEditor/utilities.ts | 4 ++-- packages/richtext-lexical/src/field/features/types.ts | 10 +++------- packages/translations/src/clientKeys.ts | 3 +++ .../ComponentMap/buildComponentMap/fields.tsx | 2 ++ 6 files changed, 14 insertions(+), 11 deletions(-) diff --git a/packages/payload/src/fields/config/client.ts b/packages/payload/src/fields/config/client.ts index f971027162..0904fbe00e 100644 --- a/packages/payload/src/fields/config/client.ts +++ b/packages/payload/src/fields/config/client.ts @@ -53,6 +53,8 @@ export const createClientFieldConfig = ({ value: option.value, } } + + return option }) } diff --git a/packages/richtext-lexical/src/field/features/link/feature.server.ts b/packages/richtext-lexical/src/field/features/link/feature.server.ts index b6ac76ddfc..6936cbdf11 100644 --- a/packages/richtext-lexical/src/field/features/link/feature.server.ts +++ b/packages/richtext-lexical/src/field/features/link/feature.server.ts @@ -66,11 +66,11 @@ export const LinkFeature: FeatureProviderProviderServer { + generateSchemaMap: ({ config, props }) => { const i18n = initI18n({ config: config.i18n, context: 'client' }) return { - fields: await transformExtraFields( + fields: transformExtraFields( props.fields, config, i18n, diff --git a/packages/richtext-lexical/src/field/features/link/plugins/floatingLinkEditor/utilities.ts b/packages/richtext-lexical/src/field/features/link/plugins/floatingLinkEditor/utilities.ts index b7d93c2b05..67d5bffafa 100644 --- a/packages/richtext-lexical/src/field/features/link/plugins/floatingLinkEditor/utilities.ts +++ b/packages/richtext-lexical/src/field/features/link/plugins/floatingLinkEditor/utilities.ts @@ -8,7 +8,7 @@ import { getBaseFields } from '../../drawer/baseFields.js' * This function is run to enrich the basefields which every link has with potential, custom user-added fields. */ // eslint-disable-next-line @typescript-eslint/require-await -export async function transformExtraFields( +export function transformExtraFields( customFieldSchema: | ((args: { config: SanitizedConfig; defaultFields: Field[]; i18n: I18n }) => Field[]) | Field[], @@ -16,7 +16,7 @@ export async function transformExtraFields( i18n: I18n, enabledCollections?: false | string[], disabledCollections?: false | string[], -): Promise { +): Field[] { const baseFields: Field[] = getBaseFields(config, enabledCollections, disabledCollections) const fields = diff --git a/packages/richtext-lexical/src/field/features/types.ts b/packages/richtext-lexical/src/field/features/types.ts index 0fed182a1f..f55c6140a4 100644 --- a/packages/richtext-lexical/src/field/features/types.ts +++ b/packages/richtext-lexical/src/field/features/types.ts @@ -188,13 +188,9 @@ export type ServerFeature = { props: ServerProps schemaMap: Map schemaPath: string - }) => - | { - [key: string]: Field[] - } - | Promise<{ - [key: string]: Field[] - }> + }) => { + [key: string]: Field[] + } generatedTypes?: { modifyOutputSchema: ({ collectionIDFieldTypes, diff --git a/packages/translations/src/clientKeys.ts b/packages/translations/src/clientKeys.ts index 7d82d2a054..63074666fb 100644 --- a/packages/translations/src/clientKeys.ts +++ b/packages/translations/src/clientKeys.ts @@ -60,6 +60,9 @@ export const clientTranslationKeys = [ 'fields:block', 'fields:blocks', 'fields:blockType', + 'fields:chooseBetweenCustomTextOrDocument', + 'fields:customURL', + 'fields:internalLink', 'fields:chooseFromExisting', 'fields:collapseAll', 'fields:editLink', diff --git a/packages/ui/src/providers/ComponentMap/buildComponentMap/fields.tsx b/packages/ui/src/providers/ComponentMap/buildComponentMap/fields.tsx index 1aa5c5f65a..c55bd4b43a 100644 --- a/packages/ui/src/providers/ComponentMap/buildComponentMap/fields.tsx +++ b/packages/ui/src/providers/ComponentMap/buildComponentMap/fields.tsx @@ -209,6 +209,8 @@ export const mapFields = (args: { value: option.value, } } + + return option }) } From 69e884f5b79fc88d250072c7f8fa8ab6dfd2b322 Mon Sep 17 00:00:00 2001 From: James Date: Mon, 8 Apr 2024 22:12:05 -0400 Subject: [PATCH 005/177] chore: dynamically loads date-fns locales --- packages/next/src/layouts/Root/index.tsx | 30 +- .../next/src/routes/rest/buildFormState.ts | 37 +- .../utilities/buildFieldSchemaMap/index.ts | 49 +- .../buildFieldSchemaMap/traverseFields.ts | 142 ++-- .../src/utilities/createPayloadRequest.ts | 2 +- packages/next/src/utilities/getNextI18n.ts | 4 +- packages/next/src/utilities/initPage.ts | 2 +- .../src/views/Document/getMetaBySegment.tsx | 2 +- packages/next/src/views/NotFound/index.tsx | 2 +- packages/next/src/views/Root/meta.ts | 2 +- .../src/views/Version/Default/SetStepNav.tsx | 8 +- .../next/src/views/Version/Default/index.tsx | 2 +- .../views/Version/SelectComparison/index.tsx | 2 +- packages/next/src/views/Version/meta.ts | 2 +- .../views/Versions/cells/CreatedAt/index.tsx | 3 +- packages/payload/src/admin/RichText.ts | 3 +- packages/payload/src/admin/views/types.ts | 4 +- packages/payload/src/config/sanitize.ts | 2 +- packages/payload/src/config/types.ts | 3 +- .../payload/src/errors/AuthenticationError.ts | 4 +- .../payload/src/errors/ErrorDeletingFile.ts | 7 +- .../payload/src/errors/FileUploadError.ts | 4 +- packages/payload/src/errors/Forbidden.ts | 4 +- packages/payload/src/errors/LockedAuth.ts | 4 +- packages/payload/src/errors/MissingFile.ts | 8 +- packages/payload/src/errors/NotFound.ts | 4 +- .../payload/src/errors/UnathorizedError.ts | 4 +- .../payload/src/errors/ValidationError.ts | 6 +- .../src/field/features/link/feature.server.ts | 6 +- .../src/field/features/types.ts | 13 +- .../src/generateComponentMap.tsx | 2 + .../richtext-lexical/src/generateSchemaMap.ts | 3 +- .../richtext-slate/src/generateSchemaMap.ts | 4 +- packages/translations/package.json | 1 + packages/translations/src/exports/all.ts | 66 +- packages/translations/src/exports/index.ts | 1 + .../translations/src/importDateFNSLocale.ts | 116 +++ packages/translations/src/languages/ar.ts | 769 ++++++++--------- packages/translations/src/languages/de.ts | 788 +++++++++--------- packages/translations/src/languages/en.ts | 782 ++++++++--------- packages/translations/src/types.ts | 42 +- ...nguages.ts => getTranslationsByContext.ts} | 22 +- packages/translations/src/utilities/init.ts | 41 +- packages/ui/src/elements/Autosave/index.tsx | 2 +- .../ui/src/elements/DatePicker/DatePicker.tsx | 8 +- .../elements/DatePicker/getFormattedLocale.ts | 12 + .../src/elements/DocumentControls/index.tsx | 12 +- .../Table/DefaultCell/fields/Date/index.tsx | 2 +- packages/ui/src/providers/Root/index.tsx | 13 +- .../ui/src/providers/Translation/index.tsx | 36 +- packages/ui/src/utilities/formatDate.ts | 34 +- packages/ui/src/utilities/formatDocTitle.ts | 2 +- packages/ui/src/utilities/getDateLocale.ts | 24 - pnpm-lock.yaml | 4 +- test/buildConfigWithDefaults.ts | 8 + 55 files changed, 1667 insertions(+), 1492 deletions(-) create mode 100644 packages/translations/src/importDateFNSLocale.ts rename packages/translations/src/utilities/{reduceLanguages.ts => getTranslationsByContext.ts} (73%) create mode 100644 packages/ui/src/elements/DatePicker/getFormattedLocale.ts delete mode 100644 packages/ui/src/utilities/getDateLocale.ts diff --git a/packages/next/src/layouts/Root/index.tsx b/packages/next/src/layouts/Root/index.tsx index 24bdd7ed7c..9565b78af7 100644 --- a/packages/next/src/layouts/Root/index.tsx +++ b/packages/next/src/layouts/Root/index.tsx @@ -33,23 +33,30 @@ export const RootLayout = async ({ const headers = getHeaders() const cookies = parseCookies(headers) - const lang = + const languageCode = getRequestLanguage({ config, cookies, headers, }) ?? config.i18n.fallbackLanguage - const i18n = initI18n({ config: config.i18n, context: 'client', language: lang }) + const i18n = await initI18n({ config: config.i18n, context: 'client', language: languageCode }) const clientConfig = await createClientConfig({ config, t: i18n.t }) - const dir = rtlLanguages.includes(lang) ? 'RTL' : 'LTR' + const dir = rtlLanguages.includes(languageCode) ? 'RTL' : 'LTR' - const languageOptions = Object.entries(i18n.translations || {}).map( - ([language, translations]) => ({ - label: translations.general.thisLanguage, - value: language, - }), + const languageOptions = Object.entries(config.i18n.supportedLanguages || {}).reduce( + (acc, [language, languageConfig]) => { + if (Object.keys(config.i18n.supportedLanguages).includes(language)) { + acc.push({ + label: languageConfig.translations.general.thisLanguage, + value: language, + }) + } + + return acc + }, + [], ) // eslint-disable-next-line @typescript-eslint/require-await @@ -71,17 +78,18 @@ export const RootLayout = async ({ }) return ( - + {wrappedChildren} diff --git a/packages/next/src/routes/rest/buildFormState.ts b/packages/next/src/routes/rest/buildFormState.ts index ec1a16ccd7..14c103d436 100644 --- a/packages/next/src/routes/rest/buildFormState.ts +++ b/packages/next/src/routes/rest/buildFormState.ts @@ -1,11 +1,5 @@ import type { BuildFormStateArgs } from '@payloadcms/ui/forms/buildStateFromSchema' -import type { - DocumentPreferences, - Field, - PayloadRequest, - SanitizedConfig, - TypeWithID, -} from 'payload/types' +import type { DocumentPreferences, Field, PayloadRequest, TypeWithID } from 'payload/types' import { buildStateFromSchema } from '@payloadcms/ui/forms/buildStateFromSchema' import { reduceFieldsToValues } from '@payloadcms/ui/utilities/reduceFieldsToValues' @@ -15,32 +9,21 @@ import type { FieldSchemaMap } from '../../utilities/buildFieldSchemaMap/types.j import { buildFieldSchemaMap } from '../../utilities/buildFieldSchemaMap/index.js' -let cached: { - promise: Promise | null - schemaMap: FieldSchemaMap | null -} = global._payload_fieldSchemaMap +let cached = global._payload_fieldSchemaMap + if (!cached) { // eslint-disable-next-line no-multi-assign - cached = global._payload_fieldSchemaMap = { promise: null, schemaMap: null } + cached = global._payload_fieldSchemaMap = null } -export const getFieldSchemaMap = async (config: SanitizedConfig): Promise => { - if (cached.schemaMap && process.env.NODE_ENV !== 'development') { - return cached.schemaMap +export const getFieldSchemaMap = (req: PayloadRequest): FieldSchemaMap => { + if (cached && process.env.NODE_ENV !== 'development') { + return cached } - if (!cached.promise) { - cached.promise = buildFieldSchemaMap(config) - } + cached = buildFieldSchemaMap(req) - try { - cached.schemaMap = await cached.promise - } catch (e) { - cached.promise = null - throw e - } - - return cached.schemaMap + return cached } export const buildFormState = async ({ req }: { req: PayloadRequest }) => { @@ -76,7 +59,7 @@ export const buildFormState = async ({ req }: { req: PayloadRequest }) => { }) } - const fieldSchemaMap = await getFieldSchemaMap(req.payload.config) + const fieldSchemaMap = getFieldSchemaMap(req) const id = collectionSlug ? reqData.id : undefined const schemaPathSegments = schemaPath.split('.') diff --git a/packages/next/src/utilities/buildFieldSchemaMap/index.ts b/packages/next/src/utilities/buildFieldSchemaMap/index.ts index a07f495e28..d539688db4 100644 --- a/packages/next/src/utilities/buildFieldSchemaMap/index.ts +++ b/packages/next/src/utilities/buildFieldSchemaMap/index.ts @@ -1,37 +1,38 @@ -import type { SanitizedConfig } from 'payload/types' +import type { PayloadRequest } from 'payload/types' import type { FieldSchemaMap } from './types.js' import { traverseFields } from './traverseFields.js' -export const buildFieldSchemaMap = async (config: SanitizedConfig): Promise => { +export const buildFieldSchemaMap = ({ + i18n, + payload: { config }, +}: PayloadRequest): FieldSchemaMap => { const result: FieldSchemaMap = new Map() const validRelationships = config.collections.map((c) => c.slug) || [] - await Promise.all( - config.collections.map(async (collection) => { - await traverseFields({ - config, - fields: collection.fields, - schemaMap: result, - schemaPath: collection.slug, - validRelationships, - }) - }), - ) + config.collections.forEach((collection) => { + traverseFields({ + config, + fields: collection.fields, + i18n, + schemaMap: result, + schemaPath: collection.slug, + validRelationships, + }) + }) - await Promise.all( - config.globals.map(async (global) => { - await traverseFields({ - config, - fields: global.fields, - schemaMap: result, - schemaPath: global.slug, - validRelationships, - }) - }), - ) + config.globals.forEach((global) => { + traverseFields({ + config, + fields: global.fields, + i18n, + schemaMap: result, + schemaPath: global.slug, + validRelationships, + }) + }) return result } diff --git a/packages/next/src/utilities/buildFieldSchemaMap/traverseFields.ts b/packages/next/src/utilities/buildFieldSchemaMap/traverseFields.ts index efec468e98..b32cb69f30 100644 --- a/packages/next/src/utilities/buildFieldSchemaMap/traverseFields.ts +++ b/packages/next/src/utilities/buildFieldSchemaMap/traverseFields.ts @@ -1,3 +1,4 @@ +import type { I18n } from '@payloadcms/translations' import type { Field, SanitizedConfig } from 'payload/types' import { tabHasName } from 'payload/types' @@ -7,94 +8,95 @@ import type { FieldSchemaMap } from './types.js' type Args = { config: SanitizedConfig fields: Field[] + i18n: I18n schemaMap: FieldSchemaMap schemaPath: string validRelationships: string[] } -export const traverseFields = async ({ +export const traverseFields = ({ config, fields, + i18n, schemaMap, schemaPath, validRelationships, -}: Args): Promise => { - await Promise.all( - fields.map(async (field) => { - switch (field.type) { - case 'group': - case 'array': - schemaMap.set(`${schemaPath}.${field.name}`, field.fields) +}: Args) => { + fields.map((field) => { + switch (field.type) { + case 'group': + case 'array': + schemaMap.set(`${schemaPath}.${field.name}`, field.fields) - await traverseFields({ + traverseFields({ + config, + fields: field.fields, + i18n, + schemaMap, + schemaPath: `${schemaPath}.${field.name}`, + validRelationships, + }) + break + + case 'collapsible': + case 'row': + traverseFields({ + config, + fields: field.fields, + i18n, + schemaMap, + schemaPath, + validRelationships, + }) + break + + case 'blocks': + field.blocks.map((block) => { + const blockSchemaPath = `${schemaPath}.${field.name}.${block.slug}` + + schemaMap.set(blockSchemaPath, block.fields) + + traverseFields({ config, - fields: field.fields, + fields: block.fields, + i18n, + schemaMap, + schemaPath: blockSchemaPath, + validRelationships, + }) + }) + break + + case 'richText': + if (typeof field.editor.generateSchemaMap === 'function') { + field.editor.generateSchemaMap({ + config, + i18n, schemaMap, schemaPath: `${schemaPath}.${field.name}`, - validRelationships, }) - break + } - case 'collapsible': - case 'row': - await traverseFields({ - config, - fields: field.fields, - schemaMap, - schemaPath, - validRelationships, - }) - break + break - case 'blocks': - await Promise.all( - field.blocks.map(async (block) => { - const blockSchemaPath = `${schemaPath}.${field.name}.${block.slug}` + case 'tabs': + field.tabs.map((tab) => { + const tabSchemaPath = tabHasName(tab) ? `${schemaPath}.${tab.name}` : schemaPath - schemaMap.set(blockSchemaPath, block.fields) - - await traverseFields({ - config, - fields: block.fields, - schemaMap, - schemaPath: blockSchemaPath, - validRelationships, - }) - }), - ) - break - - case 'richText': - if (typeof field.editor.generateSchemaMap === 'function') { - await field.editor.generateSchemaMap({ - config, - schemaMap, - schemaPath: `${schemaPath}.${field.name}`, - }) + if (tabHasName(tab)) { + schemaMap.set(tabSchemaPath, tab.fields) } - break - - case 'tabs': - await Promise.all( - field.tabs.map(async (tab) => { - const tabSchemaPath = tabHasName(tab) ? `${schemaPath}.${tab.name}` : schemaPath - - if (tabHasName(tab)) { - schemaMap.set(tabSchemaPath, tab.fields) - } - - await traverseFields({ - config, - fields: tab.fields, - schemaMap, - schemaPath: tabSchemaPath, - validRelationships, - }) - }), - ) - break - } - }), - ) + traverseFields({ + config, + fields: tab.fields, + i18n, + schemaMap, + schemaPath: tabSchemaPath, + validRelationships, + }) + }) + break + } + }) } diff --git a/packages/next/src/utilities/createPayloadRequest.ts b/packages/next/src/utilities/createPayloadRequest.ts index af23366ca4..72ec72bfcd 100644 --- a/packages/next/src/utilities/createPayloadRequest.ts +++ b/packages/next/src/utilities/createPayloadRequest.ts @@ -71,7 +71,7 @@ export const createPayloadRequest = async ({ headers: request.headers, }) - const i18n = initI18n({ + const i18n = await initI18n({ config: config.i18n, context: 'api', language, diff --git a/packages/next/src/utilities/getNextI18n.ts b/packages/next/src/utilities/getNextI18n.ts index 77f9a9723a..82c488c644 100644 --- a/packages/next/src/utilities/getNextI18n.ts +++ b/packages/next/src/utilities/getNextI18n.ts @@ -6,13 +6,13 @@ import { cookies, headers } from 'next/headers.js' import { getRequestLanguage } from './getRequestLanguage.js' -export const getNextI18n = ({ +export const getNextI18n = async ({ config, language, }: { config: SanitizedConfig language?: string -}): I18n => +}): Promise => initI18n({ config: config.i18n, context: 'client', diff --git a/packages/next/src/utilities/initPage.ts b/packages/next/src/utilities/initPage.ts index 8042718c2c..efcededc71 100644 --- a/packages/next/src/utilities/initPage.ts +++ b/packages/next/src/utilities/initPage.ts @@ -44,7 +44,7 @@ export const initPage = async ({ const cookies = parseCookies(headers) const language = getRequestLanguage({ config: payload.config, cookies, headers }) - const i18n = initI18n({ + const i18n = await initI18n({ config: payload.config.i18n, context: 'client', language, diff --git a/packages/next/src/views/Document/getMetaBySegment.tsx b/packages/next/src/views/Document/getMetaBySegment.tsx index 9a6701ca67..dde140b5f8 100644 --- a/packages/next/src/views/Document/getMetaBySegment.tsx +++ b/packages/next/src/views/Document/getMetaBySegment.tsx @@ -89,7 +89,7 @@ export const getMetaBySegment: GenerateEditViewMetadata = async ({ } } - const i18n = getNextI18n({ + const i18n = await getNextI18n({ config, }) diff --git a/packages/next/src/views/NotFound/index.tsx b/packages/next/src/views/NotFound/index.tsx index d70de66b8e..6ac6cc6ef2 100644 --- a/packages/next/src/views/NotFound/index.tsx +++ b/packages/next/src/views/NotFound/index.tsx @@ -19,7 +19,7 @@ export const generatePageMetadata = async ({ }): Promise => { const config = await configPromise - const i18n = getNextI18n({ + const i18n = await getNextI18n({ config, }) diff --git a/packages/next/src/views/Root/meta.ts b/packages/next/src/views/Root/meta.ts index 0edcfd5319..dbbed934d6 100644 --- a/packages/next/src/views/Root/meta.ts +++ b/packages/next/src/views/Root/meta.ts @@ -49,7 +49,7 @@ export const generatePageMetadata = async ({ config: configPromise, params }: Ar const isGlobal = segmentOne === 'globals' const isCollection = segmentOne === 'collections' - const i18n = getNextI18n({ + const i18n = await getNextI18n({ config, }) diff --git a/packages/next/src/views/Version/Default/SetStepNav.tsx b/packages/next/src/views/Version/Default/SetStepNav.tsx index 0feecc3cce..a94a686a35 100644 --- a/packages/next/src/views/Version/Default/SetStepNav.tsx +++ b/packages/next/src/views/Version/Default/SetStepNav.tsx @@ -85,7 +85,9 @@ export const SetStepNav: React.FC<{ url: `${adminRoute}/collections/${collectionSlug}/${id}/versions`, }, { - label: doc?.createdAt ? formatDate(doc.createdAt, dateFormat, i18n?.language) : '', + label: doc?.createdAt + ? formatDate({ date: doc.createdAt, i18n, pattern: dateFormat }) + : '', }, ] } @@ -101,7 +103,9 @@ export const SetStepNav: React.FC<{ url: `${adminRoute}/globals/${globalConfig.slug}/versions`, }, { - label: doc?.createdAt ? formatDate(doc.createdAt, dateFormat, i18n?.language) : '', + label: doc?.createdAt + ? formatDate({ date: doc.createdAt, i18n, pattern: dateFormat }) + : '', }, ] } diff --git a/packages/next/src/views/Version/Default/index.tsx b/packages/next/src/views/Version/Default/index.tsx index 1c40869dad..e6b0042eac 100644 --- a/packages/next/src/views/Version/Default/index.tsx +++ b/packages/next/src/views/Version/Default/index.tsx @@ -61,7 +61,7 @@ export const DefaultVersionView: React.FC = ({ } = config const formattedCreatedAt = doc?.createdAt - ? formatDate(doc.createdAt, dateFormat, i18n.language) + ? formatDate({ date: doc.createdAt, i18n, pattern: dateFormat }) : '' const originalDocFetchURL = `${serverURL}${apiRoute}/${globalSlug ? 'globals/' : ''}${ diff --git a/packages/next/src/views/Version/SelectComparison/index.tsx b/packages/next/src/views/Version/SelectComparison/index.tsx index a19ccced33..1e332b3313 100644 --- a/packages/next/src/views/Version/SelectComparison/index.tsx +++ b/packages/next/src/views/Version/SelectComparison/index.tsx @@ -88,7 +88,7 @@ export const SelectComparison: React.FC = (props) => { setOptions((existingOptions) => [ ...existingOptions, ...data.docs.map((doc) => ({ - label: formatDate(doc.updatedAt, dateFormat, i18n.language), + label: formatDate({ date: doc.updatedAt, i18n, pattern: dateFormat }), value: doc.id, })), ]) diff --git a/packages/next/src/views/Version/meta.ts b/packages/next/src/views/Version/meta.ts index 941d6dc6ae..9190847be7 100644 --- a/packages/next/src/views/Version/meta.ts +++ b/packages/next/src/views/Version/meta.ts @@ -22,7 +22,7 @@ export const generateMetadata: GenerateEditViewMetadata = async ({ const doc: any = {} // TODO: figure this out const formattedCreatedAt = doc?.createdAt - ? formatDate(doc.createdAt, config?.admin?.dateFormat, i18n?.language) + ? formatDate({ date: doc.createdAt, i18n, pattern: config?.admin?.dateFormat }) : '' if (collectionConfig) { diff --git a/packages/next/src/views/Versions/cells/CreatedAt/index.tsx b/packages/next/src/views/Versions/cells/CreatedAt/index.tsx index 48c52e2ee4..be21534582 100644 --- a/packages/next/src/views/Versions/cells/CreatedAt/index.tsx +++ b/packages/next/src/views/Versions/cells/CreatedAt/index.tsx @@ -38,7 +38,8 @@ export const CreatedAtCell: React.FC = ({ return ( - {cellData && formatDate(cellData as Date | number | string, dateFormat, i18n.language)} + {cellData && + formatDate({ date: cellData as Date | number | string, i18n, pattern: dateFormat })} ) } diff --git a/packages/payload/src/admin/RichText.ts b/packages/payload/src/admin/RichText.ts index e3d2dd6d09..36d4eb59e8 100644 --- a/packages/payload/src/admin/RichText.ts +++ b/packages/payload/src/admin/RichText.ts @@ -34,9 +34,10 @@ type RichTextAdapterBase< }) => Map generateSchemaMap?: (args: { config: SanitizedConfig + i18n: I18n schemaMap: Map schemaPath: string - }) => Map | Promise> + }) => Map outputSchema?: ({ collectionIDFieldTypes, config, diff --git a/packages/payload/src/admin/views/types.ts b/packages/payload/src/admin/views/types.ts index f0cd4b41d0..9405f7e370 100644 --- a/packages/payload/src/admin/views/types.ts +++ b/packages/payload/src/admin/views/types.ts @@ -1,4 +1,4 @@ -import type { Translations } from '@payloadcms/translations' +import type { SupportedLanguages } from '@payloadcms/translations' import type { Permissions } from '../../auth/index.js' import type { SanitizedCollectionConfig } from '../../collections/config/types.js' @@ -43,7 +43,7 @@ export type InitPageResult = { locale: Locale permissions: Permissions req: PayloadRequest - translations: Translations + translations: SupportedLanguages visibleEntities: VisibleEntities } diff --git a/packages/payload/src/config/sanitize.ts b/packages/payload/src/config/sanitize.ts index 77d350befc..6e17c0da80 100644 --- a/packages/payload/src/config/sanitize.ts +++ b/packages/payload/src/config/sanitize.ts @@ -1,4 +1,4 @@ -import en from '@payloadcms/translations/languages/en' +import { en } from '@payloadcms/translations/languages/en' import merge from 'deepmerge' import type { diff --git a/packages/payload/src/config/types.ts b/packages/payload/src/config/types.ts index b6b8f5fb51..7dbc69c052 100644 --- a/packages/payload/src/config/types.ts +++ b/packages/payload/src/config/types.ts @@ -673,11 +673,12 @@ export type Config = { export type SanitizedConfig = Omit< DeepRequired, - 'collections' | 'endpoint' | 'globals' | 'localization' + 'collections' | 'endpoint' | 'globals' | 'i18n' | 'localization' > & { collections: SanitizedCollectionConfig[] endpoints: Endpoint[] globals: SanitizedGlobalConfig[] + i18n: Required localization: SanitizedLocalizationConfig | false paths: { config: string diff --git a/packages/payload/src/errors/AuthenticationError.ts b/packages/payload/src/errors/AuthenticationError.ts index a446954279..806385c5df 100644 --- a/packages/payload/src/errors/AuthenticationError.ts +++ b/packages/payload/src/errors/AuthenticationError.ts @@ -1,6 +1,6 @@ import type { TFunction } from '@payloadcms/translations' -import en from '@payloadcms/translations/languages/en' +import { en } from '@payloadcms/translations/languages/en' import httpStatus from 'http-status' import APIError from './APIError.js' @@ -8,7 +8,7 @@ import APIError from './APIError.js' class AuthenticationError extends APIError { constructor(t?: TFunction) { super( - t ? t('error:emailOrPasswordIncorrect') : en.error.emailOrPasswordIncorrect, + t ? t('error:emailOrPasswordIncorrect') : en.translations.error.emailOrPasswordIncorrect, httpStatus.UNAUTHORIZED, ) } diff --git a/packages/payload/src/errors/ErrorDeletingFile.ts b/packages/payload/src/errors/ErrorDeletingFile.ts index c53251dbf0..af67abb938 100644 --- a/packages/payload/src/errors/ErrorDeletingFile.ts +++ b/packages/payload/src/errors/ErrorDeletingFile.ts @@ -1,13 +1,16 @@ import type { TFunction } from '@payloadcms/translations' -import en from '@payloadcms/translations/languages/en' +import { en } from '@payloadcms/translations/languages/en' import httpStatus from 'http-status' import APIError from './APIError.js' class ErrorDeletingFile extends APIError { constructor(t?: TFunction) { - super(t ? t('error:deletingFile') : en.error.deletingFile, httpStatus.INTERNAL_SERVER_ERROR) + super( + t ? t('error:deletingFile') : en.translations.error.deletingFile, + httpStatus.INTERNAL_SERVER_ERROR, + ) } } diff --git a/packages/payload/src/errors/FileUploadError.ts b/packages/payload/src/errors/FileUploadError.ts index 36a4f13a6a..cb26e0d679 100644 --- a/packages/payload/src/errors/FileUploadError.ts +++ b/packages/payload/src/errors/FileUploadError.ts @@ -1,6 +1,6 @@ import type { TFunction } from '@payloadcms/translations' -import en from '@payloadcms/translations/languages/en' +import { en } from '@payloadcms/translations/languages/en' import httpStatus from 'http-status' import APIError from './APIError.js' @@ -8,7 +8,7 @@ import APIError from './APIError.js' class FileUploadError extends APIError { constructor(t?: TFunction) { super( - t ? t('error:problemUploadingFile') : en.error.problemUploadingFile, + t ? t('error:problemUploadingFile') : en.translations.error.problemUploadingFile, httpStatus.BAD_REQUEST, ) } diff --git a/packages/payload/src/errors/Forbidden.ts b/packages/payload/src/errors/Forbidden.ts index 471ce09e09..3c855fef87 100644 --- a/packages/payload/src/errors/Forbidden.ts +++ b/packages/payload/src/errors/Forbidden.ts @@ -1,6 +1,6 @@ import type { TFunction } from '@payloadcms/translations' -import en from '@payloadcms/translations/languages/en' +import { en } from '@payloadcms/translations/languages/en' import httpStatus from 'http-status' import APIError from './APIError.js' @@ -8,7 +8,7 @@ import APIError from './APIError.js' class Forbidden extends APIError { constructor(t?: TFunction) { super( - t ? t('error:notAllowedToPerformAction') : en.error.notAllowedToPerformAction, + t ? t('error:notAllowedToPerformAction') : en.translations.error.notAllowedToPerformAction, httpStatus.FORBIDDEN, ) } diff --git a/packages/payload/src/errors/LockedAuth.ts b/packages/payload/src/errors/LockedAuth.ts index 3d7f36ce1f..a72461c3a9 100644 --- a/packages/payload/src/errors/LockedAuth.ts +++ b/packages/payload/src/errors/LockedAuth.ts @@ -1,13 +1,13 @@ import type { TFunction } from '@payloadcms/translations' -import en from '@payloadcms/translations/languages/en' +import { en } from '@payloadcms/translations/languages/en' import httpStatus from 'http-status' import APIError from './APIError.js' class LockedAuth extends APIError { constructor(t?: TFunction) { - super(t ? t('error:userLocked') : en.error.userLocked, httpStatus.UNAUTHORIZED) + super(t ? t('error:userLocked') : en.translations.error.userLocked, httpStatus.UNAUTHORIZED) } } diff --git a/packages/payload/src/errors/MissingFile.ts b/packages/payload/src/errors/MissingFile.ts index 314237f440..4d864b99c6 100644 --- a/packages/payload/src/errors/MissingFile.ts +++ b/packages/payload/src/errors/MissingFile.ts @@ -1,14 +1,16 @@ import type { TFunction } from '@payloadcms/translations' -import en from '@payloadcms/translations/languages/en' - +import { en } from '@payloadcms/translations/languages/en' import httpStatus from 'http-status' import APIError from './APIError.js' class MissingFile extends APIError { constructor(t?: TFunction) { - super(t ? t('error:noFilesUploaded') : en.error.noFilesUploaded, httpStatus.BAD_REQUEST) + super( + t ? t('error:noFilesUploaded') : en.translations.error.noFilesUploaded, + httpStatus.BAD_REQUEST, + ) } } diff --git a/packages/payload/src/errors/NotFound.ts b/packages/payload/src/errors/NotFound.ts index 9676f45d25..06372e3da3 100644 --- a/packages/payload/src/errors/NotFound.ts +++ b/packages/payload/src/errors/NotFound.ts @@ -1,13 +1,13 @@ import type { TFunction } from '@payloadcms/translations' -import en from '@payloadcms/translations/languages/en' +import { en } from '@payloadcms/translations/languages/en' import httpStatus from 'http-status' import APIError from './APIError.js' class NotFound extends APIError { constructor(t?: TFunction) { - super(t ? t('general:notFound') : en.general.notFound, httpStatus.NOT_FOUND) + super(t ? t('general:notFound') : en.translations.general.notFound, httpStatus.NOT_FOUND) } } diff --git a/packages/payload/src/errors/UnathorizedError.ts b/packages/payload/src/errors/UnathorizedError.ts index e46f8decc4..0e4e5bf38c 100644 --- a/packages/payload/src/errors/UnathorizedError.ts +++ b/packages/payload/src/errors/UnathorizedError.ts @@ -1,13 +1,13 @@ import type { TFunction } from '@payloadcms/translations' -import en from '@payloadcms/translations/languages/en' +import { en } from '@payloadcms/translations/languages/en' import httpStatus from 'http-status' import APIError from './APIError.js' class UnauthorizedError extends APIError { constructor(t?: TFunction) { - super(t ? t('error:unauthorized') : en.error.unauthorized, httpStatus.UNAUTHORIZED) + super(t ? t('error:unauthorized') : en.translations.error.unauthorized, httpStatus.UNAUTHORIZED) } } diff --git a/packages/payload/src/errors/ValidationError.ts b/packages/payload/src/errors/ValidationError.ts index 96d4d95605..55403b1cdd 100644 --- a/packages/payload/src/errors/ValidationError.ts +++ b/packages/payload/src/errors/ValidationError.ts @@ -1,6 +1,6 @@ import type { TFunction } from '@payloadcms/translations' -import en from '@payloadcms/translations/languages/en' +import { en } from '@payloadcms/translations/languages/en' import httpStatus from 'http-status' import APIError from './APIError.js' @@ -10,8 +10,8 @@ class ValidationError extends APIError<{ field: string; message: string }[]> { const message = t ? t('error:followingFieldsInvalid', { count: results.length }) : results.length === 1 - ? en.error.followingFieldsInvalid_one - : en.error.followingFieldsInvalid_other + ? en.translations.error.followingFieldsInvalid_one + : en.translations.error.followingFieldsInvalid_other super(`${message} ${results.map((f) => f.field).join(', ')}`, httpStatus.BAD_REQUEST, results) } diff --git a/packages/richtext-lexical/src/field/features/link/feature.server.ts b/packages/richtext-lexical/src/field/features/link/feature.server.ts index 6936cbdf11..b9a2d043bf 100644 --- a/packages/richtext-lexical/src/field/features/link/feature.server.ts +++ b/packages/richtext-lexical/src/field/features/link/feature.server.ts @@ -2,8 +2,6 @@ import type { I18n } from '@payloadcms/translations' import type { SanitizedConfig } from 'payload/config' import type { FieldWithRichTextRequiredEditor } from 'payload/types' -import { initI18n } from '@payloadcms/translations' - import type { HTMLConverter } from '../converters/html/converter/types.js' import type { FeatureProviderProviderServer } from '../types.js' import type { ClientProps } from './feature.client.js' @@ -66,9 +64,7 @@ export const LinkFeature: FeatureProviderProviderServer { - const i18n = initI18n({ config: config.i18n, context: 'client' }) - + generateSchemaMap: ({ config, i18n, props }) => { return { fields: transformExtraFields( props.fields, diff --git a/packages/richtext-lexical/src/field/features/types.ts b/packages/richtext-lexical/src/field/features/types.ts index f55c6140a4..9864537968 100644 --- a/packages/richtext-lexical/src/field/features/types.ts +++ b/packages/richtext-lexical/src/field/features/types.ts @@ -1,4 +1,5 @@ import type { Transformer } from '@lexical/markdown' +import type { I18n } from '@payloadcms/translations' import type { JSONSchema4 } from 'json-schema' import type { Klass, LexicalEditor, LexicalNode, SerializedEditorState } from 'lexical' import type { SerializedLexicalNode } from 'lexical' @@ -178,6 +179,7 @@ export type ServerFeature = { clientFeatureProps?: ClientFeatureProps generateComponentMap?: (args: { config: SanitizedConfig + i18n: I18n props: ServerProps schemaPath: string }) => { @@ -185,12 +187,17 @@ export type ServerFeature = { } generateSchemaMap?: (args: { config: SanitizedConfig + i18n: I18n props: ServerProps schemaMap: Map schemaPath: string - }) => { - [key: string]: Field[] - } + }) => + | { + [key: string]: Field[] + } + | Promise<{ + [key: string]: Field[] + }> generatedTypes?: { modifyOutputSchema: ({ collectionIDFieldTypes, diff --git a/packages/richtext-lexical/src/generateComponentMap.tsx b/packages/richtext-lexical/src/generateComponentMap.tsx index 43ad1ef9de..e9002b1fd5 100644 --- a/packages/richtext-lexical/src/generateComponentMap.tsx +++ b/packages/richtext-lexical/src/generateComponentMap.tsx @@ -39,6 +39,7 @@ export const getGenerateComponentMap = ) { const components = resolvedFeature.generateComponentMap({ config, + i18n, props: resolvedFeature.serverFeatureProps, schemaPath, }) @@ -68,6 +69,7 @@ export const getGenerateComponentMap = ) { const schemas = resolvedFeature.generateSchemaMap({ config, + i18n, props: resolvedFeature.serverFeatureProps, schemaMap: new Map(), schemaPath, diff --git a/packages/richtext-lexical/src/generateSchemaMap.ts b/packages/richtext-lexical/src/generateSchemaMap.ts index a5976317c0..590073e76a 100644 --- a/packages/richtext-lexical/src/generateSchemaMap.ts +++ b/packages/richtext-lexical/src/generateSchemaMap.ts @@ -8,7 +8,7 @@ import { cloneDeep } from './field/lexical/utils/cloneDeep.js' export const getGenerateSchemaMap = (args: { resolvedFeatureMap: ResolvedServerFeatureMap }): RichTextAdapter['generateSchemaMap'] => - ({ config, schemaMap, schemaPath }) => { + ({ config, i18n, schemaMap, schemaPath }) => { const validRelationships = config.collections.map((c) => c.slug) || [] for (const [featureKey, resolvedFeature] of args.resolvedFeatureMap.entries()) { @@ -20,6 +20,7 @@ export const getGenerateSchemaMap = } const schemas = resolvedFeature.generateSchemaMap({ config, + i18n, props: resolvedFeature.serverFeatureProps, schemaMap, schemaPath, diff --git a/packages/richtext-slate/src/generateSchemaMap.ts b/packages/richtext-slate/src/generateSchemaMap.ts index c00932e44d..b04bba1034 100644 --- a/packages/richtext-slate/src/generateSchemaMap.ts +++ b/packages/richtext-slate/src/generateSchemaMap.ts @@ -1,6 +1,5 @@ import type { RichTextAdapter } from 'payload/types' -import { initI18n } from '@payloadcms/translations' import { sanitizeFields } from 'payload/config' import type { AdapterArguments, RichTextCustomElement } from './types.js' @@ -12,8 +11,7 @@ import { uploadFieldsSchemaPath } from './field/elements/upload/shared.js' export const getGenerateSchemaMap = (args: AdapterArguments): RichTextAdapter['generateSchemaMap'] => - ({ config, schemaMap, schemaPath }) => { - const i18n = initI18n({ config: config.i18n, context: 'client' }) + ({ config, i18n, schemaMap, schemaPath }) => { const validRelationships = config.collections.map((c) => c.slug) || [] ;(args?.admin?.elements || Object.values(elementTypes)).forEach((el) => { diff --git a/packages/translations/package.json b/packages/translations/package.json index a98eadbf8a..d76abc16d3 100644 --- a/packages/translations/package.json +++ b/packages/translations/package.json @@ -56,6 +56,7 @@ "@payloadcms/eslint-config": "workspace:*", "@swc/core": "^1.3.102", "@types/react": "18.2.74", + "date-fns": "3.3.1", "typescript": "5.4.4" }, "files": [ diff --git a/packages/translations/src/exports/all.ts b/packages/translations/src/exports/all.ts index 86b6e37b53..47ad1fe1df 100644 --- a/packages/translations/src/exports/all.ts +++ b/packages/translations/src/exports/all.ts @@ -1,9 +1,11 @@ -import ar from '../languages/ar.js' +import type { SupportedLanguages } from '../types.js' + +import { ar } from '../languages/ar.js' import az from '../languages/az.js' import bg from '../languages/bg.js' import cs from '../languages/cs.js' -import de from '../languages/de.js' -import en from '../languages/en.js' +import { de } from '../languages/de.js' +import { en } from '../languages/en.js' import es from '../languages/es.js' import fa from '../languages/fa.js' import fr from '../languages/fr.js' @@ -31,35 +33,33 @@ import zhTw from '../languages/zhTw.js' export const translations = { ar, - az, - bg, - cs, + // az, + // bg, + // cs, de, en, - es, - fa, - fr, - hr, - hu, - it, - ja, - ko, - my, - nb, - nl, - pl, - pt, - ro, - rs, - 'rs-latin': rsLatin, - ru, - sv, - th, - tr, - ua, - vi, - zh, - 'zh-tw': zhTw, -} as { - [locale: string]: Record> -} + // es, + // fa, + // fr, + // hr, + // hu, + // it, + // ja, + // ko, + // my, + // nb, + // nl, + // pl, + // pt, + // ro, + // rs, + // 'rs-latin': rsLatin, + // ru, + // sv, + // th, + // tr, + // ua, + // vi, + // zh, + // 'zh-tw': zhTw, +} as SupportedLanguages diff --git a/packages/translations/src/exports/index.ts b/packages/translations/src/exports/index.ts index fad56a8502..22927f88f3 100644 --- a/packages/translations/src/exports/index.ts +++ b/packages/translations/src/exports/index.ts @@ -1,3 +1,4 @@ +export { importDateFNSLocale } from '../importDateFNSLocale.js' export { getTranslation } from '../utilities/getTranslation.js' export { initI18n, matchLanguage, t } from '../utilities/init.js' export type * from '../types.js' diff --git a/packages/translations/src/importDateFNSLocale.ts b/packages/translations/src/importDateFNSLocale.ts new file mode 100644 index 0000000000..f27689d76f --- /dev/null +++ b/packages/translations/src/importDateFNSLocale.ts @@ -0,0 +1,116 @@ +import type { Locale } from 'date-fns' + +export const importDateFNSLocale = async (locale: string): Promise => { + let result + + switch (locale) { + case 'ar': + result = await import('date-fns/locale/ar') + + break + case 'az': + result = await import('date-fns/locale/az') + + break + case 'bg': + result = await import('date-fns/locale/bg') + + break + case 'cs': + result = await import('date-fns/locale/cs') + + break + case 'de': + result = await import('date-fns/locale/de') + + break + case 'en-US': + result = await import('date-fns/locale/en-US') + + break + case 'es': + result = await import('date-fns/locale/es') + + break + case 'fa-IR': + result = await import('date-fns/locale/fa-IR') + + break + case 'fr': + result = await import('date-fns/locale/fr') + + break + case 'hr': + result = await import('date-fns/locale/hr') + + break + case 'hu': + result = await import('date-fns/locale/hu') + + break + case 'it': + result = await import('date-fns/locale/it') + + break + case 'ja': + result = await import('date-fns/locale/ja') + + break + case 'ko': + result = await import('date-fns/locale/ko') + + break + case 'nb': + result = await import('date-fns/locale/nb') + + break + case 'nl': + result = await import('date-fns/locale/nl') + + break + case 'pl': + result = await import('date-fns/locale/pl') + + break + case 'pt': + result = await import('date-fns/locale/pt') + + break + case 'ro': + result = await import('date-fns/locale/ro') + + break + case 'ru': + result = await import('date-fns/locale/ru') + + break + case 'sv': + result = await import('date-fns/locale/sv') + + break + case 'th': + result = await import('date-fns/locale/th') + + break + case 'tr': + result = await import('date-fns/locale/tr') + + break + case 'vi': + result = await import('date-fns/locale/vi') + + break + case 'zh-CN': + result = await import('date-fns/locale/zh-CN') + + break + case 'zh-TW': + result = await import('date-fns/locale/zh-TW') + + break + } + + if (result.default) return result.default + + return result as Locale +} diff --git a/packages/translations/src/languages/ar.ts b/packages/translations/src/languages/ar.ts index 067e945cb9..0df82f376f 100644 --- a/packages/translations/src/languages/ar.ts +++ b/packages/translations/src/languages/ar.ts @@ -1,384 +1,389 @@ -export default { - authentication: { - account: 'الحساب', - accountOfCurrentUser: 'حساب المستخدم الحالي', - alreadyActivated: 'تمّ التّفعيل بالفعل', - alreadyLoggedIn: 'تمّ تسجيل الدّخول بالفعل', - apiKey: 'مفتاح API', - backToLogin: 'العودة لتسجيل الدخول', - beginCreateFirstUser: 'للبدء, قم بإنشاء المستخدم الأوّل.', - changePassword: 'تغيير كلمة المرور', - checkYourEmailForPasswordReset: - 'تحقّق من بريدك الإلكتروني بحثًا عن رابط يسمح لك بإعادة تعيين كلمة المرور الخاصّة بك بشكل آمن.', - confirmGeneration: 'تأكيد التّوليد', - confirmPassword: 'تأكيد كلمة المرور', - createFirstUser: 'إنشاء المستخدم الأوّل', - emailNotValid: 'البريد الإلكتروني غير صالح', - emailSent: 'تمّ ارسال البريد الإلكتروني', - enableAPIKey: 'تفعيل مفتاح API', - failedToUnlock: 'فشل فتح القفل', - forceUnlock: 'إجبار فتح القفل', - forgotPassword: 'نسيت كلمة المرور', - forgotPasswordEmailInstructions: - 'يرجى إدخال البريد الالكتروني أدناه. ستتلقّى رسالة بريد إلكتروني تحتوي على إرشادات حول كيفيّة إعادة تعيين كلمة المرور الخاصّة بك.', - forgotPasswordQuestion: 'هل نسيت كلمة المرور؟', - generate: 'توليد', - generateNewAPIKey: 'توليد مفتاح API جديد', - generatingNewAPIKeyWillInvalidate: - 'سيؤدّي إنشاء مفتاح API جديد إلى <1> إبطال المفتاح السّابق. هل أنت متأكّد أنّك تريد المتابعة؟', - lockUntil: 'قفل حتى', - logBackIn: 'تسجيل الدّخول من جديد', - logOut: 'تسجيل الخروج', - loggedIn: 'لتسجيل الدّخول مع مستخدم آخر ، يجب عليك <0> تسجيل الخروج أوّلاً.', - loggedInChangePassword: - 'لتغيير كلمة المرور الخاصّة بك ، انتقل إلى <0>حسابك وقم بتعديل كلمة المرور هناك.', - loggedOutInactivity: 'لقد تمّ تسجيل الخروج بسبب عدم النّشاط.', - loggedOutSuccessfully: 'لقد تمّ تسجيل خروجك بنجاح.', - login: 'تسجيل الدخول', - loginAttempts: 'محاولات تسجيل الدخول', - loginUser: 'تسجيل دخول المستخدم', - loginWithAnotherUser: 'لتسجيل الدخول مع مستخدم آخر ، يجب عليك <0> تسجيل الخروج أوّلاً.', - logout: 'تسجيل الخروج', - logoutUser: 'تسجيل خروج المستخدم', - newAPIKeyGenerated: 'تمّ توليد مفتاح API جديد.', - newAccountCreated: - 'تمّ إنشاء حساب جديد لتتمكّن من الوصول إلى {{serverURL}} الرّجاء النّقر فوق الرّابط التّالي أو لصق عنوان URL أدناه في متصفّحّك لتأكيد بريدك الإلكتروني : {{verificationURL}}
بعد التّحقّق من بريدك الإلكتروني ، ستتمكّن من تسجيل الدّخول بنجاح.', - newPassword: 'كلمة مرور جديدة', - resetPassword: 'إعادة تعيين كلمة المرور', - resetPasswordExpiration: 'انتهاء صلاحيّة إعادة تعيين كلمة المرور', - resetPasswordToken: 'رمز إعادة تعيين كلمة المرور', - resetYourPassword: 'إعادة تعيين كلمة المرور الخاصّة بك', - stayLoggedIn: 'ابق متّصلًا', - successfullyUnlocked: 'تمّ فتح القفل بنجاح', - unableToVerify: 'غير قادر على التحقق من', - verified: 'تمّ التحقّق', - verifiedSuccessfully: 'تمّ التحقّق بنجاح', - verify: 'قم بالتّحقّق', - verifyUser: 'قم بالتّحقّق من المستخدم', - verifyYourEmail: 'قم بتأكيد بريدك الألكتروني', - youAreInactive: - 'لم تكن نشطًا منذ فترة قصيرة وسيتمّ تسجيل خروجك قريبًا تلقائيًا من أجل أمنك. هل ترغب في البقاء مسجّلا؟', - youAreReceivingResetPassword: - 'أنت تتلقّى هذا البريد الالكتروني لأنّك (أو لأنّ شخص آخر) طلبت إعادة تعيين كلمة المرور لحسابك. الرّجاء النّقر فوق الرّابط التّالي ، أو لصق هذا الرّابط في متصفّحك لإكمال العمليّة:', - youDidNotRequestPassword: - 'إن لم تطلب هذا ، يرجى تجاهل هذا البريد الإلكتروني وستبقى كلمة مرورك ذاتها بدون تغيير.', - }, - error: { - accountAlreadyActivated: 'تم تفعيل هذا الحساب بالفعل.', - autosaving: 'حدثت مشكلة أثناء حفظ هذا المستند تلقائيًا.', - correctInvalidFields: 'يرجى تصحيح الحقول غير الصالحة.', - deletingFile: 'حدث خطأ أثناء حذف الملف.', - deletingTitle: - 'حدث خطأ أثناء حذف {{title}}. يرجى التحقق من الاتصال الخاص بك والمحاولة مرة أخرى.', - emailOrPasswordIncorrect: 'البريد الإلكتروني أو كلمة المرور المقدمة غير صحيحة.', - followingFieldsInvalid_one: 'الحقل التالي غير صالح:', - followingFieldsInvalid_other: 'الحقول التالية غير صالحة:', - incorrectCollection: 'مجموعة غير صحيحة', - invalidFileType: 'نوع ملف غير صالح', - invalidFileTypeValue: 'نوع ملف غير صالح: {{value}}', - loadingDocument: 'حدثت مشكلة أثناء تحميل المستند برقم التعريف {{id}}.', - missingEmail: 'البريد الإلكتروني مفقود.', - missingIDOfDocument: 'معرّف المستند المراد تحديثه مفقود.', - missingIDOfVersion: 'معرّف النسخة مفقود.', - missingRequiredData: 'توجد بيانات مطلوبة مفقودة.', - noFilesUploaded: 'لم يتمّ رفع أيّة ملفّات.', - noMatchedField: 'لم يتمّ العثور على حقل مطابق لـ "{{label}}"', - noUser: 'لا يوجد مستخدم', - notAllowedToAccessPage: 'لا يسمح لك الوصول إلى هذه الصّفحة.', - notAllowedToPerformAction: 'لا يسمح لك القيام بهذه العمليّة.', - notFound: 'لم يتمّ العثور على المورد المطلوب.', - previewing: 'حدث خطأ في اثناء معاينة هذا المستند.', - problemUploadingFile: 'حدث خطأ اثناء رفع الملفّ.', - tokenInvalidOrExpired: 'الرّمز إمّا غير صالح أو منتهي الصّلاحيّة.', - unPublishingDocument: 'حدث خطأ أثناء إلغاء نشر هذا المستند.', - unableToDeleteCount: 'يتعذّر حذف {{count}} من {{total}} {{label}}.', - unableToUpdateCount: 'يتعذّر تحديث {{count}} من {{total}} {{label}}.', - unauthorized: 'غير مصرّح لك ، عليك أن تقوم بتسجيل الدّخول لتتمكّن من تقديم هذا الطّلب.', - unknown: 'حدث خطأ غير معروف.', - unspecific: 'حدث خطأ.', - userLocked: 'تمّ قفل هذا المستخدم نظرًا لوجود عدد كبير من محاولات تسجيل الدّخول الغير ناجحة.', - valueMustBeUnique: 'على القيمة أن تكون فريدة', - verificationTokenInvalid: 'رمز التحقّق غير صالح.', - }, - fields: { - addLabel: 'أضف {{label}}', - addLink: 'أضف رابط', - addNew: 'أضف جديد', - addNewLabel: 'أضف {{label}} جديد', - addRelationship: 'أضف علاقة', - addUpload: 'أضف تحميل', - block: 'وحدة محتوى', - blockType: 'نوع وحدة المحتوى', - blocks: 'وحدات المحتوى', - chooseBetweenCustomTextOrDocument: 'اختر بين إدخال عنوان URL نصّي مخصّص أو الرّبط بمستند آخر.', - chooseDocumentToLink: 'اختر مستندًا للربط', - chooseFromExisting: 'اختر من القائمة', - chooseLabel: 'اختر {{label}}', - collapseAll: 'طيّ الكلّ', - customURL: 'URL مخصّص', - editLabelData: 'عدّل بيانات {{label}}', - editLink: 'عدّل الرّابط', - editRelationship: 'عدّل العلاقة', - enterURL: 'ادخل عنوان URL', - internalLink: 'رابط داخلي', - itemsAndMore: '{{items}} و {{count}} أخرى', - labelRelationship: '{{label}} علاقة', - latitude: 'خطّ العرض', - linkType: 'نوع الرّابط', - linkedTo: 'تمّ الرّبط ل <0>{{label}}', - longitude: 'خطّ الطّول', - newLabel: '{{label}} جديد', - openInNewTab: 'الفتح في علامة تبويب جديدة', - passwordsDoNotMatch: 'كلمة المرور غير مطابقة.', - relatedDocument: 'مستند مربوط', - relationTo: 'ربط ل', - removeRelationship: 'حذف العلاقة', - removeUpload: 'حذف المحتوى المرفوع', - saveChanges: 'حفظ التّغييرات', - searchForBlock: 'ابحث عن وحدة محتوى', - selectExistingLabel: 'اختيار {{label}} من القائمة', - selectFieldsToEdit: 'حدّد الحقول اللتي تريد تعديلها', - showAll: 'إظهار الكلّ', - swapRelationship: 'تبديل العلاقة', - swapUpload: 'تبديل المحتوى المرفوع', - textToDisplay: 'النصّ الذي تريد إظهاره', - toggleBlock: 'Toggle block', - uploadNewLabel: 'رفع {{label}} جديد', - }, - general: { - aboutToDelete: 'أنت على وشك حذف {{label}} <1>{{title}}. هل أنت متأكّد؟', - aboutToDeleteCount_many: 'أنت على وشك حذف {{count}} {{label}}', - aboutToDeleteCount_one: 'أنت على وشك حذف {{count}} {{label}}', - aboutToDeleteCount_other: 'أنت على وشك حذف {{count}} {{label}}', - addBelow: 'أضف في الاسفل', - addFilter: 'أضف فلتر', - adminTheme: 'شكل واجهة المستخدم', - and: 'و', - applyChanges: 'طبق التغييرات', - ascending: 'تصاعدي', - automatic: 'تلقائي', - backToDashboard: 'العودة للوحة التّحكّم', - cancel: 'إلغاء', - changesNotSaved: 'لم يتمّ حفظ التّغييرات. إن غادرت الآن ، ستفقد تغييراتك.', - close: 'إغلاق', - collapse: 'طيّ', - collections: 'المجموعات', - columnToSort: 'التّرتيب حسب العامود', - columns: 'الأعمدة', - confirm: 'تأكيد', - confirmDeletion: 'تأكيد الحذف', - confirmDuplication: 'تأكيد التّكرار', - copied: 'تمّ النّسخ', - copy: 'نسخ', - create: 'إنشاء', - createNew: 'أنشاء جديد', - createNewLabel: 'إنشاء {{label}} جديد', - created: 'تمّ الإنشاء', - createdAt: 'تمّ الإنشاء في', - creating: 'يتمّ الإنشاء', - creatingNewLabel: 'جاري إنشاء {{label}} جديد', - dark: 'غامق', - dashboard: 'لوحة التّحكّم', - delete: 'حذف', - deletedCountSuccessfully: 'تمّ حذف {{count}} {{label}} بنجاح.', - deletedSuccessfully: 'تمّ الحذف بنجاح.', - deleting: 'يتمّ الحذف...', - descending: 'تنازلي', - deselectAllRows: 'إلغاء تحديد جميع الصفوف', - duplicate: 'استنساخ', - duplicateWithoutSaving: 'استنساخ بدون حفظ التغييرات', - edit: 'تعديل', - editLabel: 'تعديل {{label}}', - editing: 'جاري التعديل', - editingLabel_many: 'تعديل {{count}} {{label}}', - editingLabel_one: 'تعديل {{count}} {{label}}', - editingLabel_other: 'تعديل {{count}} {{label}}', - email: 'البريد الإلكتروني', - emailAddress: 'عنوان البريد الإلكتروني', - enterAValue: 'أدخل قيمة', - error: 'خطأ', - errors: 'أخطاء', - fallbackToDefaultLocale: 'الرجوع إلى اللغة الافتراضية', - filter: 'تصفية', - filterWhere: 'تصفية {{label}} حيث', - filters: 'عوامل التصفية', - globals: 'عامة', - language: 'اللغة', - lastModified: 'آخر تعديل', - leaveAnyway: 'المغادرة على أي حال', - leaveWithoutSaving: 'المغادرة بدون حفظ', - light: 'فاتح', - livePreview: 'معاينة مباشرة', - loading: 'يتمّ التّحميل', - locale: 'اللّغة', - locales: 'اللّغات', - menu: 'قائمة', - moveDown: 'التّحريك إلى الأسفل', - moveUp: 'التّحريك إلى الأعلى', - newPassword: 'كلمة مرور جديدة', - noFiltersSet: 'لم يتم تعيين أي عوامل تصفية', - noLabel: '<لا {{label}}>', - noOptions: 'لا خيارات', - noResults: - 'لا يوجد {{label}}. إما أن لا {{label}} موجودة حتى الآن أو لا تتطابق مع عوامل التصفية التي حددتها أعلاه.', - noValue: 'لا يوجد قيمة', - none: 'لا شيء', - notFound: 'غير موجود', - nothingFound: 'لم يتم العثور على شيء', - of: 'من', - open: 'فتح', - or: 'أو', - order: 'التّرتيب', - pageNotFound: 'الصّفحة غير موجودة', - password: 'كلمة المرور', - payloadSettings: 'الإعدادات', - perPage: 'لكلّ صفحة: {{limit}}', - remove: 'إزالة', - reset: 'إعادة تعيين', - row: 'سطر', - rows: 'أسطُر', - save: 'حفظ', - saving: 'جاري الحفظ...', - searchBy: 'البحث عن طريق {{label}}', - selectAll: 'تحديد كل {{count}} {{label}}', - selectAllRows: 'حدد جميع الصفوف', - selectValue: 'اختيار قيمة', - selectedCount: 'تم تحديد {{count}} {{label}}', - showAllLabel: 'عرض كل {{label}}', - sorryNotFound: 'عذرًا - لا يوجد شيء يتوافق مع طلبك.', - sort: 'ترتيب', - sortByLabelDirection: 'رتّب حسب {{label}} {{direction}}', - stayOnThisPage: 'البقاء على هذه الصفحة', - submissionSuccessful: 'تمت الإرسال بنجاح.', - submit: 'إرسال', - successfullyCreated: '{{label}} تم إنشاؤها بنجاح.', - successfullyDuplicated: '{{label}} تم استنساخها بنجاح.', - thisLanguage: 'العربية', - titleDeleted: 'تم حذف {{label}} "{{title}}" بنجاح.', - unauthorized: 'غير مصرح به', - unsavedChangesDuplicate: 'لديك تغييرات لم يتم حفظها. هل تريد الاستمرار في الاستنساخ؟', - untitled: 'بدون عنوان', - updatedAt: 'تم التحديث في', - updatedCountSuccessfully: 'تم تحديث {{count}} {{label}} بنجاح.', - updatedSuccessfully: 'تم التحديث بنجاح.', - updating: 'جار التحديث', - uploading: 'جار الرفع', - user: 'المستخدم', - users: 'المستخدمين', - value: 'القيمة', - welcome: 'مرحبًا', - }, - operators: { - contains: 'يحتوي', - equals: 'يساوي', - exists: 'موجود', - isGreaterThan: 'أكبر من', - isGreaterThanOrEqualTo: 'أكبر أو يساوي', - isIn: 'موجود في', - isLessThan: 'أصغر من', - isLessThanOrEqualTo: 'أصغر أو يساوي', - isLike: 'هو مثل', - isNotEqualTo: 'لا يساوي', - isNotIn: 'غير موجود في', - near: 'قريب من', - }, - upload: { - crop: 'محصول', - cropToolDescription: 'اسحب الزوايا المحددة للمنطقة، رسم منطقة جديدة أو قم بضبط القيم أدناه.', - dragAndDrop: 'قم بسحب وإسقاط ملفّ', - dragAndDropHere: 'أو اسحب الملفّ وأفلته هنا', - editImage: 'تعديل الصورة', - fileName: 'اسم الملفّ', - fileSize: 'حجم الملفّ', - focalPoint: 'نقطة التركيز', - focalPointDescription: 'اسحب النقطة المركزية مباشرة على المعاينة أو قم بضبط القيم أدناه.', - height: 'الطّول', - lessInfo: 'معلومات أقلّ', - moreInfo: 'معلومات أكثر', - previewSizes: 'أحجام المعاينة', - selectCollectionToBrowse: 'حدّد مجموعة لاستعراضها', - selectFile: 'اختر ملفّ', - setCropArea: 'حدد منطقة القص', - setFocalPoint: 'حدد النقطة البؤرية', - sizes: 'الاحجام', - sizesFor: 'أحجام لـ {{label}}', - width: 'العرض', - }, - validation: { - emailAddress: 'يرجى إدخال عنوان بريد إلكتروني صحيح.', - enterNumber: 'يرجى إدخال رقم صحيح.', - fieldHasNo: 'هذا الحقل ليس لديه {{label}}', - greaterThanMax: '{{value}} أكبر من الحد الأقصى المسموح به {{label}} الذي يبلغ {{max}}.', - invalidInput: 'هذا الحقل لديه إدخال غير صالح.', - invalidSelection: 'هذا الحقل لديه اختيار غير صالح.', - invalidSelections: 'هذا الحقل لديه الاختيارات الغير صالحة التالية:', - lessThanMin: '{{value}} أقل من الحد الأدنى المسموح به {{label}} الذي يبلغ {{min}}.', - limitReached: 'تم الوصول إلى الحد الأقصى، يمكن إضافة {{max}} عناصر فقط.', - longerThanMin: 'يجب أن يكون هذا القيمة أطول من الحد الأدنى للطول الذي هو {{minLength}} أحرف.', - notValidDate: '"{{value}}" ليس تاريخا صالحا.', - required: 'هذا الحقل مطلوب.', - requiresAtLeast: 'هذا الحقل يتطلب على الأقل {{count}} {{label}}.', - requiresNoMoreThan: 'هذا الحقل يتطلب عدم تجاوز {{count}} {{label}}.', - requiresTwoNumbers: 'هذا الحقل يتطلب رقمين.', - shorterThanMax: 'يجب أن تكون هذه القيمة أقصر من الحد الأقصى للطول الذي هو {{maxLength}} أحرف.', - trueOrFalse: 'يمكن أن يكون هذا الحقل مساويًا فقط للقيمتين صحيح أو خطأ.', - validUploadID: 'هذا الحقل ليس معرّف تحميل صالح.', - }, - version: { - aboutToPublishSelection: 'أنت على وشك نشر كلّ {{label}} في التّحديد. هل أنت متأكّد؟', - aboutToRestore: - 'أنت على وشك استرجاع هذا المستند {{label}} إلى الحالة التّي كان عليها في {{versionDate}}.', - aboutToRestoreGlobal: - 'أنت على وشك استرجاع الاعداد العامّ {{label}} إلى الحالة التي كان عليها في {{versionDate}}.', - aboutToRevertToPublished: 'أنت على وشك إعادة هذا المستند إلى حالته المنشورة. هل أنت متأكّد؟', - aboutToUnpublish: 'أنت على وشك إلغاء نشر هذا المستند. هل أنت متأكّد؟', - aboutToUnpublishSelection: 'أنت على وشك إلغاء نشر كلّ {{label}} في التّحديد. هل أنت متأكّد؟', - autosave: 'حفظ تلقائي', - autosavedSuccessfully: 'تمّ الحفظ التّلقائي بنجاح.', - autosavedVersion: 'النّسخة المحفوظة تلقائياً', - changed: 'تمّ التّغيير', - compareVersion: 'مقارنة النّسخة مع:', - confirmPublish: 'تأكيد النّشر', - confirmRevertToSaved: 'تأكيد الرّجوع للنسخة المنشورة', - confirmUnpublish: 'تأكيد إلغاء النّشر', - confirmVersionRestoration: 'تأكيد إستعادة النّسخة', - currentDocumentStatus: 'المستند {{docStatus}} الحالي', - draft: 'مسودّة', - draftSavedSuccessfully: 'تمّ حفظ المسودّة بنجاح.', - lastSavedAgo: 'تم الحفظ آخر مرة قبل {{distance}}', - noFurtherVersionsFound: 'لم يتمّ العثور على نسخات أخرى', - noRowsFound: 'لم يتمّ العثور على {{label}}', - preview: 'معاينة', - problemRestoringVersion: 'حدث خطأ في استعادة هذه النّسخة', - publish: 'نشر', - publishChanges: 'نشر التّغييرات', - published: 'تمّ النّشر', - publishing: 'نشر', - restoreThisVersion: 'استعادة هذه النّسخة', - restoredSuccessfully: 'تمّت الاستعادة بنحاح.', - restoring: 'تتمّ الاستعادة...', - revertToPublished: 'الرّجوع للنسخة المنشورة', - reverting: 'يتمّ الاسترجاع...', - saveDraft: 'حفظ المسودّة', - selectLocales: 'حدّد اللّغات المراد عرضها', - selectVersionToCompare: 'حدّد نسخة للمقارنة', - showLocales: 'اظهر اللّغات:', - showingVersionsFor: 'يتمّ عرض النًّسخ ل:', - status: 'الحالة', - type: 'النّوع', - unpublish: 'الغاء النّشر', - unpublishing: 'يتمّ الغاء النّشر...', - version: 'النّسخة', - versionCount_many: 'تمّ العثور على {{count}} نُسخ', - versionCount_none: 'لم يتمّ العثور على أيّ من النّسخ', - versionCount_one: 'تمّ العثور على {{count}} من النّسخ', - versionCount_other: 'تمّ العثور على {{count}} نُسخ', - versionCreatedOn: 'تمّ ﻹنشاء النّسخة في {{version}}:', - versionID: 'مُعرّف النّسخة', - versions: 'النُّسَخ', - viewingVersion: 'يتمّ استعراض نسخة ل {{entityLabel}} {{documentTitle}}', - viewingVersionGlobal: 'يتمّ استعراض نسخة للاعداد العامّ {{entityLabel}}', - viewingVersions: 'يتمّ استعراض النُّسَخ ل {{entityLabel}} {{documentTitle}}', - viewingVersionsGlobal: 'يتمّ استعراض النُّسَخ للاعداد العامّ {{entityLabel}}', +export const ar = { + dateFNSKey: 'ar', + translations: { + authentication: { + account: 'الحساب', + accountOfCurrentUser: 'حساب المستخدم الحالي', + alreadyActivated: 'تمّ التّفعيل بالفعل', + alreadyLoggedIn: 'تمّ تسجيل الدّخول بالفعل', + apiKey: 'مفتاح API', + backToLogin: 'العودة لتسجيل الدخول', + beginCreateFirstUser: 'للبدء, قم بإنشاء المستخدم الأوّل.', + changePassword: 'تغيير كلمة المرور', + checkYourEmailForPasswordReset: + 'تحقّق من بريدك الإلكتروني بحثًا عن رابط يسمح لك بإعادة تعيين كلمة المرور الخاصّة بك بشكل آمن.', + confirmGeneration: 'تأكيد التّوليد', + confirmPassword: 'تأكيد كلمة المرور', + createFirstUser: 'إنشاء المستخدم الأوّل', + emailNotValid: 'البريد الإلكتروني غير صالح', + emailSent: 'تمّ ارسال البريد الإلكتروني', + enableAPIKey: 'تفعيل مفتاح API', + failedToUnlock: 'فشل فتح القفل', + forceUnlock: 'إجبار فتح القفل', + forgotPassword: 'نسيت كلمة المرور', + forgotPasswordEmailInstructions: + 'يرجى إدخال البريد الالكتروني أدناه. ستتلقّى رسالة بريد إلكتروني تحتوي على إرشادات حول كيفيّة إعادة تعيين كلمة المرور الخاصّة بك.', + forgotPasswordQuestion: 'هل نسيت كلمة المرور؟', + generate: 'توليد', + generateNewAPIKey: 'توليد مفتاح API جديد', + generatingNewAPIKeyWillInvalidate: + 'سيؤدّي إنشاء مفتاح API جديد إلى <1> إبطال المفتاح السّابق. هل أنت متأكّد أنّك تريد المتابعة؟', + lockUntil: 'قفل حتى', + logBackIn: 'تسجيل الدّخول من جديد', + logOut: 'تسجيل الخروج', + loggedIn: 'لتسجيل الدّخول مع مستخدم آخر ، يجب عليك <0> تسجيل الخروج أوّلاً.', + loggedInChangePassword: + 'لتغيير كلمة المرور الخاصّة بك ، انتقل إلى <0>حسابك وقم بتعديل كلمة المرور هناك.', + loggedOutInactivity: 'لقد تمّ تسجيل الخروج بسبب عدم النّشاط.', + loggedOutSuccessfully: 'لقد تمّ تسجيل خروجك بنجاح.', + login: 'تسجيل الدخول', + loginAttempts: 'محاولات تسجيل الدخول', + loginUser: 'تسجيل دخول المستخدم', + loginWithAnotherUser: 'لتسجيل الدخول مع مستخدم آخر ، يجب عليك <0> تسجيل الخروج أوّلاً.', + logout: 'تسجيل الخروج', + logoutUser: 'تسجيل خروج المستخدم', + newAPIKeyGenerated: 'تمّ توليد مفتاح API جديد.', + newAccountCreated: + 'تمّ إنشاء حساب جديد لتتمكّن من الوصول إلى {{serverURL}} الرّجاء النّقر فوق الرّابط التّالي أو لصق عنوان URL أدناه في متصفّحّك لتأكيد بريدك الإلكتروني : {{verificationURL}}
بعد التّحقّق من بريدك الإلكتروني ، ستتمكّن من تسجيل الدّخول بنجاح.', + newPassword: 'كلمة مرور جديدة', + resetPassword: 'إعادة تعيين كلمة المرور', + resetPasswordExpiration: 'انتهاء صلاحيّة إعادة تعيين كلمة المرور', + resetPasswordToken: 'رمز إعادة تعيين كلمة المرور', + resetYourPassword: 'إعادة تعيين كلمة المرور الخاصّة بك', + stayLoggedIn: 'ابق متّصلًا', + successfullyUnlocked: 'تمّ فتح القفل بنجاح', + unableToVerify: 'غير قادر على التحقق من', + verified: 'تمّ التحقّق', + verifiedSuccessfully: 'تمّ التحقّق بنجاح', + verify: 'قم بالتّحقّق', + verifyUser: 'قم بالتّحقّق من المستخدم', + verifyYourEmail: 'قم بتأكيد بريدك الألكتروني', + youAreInactive: + 'لم تكن نشطًا منذ فترة قصيرة وسيتمّ تسجيل خروجك قريبًا تلقائيًا من أجل أمنك. هل ترغب في البقاء مسجّلا؟', + youAreReceivingResetPassword: + 'أنت تتلقّى هذا البريد الالكتروني لأنّك (أو لأنّ شخص آخر) طلبت إعادة تعيين كلمة المرور لحسابك. الرّجاء النّقر فوق الرّابط التّالي ، أو لصق هذا الرّابط في متصفّحك لإكمال العمليّة:', + youDidNotRequestPassword: + 'إن لم تطلب هذا ، يرجى تجاهل هذا البريد الإلكتروني وستبقى كلمة مرورك ذاتها بدون تغيير.', + }, + error: { + accountAlreadyActivated: 'تم تفعيل هذا الحساب بالفعل.', + autosaving: 'حدثت مشكلة أثناء حفظ هذا المستند تلقائيًا.', + correctInvalidFields: 'يرجى تصحيح الحقول غير الصالحة.', + deletingFile: 'حدث خطأ أثناء حذف الملف.', + deletingTitle: + 'حدث خطأ أثناء حذف {{title}}. يرجى التحقق من الاتصال الخاص بك والمحاولة مرة أخرى.', + emailOrPasswordIncorrect: 'البريد الإلكتروني أو كلمة المرور المقدمة غير صحيحة.', + followingFieldsInvalid_one: 'الحقل التالي غير صالح:', + followingFieldsInvalid_other: 'الحقول التالية غير صالحة:', + incorrectCollection: 'مجموعة غير صحيحة', + invalidFileType: 'نوع ملف غير صالح', + invalidFileTypeValue: 'نوع ملف غير صالح: {{value}}', + loadingDocument: 'حدثت مشكلة أثناء تحميل المستند برقم التعريف {{id}}.', + missingEmail: 'البريد الإلكتروني مفقود.', + missingIDOfDocument: 'معرّف المستند المراد تحديثه مفقود.', + missingIDOfVersion: 'معرّف النسخة مفقود.', + missingRequiredData: 'توجد بيانات مطلوبة مفقودة.', + noFilesUploaded: 'لم يتمّ رفع أيّة ملفّات.', + noMatchedField: 'لم يتمّ العثور على حقل مطابق لـ "{{label}}"', + noUser: 'لا يوجد مستخدم', + notAllowedToAccessPage: 'لا يسمح لك الوصول إلى هذه الصّفحة.', + notAllowedToPerformAction: 'لا يسمح لك القيام بهذه العمليّة.', + notFound: 'لم يتمّ العثور على المورد المطلوب.', + previewing: 'حدث خطأ في اثناء معاينة هذا المستند.', + problemUploadingFile: 'حدث خطأ اثناء رفع الملفّ.', + tokenInvalidOrExpired: 'الرّمز إمّا غير صالح أو منتهي الصّلاحيّة.', + unPublishingDocument: 'حدث خطأ أثناء إلغاء نشر هذا المستند.', + unableToDeleteCount: 'يتعذّر حذف {{count}} من {{total}} {{label}}.', + unableToUpdateCount: 'يتعذّر تحديث {{count}} من {{total}} {{label}}.', + unauthorized: 'غير مصرّح لك ، عليك أن تقوم بتسجيل الدّخول لتتمكّن من تقديم هذا الطّلب.', + unknown: 'حدث خطأ غير معروف.', + unspecific: 'حدث خطأ.', + userLocked: 'تمّ قفل هذا المستخدم نظرًا لوجود عدد كبير من محاولات تسجيل الدّخول الغير ناجحة.', + valueMustBeUnique: 'على القيمة أن تكون فريدة', + verificationTokenInvalid: 'رمز التحقّق غير صالح.', + }, + fields: { + addLabel: 'أضف {{label}}', + addLink: 'أضف رابط', + addNew: 'أضف جديد', + addNewLabel: 'أضف {{label}} جديد', + addRelationship: 'أضف علاقة', + addUpload: 'أضف تحميل', + block: 'وحدة محتوى', + blockType: 'نوع وحدة المحتوى', + blocks: 'وحدات المحتوى', + chooseBetweenCustomTextOrDocument: + 'اختر بين إدخال عنوان URL نصّي مخصّص أو الرّبط بمستند آخر.', + chooseDocumentToLink: 'اختر مستندًا للربط', + chooseFromExisting: 'اختر من القائمة', + chooseLabel: 'اختر {{label}}', + collapseAll: 'طيّ الكلّ', + customURL: 'URL مخصّص', + editLabelData: 'عدّل بيانات {{label}}', + editLink: 'عدّل الرّابط', + editRelationship: 'عدّل العلاقة', + enterURL: 'ادخل عنوان URL', + internalLink: 'رابط داخلي', + itemsAndMore: '{{items}} و {{count}} أخرى', + labelRelationship: '{{label}} علاقة', + latitude: 'خطّ العرض', + linkType: 'نوع الرّابط', + linkedTo: 'تمّ الرّبط ل <0>{{label}}', + longitude: 'خطّ الطّول', + newLabel: '{{label}} جديد', + openInNewTab: 'الفتح في علامة تبويب جديدة', + passwordsDoNotMatch: 'كلمة المرور غير مطابقة.', + relatedDocument: 'مستند مربوط', + relationTo: 'ربط ل', + removeRelationship: 'حذف العلاقة', + removeUpload: 'حذف المحتوى المرفوع', + saveChanges: 'حفظ التّغييرات', + searchForBlock: 'ابحث عن وحدة محتوى', + selectExistingLabel: 'اختيار {{label}} من القائمة', + selectFieldsToEdit: 'حدّد الحقول اللتي تريد تعديلها', + showAll: 'إظهار الكلّ', + swapRelationship: 'تبديل العلاقة', + swapUpload: 'تبديل المحتوى المرفوع', + textToDisplay: 'النصّ الذي تريد إظهاره', + toggleBlock: 'Toggle block', + uploadNewLabel: 'رفع {{label}} جديد', + }, + general: { + aboutToDelete: 'أنت على وشك حذف {{label}} <1>{{title}}. هل أنت متأكّد؟', + aboutToDeleteCount_many: 'أنت على وشك حذف {{count}} {{label}}', + aboutToDeleteCount_one: 'أنت على وشك حذف {{count}} {{label}}', + aboutToDeleteCount_other: 'أنت على وشك حذف {{count}} {{label}}', + addBelow: 'أضف في الاسفل', + addFilter: 'أضف فلتر', + adminTheme: 'شكل واجهة المستخدم', + and: 'و', + applyChanges: 'طبق التغييرات', + ascending: 'تصاعدي', + automatic: 'تلقائي', + backToDashboard: 'العودة للوحة التّحكّم', + cancel: 'إلغاء', + changesNotSaved: 'لم يتمّ حفظ التّغييرات. إن غادرت الآن ، ستفقد تغييراتك.', + close: 'إغلاق', + collapse: 'طيّ', + collections: 'المجموعات', + columnToSort: 'التّرتيب حسب العامود', + columns: 'الأعمدة', + confirm: 'تأكيد', + confirmDeletion: 'تأكيد الحذف', + confirmDuplication: 'تأكيد التّكرار', + copied: 'تمّ النّسخ', + copy: 'نسخ', + create: 'إنشاء', + createNew: 'أنشاء جديد', + createNewLabel: 'إنشاء {{label}} جديد', + created: 'تمّ الإنشاء', + createdAt: 'تمّ الإنشاء في', + creating: 'يتمّ الإنشاء', + creatingNewLabel: 'جاري إنشاء {{label}} جديد', + dark: 'غامق', + dashboard: 'لوحة التّحكّم', + delete: 'حذف', + deletedCountSuccessfully: 'تمّ حذف {{count}} {{label}} بنجاح.', + deletedSuccessfully: 'تمّ الحذف بنجاح.', + deleting: 'يتمّ الحذف...', + descending: 'تنازلي', + deselectAllRows: 'إلغاء تحديد جميع الصفوف', + duplicate: 'استنساخ', + duplicateWithoutSaving: 'استنساخ بدون حفظ التغييرات', + edit: 'تعديل', + editLabel: 'تعديل {{label}}', + editing: 'جاري التعديل', + editingLabel_many: 'تعديل {{count}} {{label}}', + editingLabel_one: 'تعديل {{count}} {{label}}', + editingLabel_other: 'تعديل {{count}} {{label}}', + email: 'البريد الإلكتروني', + emailAddress: 'عنوان البريد الإلكتروني', + enterAValue: 'أدخل قيمة', + error: 'خطأ', + errors: 'أخطاء', + fallbackToDefaultLocale: 'الرجوع إلى اللغة الافتراضية', + filter: 'تصفية', + filterWhere: 'تصفية {{label}} حيث', + filters: 'عوامل التصفية', + globals: 'عامة', + language: 'اللغة', + lastModified: 'آخر تعديل', + leaveAnyway: 'المغادرة على أي حال', + leaveWithoutSaving: 'المغادرة بدون حفظ', + light: 'فاتح', + livePreview: 'معاينة مباشرة', + loading: 'يتمّ التّحميل', + locale: 'اللّغة', + locales: 'اللّغات', + menu: 'قائمة', + moveDown: 'التّحريك إلى الأسفل', + moveUp: 'التّحريك إلى الأعلى', + newPassword: 'كلمة مرور جديدة', + noFiltersSet: 'لم يتم تعيين أي عوامل تصفية', + noLabel: '<لا {{label}}>', + noOptions: 'لا خيارات', + noResults: + 'لا يوجد {{label}}. إما أن لا {{label}} موجودة حتى الآن أو لا تتطابق مع عوامل التصفية التي حددتها أعلاه.', + noValue: 'لا يوجد قيمة', + none: 'لا شيء', + notFound: 'غير موجود', + nothingFound: 'لم يتم العثور على شيء', + of: 'من', + open: 'فتح', + or: 'أو', + order: 'التّرتيب', + pageNotFound: 'الصّفحة غير موجودة', + password: 'كلمة المرور', + payloadSettings: 'الإعدادات', + perPage: 'لكلّ صفحة: {{limit}}', + remove: 'إزالة', + reset: 'إعادة تعيين', + row: 'سطر', + rows: 'أسطُر', + save: 'حفظ', + saving: 'جاري الحفظ...', + searchBy: 'البحث عن طريق {{label}}', + selectAll: 'تحديد كل {{count}} {{label}}', + selectAllRows: 'حدد جميع الصفوف', + selectValue: 'اختيار قيمة', + selectedCount: 'تم تحديد {{count}} {{label}}', + showAllLabel: 'عرض كل {{label}}', + sorryNotFound: 'عذرًا - لا يوجد شيء يتوافق مع طلبك.', + sort: 'ترتيب', + sortByLabelDirection: 'رتّب حسب {{label}} {{direction}}', + stayOnThisPage: 'البقاء على هذه الصفحة', + submissionSuccessful: 'تمت الإرسال بنجاح.', + submit: 'إرسال', + successfullyCreated: '{{label}} تم إنشاؤها بنجاح.', + successfullyDuplicated: '{{label}} تم استنساخها بنجاح.', + thisLanguage: 'العربية', + titleDeleted: 'تم حذف {{label}} "{{title}}" بنجاح.', + unauthorized: 'غير مصرح به', + unsavedChangesDuplicate: 'لديك تغييرات لم يتم حفظها. هل تريد الاستمرار في الاستنساخ؟', + untitled: 'بدون عنوان', + updatedAt: 'تم التحديث في', + updatedCountSuccessfully: 'تم تحديث {{count}} {{label}} بنجاح.', + updatedSuccessfully: 'تم التحديث بنجاح.', + updating: 'جار التحديث', + uploading: 'جار الرفع', + user: 'المستخدم', + users: 'المستخدمين', + value: 'القيمة', + welcome: 'مرحبًا', + }, + operators: { + contains: 'يحتوي', + equals: 'يساوي', + exists: 'موجود', + isGreaterThan: 'أكبر من', + isGreaterThanOrEqualTo: 'أكبر أو يساوي', + isIn: 'موجود في', + isLessThan: 'أصغر من', + isLessThanOrEqualTo: 'أصغر أو يساوي', + isLike: 'هو مثل', + isNotEqualTo: 'لا يساوي', + isNotIn: 'غير موجود في', + near: 'قريب من', + }, + upload: { + crop: 'محصول', + cropToolDescription: 'اسحب الزوايا المحددة للمنطقة، رسم منطقة جديدة أو قم بضبط القيم أدناه.', + dragAndDrop: 'قم بسحب وإسقاط ملفّ', + dragAndDropHere: 'أو اسحب الملفّ وأفلته هنا', + editImage: 'تعديل الصورة', + fileName: 'اسم الملفّ', + fileSize: 'حجم الملفّ', + focalPoint: 'نقطة التركيز', + focalPointDescription: 'اسحب النقطة المركزية مباشرة على المعاينة أو قم بضبط القيم أدناه.', + height: 'الطّول', + lessInfo: 'معلومات أقلّ', + moreInfo: 'معلومات أكثر', + previewSizes: 'أحجام المعاينة', + selectCollectionToBrowse: 'حدّد مجموعة لاستعراضها', + selectFile: 'اختر ملفّ', + setCropArea: 'حدد منطقة القص', + setFocalPoint: 'حدد النقطة البؤرية', + sizes: 'الاحجام', + sizesFor: 'أحجام لـ {{label}}', + width: 'العرض', + }, + validation: { + emailAddress: 'يرجى إدخال عنوان بريد إلكتروني صحيح.', + enterNumber: 'يرجى إدخال رقم صحيح.', + fieldHasNo: 'هذا الحقل ليس لديه {{label}}', + greaterThanMax: '{{value}} أكبر من الحد الأقصى المسموح به {{label}} الذي يبلغ {{max}}.', + invalidInput: 'هذا الحقل لديه إدخال غير صالح.', + invalidSelection: 'هذا الحقل لديه اختيار غير صالح.', + invalidSelections: 'هذا الحقل لديه الاختيارات الغير صالحة التالية:', + lessThanMin: '{{value}} أقل من الحد الأدنى المسموح به {{label}} الذي يبلغ {{min}}.', + limitReached: 'تم الوصول إلى الحد الأقصى، يمكن إضافة {{max}} عناصر فقط.', + longerThanMin: 'يجب أن يكون هذا القيمة أطول من الحد الأدنى للطول الذي هو {{minLength}} أحرف.', + notValidDate: '"{{value}}" ليس تاريخا صالحا.', + required: 'هذا الحقل مطلوب.', + requiresAtLeast: 'هذا الحقل يتطلب على الأقل {{count}} {{label}}.', + requiresNoMoreThan: 'هذا الحقل يتطلب عدم تجاوز {{count}} {{label}}.', + requiresTwoNumbers: 'هذا الحقل يتطلب رقمين.', + shorterThanMax: + 'يجب أن تكون هذه القيمة أقصر من الحد الأقصى للطول الذي هو {{maxLength}} أحرف.', + trueOrFalse: 'يمكن أن يكون هذا الحقل مساويًا فقط للقيمتين صحيح أو خطأ.', + validUploadID: 'هذا الحقل ليس معرّف تحميل صالح.', + }, + version: { + type: 'النّوع', + aboutToPublishSelection: 'أنت على وشك نشر كلّ {{label}} في التّحديد. هل أنت متأكّد؟', + aboutToRestore: + 'أنت على وشك استرجاع هذا المستند {{label}} إلى الحالة التّي كان عليها في {{versionDate}}.', + aboutToRestoreGlobal: + 'أنت على وشك استرجاع الاعداد العامّ {{label}} إلى الحالة التي كان عليها في {{versionDate}}.', + aboutToRevertToPublished: 'أنت على وشك إعادة هذا المستند إلى حالته المنشورة. هل أنت متأكّد؟', + aboutToUnpublish: 'أنت على وشك إلغاء نشر هذا المستند. هل أنت متأكّد؟', + aboutToUnpublishSelection: 'أنت على وشك إلغاء نشر كلّ {{label}} في التّحديد. هل أنت متأكّد؟', + autosave: 'حفظ تلقائي', + autosavedSuccessfully: 'تمّ الحفظ التّلقائي بنجاح.', + autosavedVersion: 'النّسخة المحفوظة تلقائياً', + changed: 'تمّ التّغيير', + compareVersion: 'مقارنة النّسخة مع:', + confirmPublish: 'تأكيد النّشر', + confirmRevertToSaved: 'تأكيد الرّجوع للنسخة المنشورة', + confirmUnpublish: 'تأكيد إلغاء النّشر', + confirmVersionRestoration: 'تأكيد إستعادة النّسخة', + currentDocumentStatus: 'المستند {{docStatus}} الحالي', + draft: 'مسودّة', + draftSavedSuccessfully: 'تمّ حفظ المسودّة بنجاح.', + lastSavedAgo: 'تم الحفظ آخر مرة قبل {{distance}}', + noFurtherVersionsFound: 'لم يتمّ العثور على نسخات أخرى', + noRowsFound: 'لم يتمّ العثور على {{label}}', + preview: 'معاينة', + problemRestoringVersion: 'حدث خطأ في استعادة هذه النّسخة', + publish: 'نشر', + publishChanges: 'نشر التّغييرات', + published: 'تمّ النّشر', + publishing: 'نشر', + restoreThisVersion: 'استعادة هذه النّسخة', + restoredSuccessfully: 'تمّت الاستعادة بنحاح.', + restoring: 'تتمّ الاستعادة...', + revertToPublished: 'الرّجوع للنسخة المنشورة', + reverting: 'يتمّ الاسترجاع...', + saveDraft: 'حفظ المسودّة', + selectLocales: 'حدّد اللّغات المراد عرضها', + selectVersionToCompare: 'حدّد نسخة للمقارنة', + showLocales: 'اظهر اللّغات:', + showingVersionsFor: 'يتمّ عرض النًّسخ ل:', + status: 'الحالة', + unpublish: 'الغاء النّشر', + unpublishing: 'يتمّ الغاء النّشر...', + version: 'النّسخة', + versionCount_many: 'تمّ العثور على {{count}} نُسخ', + versionCount_none: 'لم يتمّ العثور على أيّ من النّسخ', + versionCount_one: 'تمّ العثور على {{count}} من النّسخ', + versionCount_other: 'تمّ العثور على {{count}} نُسخ', + versionCreatedOn: 'تمّ ﻹنشاء النّسخة في {{version}}:', + versionID: 'مُعرّف النّسخة', + versions: 'النُّسَخ', + viewingVersion: 'يتمّ استعراض نسخة ل {{entityLabel}} {{documentTitle}}', + viewingVersionGlobal: 'يتمّ استعراض نسخة للاعداد العامّ {{entityLabel}}', + viewingVersions: 'يتمّ استعراض النُّسَخ ل {{entityLabel}} {{documentTitle}}', + viewingVersionsGlobal: 'يتمّ استعراض النُّسَخ للاعداد العامّ {{entityLabel}}', + }, }, } diff --git a/packages/translations/src/languages/de.ts b/packages/translations/src/languages/de.ts index 3493dd7b36..7d21b25f49 100644 --- a/packages/translations/src/languages/de.ts +++ b/packages/translations/src/languages/de.ts @@ -1,394 +1,398 @@ -export default { - authentication: { - account: 'Konto', - accountOfCurrentUser: 'Aktuelles Benutzerkonto', - alreadyActivated: 'Bereits aktiviert', - alreadyLoggedIn: 'Bereits angemeldet', - apiKey: 'API-Key', - backToLogin: 'Zurück zur Anmeldung', - beginCreateFirstUser: 'Erstelle deinen ersten Benutzer um zu beginnen', - changePassword: 'Passwort ändern', - checkYourEmailForPasswordReset: - 'Du solltest eine E-Mail mit einem Link zum sicheren Zurücksetzen deines Passworts erhalten haben.', - confirmGeneration: 'Generierung bestätigen', - confirmPassword: 'Passwort bestätigen', - createFirstUser: 'Ersten Benutzer erstellen', - emailNotValid: 'Die angegebene E-Mail-Adresse ist ungültig', - emailSent: 'E-Mail verschickt', - enableAPIKey: 'API-Key aktivieren', - failedToUnlock: 'Konnte nicht entsperren', - forceUnlock: 'Entsperrung erzwingen', - forgotPassword: 'Passwort vergessen', - forgotPasswordEmailInstructions: - 'Bitte gib deine E-Mail-Adresse an. Du wirst eine E-Mail mit Instruktionen zum Zurücksetzen deines Passworts erhalten.', - forgotPasswordQuestion: 'Passwort vergessen?', - generate: 'Generieren', - generateNewAPIKey: 'Neuen API-Key generieren', - generatingNewAPIKeyWillInvalidate: - 'Die Generierung eines neuen API-Keys wird den vorherigen Key <1>ungültig machen. Bist du sicher, dass du fortfahren möchtest?', - lockUntil: 'Sperre bis', - logBackIn: 'Wieder anmelden', - logOut: 'Abmelden', - loggedIn: - 'Um dich mit einem anderen Benutzer anzumelden, musst du dich zuerst <0>abmelden.', - loggedInChangePassword: - 'Um dein Passwort zu ändern, gehe in dein <0>Konto und ändere dort dein Passwort.', - loggedOutInactivity: 'Du wurdest aufgrund von Inaktivität abgemeldet.', - loggedOutSuccessfully: 'Du wurdest erfolgreich abgemeldet.', - login: 'Anmelden', - loginAttempts: 'Anmelde-Versuche', - loginUser: 'Benutzeranmeldung', - loginWithAnotherUser: - 'Um dich mit einem anderen Benutzer anzumelden, musst du dich zuerst <0>abmelden.', - logout: 'Abmelden', - logoutUser: 'Benutzerabmeldung', - newAPIKeyGenerated: 'Neuer API-Key wurde generiert', - newAccountCreated: - 'Ein neues Konto wurde gerade für dich auf {{serverURL}} erstellt. Bitte klicke auf den folgenden Link oder kopiere die URL in deinen Browser um deine E-Mail-Adresse zu verifizieren: {{verificationURL}}
Nachdem du deine E-Mail-Adresse verifiziert hast, kannst du dich erfolgreich anmelden.', - newPassword: 'Neues Passwort', - resetPassword: 'Passwort zurücksetzen', - resetPasswordExpiration: 'Passwort-Ablauf zurücksetzen', - resetPasswordToken: 'Passwort-Token zurücksetzen', - resetYourPassword: 'Dein Passwort zurücksetzen', - stayLoggedIn: 'Angemeldet bleiben', - successfullyUnlocked: 'Erfolgreich entsperrt', - unableToVerify: 'Konnte nicht verifiziert werden', - verified: 'Verifiziert', - verifiedSuccessfully: 'Erfolgreich verifiziert', - verify: 'Verifizieren', - verifyUser: 'Benutzer verifizieren', - verifyYourEmail: 'Deine E-Mail-Adresse verifizieren', - youAreInactive: - 'Du warst seit einiger Zeit inaktiv und wirst in kurzer Zeit zu deiner eigenen Sicherheit abgemeldet. Möchtest du angemeldet bleiben?', - youAreReceivingResetPassword: - 'Du erhältst diese Nachricht, weil du (oder jemand anderes) das Zurücksetzen deines Passworts für dein Benutzerkonto angefordert hat. Bitte klicke auf den folgenden Link, oder kopiere die URL in deinen Browser den Prozess abzuschließen:', - youDidNotRequestPassword: - 'Solltest du dies nicht angefordert haben, ignoriere diese E-Mail und dein Passwort bleibt unverändert.', - }, - error: { - accountAlreadyActivated: 'Dieses Konto wurde bereits aktiviert', - autosaving: 'Es gab ein Problem während der automatischen Speicherung für dieses Dokument', - correctInvalidFields: 'Bitte ungültige Felder korrigieren.', - deletingFile: 'Beim Löschen der Datei ist ein Fehler aufgetreten.', - deletingTitle: - 'Es gab ein Problem während der Löschung von {{title}}. Bitte überprüfe deine Verbindung und versuche es erneut.', - emailOrPasswordIncorrect: 'Die E-Mail-Adresse oder das Passwort sind nicht korrekt.', - followingFieldsInvalid_one: 'Das folgende Feld ist nicht korrekt:', - followingFieldsInvalid_other: 'Die folgenden Felder sind nicht korrekt:', - incorrectCollection: 'Falsche Sammlung', - invalidFileType: 'Ungültiger Datei-Typ', - invalidFileTypeValue: 'Ungültiger Datei-Typ: {{value}}', - loadingDocument: 'Es gab ein Problem, das Dokument mit der ID {{id}} zu laden.', - missingEmail: 'E-Mail-Adresse fehlt.', - missingIDOfDocument: 'ID des zu speichernden Dokuments fehlt.', - missingIDOfVersion: 'ID der Version fehlt.', - missingRequiredData: 'Erforderliche Daten fehlen.', - noFilesUploaded: 'Es wurden keine Dateien hochgeladen.', - noMatchedField: 'Kein übereinstimmendes Feld für "{{label}}" gefunden', - noUser: 'Kein Benutzer', - notAllowedToAccessPage: 'Du hast keine Berechtigung, auf diese Seite zuzugreifen.', - notAllowedToPerformAction: 'Du hast keine Berechtigung, diese Aktion auszuführen.', - notFound: 'Die angeforderte Ressource wurde nicht gefunden.', - previewing: 'Es gab ein Problem beim Vorschauen dieses Dokuments.', - problemUploadingFile: 'Es gab ein Problem während des Hochladens der Datei.', - tokenInvalidOrExpired: 'Token ist entweder ungültig oder abgelaufen.', - unPublishingDocument: 'Es gab ein Problem, dieses Dokument auf Entwurf zu setzen.', - unableToDeleteCount: '{{count}} von {{total}} {{label}} konnte nicht gelöscht werden.', - unableToUpdateCount: '{{count}} von {{total}} {{label}} konnte nicht aktualisiert werden.', - unauthorized: 'Nicht autorisiert - du musst angemeldet sein, um diese Anfrage zu stellen.', - unknown: 'Ein unbekannter Fehler ist aufgetreten.', - unspecific: 'Ein Fehler ist aufgetreten.', - userLocked: - 'Dieser Benutzer ist auf Grund zu vieler unerfolgreicher Anmelde-Versuche gesperrt.', - valueMustBeUnique: 'Wert muss einzigartig sein', - verificationTokenInvalid: 'Verifizierungs-Token ist nicht korrekt.', - }, - fields: { - addLabel: '{{label}} hinzufügen', - addLink: 'Link Hinzufügen', - addNew: 'Neu erstellen', - addNewLabel: '{{label}} erstellen', - addRelationship: 'Verknüpfung Hinzufügen', - addUpload: 'Hochladen Hinzufügen', - block: 'Block', - blockType: 'Block-Typ', - blocks: 'Blöcke', - chooseBetweenCustomTextOrDocument: - 'Wähle zwischen einer eigenen Text-URL oder verlinke zu einem anderen Dokument.', - chooseDocumentToLink: 'Wähle ein Dokument zum Verlinken', - chooseFromExisting: 'Aus vorhandenen auswählen', - chooseLabel: '{{label}} auswählen', - collapseAll: 'Alle einklappen', - customURL: 'Eigene URL', - editLabelData: '{{label}} bearbeiten', - editLink: 'Bearbeite Link', - editRelationship: 'Beziehung Hinzufügen', - enterURL: 'URL eingeben', - internalLink: 'Interner Link', - itemsAndMore: '{{items}} und {{count}} mehr', - labelRelationship: '{{label}} Verknüpfung', - latitude: 'Breitengrad', - linkType: 'Linktyp', - linkedTo: 'Verweist auf <0>{{label}}', - longitude: 'Längengrad', - newLabel: '{{label}} erstellen', - openInNewTab: 'Öffne im neuen Tab', - passwordsDoNotMatch: 'Passwörter stimmen nicht überein.', - relatedDocument: 'Verknüpftes Dokument', - relationTo: 'Verknüpfung zu', - removeRelationship: 'Beziehung Entfernen', - removeUpload: 'Hochgeladene Datei Löschen', - saveChanges: 'Änderungen speichern', - searchForBlock: 'Nach Block suchen', - selectExistingLabel: '{{label}} auswählen (vorhandene)', - selectFieldsToEdit: 'Wählen Sie die zu bearbeitenden Felder aus', - showAll: 'Alle anzeigen', - swapRelationship: 'Beziehung Tauschen', - swapUpload: 'Datei Austauschen', - textToDisplay: 'Angezeigter Text', - toggleBlock: 'Block umschalten', - uploadNewLabel: '{{label}} neu hochladen', - }, - general: { - aboutToDelete: 'Du bist dabei {{label}} <1>{{title}} zu löschen. Bist du dir sicher?', - aboutToDeleteCount_many: 'Sie sind dabei, {{count}} {{label}} zu löschen', - aboutToDeleteCount_one: 'Sie sind dabei, {{count}} {{label}} zu löschen', - aboutToDeleteCount_other: 'Sie sind dabei, {{count}} {{label}} zu löschen', - addBelow: 'Darunter hinzufügen', - addFilter: 'Filter hinzufügen', - adminTheme: 'Admin-Farbthema', - and: 'Und', - applyChanges: 'Änderungen anwenden', - ascending: 'Aufsteigend', - automatic: 'Automatisch', - backToDashboard: 'Zurück zur Übersicht', - cancel: 'Abbrechen', - changesNotSaved: - 'Deine Änderungen wurden nicht gespeichert. Wenn du diese Seite verlässt, gehen deine Änderungen verloren.', - close: 'Schließen', - collapse: 'Einklappen', - collections: 'Sammlungen', - columnToSort: 'Spalten zum Sortieren', - columns: 'Spalten', - confirm: 'Bestätigen', - confirmDeletion: 'Löschen bestätigen', - confirmDuplication: 'Duplizieren bestätigen', - copied: 'Kopiert', - copy: 'Kopieren', - create: 'Erstellen', - createNew: 'Neu Erstellen', - createNewLabel: '{{label}} neu erstellen', - created: 'Erstellt', - createdAt: 'Erstellt am', - creating: 'Erstelle', - creatingNewLabel: 'Erstelle {{label}}', - dark: 'Dunkel', - dashboard: 'Übersicht', - delete: 'Löschen', - deletedCountSuccessfully: '{{count}} {{label}} erfolgreich gelöscht.', - deletedSuccessfully: 'Erfolgreich gelöscht.', - deleting: 'Lösche...', - descending: 'Absteigend', - deselectAllRows: 'Alle Zeilen abwählen', - duplicate: 'Duplizieren', - duplicateWithoutSaving: 'Dupliziere ohne Änderungen zu speichern', - edit: 'Bearbeiten', - editLabel: '{{label}} bearbeiten', - editing: 'Bearbeite', - editingLabel_many: 'Bearbeiten von {{count}} {{label}}', - editingLabel_one: 'Bearbeiten von {{count}} {{label}}', - editingLabel_other: 'Bearbeiten von {{count}} {{label}}', - email: 'E-Mail', - emailAddress: 'E-Mail-Adresse', - enterAValue: 'Gib einen Wert ein', - error: 'Fehler', - errors: 'Fehler', - fallbackToDefaultLocale: 'Rückgriff auf das Standardgebietsschema', - filter: 'Filter', - filterWhere: 'Filter {{label}} wo', - filters: 'Filter', - globals: 'Globale Dokumente', - language: 'Sprache', - lastModified: 'Zuletzt geändert', - leaveAnyway: 'Trotzdem verlassen', - leaveWithoutSaving: 'Ohne speichern verlassen', - light: 'Hell', - livePreview: 'Vorschau', - loading: 'Lädt', - locale: 'Sprachumgebung', - locales: 'Sprachumgebungen', - menu: 'Menü', - moveDown: 'Nach unten bewegen', - moveUp: 'Nach oben bewegen', - newPassword: 'Neues Passwort', - noFiltersSet: 'Keine Filter gesetzt', - noLabel: '', - noOptions: 'Keine Optionen', - noResults: - 'Keine {{label}} gefunden. Entweder es existieren keine {{label}} oder es gibt keine Übereinstimmung zu den von dir verwendeten Filtern.', - noValue: 'Kein Wert', - none: 'Kein', - notFound: 'Nicht gefunden', - nothingFound: 'Keine Ergebnisse', - of: 'von', - open: 'Öffnen', - or: 'oder', - order: 'Reihenfolge', - pageNotFound: 'Seite nicht gefunden', - password: 'Passwort', - payloadSettings: 'Payload Einstellungen', - perPage: 'Pro Seite: {{limit}}', - remove: 'Entfernen', - reset: 'Zurücksetzen', - row: 'Zeile', - rows: 'Zeilen', - save: 'Speichern', - saving: 'Speichert...', - searchBy: 'Suche nach {{label}}', - selectAll: 'Alle auswählen {{count}} {{label}}', - selectAllRows: 'Wählen Sie alle Zeilen aus', - selectValue: 'Wert auswählen', - selectedCount: '{{count}} {{label}} ausgewählt', - showAllLabel: 'Zeige alle {{label}}', - sorryNotFound: 'Entschuldige, es entspricht nichts deiner Anfrage', - sort: 'Sortieren', - sortByLabelDirection: 'Sortieren nach {{label}} {{direction}}', - stayOnThisPage: 'Auf dieser Seite bleiben', - submissionSuccessful: 'Einrichung erfolgreich.', - submit: 'Senden', - successfullyCreated: '{{label}} erfolgreich erstellt.', - successfullyDuplicated: '{{label}} wurde erfolgreich dupliziert.', - thisLanguage: 'Deutsch', - titleDeleted: '{{label}} {{title}} wurde erfolgreich gelöscht.', - unauthorized: 'Nicht autorisiert', - unsavedChangesDuplicate: - 'Du hast ungespeicherte Änderungen, möchtest du mit dem Duplizieren fortfahren?', - untitled: 'ohne Titel', - updatedAt: 'Aktualisiert am', - updatedCountSuccessfully: '{{count}} {{label}} erfolgreich aktualisiert.', - updatedSuccessfully: 'Erfolgreich aktualisiert.', - updating: 'Aktualisierung', - uploading: 'Hochladen', - user: 'Benutzer', - users: 'Benutzer', - value: 'Wert', - welcome: 'Willkommen', - }, - operators: { - contains: 'enthält', - equals: 'gleich', - exists: 'existiert', - isGreaterThan: 'ist größer als', - isGreaterThanOrEqualTo: 'ist größer oder gleich', - isIn: 'ist drin', - isLessThan: 'ist kleiner als', - isLessThanOrEqualTo: 'ist kleiner oder gleich', - isLike: 'ist wie', - isNotEqualTo: 'ist nicht gleich', - isNotIn: 'ist nicht drin', - near: 'in der Nähe', - }, - upload: { - crop: 'Zuschneiden', - cropToolDescription: - 'Ziehen Sie die Ecken des ausgewählten Bereichs, zeichnen Sie einen neuen Bereich oder passen Sie die Werte unten an.', - dragAndDrop: 'Ziehen Sie eine Datei per Drag-and-Drop', - dragAndDropHere: 'oder ziehe eine Datei hier', - editImage: 'Bild bearbeiten', - fileName: 'Dateiname', - fileSize: 'Dateigröße', - focalPoint: 'Brennpunkt', - focalPointDescription: - 'Ziehen Sie den Fokuspunkt direkt auf die Vorschau oder passen Sie die Werte unten an.', - height: 'Höhe', - lessInfo: 'Weniger Info', - moreInfo: 'Mehr Info', - previewSizes: 'Vorschaugrößen', - selectCollectionToBrowse: 'Wähle eine Sammlung zum Durchsuchen aus', - selectFile: 'Datei auswählen', - setCropArea: 'Bereich zum Zuschneiden festlegen', - setFocalPoint: 'Fokuspunkt setzen', - sizes: 'Größen', - sizesFor: 'Größen für {{label}}', - width: 'Breite', - }, - validation: { - emailAddress: 'Bitte gib eine korrekte E-Mail-Adresse an.', - enterNumber: 'Bitte gib eine gültige Nummer an,', - fieldHasNo: 'Dieses Feld hat kein {{label}}', - greaterThanMax: '{{value}} ist größer als der maximal erlaubte {{label}} von {{max}}.', - invalidInput: 'Dieses Feld hat einen inkorrekten Wert.', - invalidSelection: 'Dieses Feld hat eine inkorrekte Auswahl.', - invalidSelections: "'Dieses Feld enthält die folgenden inkorrekten Auswahlen:'", - lessThanMin: '{{value}} ist kleiner als der minimal erlaubte {{label}} von {{min}}.', - limitReached: 'Limit erreicht, es können nur {{max}} Elemente hinzugefügt werden.', - longerThanMin: 'Dieser Wert muss länger als die minimale Länge von {{minLength}} Zeichen sein.', - notValidDate: '"{{value}}" ist kein gültiges Datum.', - required: 'Pflichtfeld', - requiresAtLeast: 'Dieses Feld muss mindestens {{count}} {{label}} enthalten.', - requiresNoMoreThan: 'Dieses Feld kann nicht mehr als {{count}} {{label}} enthalten.', - requiresTwoNumbers: 'Dieses Feld muss zwei Nummern enthalten.', - shorterThanMax: 'Dieser Wert muss kürzer als die maximale Länge von {{maxLength}} sein.', - trueOrFalse: 'Dieses Feld kann nur wahr oder falsch sein.', - validUploadID: "'Dieses Feld enthält keine valide Upload-ID.'", - }, - version: { - aboutToPublishSelection: - 'Sie sind dabei, alle {{label}} in der Auswahl zu veröffentlichen. Bist du dir sicher?', - aboutToRestore: 'Du bist dabei, {{label}} auf den Stand vom {{versionDate}} zurücksetzen.', - aboutToRestoreGlobal: - 'Du bist dabei, das Globale Dokument {{label}} auf den Stand vom {{versionDate}} zurückzusetzen.', - aboutToRevertToPublished: - 'Du bist dabei, dieses Dokument auf den Stand des ersten Veröffentlichungsdatums zurückzusetzen - Bist du sicher?', - aboutToUnpublish: 'Du bist dabei dieses Dokument auf Entwurf zu setzen - bist du dir sicher?', - aboutToUnpublishSelection: - 'Sie sind dabei, die Veröffentlichung aller {{label}} in der Auswahl aufzuheben. Bist du dir sicher?', - autosave: 'Automatische Speicherung', - autosavedSuccessfully: 'Erfolgreich automatisch gespeichert.', - autosavedVersion: 'Automatisch gespeicherte Version', - changed: 'Geändert', - compareVersion: 'Vergleiche Version zu:', - confirmPublish: 'Veröffentlichung bestätigen', - confirmRevertToSaved: 'Zurücksetzen auf die letzte Speicherung bestätigen', - confirmUnpublish: 'Setzen auf Entwurf bestätigen', - confirmVersionRestoration: ' Wiederherstellung der Version bestätigen', - currentDocumentStatus: 'Aktueller Dokumentenstatus: {{docStatus}}', - draft: 'Entwurf', - draftSavedSuccessfully: 'Entwurf erfolgreich gespeichert.', - lastSavedAgo: 'Zuletzt vor {{distance}} gespeichert', - noFurtherVersionsFound: 'Keine weiteren Versionen vorhanden', - noRowsFound: 'Kein {{label}} gefunden', - preview: 'Vorschau', - problemRestoringVersion: 'Es gab ein Problem bei der Wiederherstellung dieser Version', - publish: 'Veröffentlichen', - publishChanges: 'Änderungen veröffentlichen', - published: 'Veröffentlicht', - publishing: 'Veröffentlichung', - restoreThisVersion: 'Diese Version wiederherstellen', - restoredSuccessfully: 'Erfolgreich wiederhergestellt.', - restoring: 'wiederherstellen...', - revertToPublished: 'Auf Veröffentlicht zurücksetzen', - reverting: 'zurücksetzen...', - saveDraft: 'Entwurf speichern', - selectLocales: 'Wähle anzuzeigende Sprachumgebungen', - selectVersionToCompare: 'Wähle Version zum Vergleich', - showLocales: 'Sprachumgebungen anzeigen:', - showingVersionsFor: 'Versionen anzeigen für:', - status: 'Status', - type: 'Typ', - unpublish: 'Auf Entwurf setzen', - unpublishing: 'Setze auf Entwurf...', - version: 'Version', - versionCount_many: '{{count}} Versionen gefunden', - versionCount_none: 'Keine Versionen gefunden', - versionCount_one: '{{count}} Version gefunden', - versionCount_other: '{{count}} Versionen gefunden', - versionCreatedOn: '{{version}} erstellt am:', - versionID: 'Version ID', - versions: 'Versionen', - viewingVersion: 'Betrachte Version für {{entityLabel}} {{documentTitle}}', - viewingVersionGlobal: '`Betrachte Version für das Globale Dokument {{entityLabel}}', - viewingVersions: 'Betrachte Versionen für {{entityLabel}} {{documentTitle}}', - viewingVersionsGlobal: '`Betrachte Versionen für das Globale Dokument {{entityLabel}}', +export const de = { + dateFNSKey: 'de', + translations: { + authentication: { + account: 'Konto', + accountOfCurrentUser: 'Aktuelles Benutzerkonto', + alreadyActivated: 'Bereits aktiviert', + alreadyLoggedIn: 'Bereits angemeldet', + apiKey: 'API-Key', + backToLogin: 'Zurück zur Anmeldung', + beginCreateFirstUser: 'Erstelle deinen ersten Benutzer um zu beginnen', + changePassword: 'Passwort ändern', + checkYourEmailForPasswordReset: + 'Du solltest eine E-Mail mit einem Link zum sicheren Zurücksetzen deines Passworts erhalten haben.', + confirmGeneration: 'Generierung bestätigen', + confirmPassword: 'Passwort bestätigen', + createFirstUser: 'Ersten Benutzer erstellen', + emailNotValid: 'Die angegebene E-Mail-Adresse ist ungültig', + emailSent: 'E-Mail verschickt', + enableAPIKey: 'API-Key aktivieren', + failedToUnlock: 'Konnte nicht entsperren', + forceUnlock: 'Entsperrung erzwingen', + forgotPassword: 'Passwort vergessen', + forgotPasswordEmailInstructions: + 'Bitte gib deine E-Mail-Adresse an. Du wirst eine E-Mail mit Instruktionen zum Zurücksetzen deines Passworts erhalten.', + forgotPasswordQuestion: 'Passwort vergessen?', + generate: 'Generieren', + generateNewAPIKey: 'Neuen API-Key generieren', + generatingNewAPIKeyWillInvalidate: + 'Die Generierung eines neuen API-Keys wird den vorherigen Key <1>ungültig machen. Bist du sicher, dass du fortfahren möchtest?', + lockUntil: 'Sperre bis', + logBackIn: 'Wieder anmelden', + logOut: 'Abmelden', + loggedIn: + 'Um dich mit einem anderen Benutzer anzumelden, musst du dich zuerst <0>abmelden.', + loggedInChangePassword: + 'Um dein Passwort zu ändern, gehe in dein <0>Konto und ändere dort dein Passwort.', + loggedOutInactivity: 'Du wurdest aufgrund von Inaktivität abgemeldet.', + loggedOutSuccessfully: 'Du wurdest erfolgreich abgemeldet.', + login: 'Anmelden', + loginAttempts: 'Anmelde-Versuche', + loginUser: 'Benutzeranmeldung', + loginWithAnotherUser: + 'Um dich mit einem anderen Benutzer anzumelden, musst du dich zuerst <0>abmelden.', + logout: 'Abmelden', + logoutUser: 'Benutzerabmeldung', + newAPIKeyGenerated: 'Neuer API-Key wurde generiert', + newAccountCreated: + 'Ein neues Konto wurde gerade für dich auf {{serverURL}} erstellt. Bitte klicke auf den folgenden Link oder kopiere die URL in deinen Browser um deine E-Mail-Adresse zu verifizieren: {{verificationURL}}
Nachdem du deine E-Mail-Adresse verifiziert hast, kannst du dich erfolgreich anmelden.', + newPassword: 'Neues Passwort', + resetPassword: 'Passwort zurücksetzen', + resetPasswordExpiration: 'Passwort-Ablauf zurücksetzen', + resetPasswordToken: 'Passwort-Token zurücksetzen', + resetYourPassword: 'Dein Passwort zurücksetzen', + stayLoggedIn: 'Angemeldet bleiben', + successfullyUnlocked: 'Erfolgreich entsperrt', + unableToVerify: 'Konnte nicht verifiziert werden', + verified: 'Verifiziert', + verifiedSuccessfully: 'Erfolgreich verifiziert', + verify: 'Verifizieren', + verifyUser: 'Benutzer verifizieren', + verifyYourEmail: 'Deine E-Mail-Adresse verifizieren', + youAreInactive: + 'Du warst seit einiger Zeit inaktiv und wirst in kurzer Zeit zu deiner eigenen Sicherheit abgemeldet. Möchtest du angemeldet bleiben?', + youAreReceivingResetPassword: + 'Du erhältst diese Nachricht, weil du (oder jemand anderes) das Zurücksetzen deines Passworts für dein Benutzerkonto angefordert hat. Bitte klicke auf den folgenden Link, oder kopiere die URL in deinen Browser den Prozess abzuschließen:', + youDidNotRequestPassword: + 'Solltest du dies nicht angefordert haben, ignoriere diese E-Mail und dein Passwort bleibt unverändert.', + }, + error: { + accountAlreadyActivated: 'Dieses Konto wurde bereits aktiviert', + autosaving: 'Es gab ein Problem während der automatischen Speicherung für dieses Dokument', + correctInvalidFields: 'Bitte ungültige Felder korrigieren.', + deletingFile: 'Beim Löschen der Datei ist ein Fehler aufgetreten.', + deletingTitle: + 'Es gab ein Problem während der Löschung von {{title}}. Bitte überprüfe deine Verbindung und versuche es erneut.', + emailOrPasswordIncorrect: 'Die E-Mail-Adresse oder das Passwort sind nicht korrekt.', + followingFieldsInvalid_one: 'Das folgende Feld ist nicht korrekt:', + followingFieldsInvalid_other: 'Die folgenden Felder sind nicht korrekt:', + incorrectCollection: 'Falsche Sammlung', + invalidFileType: 'Ungültiger Datei-Typ', + invalidFileTypeValue: 'Ungültiger Datei-Typ: {{value}}', + loadingDocument: 'Es gab ein Problem, das Dokument mit der ID {{id}} zu laden.', + missingEmail: 'E-Mail-Adresse fehlt.', + missingIDOfDocument: 'ID des zu speichernden Dokuments fehlt.', + missingIDOfVersion: 'ID der Version fehlt.', + missingRequiredData: 'Erforderliche Daten fehlen.', + noFilesUploaded: 'Es wurden keine Dateien hochgeladen.', + noMatchedField: 'Kein übereinstimmendes Feld für "{{label}}" gefunden', + noUser: 'Kein Benutzer', + notAllowedToAccessPage: 'Du hast keine Berechtigung, auf diese Seite zuzugreifen.', + notAllowedToPerformAction: 'Du hast keine Berechtigung, diese Aktion auszuführen.', + notFound: 'Die angeforderte Ressource wurde nicht gefunden.', + previewing: 'Es gab ein Problem beim Vorschauen dieses Dokuments.', + problemUploadingFile: 'Es gab ein Problem während des Hochladens der Datei.', + tokenInvalidOrExpired: 'Token ist entweder ungültig oder abgelaufen.', + unPublishingDocument: 'Es gab ein Problem, dieses Dokument auf Entwurf zu setzen.', + unableToDeleteCount: '{{count}} von {{total}} {{label}} konnte nicht gelöscht werden.', + unableToUpdateCount: '{{count}} von {{total}} {{label}} konnte nicht aktualisiert werden.', + unauthorized: 'Nicht autorisiert - du musst angemeldet sein, um diese Anfrage zu stellen.', + unknown: 'Ein unbekannter Fehler ist aufgetreten.', + unspecific: 'Ein Fehler ist aufgetreten.', + userLocked: + 'Dieser Benutzer ist auf Grund zu vieler unerfolgreicher Anmelde-Versuche gesperrt.', + valueMustBeUnique: 'Wert muss einzigartig sein', + verificationTokenInvalid: 'Verifizierungs-Token ist nicht korrekt.', + }, + fields: { + addLabel: '{{label}} hinzufügen', + addLink: 'Link Hinzufügen', + addNew: 'Neu erstellen', + addNewLabel: '{{label}} erstellen', + addRelationship: 'Verknüpfung Hinzufügen', + addUpload: 'Hochladen Hinzufügen', + block: 'Block', + blockType: 'Block-Typ', + blocks: 'Blöcke', + chooseBetweenCustomTextOrDocument: + 'Wähle zwischen einer eigenen Text-URL oder verlinke zu einem anderen Dokument.', + chooseDocumentToLink: 'Wähle ein Dokument zum Verlinken', + chooseFromExisting: 'Aus vorhandenen auswählen', + chooseLabel: '{{label}} auswählen', + collapseAll: 'Alle einklappen', + customURL: 'Eigene URL', + editLabelData: '{{label}} bearbeiten', + editLink: 'Bearbeite Link', + editRelationship: 'Beziehung Hinzufügen', + enterURL: 'URL eingeben', + internalLink: 'Interner Link', + itemsAndMore: '{{items}} und {{count}} mehr', + labelRelationship: '{{label}} Verknüpfung', + latitude: 'Breitengrad', + linkType: 'Linktyp', + linkedTo: 'Verweist auf <0>{{label}}', + longitude: 'Längengrad', + newLabel: '{{label}} erstellen', + openInNewTab: 'Öffne im neuen Tab', + passwordsDoNotMatch: 'Passwörter stimmen nicht überein.', + relatedDocument: 'Verknüpftes Dokument', + relationTo: 'Verknüpfung zu', + removeRelationship: 'Beziehung Entfernen', + removeUpload: 'Hochgeladene Datei Löschen', + saveChanges: 'Änderungen speichern', + searchForBlock: 'Nach Block suchen', + selectExistingLabel: '{{label}} auswählen (vorhandene)', + selectFieldsToEdit: 'Wählen Sie die zu bearbeitenden Felder aus', + showAll: 'Alle anzeigen', + swapRelationship: 'Beziehung Tauschen', + swapUpload: 'Datei Austauschen', + textToDisplay: 'Angezeigter Text', + toggleBlock: 'Block umschalten', + uploadNewLabel: '{{label}} neu hochladen', + }, + general: { + aboutToDelete: 'Du bist dabei {{label}} <1>{{title}} zu löschen. Bist du dir sicher?', + aboutToDeleteCount_many: 'Sie sind dabei, {{count}} {{label}} zu löschen', + aboutToDeleteCount_one: 'Sie sind dabei, {{count}} {{label}} zu löschen', + aboutToDeleteCount_other: 'Sie sind dabei, {{count}} {{label}} zu löschen', + addBelow: 'Darunter hinzufügen', + addFilter: 'Filter hinzufügen', + adminTheme: 'Admin-Farbthema', + and: 'Und', + applyChanges: 'Änderungen anwenden', + ascending: 'Aufsteigend', + automatic: 'Automatisch', + backToDashboard: 'Zurück zur Übersicht', + cancel: 'Abbrechen', + changesNotSaved: + 'Deine Änderungen wurden nicht gespeichert. Wenn du diese Seite verlässt, gehen deine Änderungen verloren.', + close: 'Schließen', + collapse: 'Einklappen', + collections: 'Sammlungen', + columnToSort: 'Spalten zum Sortieren', + columns: 'Spalten', + confirm: 'Bestätigen', + confirmDeletion: 'Löschen bestätigen', + confirmDuplication: 'Duplizieren bestätigen', + copied: 'Kopiert', + copy: 'Kopieren', + create: 'Erstellen', + createNew: 'Neu Erstellen', + createNewLabel: '{{label}} neu erstellen', + created: 'Erstellt', + createdAt: 'Erstellt am', + creating: 'Erstelle', + creatingNewLabel: 'Erstelle {{label}}', + dark: 'Dunkel', + dashboard: 'Übersicht', + delete: 'Löschen', + deletedCountSuccessfully: '{{count}} {{label}} erfolgreich gelöscht.', + deletedSuccessfully: 'Erfolgreich gelöscht.', + deleting: 'Lösche...', + descending: 'Absteigend', + deselectAllRows: 'Alle Zeilen abwählen', + duplicate: 'Duplizieren', + duplicateWithoutSaving: 'Dupliziere ohne Änderungen zu speichern', + edit: 'Bearbeiten', + editLabel: '{{label}} bearbeiten', + editing: 'Bearbeite', + editingLabel_many: 'Bearbeiten von {{count}} {{label}}', + editingLabel_one: 'Bearbeiten von {{count}} {{label}}', + editingLabel_other: 'Bearbeiten von {{count}} {{label}}', + email: 'E-Mail', + emailAddress: 'E-Mail-Adresse', + enterAValue: 'Gib einen Wert ein', + error: 'Fehler', + errors: 'Fehler', + fallbackToDefaultLocale: 'Rückgriff auf das Standardgebietsschema', + filter: 'Filter', + filterWhere: 'Filter {{label}} wo', + filters: 'Filter', + globals: 'Globale Dokumente', + language: 'Sprache', + lastModified: 'Zuletzt geändert', + leaveAnyway: 'Trotzdem verlassen', + leaveWithoutSaving: 'Ohne speichern verlassen', + light: 'Hell', + livePreview: 'Vorschau', + loading: 'Lädt', + locale: 'Sprachumgebung', + locales: 'Sprachumgebungen', + menu: 'Menü', + moveDown: 'Nach unten bewegen', + moveUp: 'Nach oben bewegen', + newPassword: 'Neues Passwort', + noFiltersSet: 'Keine Filter gesetzt', + noLabel: '', + noOptions: 'Keine Optionen', + noResults: + 'Keine {{label}} gefunden. Entweder es existieren keine {{label}} oder es gibt keine Übereinstimmung zu den von dir verwendeten Filtern.', + noValue: 'Kein Wert', + none: 'Kein', + notFound: 'Nicht gefunden', + nothingFound: 'Keine Ergebnisse', + of: 'von', + open: 'Öffnen', + or: 'oder', + order: 'Reihenfolge', + pageNotFound: 'Seite nicht gefunden', + password: 'Passwort', + payloadSettings: 'Payload Einstellungen', + perPage: 'Pro Seite: {{limit}}', + remove: 'Entfernen', + reset: 'Zurücksetzen', + row: 'Zeile', + rows: 'Zeilen', + save: 'Speichern', + saving: 'Speichert...', + searchBy: 'Suche nach {{label}}', + selectAll: 'Alle auswählen {{count}} {{label}}', + selectAllRows: 'Wählen Sie alle Zeilen aus', + selectValue: 'Wert auswählen', + selectedCount: '{{count}} {{label}} ausgewählt', + showAllLabel: 'Zeige alle {{label}}', + sorryNotFound: 'Entschuldige, es entspricht nichts deiner Anfrage', + sort: 'Sortieren', + sortByLabelDirection: 'Sortieren nach {{label}} {{direction}}', + stayOnThisPage: 'Auf dieser Seite bleiben', + submissionSuccessful: 'Einrichung erfolgreich.', + submit: 'Senden', + successfullyCreated: '{{label}} erfolgreich erstellt.', + successfullyDuplicated: '{{label}} wurde erfolgreich dupliziert.', + thisLanguage: 'Deutsch', + titleDeleted: '{{label}} {{title}} wurde erfolgreich gelöscht.', + unauthorized: 'Nicht autorisiert', + unsavedChangesDuplicate: + 'Du hast ungespeicherte Änderungen, möchtest du mit dem Duplizieren fortfahren?', + untitled: 'ohne Titel', + updatedAt: 'Aktualisiert am', + updatedCountSuccessfully: '{{count}} {{label}} erfolgreich aktualisiert.', + updatedSuccessfully: 'Erfolgreich aktualisiert.', + updating: 'Aktualisierung', + uploading: 'Hochladen', + user: 'Benutzer', + users: 'Benutzer', + value: 'Wert', + welcome: 'Willkommen', + }, + operators: { + contains: 'enthält', + equals: 'gleich', + exists: 'existiert', + isGreaterThan: 'ist größer als', + isGreaterThanOrEqualTo: 'ist größer oder gleich', + isIn: 'ist drin', + isLessThan: 'ist kleiner als', + isLessThanOrEqualTo: 'ist kleiner oder gleich', + isLike: 'ist wie', + isNotEqualTo: 'ist nicht gleich', + isNotIn: 'ist nicht drin', + near: 'in der Nähe', + }, + upload: { + crop: 'Zuschneiden', + cropToolDescription: + 'Ziehen Sie die Ecken des ausgewählten Bereichs, zeichnen Sie einen neuen Bereich oder passen Sie die Werte unten an.', + dragAndDrop: 'Ziehen Sie eine Datei per Drag-and-Drop', + dragAndDropHere: 'oder ziehe eine Datei hier', + editImage: 'Bild bearbeiten', + fileName: 'Dateiname', + fileSize: 'Dateigröße', + focalPoint: 'Brennpunkt', + focalPointDescription: + 'Ziehen Sie den Fokuspunkt direkt auf die Vorschau oder passen Sie die Werte unten an.', + height: 'Höhe', + lessInfo: 'Weniger Info', + moreInfo: 'Mehr Info', + previewSizes: 'Vorschaugrößen', + selectCollectionToBrowse: 'Wähle eine Sammlung zum Durchsuchen aus', + selectFile: 'Datei auswählen', + setCropArea: 'Bereich zum Zuschneiden festlegen', + setFocalPoint: 'Fokuspunkt setzen', + sizes: 'Größen', + sizesFor: 'Größen für {{label}}', + width: 'Breite', + }, + validation: { + emailAddress: 'Bitte gib eine korrekte E-Mail-Adresse an.', + enterNumber: 'Bitte gib eine gültige Nummer an,', + fieldHasNo: 'Dieses Feld hat kein {{label}}', + greaterThanMax: '{{value}} ist größer als der maximal erlaubte {{label}} von {{max}}.', + invalidInput: 'Dieses Feld hat einen inkorrekten Wert.', + invalidSelection: 'Dieses Feld hat eine inkorrekte Auswahl.', + invalidSelections: "'Dieses Feld enthält die folgenden inkorrekten Auswahlen:'", + lessThanMin: '{{value}} ist kleiner als der minimal erlaubte {{label}} von {{min}}.', + limitReached: 'Limit erreicht, es können nur {{max}} Elemente hinzugefügt werden.', + longerThanMin: + 'Dieser Wert muss länger als die minimale Länge von {{minLength}} Zeichen sein.', + notValidDate: '"{{value}}" ist kein gültiges Datum.', + required: 'Pflichtfeld', + requiresAtLeast: 'Dieses Feld muss mindestens {{count}} {{label}} enthalten.', + requiresNoMoreThan: 'Dieses Feld kann nicht mehr als {{count}} {{label}} enthalten.', + requiresTwoNumbers: 'Dieses Feld muss zwei Nummern enthalten.', + shorterThanMax: 'Dieser Wert muss kürzer als die maximale Länge von {{maxLength}} sein.', + trueOrFalse: 'Dieses Feld kann nur wahr oder falsch sein.', + validUploadID: "'Dieses Feld enthält keine valide Upload-ID.'", + }, + version: { + type: 'Typ', + aboutToPublishSelection: + 'Sie sind dabei, alle {{label}} in der Auswahl zu veröffentlichen. Bist du dir sicher?', + aboutToRestore: 'Du bist dabei, {{label}} auf den Stand vom {{versionDate}} zurücksetzen.', + aboutToRestoreGlobal: + 'Du bist dabei, das Globale Dokument {{label}} auf den Stand vom {{versionDate}} zurückzusetzen.', + aboutToRevertToPublished: + 'Du bist dabei, dieses Dokument auf den Stand des ersten Veröffentlichungsdatums zurückzusetzen - Bist du sicher?', + aboutToUnpublish: 'Du bist dabei dieses Dokument auf Entwurf zu setzen - bist du dir sicher?', + aboutToUnpublishSelection: + 'Sie sind dabei, die Veröffentlichung aller {{label}} in der Auswahl aufzuheben. Bist du dir sicher?', + autosave: 'Automatische Speicherung', + autosavedSuccessfully: 'Erfolgreich automatisch gespeichert.', + autosavedVersion: 'Automatisch gespeicherte Version', + changed: 'Geändert', + compareVersion: 'Vergleiche Version zu:', + confirmPublish: 'Veröffentlichung bestätigen', + confirmRevertToSaved: 'Zurücksetzen auf die letzte Speicherung bestätigen', + confirmUnpublish: 'Setzen auf Entwurf bestätigen', + confirmVersionRestoration: ' Wiederherstellung der Version bestätigen', + currentDocumentStatus: 'Aktueller Dokumentenstatus: {{docStatus}}', + draft: 'Entwurf', + draftSavedSuccessfully: 'Entwurf erfolgreich gespeichert.', + lastSavedAgo: 'Zuletzt vor {{distance}} gespeichert', + noFurtherVersionsFound: 'Keine weiteren Versionen vorhanden', + noRowsFound: 'Kein {{label}} gefunden', + preview: 'Vorschau', + problemRestoringVersion: 'Es gab ein Problem bei der Wiederherstellung dieser Version', + publish: 'Veröffentlichen', + publishChanges: 'Änderungen veröffentlichen', + published: 'Veröffentlicht', + publishing: 'Veröffentlichung', + restoreThisVersion: 'Diese Version wiederherstellen', + restoredSuccessfully: 'Erfolgreich wiederhergestellt.', + restoring: 'wiederherstellen...', + revertToPublished: 'Auf Veröffentlicht zurücksetzen', + reverting: 'zurücksetzen...', + saveDraft: 'Entwurf speichern', + selectLocales: 'Wähle anzuzeigende Sprachumgebungen', + selectVersionToCompare: 'Wähle Version zum Vergleich', + showLocales: 'Sprachumgebungen anzeigen:', + showingVersionsFor: 'Versionen anzeigen für:', + status: 'Status', + unpublish: 'Auf Entwurf setzen', + unpublishing: 'Setze auf Entwurf...', + version: 'Version', + versionCount_many: '{{count}} Versionen gefunden', + versionCount_none: 'Keine Versionen gefunden', + versionCount_one: '{{count}} Version gefunden', + versionCount_other: '{{count}} Versionen gefunden', + versionCreatedOn: '{{version}} erstellt am:', + versionID: 'Version ID', + versions: 'Versionen', + viewingVersion: 'Betrachte Version für {{entityLabel}} {{documentTitle}}', + viewingVersionGlobal: '`Betrachte Version für das Globale Dokument {{entityLabel}}', + viewingVersions: 'Betrachte Versionen für {{entityLabel}} {{documentTitle}}', + viewingVersionsGlobal: '`Betrachte Versionen für das Globale Dokument {{entityLabel}}', + }, }, } diff --git a/packages/translations/src/languages/en.ts b/packages/translations/src/languages/en.ts index d2d674038b..97f46eab9a 100644 --- a/packages/translations/src/languages/en.ts +++ b/packages/translations/src/languages/en.ts @@ -1,391 +1,395 @@ -export default { - authentication: { - account: 'Account', - accountOfCurrentUser: 'Account of current user', - alreadyActivated: 'Already Activated', - alreadyLoggedIn: 'Already logged in', - apiKey: 'API Key', - backToLogin: 'Back to login', - beginCreateFirstUser: 'To begin, create your first user.', - changePassword: 'Change Password', - checkYourEmailForPasswordReset: - 'Check your email for a link that will allow you to securely reset your password.', - confirmGeneration: 'Confirm Generation', - confirmPassword: 'Confirm Password', - createFirstUser: 'Create first user', - emailNotValid: 'The email provided is not valid', - emailSent: 'Email Sent', - enableAPIKey: 'Enable API Key', - failedToUnlock: 'Failed to unlock', - forceUnlock: 'Force Unlock', - forgotPassword: 'Forgot Password', - forgotPasswordEmailInstructions: - 'Please enter your email below. You will receive an email message with instructions on how to reset your password.', - forgotPasswordQuestion: 'Forgot password?', - generate: 'Generate', - generateNewAPIKey: 'Generate new API key', - generatingNewAPIKeyWillInvalidate: - 'Generating a new API key will <1>invalidate the previous key. Are you sure you wish to continue?', - lockUntil: 'Lock Until', - logBackIn: 'Log back in', - logOut: 'Log out', - loggedIn: 'To log in with another user, you should <0>log out first.', - loggedInChangePassword: - 'To change your password, go to your <0>account and edit your password there.', - loggedOutInactivity: 'You have been logged out due to inactivity.', - loggedOutSuccessfully: 'You have been logged out successfully.', - login: 'Login', - loginAttempts: 'Login Attempts', - loginUser: 'Login user', - loginWithAnotherUser: 'To log in with another user, you should <0>log out first.', - logout: 'Logout', - logoutUser: 'Logout user', - newAPIKeyGenerated: 'New API Key Generated.', - newAccountCreated: - 'A new account has just been created for you to access {{serverURL}} Please click on the following link or paste the URL below into your browser to verify your email: {{verificationURL}}
After verifying your email, you will be able to log in successfully.', - newPassword: 'New Password', - resetPassword: 'Reset Password', - resetPasswordExpiration: 'Reset Password Expiration', - resetPasswordToken: 'Reset Password Token', - resetYourPassword: 'Reset Your Password', - stayLoggedIn: 'Stay logged in', - successfullyUnlocked: 'Successfully unlocked', - unableToVerify: 'Unable to Verify', - verified: 'Verified', - verifiedSuccessfully: 'Verified Successfully', - verify: 'Verify', - verifyUser: 'Verify User', - verifyYourEmail: 'Verify your email', - youAreInactive: - "You haven't been active in a little while and will shortly be automatically logged out for your own security. Would you like to stay logged in?", - youAreReceivingResetPassword: - 'You are receiving this because you (or someone else) have requested the reset of the password for your account. Please click on the following link, or paste this into your browser to complete the process:', - youDidNotRequestPassword: - 'If you did not request this, please ignore this email and your password will remain unchanged.', - }, - error: { - accountAlreadyActivated: 'This account has already been activated.', - autosaving: 'There was a problem while autosaving this document.', - correctInvalidFields: 'Please correct invalid fields.', - deletingFile: 'There was an error deleting file.', - deletingTitle: - 'There was an error while deleting {{title}}. Please check your connection and try again.', - emailOrPasswordIncorrect: 'The email or password provided is incorrect.', - followingFieldsInvalid_one: 'The following field is invalid:', - followingFieldsInvalid_other: 'The following fields are invalid:', - incorrectCollection: 'Incorrect Collection', - invalidFileType: 'Invalid file type', - invalidFileTypeValue: 'Invalid file type: {{value}}', - loadingDocument: 'There was a problem loading the document with ID of {{id}}.', - missingEmail: 'Missing email.', - missingIDOfDocument: 'Missing ID of document to update.', - missingIDOfVersion: 'Missing ID of version.', - missingRequiredData: 'Missing required data.', - noFilesUploaded: 'No files were uploaded.', - noMatchedField: 'No matched field found for "{{label}}"', - noUser: 'No User', - notAllowedToAccessPage: 'You are not allowed to access this page.', - notAllowedToPerformAction: 'You are not allowed to perform this action.', - notFound: 'The requested resource was not found.', - previewing: 'There was a problem previewing this document.', - problemUploadingFile: 'There was a problem while uploading the file.', - tokenInvalidOrExpired: 'Token is either invalid or has expired.', - unPublishingDocument: 'There was a problem while un-publishing this document.', - unableToDeleteCount: 'Unable to delete {{count}} out of {{total}} {{label}}.', - unableToUpdateCount: 'Unable to update {{count}} out of {{total}} {{label}}.', - unauthorized: 'Unauthorized, you must be logged in to make this request.', - unknown: 'An unknown error has occurred.', - unspecific: 'An error has occurred.', - userLocked: 'This user is locked due to having too many failed login attempts.', - valueMustBeUnique: 'Value must be unique', - verificationTokenInvalid: 'Verification token is invalid.', - }, - fields: { - addLabel: 'Add {{label}}', - addLink: 'Add Link', - addNew: 'Add new', - addNewLabel: 'Add new {{label}}', - addRelationship: 'Add Relationship', - addUpload: 'Add Upload', - block: 'block', - blockType: 'Block Type', - blocks: 'blocks', - chooseBetweenCustomTextOrDocument: - 'Choose between entering a custom text URL or linking to another document.', - chooseDocumentToLink: 'Choose a document to link to', - chooseFromExisting: 'Choose from existing', - chooseLabel: 'Choose {{label}}', - collapseAll: 'Collapse All', - customURL: 'Custom URL', - editLabelData: 'Edit {{label}} data', - editLink: 'Edit Link', - editRelationship: 'Edit Relationship', - enterURL: 'Enter a URL', - internalLink: 'Internal Link', - itemsAndMore: '{{items}} and {{count}} more', - labelRelationship: '{{label}} Relationship', - latitude: 'Latitude', - linkType: 'Link Type', - linkedTo: 'Linked to <0>{{label}}', - longitude: 'Longitude', - newLabel: 'New {{label}}', - openInNewTab: 'Open in new tab', - passwordsDoNotMatch: 'Passwords do not match.', - relatedDocument: 'Related Document', - relationTo: 'Relation To', - removeRelationship: 'Remove Relationship', - removeUpload: 'Remove Upload', - saveChanges: 'Save changes', - searchForBlock: 'Search for a block', - selectExistingLabel: 'Select existing {{label}}', - selectFieldsToEdit: 'Select fields to edit', - showAll: 'Show All', - swapRelationship: 'Swap Relationship', - swapUpload: 'Swap Upload', - textToDisplay: 'Text to display', - toggleBlock: 'Toggle block', - uploadNewLabel: 'Upload new {{label}}', - }, - general: { - aboutToDelete: 'You are about to delete the {{label}} <1>{{title}}. Are you sure?', - aboutToDeleteCount_many: 'You are about to delete {{count}} {{label}}', - aboutToDeleteCount_one: 'You are about to delete {{count}} {{label}}', - aboutToDeleteCount_other: 'You are about to delete {{count}} {{label}}', - addBelow: 'Add Below', - addFilter: 'Add Filter', - adminTheme: 'Admin Theme', - and: 'And', - applyChanges: 'Apply Changes', - ascending: 'Ascending', - automatic: 'Automatic', - backToDashboard: 'Back to Dashboard', - cancel: 'Cancel', - changesNotSaved: - 'Your changes have not been saved. If you leave now, you will lose your changes.', - close: 'Close', - collapse: 'Collapse', - collections: 'Collections', - columnToSort: 'Column to Sort', - columns: 'Columns', - confirm: 'Confirm', - confirmDeletion: 'Confirm deletion', - confirmDuplication: 'Confirm duplication', - copied: 'Copied', - copy: 'Copy', - create: 'Create', - createNew: 'Create New', - createNewLabel: 'Create new {{label}}', - creatingNewLabel: 'Creating new {{label}}', - created: 'Created', - createdAt: 'Created At', - creating: 'Creating', - dark: 'Dark', - dashboard: 'Dashboard', - delete: 'Delete', - deletedCountSuccessfully: 'Deleted {{count}} {{label}} successfully.', - deletedSuccessfully: 'Deleted successfully.', - deleting: 'Deleting...', - descending: 'Descending', - deselectAllRows: 'Deselect all rows', - duplicate: 'Duplicate', - duplicateWithoutSaving: 'Duplicate without saving changes', - edit: 'Edit', - editLabel: 'Edit {{label}}', - editing: 'Editing', - editingLabel_many: 'Editing {{count}} {{label}}', - editingLabel_one: 'Editing {{count}} {{label}}', - editingLabel_other: 'Editing {{count}} {{label}}', - email: 'Email', - emailAddress: 'Email Address', - enterAValue: 'Enter a value', - error: 'Error', - errors: 'Errors', - fallbackToDefaultLocale: 'Fallback to default locale', - filter: 'Filter', - filterWhere: 'Filter {{label}} where', - filters: 'Filters', - globals: 'Globals', - language: 'Language', - lastModified: 'Last Modified', - leaveAnyway: 'Leave anyway', - leaveWithoutSaving: 'Leave without saving', - light: 'Light', - livePreview: 'Live Preview', - loading: 'Loading', - locale: 'Locale', - locales: 'Locales', - menu: 'Menu', - moveDown: 'Move Down', - moveUp: 'Move Up', - newPassword: 'New Password', - noFiltersSet: 'No filters set', - noLabel: '', - noOptions: 'No options', - noResults: - "No {{label}} found. Either no {{label}} exist yet or none match the filters you've specified above.", - noValue: 'No value', - none: 'None', - notFound: 'Not Found', - nothingFound: 'Nothing found', - of: 'of', - or: 'Or', - open: 'Open', - order: 'Order', - pageNotFound: 'Page not found', - password: 'Password', - payloadSettings: 'Payload Settings', - perPage: 'Per Page: {{limit}}', - remove: 'Remove', - reset: 'Reset', - row: 'Row', - rows: 'Rows', - save: 'Save', - saving: 'Saving...', - searchBy: 'Search by {{label}}', - selectAll: 'Select all {{count}} {{label}}', - selectAllRows: 'Select all rows', - selectValue: 'Select a value', - selectedCount: '{{count}} {{label}} selected', - showAllLabel: 'Show all {{label}}', - sorryNotFound: 'Sorry—there is nothing to correspond with your request.', - sort: 'Sort', - sortByLabelDirection: 'Sort by {{label}} {{direction}}', - stayOnThisPage: 'Stay on this page', - submissionSuccessful: 'Submission Successful.', - submit: 'Submit', - successfullyCreated: '{{label}} successfully created.', - successfullyDuplicated: '{{label}} successfully duplicated.', - thisLanguage: 'English', - titleDeleted: '{{label}} "{{title}}" successfully deleted.', - unauthorized: 'Unauthorized', - unsavedChangesDuplicate: 'You have unsaved changes. Would you like to continue to duplicate?', - untitled: 'Untitled', - updatedAt: 'Updated At', - updatedCountSuccessfully: 'Updated {{count}} {{label}} successfully.', - updatedSuccessfully: 'Updated successfully.', - updating: 'Updating', - uploading: 'Uploading', - user: 'User', - users: 'Users', - value: 'Value', - welcome: 'Welcome', - }, - operators: { - contains: 'contains', - equals: 'equals', - exists: 'exists', - isGreaterThan: 'is greater than', - isGreaterThanOrEqualTo: 'is greater than or equal to', - isIn: 'is in', - isLessThan: 'is less than', - isLessThanOrEqualTo: 'is less than or equal to', - isLike: 'is like', - isNotEqualTo: 'is not equal to', - isNotIn: 'is not in', - near: 'near', - }, - upload: { - crop: 'Crop', - cropToolDescription: - 'Drag the corners of the selected area, draw a new area or adjust the values below.', - dragAndDrop: 'Drag and drop a file', - dragAndDropHere: 'or drag and drop a file here', - editImage: 'Edit Image', - focalPoint: 'Focal Point', - focalPointDescription: - 'Drag the focal point directly on the preview or adjust the values below.', - fileName: 'File Name', - fileSize: 'File Size', - height: 'Height', - lessInfo: 'Less info', - moreInfo: 'More info', - previewSizes: 'Preview Sizes', - selectCollectionToBrowse: 'Select a Collection to Browse', - selectFile: 'Select a file', - setCropArea: 'Set crop area', - setFocalPoint: 'Set focal point', - sizes: 'Sizes', - sizesFor: 'Sizes for {{label}}', - width: 'Width', - }, - validation: { - emailAddress: 'Please enter a valid email address.', - enterNumber: 'Please enter a valid number.', - fieldHasNo: 'This field has no {{label}}', - greaterThanMax: '{{value}} is greater than the max allowed {{label}} of {{max}}.', - invalidInput: 'This field has an invalid input.', - invalidSelection: 'This field has an invalid selection.', - invalidSelections: 'This field has the following invalid selections:', - lessThanMin: '{{value}} is less than the min allowed {{label}} of {{min}}.', - limitReached: 'Limit reached, only {{max}} items can be added.', - longerThanMin: 'This value must be longer than the minimum length of {{minLength}} characters.', - notValidDate: '"{{value}}" is not a valid date.', - required: 'This field is required.', - requiresAtLeast: 'This field requires at least {{count}} {{label}}.', - requiresNoMoreThan: 'This field requires no more than {{count}} {{label}}.', - requiresTwoNumbers: 'This field requires two numbers.', - shorterThanMax: 'This value must be shorter than the max length of {{maxLength}} characters.', - trueOrFalse: 'This field can only be equal to true or false.', - validUploadID: 'This field is not a valid upload ID.', - }, - version: { - aboutToPublishSelection: - 'You are about to publish all {{label}} in the selection. Are you sure?', - aboutToRestore: - 'You are about to restore this {{label}} document to the state that it was in on {{versionDate}}.', - aboutToRestoreGlobal: - 'You are about to restore the global {{label}} to the state that it was in on {{versionDate}}.', - aboutToRevertToPublished: - "You are about to revert this document's changes to its published state. Are you sure?", - aboutToUnpublish: 'You are about to unpublish this document. Are you sure?', - aboutToUnpublishSelection: - 'You are about to unpublish all {{label}} in the selection. Are you sure?', - autosave: 'Autosave', - autosavedSuccessfully: 'Autosaved successfully.', - autosavedVersion: 'Autosaved version', - changed: 'Changed', - compareVersion: 'Compare version against:', - confirmPublish: 'Confirm publish', - confirmRevertToSaved: 'Confirm revert to saved', - confirmUnpublish: 'Confirm unpublish', - confirmVersionRestoration: 'Confirm version Restoration', - currentDocumentStatus: 'Current {{docStatus}} document', - draft: 'Draft', - draftSavedSuccessfully: 'Draft saved successfully.', - lastSavedAgo: 'Last saved {{distance}} ago', - noFurtherVersionsFound: 'No further versions found', - noRowsFound: 'No {{label}} found', - preview: 'Preview', - problemRestoringVersion: 'There was a problem restoring this version', - publish: 'Publish', - publishChanges: 'Publish changes', - published: 'Published', - publishing: 'Publishing', - restoreThisVersion: 'Restore this version', - restoredSuccessfully: 'Restored Successfully.', - restoring: 'Restoring...', - revertToPublished: 'Revert to published', - reverting: 'Reverting...', - saveDraft: 'Save Draft', - selectLocales: 'Select locales to display', - selectVersionToCompare: 'Select a version to compare', - showLocales: 'Show locales:', - showingVersionsFor: 'Showing versions for:', - status: 'Status', - type: 'Type', - unpublish: 'Unpublish', - unpublishing: 'Unpublishing...', - version: 'Version', - versionCount_many: '{{count}} versions found', - versionCount_none: 'No versions found', - versionCount_one: '{{count}} version found', - versionCount_other: '{{count}} versions found', - versionCreatedOn: '{{version}} created on:', - versionID: 'Version ID', - versions: 'Versions', - viewingVersion: 'Viewing version for the {{entityLabel}} {{documentTitle}}', - viewingVersionGlobal: 'Viewing version for the global {{entityLabel}}', - viewingVersions: 'Viewing versions for the {{entityLabel}} {{documentTitle}}', - viewingVersionsGlobal: 'Viewing versions for the global {{entityLabel}}', +export const en = { + dateFNSKey: 'en-US', + translations: { + authentication: { + account: 'Account', + accountOfCurrentUser: 'Account of current user', + alreadyActivated: 'Already Activated', + alreadyLoggedIn: 'Already logged in', + apiKey: 'API Key', + backToLogin: 'Back to login', + beginCreateFirstUser: 'To begin, create your first user.', + changePassword: 'Change Password', + checkYourEmailForPasswordReset: + 'Check your email for a link that will allow you to securely reset your password.', + confirmGeneration: 'Confirm Generation', + confirmPassword: 'Confirm Password', + createFirstUser: 'Create first user', + emailNotValid: 'The email provided is not valid', + emailSent: 'Email Sent', + enableAPIKey: 'Enable API Key', + failedToUnlock: 'Failed to unlock', + forceUnlock: 'Force Unlock', + forgotPassword: 'Forgot Password', + forgotPasswordEmailInstructions: + 'Please enter your email below. You will receive an email message with instructions on how to reset your password.', + forgotPasswordQuestion: 'Forgot password?', + generate: 'Generate', + generateNewAPIKey: 'Generate new API key', + generatingNewAPIKeyWillInvalidate: + 'Generating a new API key will <1>invalidate the previous key. Are you sure you wish to continue?', + lockUntil: 'Lock Until', + logBackIn: 'Log back in', + logOut: 'Log out', + loggedIn: 'To log in with another user, you should <0>log out first.', + loggedInChangePassword: + 'To change your password, go to your <0>account and edit your password there.', + loggedOutInactivity: 'You have been logged out due to inactivity.', + loggedOutSuccessfully: 'You have been logged out successfully.', + login: 'Login', + loginAttempts: 'Login Attempts', + loginUser: 'Login user', + loginWithAnotherUser: 'To log in with another user, you should <0>log out first.', + logout: 'Logout', + logoutUser: 'Logout user', + newAPIKeyGenerated: 'New API Key Generated.', + newAccountCreated: + 'A new account has just been created for you to access {{serverURL}} Please click on the following link or paste the URL below into your browser to verify your email: {{verificationURL}}
After verifying your email, you will be able to log in successfully.', + newPassword: 'New Password', + resetPassword: 'Reset Password', + resetPasswordExpiration: 'Reset Password Expiration', + resetPasswordToken: 'Reset Password Token', + resetYourPassword: 'Reset Your Password', + stayLoggedIn: 'Stay logged in', + successfullyUnlocked: 'Successfully unlocked', + unableToVerify: 'Unable to Verify', + verified: 'Verified', + verifiedSuccessfully: 'Verified Successfully', + verify: 'Verify', + verifyUser: 'Verify User', + verifyYourEmail: 'Verify your email', + youAreInactive: + "You haven't been active in a little while and will shortly be automatically logged out for your own security. Would you like to stay logged in?", + youAreReceivingResetPassword: + 'You are receiving this because you (or someone else) have requested the reset of the password for your account. Please click on the following link, or paste this into your browser to complete the process:', + youDidNotRequestPassword: + 'If you did not request this, please ignore this email and your password will remain unchanged.', + }, + error: { + accountAlreadyActivated: 'This account has already been activated.', + autosaving: 'There was a problem while autosaving this document.', + correctInvalidFields: 'Please correct invalid fields.', + deletingFile: 'There was an error deleting file.', + deletingTitle: + 'There was an error while deleting {{title}}. Please check your connection and try again.', + emailOrPasswordIncorrect: 'The email or password provided is incorrect.', + followingFieldsInvalid_one: 'The following field is invalid:', + followingFieldsInvalid_other: 'The following fields are invalid:', + incorrectCollection: 'Incorrect Collection', + invalidFileType: 'Invalid file type', + invalidFileTypeValue: 'Invalid file type: {{value}}', + loadingDocument: 'There was a problem loading the document with ID of {{id}}.', + missingEmail: 'Missing email.', + missingIDOfDocument: 'Missing ID of document to update.', + missingIDOfVersion: 'Missing ID of version.', + missingRequiredData: 'Missing required data.', + noFilesUploaded: 'No files were uploaded.', + noMatchedField: 'No matched field found for "{{label}}"', + noUser: 'No User', + notAllowedToAccessPage: 'You are not allowed to access this page.', + notAllowedToPerformAction: 'You are not allowed to perform this action.', + notFound: 'The requested resource was not found.', + previewing: 'There was a problem previewing this document.', + problemUploadingFile: 'There was a problem while uploading the file.', + tokenInvalidOrExpired: 'Token is either invalid or has expired.', + unPublishingDocument: 'There was a problem while un-publishing this document.', + unableToDeleteCount: 'Unable to delete {{count}} out of {{total}} {{label}}.', + unableToUpdateCount: 'Unable to update {{count}} out of {{total}} {{label}}.', + unauthorized: 'Unauthorized, you must be logged in to make this request.', + unknown: 'An unknown error has occurred.', + unspecific: 'An error has occurred.', + userLocked: 'This user is locked due to having too many failed login attempts.', + valueMustBeUnique: 'Value must be unique', + verificationTokenInvalid: 'Verification token is invalid.', + }, + fields: { + addLabel: 'Add {{label}}', + addLink: 'Add Link', + addNew: 'Add new', + addNewLabel: 'Add new {{label}}', + addRelationship: 'Add Relationship', + addUpload: 'Add Upload', + block: 'block', + blockType: 'Block Type', + blocks: 'blocks', + chooseBetweenCustomTextOrDocument: + 'Choose between entering a custom text URL or linking to another document.', + chooseDocumentToLink: 'Choose a document to link to', + chooseFromExisting: 'Choose from existing', + chooseLabel: 'Choose {{label}}', + collapseAll: 'Collapse All', + customURL: 'Custom URL', + editLabelData: 'Edit {{label}} data', + editLink: 'Edit Link', + editRelationship: 'Edit Relationship', + enterURL: 'Enter a URL', + internalLink: 'Internal Link', + itemsAndMore: '{{items}} and {{count}} more', + labelRelationship: '{{label}} Relationship', + latitude: 'Latitude', + linkType: 'Link Type', + linkedTo: 'Linked to <0>{{label}}', + longitude: 'Longitude', + newLabel: 'New {{label}}', + openInNewTab: 'Open in new tab', + passwordsDoNotMatch: 'Passwords do not match.', + relatedDocument: 'Related Document', + relationTo: 'Relation To', + removeRelationship: 'Remove Relationship', + removeUpload: 'Remove Upload', + saveChanges: 'Save changes', + searchForBlock: 'Search for a block', + selectExistingLabel: 'Select existing {{label}}', + selectFieldsToEdit: 'Select fields to edit', + showAll: 'Show All', + swapRelationship: 'Swap Relationship', + swapUpload: 'Swap Upload', + textToDisplay: 'Text to display', + toggleBlock: 'Toggle block', + uploadNewLabel: 'Upload new {{label}}', + }, + general: { + aboutToDelete: 'You are about to delete the {{label}} <1>{{title}}. Are you sure?', + aboutToDeleteCount_many: 'You are about to delete {{count}} {{label}}', + aboutToDeleteCount_one: 'You are about to delete {{count}} {{label}}', + aboutToDeleteCount_other: 'You are about to delete {{count}} {{label}}', + addBelow: 'Add Below', + addFilter: 'Add Filter', + adminTheme: 'Admin Theme', + and: 'And', + applyChanges: 'Apply Changes', + ascending: 'Ascending', + automatic: 'Automatic', + backToDashboard: 'Back to Dashboard', + cancel: 'Cancel', + changesNotSaved: + 'Your changes have not been saved. If you leave now, you will lose your changes.', + close: 'Close', + collapse: 'Collapse', + collections: 'Collections', + columnToSort: 'Column to Sort', + columns: 'Columns', + confirm: 'Confirm', + confirmDeletion: 'Confirm deletion', + confirmDuplication: 'Confirm duplication', + copied: 'Copied', + copy: 'Copy', + create: 'Create', + createNew: 'Create New', + createNewLabel: 'Create new {{label}}', + created: 'Created', + createdAt: 'Created At', + creating: 'Creating', + creatingNewLabel: 'Creating new {{label}}', + dark: 'Dark', + dashboard: 'Dashboard', + delete: 'Delete', + deletedCountSuccessfully: 'Deleted {{count}} {{label}} successfully.', + deletedSuccessfully: 'Deleted successfully.', + deleting: 'Deleting...', + descending: 'Descending', + deselectAllRows: 'Deselect all rows', + duplicate: 'Duplicate', + duplicateWithoutSaving: 'Duplicate without saving changes', + edit: 'Edit', + editLabel: 'Edit {{label}}', + editing: 'Editing', + editingLabel_many: 'Editing {{count}} {{label}}', + editingLabel_one: 'Editing {{count}} {{label}}', + editingLabel_other: 'Editing {{count}} {{label}}', + email: 'Email', + emailAddress: 'Email Address', + enterAValue: 'Enter a value', + error: 'Error', + errors: 'Errors', + fallbackToDefaultLocale: 'Fallback to default locale', + filter: 'Filter', + filterWhere: 'Filter {{label}} where', + filters: 'Filters', + globals: 'Globals', + language: 'Language', + lastModified: 'Last Modified', + leaveAnyway: 'Leave anyway', + leaveWithoutSaving: 'Leave without saving', + light: 'Light', + livePreview: 'Live Preview', + loading: 'Loading', + locale: 'Locale', + locales: 'Locales', + menu: 'Menu', + moveDown: 'Move Down', + moveUp: 'Move Up', + newPassword: 'New Password', + noFiltersSet: 'No filters set', + noLabel: '', + noOptions: 'No options', + noResults: + "No {{label}} found. Either no {{label}} exist yet or none match the filters you've specified above.", + noValue: 'No value', + none: 'None', + notFound: 'Not Found', + nothingFound: 'Nothing found', + of: 'of', + open: 'Open', + or: 'Or', + order: 'Order', + pageNotFound: 'Page not found', + password: 'Password', + payloadSettings: 'Payload Settings', + perPage: 'Per Page: {{limit}}', + remove: 'Remove', + reset: 'Reset', + row: 'Row', + rows: 'Rows', + save: 'Save', + saving: 'Saving...', + searchBy: 'Search by {{label}}', + selectAll: 'Select all {{count}} {{label}}', + selectAllRows: 'Select all rows', + selectValue: 'Select a value', + selectedCount: '{{count}} {{label}} selected', + showAllLabel: 'Show all {{label}}', + sorryNotFound: 'Sorry—there is nothing to correspond with your request.', + sort: 'Sort', + sortByLabelDirection: 'Sort by {{label}} {{direction}}', + stayOnThisPage: 'Stay on this page', + submissionSuccessful: 'Submission Successful.', + submit: 'Submit', + successfullyCreated: '{{label}} successfully created.', + successfullyDuplicated: '{{label}} successfully duplicated.', + thisLanguage: 'English', + titleDeleted: '{{label}} "{{title}}" successfully deleted.', + unauthorized: 'Unauthorized', + unsavedChangesDuplicate: 'You have unsaved changes. Would you like to continue to duplicate?', + untitled: 'Untitled', + updatedAt: 'Updated At', + updatedCountSuccessfully: 'Updated {{count}} {{label}} successfully.', + updatedSuccessfully: 'Updated successfully.', + updating: 'Updating', + uploading: 'Uploading', + user: 'User', + users: 'Users', + value: 'Value', + welcome: 'Welcome', + }, + operators: { + contains: 'contains', + equals: 'equals', + exists: 'exists', + isGreaterThan: 'is greater than', + isGreaterThanOrEqualTo: 'is greater than or equal to', + isIn: 'is in', + isLessThan: 'is less than', + isLessThanOrEqualTo: 'is less than or equal to', + isLike: 'is like', + isNotEqualTo: 'is not equal to', + isNotIn: 'is not in', + near: 'near', + }, + upload: { + crop: 'Crop', + cropToolDescription: + 'Drag the corners of the selected area, draw a new area or adjust the values below.', + dragAndDrop: 'Drag and drop a file', + dragAndDropHere: 'or drag and drop a file here', + editImage: 'Edit Image', + fileName: 'File Name', + fileSize: 'File Size', + focalPoint: 'Focal Point', + focalPointDescription: + 'Drag the focal point directly on the preview or adjust the values below.', + height: 'Height', + lessInfo: 'Less info', + moreInfo: 'More info', + previewSizes: 'Preview Sizes', + selectCollectionToBrowse: 'Select a Collection to Browse', + selectFile: 'Select a file', + setCropArea: 'Set crop area', + setFocalPoint: 'Set focal point', + sizes: 'Sizes', + sizesFor: 'Sizes for {{label}}', + width: 'Width', + }, + validation: { + emailAddress: 'Please enter a valid email address.', + enterNumber: 'Please enter a valid number.', + fieldHasNo: 'This field has no {{label}}', + greaterThanMax: '{{value}} is greater than the max allowed {{label}} of {{max}}.', + invalidInput: 'This field has an invalid input.', + invalidSelection: 'This field has an invalid selection.', + invalidSelections: 'This field has the following invalid selections:', + lessThanMin: '{{value}} is less than the min allowed {{label}} of {{min}}.', + limitReached: 'Limit reached, only {{max}} items can be added.', + longerThanMin: + 'This value must be longer than the minimum length of {{minLength}} characters.', + notValidDate: '"{{value}}" is not a valid date.', + required: 'This field is required.', + requiresAtLeast: 'This field requires at least {{count}} {{label}}.', + requiresNoMoreThan: 'This field requires no more than {{count}} {{label}}.', + requiresTwoNumbers: 'This field requires two numbers.', + shorterThanMax: 'This value must be shorter than the max length of {{maxLength}} characters.', + trueOrFalse: 'This field can only be equal to true or false.', + validUploadID: 'This field is not a valid upload ID.', + }, + version: { + type: 'Type', + aboutToPublishSelection: + 'You are about to publish all {{label}} in the selection. Are you sure?', + aboutToRestore: + 'You are about to restore this {{label}} document to the state that it was in on {{versionDate}}.', + aboutToRestoreGlobal: + 'You are about to restore the global {{label}} to the state that it was in on {{versionDate}}.', + aboutToRevertToPublished: + "You are about to revert this document's changes to its published state. Are you sure?", + aboutToUnpublish: 'You are about to unpublish this document. Are you sure?', + aboutToUnpublishSelection: + 'You are about to unpublish all {{label}} in the selection. Are you sure?', + autosave: 'Autosave', + autosavedSuccessfully: 'Autosaved successfully.', + autosavedVersion: 'Autosaved version', + changed: 'Changed', + compareVersion: 'Compare version against:', + confirmPublish: 'Confirm publish', + confirmRevertToSaved: 'Confirm revert to saved', + confirmUnpublish: 'Confirm unpublish', + confirmVersionRestoration: 'Confirm version Restoration', + currentDocumentStatus: 'Current {{docStatus}} document', + draft: 'Draft', + draftSavedSuccessfully: 'Draft saved successfully.', + lastSavedAgo: 'Last saved {{distance}} ago', + noFurtherVersionsFound: 'No further versions found', + noRowsFound: 'No {{label}} found', + preview: 'Preview', + problemRestoringVersion: 'There was a problem restoring this version', + publish: 'Publish', + publishChanges: 'Publish changes', + published: 'Published', + publishing: 'Publishing', + restoreThisVersion: 'Restore this version', + restoredSuccessfully: 'Restored Successfully.', + restoring: 'Restoring...', + revertToPublished: 'Revert to published', + reverting: 'Reverting...', + saveDraft: 'Save Draft', + selectLocales: 'Select locales to display', + selectVersionToCompare: 'Select a version to compare', + showLocales: 'Show locales:', + showingVersionsFor: 'Showing versions for:', + status: 'Status', + unpublish: 'Unpublish', + unpublishing: 'Unpublishing...', + version: 'Version', + versionCount_many: '{{count}} versions found', + versionCount_none: 'No versions found', + versionCount_one: '{{count}} version found', + versionCount_other: '{{count}} versions found', + versionCreatedOn: '{{version}} created on:', + versionID: 'Version ID', + versions: 'Versions', + viewingVersion: 'Viewing version for the {{entityLabel}} {{documentTitle}}', + viewingVersionGlobal: 'Viewing version for the global {{entityLabel}}', + viewingVersions: 'Viewing versions for the {{entityLabel}} {{documentTitle}}', + viewingVersionsGlobal: 'Viewing versions for the global {{entityLabel}}', + }, }, } diff --git a/packages/translations/src/types.ts b/packages/translations/src/types.ts index 40be0d66d0..cac0ddbd74 100644 --- a/packages/translations/src/types.ts +++ b/packages/translations/src/types.ts @@ -1,48 +1,56 @@ -export type LanguageTranslations = { - [namespace: string]: { - [key: string]: string +import type { Locale } from 'date-fns' + +import type { acceptedLanguages } from './utilities/init.js' + +export type Language = { + dateFNSKey: string + translations: { + [namespace: string]: { + [key: string]: string + } } } -export type Translations = { - [language: string]: LanguageTranslations +export type AcceptedLanguages = (typeof acceptedLanguages)[number] + +export type SupportedLanguages = { + [key in AcceptedLanguages]?: Language } export type TFunction = (key: string, options?: Record) => string export type I18n = { + dateFNS: Locale + /** Corresponding dateFNS key */ + dateFNSKey: string /** The fallback language */ fallbackLanguage: string /** The language of the request */ language: string /** Translate function */ t: TFunction - translations: Translations + translations: Language['translations'] } export type I18nOptions = { fallbackLanguage?: string - supportedLanguages?: Translations - translations?: { - [language: string]: - | { - $schema: string - } - | LanguageTranslations - } + supportedLanguages?: SupportedLanguages + translations?: Partial<{ + [key in AcceptedLanguages]?: Language['translations'] + }> } export type InitTFunction = (args: { config: I18nOptions language?: string - translations: Translations + translations: Language['translations'] }) => { t: TFunction - translations: Translations + translations: Language['translations'] } export type InitI18n = (args: { config: I18nOptions context: 'api' | 'client' language?: string -}) => I18n +}) => Promise diff --git a/packages/translations/src/utilities/reduceLanguages.ts b/packages/translations/src/utilities/getTranslationsByContext.ts similarity index 73% rename from packages/translations/src/utilities/reduceLanguages.ts rename to packages/translations/src/utilities/getTranslationsByContext.ts index 40de1ed5b4..a8126d1814 100644 --- a/packages/translations/src/utilities/reduceLanguages.ts +++ b/packages/translations/src/utilities/getTranslationsByContext.ts @@ -1,4 +1,4 @@ -import type { Translations } from '../types.js' +import type { Language } from '../types.js' import { clientTranslationKeys } from '../clientKeys.js' @@ -54,18 +54,10 @@ function sortObject(obj) { return sortedObject } -export const reduceLanguages = (supportedLanguages: Translations, context: 'api' | 'client') => { - const languages = {} - - Object.entries(supportedLanguages).forEach(([lang, translations]) => { - if (context === 'client') { - const clientTranslations = sortObject(filterKeys(translations, '', clientTranslationKeys)) - - languages[lang] = clientTranslations - } else { - languages[lang] = translations - } - }) - - return languages +export const getTranslationsByContext = (translations: Language, context: 'api' | 'client') => { + if (context === 'client') { + return sortObject(filterKeys(translations, '', clientTranslationKeys)) + } else { + return translations + } } diff --git a/packages/translations/src/utilities/init.ts b/packages/translations/src/utilities/init.ts index 62ac7046d1..7101203dbf 100644 --- a/packages/translations/src/utilities/init.ts +++ b/packages/translations/src/utilities/init.ts @@ -1,7 +1,8 @@ -import type { I18n, InitI18n, InitTFunction, Translations } from '../types.js' +import type { I18n, InitI18n, InitTFunction, Language } from '../types.js' +import { importDateFNSLocale } from '../importDateFNSLocale.js' import { deepMerge } from './deepMerge.js' -import { reduceLanguages } from './reduceLanguages.js' +import { getTranslationsByContext } from './getTranslationsByContext.js' /** * @function getTranslationString @@ -17,7 +18,7 @@ export const getTranslationString = ({ }: { count?: number key: string - translations: Translations[0] + translations: Language['translations'] }) => { const keys = key.split(':') let keySuffix = '' @@ -104,7 +105,7 @@ type TFunctionConstructor = ({ vars, }: { key: string - translations?: Translations[0] + translations?: Language['translations'] vars?: Record }) => string @@ -178,7 +179,7 @@ export const acceptedLanguages = [ 'vi', 'zh', 'zhTw', -] +] as const export function matchLanguage(header: string): string | undefined { const parsedHeader = parseAcceptLanguage(header) @@ -196,14 +197,13 @@ export function matchLanguage(header: string): string | undefined { const initTFunction: InitTFunction = (args) => { const { config, language, translations } = args - const mergedTranslations = deepMerge(config?.translations ?? {}, translations) - const languagePreference = matchLanguage(language) + const mergedTranslations = deepMerge(config?.translations?.[language] ?? {}, translations) return { t: (key, vars) => { return t({ key, - translations: mergedTranslations[languagePreference], + translations: mergedTranslations, vars, }) }, @@ -211,14 +211,14 @@ const initTFunction: InitTFunction = (args) => { } } -function memoize(fn: (args: unknown) => I18n, keys: string[]) { +function memoize(fn: (args: unknown) => Promise, keys: string[]) { const cacheMap = new Map() - const memoized = (args) => { + const memoized = async (args) => { const cacheKey = keys.reduce((acc, key) => acc + args[key], '') if (!cacheMap.has(cacheKey)) { - const result = fn(args) + const result = await fn(args) cacheMap.set(cacheKey, result) } @@ -229,20 +229,29 @@ function memoize(fn: (args: unknown) => I18n, keys: string[]) { } export const initI18n: InitI18n = memoize( - ({ config, context, language = 'en' }: Parameters[0]) => { - const languages = reduceLanguages(config.supportedLanguages, context) + async ({ config, context, language = 'en' }: Parameters[0]) => { + const translations = getTranslationsByContext( + config.supportedLanguages[language].translations, + context, + ) - const { t, translations } = initTFunction({ + const { t, translations: mergedTranslations } = initTFunction({ config, language: language || config.fallbackLanguage, - translations: languages, + translations, }) + const dateFNSKey = config.supportedLanguages[language]?.dateFNSKey || 'en-US' + + const dateFNS = await importDateFNSLocale(dateFNSKey) + const i18n: I18n = { + dateFNS, + dateFNSKey, fallbackLanguage: config.fallbackLanguage, language: language || config.fallbackLanguage, t, - translations, + translations: mergedTranslations, } return i18n diff --git a/packages/ui/src/elements/Autosave/index.tsx b/packages/ui/src/elements/Autosave/index.tsx index 1c48bc0cd1..88308aacba 100644 --- a/packages/ui/src/elements/Autosave/index.tsx +++ b/packages/ui/src/elements/Autosave/index.tsx @@ -131,7 +131,7 @@ export const Autosave: React.FC = ({ {!saving && lastSaved && ( {t('version:lastSavedAgo', { - distance: formatTimeToNow(lastSaved, i18n.language), + distance: formatTimeToNow({ date: lastSaved, i18n }), })} )} diff --git a/packages/ui/src/elements/DatePicker/DatePicker.tsx b/packages/ui/src/elements/DatePicker/DatePicker.tsx index 3e9f2c8dbb..d268830f7a 100644 --- a/packages/ui/src/elements/DatePicker/DatePicker.tsx +++ b/packages/ui/src/elements/DatePicker/DatePicker.tsx @@ -11,7 +11,7 @@ import type { Props } from './types.js' import { Calendar as CalendarIcon } from '../../icons/Calendar/index.js' import { X as XIcon } from '../../icons/X/index.js' import { useTranslation } from '../../providers/Translation/index.js' -import { getDateLocale } from '../../utilities/getDateLocale.js' +import { getFormattedLocale } from './getFormattedLocale.js' import './index.scss' const baseClass = 'date-time-picker' @@ -37,10 +37,10 @@ const DateTime: React.FC = (props) => { // Use the user's AdminUI language preference for the locale const { i18n } = useTranslation() - const { locale, localeData } = getDateLocale(i18n.language) + const datepickerLocale = getFormattedLocale(i18n.language) try { - registerLocale(locale, localeData) + registerLocale(datepickerLocale, i18n.dateFNS) } catch (e) { console.warn(`Could not find DatePicker locale for ${i18n.language}`) } @@ -108,7 +108,7 @@ const DateTime: React.FC = (props) => { diff --git a/packages/ui/src/elements/DatePicker/getFormattedLocale.ts b/packages/ui/src/elements/DatePicker/getFormattedLocale.ts new file mode 100644 index 0000000000..e2293dc665 --- /dev/null +++ b/packages/ui/src/elements/DatePicker/getFormattedLocale.ts @@ -0,0 +1,12 @@ +export const getFormattedLocale = (language = 'enUS') => { + const formattedLocales = { + en: 'enUS', + my: 'enUS', // Burmese is not currently supported + ua: 'uk', + zh: 'zhCN', + } + + const formattedLocale = formattedLocales[language] || language + + return formattedLocale +} diff --git a/packages/ui/src/elements/DocumentControls/index.tsx b/packages/ui/src/elements/DocumentControls/index.tsx index 3a009232cb..ee333a26bb 100644 --- a/packages/ui/src/elements/DocumentControls/index.tsx +++ b/packages/ui/src/elements/DocumentControls/index.tsx @@ -122,13 +122,15 @@ export const DocumentControls: React.FC<{ .filter(Boolean) .join(' ')} title={ - data?.updatedAt ? formatDate(data?.updatedAt, dateFormat, i18n.language) : '' + data?.updatedAt + ? formatDate({ date: data?.updatedAt, i18n, pattern: dateFormat }) + : '' } >

{i18n.t('general:lastModified')}: 

{data?.updatedAt && (

- {formatDate(data.updatedAt, dateFormat, i18n.language)} + {formatDate({ date: data?.updatedAt, i18n, pattern: dateFormat })}

)} @@ -137,13 +139,15 @@ export const DocumentControls: React.FC<{ .filter(Boolean) .join(' ')} title={ - data?.createdAt ? formatDate(data?.createdAt, dateFormat, i18n.language) : '' + data?.createdAt + ? formatDate({ date: data?.createdAt, i18n, pattern: dateFormat }) + : '' } >

{i18n.t('general:created')}: 

{data?.createdAt && (

- {formatDate(data?.createdAt, dateFormat, i18n.language)} + {formatDate({ date: data?.createdAt, i18n, pattern: dateFormat })}

)} diff --git a/packages/ui/src/elements/Table/DefaultCell/fields/Date/index.tsx b/packages/ui/src/elements/Table/DefaultCell/fields/Date/index.tsx index 0bb2df223f..ecc6a7cd47 100644 --- a/packages/ui/src/elements/Table/DefaultCell/fields/Date/index.tsx +++ b/packages/ui/src/elements/Table/DefaultCell/fields/Date/index.tsx @@ -18,5 +18,5 @@ export const DateCell: React.FC{cellData && formatDate(cellData, dateFormat, i18n.language)} + return {cellData && formatDate({ date: cellData, i18n, pattern: dateFormat })} } diff --git a/packages/ui/src/providers/Root/index.tsx b/packages/ui/src/providers/Root/index.tsx index 0c73aca768..fe3dde837e 100644 --- a/packages/ui/src/providers/Root/index.tsx +++ b/packages/ui/src/providers/Root/index.tsx @@ -1,5 +1,5 @@ 'use client' -import type { LanguageTranslations } from '@payloadcms/translations' +import type { Language } from '@payloadcms/translations' import type { ClientConfig } from 'payload/types' import * as facelessUIImport from '@faceless-ui/modal' @@ -33,19 +33,21 @@ type Props = { children: React.ReactNode componentMap: ComponentMap config: ClientConfig + dateFNSKey: Language['dateFNSKey'] fallbackLang: ClientConfig['i18n']['fallbackLanguage'] - lang: string + languageCode: string languageOptions: LanguageOptions switchLanguageServerAction?: (lang: string) => Promise - translations: LanguageTranslations + translations: Language['translations'] } export const RootProvider: React.FC = ({ children, componentMap, config, + dateFNSKey, fallbackLang, - lang, + languageCode, languageOptions, switchLanguageServerAction, translations, @@ -65,8 +67,9 @@ export const RootProvider: React.FC = ({ ) => string }>({ i18n: { + dateFNS: enUS, + dateFNSKey: 'en-US', fallbackLanguage: 'en', language: 'en', t: (key) => key, @@ -31,22 +36,25 @@ const Context = createContext<{ type Props = { children: React.ReactNode + dateFNSKey: Language['dateFNSKey'] fallbackLang: ClientConfig['i18n']['fallbackLanguage'] - lang: string + language: string languageOptions: LanguageOptions switchLanguageServerAction: (lang: string) => Promise - translations: LanguageTranslations + translations: Language['translations'] } export const TranslationProvider: React.FC = ({ children, + dateFNSKey, fallbackLang, - lang, + language, languageOptions, switchLanguageServerAction, translations, }) => { const { clearRouteCache } = useRouteCache() + const [dateFNS, setDateFNS] = useState() const nextT = (key: string, vars?: Record): string => t({ @@ -68,16 +76,26 @@ export const TranslationProvider: React.FC = ({ [switchLanguageServerAction, clearRouteCache], ) + useEffect(() => { + const loadDateFNS = async () => { + const imported = await importDateFNSLocale(dateFNSKey) + + setDateFNS(imported) + } + + void loadDateFNS() + }, [dateFNSKey]) + return ( { - const theDate = new Date(date) - const { localeData } = getDateLocale(locale) - return format(theDate, pattern, { locale: localeData }) +type FormatDateArgs = { + date: Date | number | string | undefined + i18n: I18n + pattern: string } -export const formatTimeToNow = ( - date: Date | number | string | undefined, - locale?: string, -): string => { +export const formatDate = ({ date, i18n, pattern }: FormatDateArgs): string => { const theDate = new Date(date) - const { localeData } = getDateLocale(locale) - return formatDistanceToNow(theDate, { locale: localeData }) + return format(theDate, pattern, { locale: i18n.dateFNS }) +} + +type FormatTimeToNowArgs = { + date: Date | number | string | undefined + i18n: I18n +} + +export const formatTimeToNow = ({ date, i18n }: FormatTimeToNowArgs): string => { + const theDate = new Date(date) + return formatDistanceToNow(theDate, { locale: i18n.dateFNS }) } diff --git a/packages/ui/src/utilities/formatDocTitle.ts b/packages/ui/src/utilities/formatDocTitle.ts index 5f24496a40..3fd9099319 100644 --- a/packages/ui/src/utilities/formatDocTitle.ts +++ b/packages/ui/src/utilities/formatDocTitle.ts @@ -44,7 +44,7 @@ export const formatDocTitle = ({ const dateFormat = ('date' in fieldConfig.admin && fieldConfig?.admin?.date?.displayFormat) || dateFormatFromConfig - title = formatDate(title, dateFormat, i18n.language) || title + title = formatDate({ date: title, i18n, pattern: dateFormat }) || title } } } diff --git a/packages/ui/src/utilities/getDateLocale.ts b/packages/ui/src/utilities/getDateLocale.ts deleted file mode 100644 index c6a162f389..0000000000 --- a/packages/ui/src/utilities/getDateLocale.ts +++ /dev/null @@ -1,24 +0,0 @@ -import type { Locale } from 'date-fns' - -import { dateLocales } from './dateLocales.js' - -export const getDateLocale = ( - locale = 'enUS', -): { - locale: string - localeData: Locale -} => { - const formattedLocales = { - en: 'enUS', - my: 'enUS', // Burmese is not currently supported - ua: 'uk', - zh: 'zhCN', - } - - const formattedLocale = formattedLocales[locale] || locale - - return { - locale: formattedLocale, - localeData: dateLocales[formattedLocale], - } -} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f8d37f8c20..51286c9745 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1345,6 +1345,9 @@ importers: '@types/react': specifier: 18.2.74 version: 18.2.74 + date-fns: + specifier: 3.3.1 + version: 3.3.1 typescript: specifier: 5.4.4 version: 5.4.4 @@ -8358,7 +8361,6 @@ packages: /date-fns@3.3.1: resolution: {integrity: sha512-y8e109LYGgoQDveiEBD3DYXKba1jWf5BA8YU1FL5Tvm0BTdEfy54WLCwnuYWZNnzzvALy/QQ4Hov+Q9RVRv+Zw==} - dev: false /dateformat@4.6.3: resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} diff --git a/test/buildConfigWithDefaults.ts b/test/buildConfigWithDefaults.ts index 49e9834ea9..faaf1ed889 100644 --- a/test/buildConfigWithDefaults.ts +++ b/test/buildConfigWithDefaults.ts @@ -25,6 +25,8 @@ import { UploadFeature, lexicalEditor, } from '@payloadcms/richtext-lexical' +import { de } from '@payloadcms/translations/languages/de' +import { en } from '@payloadcms/translations/languages/en' // import { slateEditor } from '@payloadcms/richtext-slate' import { type Config, buildConfig } from 'payload/config' import sharp from 'sharp' @@ -171,6 +173,12 @@ export async function buildConfigWithDefaults( }), sharp, telemetry: false, + i18n: { + supportedLanguages: { + en, + de, + }, + }, typescript: { declare: false, }, From c9399efa6547ce725770d07d054fd3d6a59ff0e6 Mon Sep 17 00:00:00 2001 From: James Date: Mon, 8 Apr 2024 22:25:35 -0400 Subject: [PATCH 006/177] chore: fixes access control test --- test/access-control/e2e.spec.ts | 4 ++-- test/dev.js | 10 ---------- 2 files changed, 2 insertions(+), 12 deletions(-) diff --git a/test/access-control/e2e.spec.ts b/test/access-control/e2e.spec.ts index 0d046404e2..f5a94e91da 100644 --- a/test/access-control/e2e.spec.ts +++ b/test/access-control/e2e.spec.ts @@ -100,7 +100,7 @@ describe('access control', () => { beforeAll(async () => { existingDoc = await payload.create({ - collection: readOnlySlug, + collection: restrictedSlug, data: { name: 'name', }, @@ -135,7 +135,7 @@ describe('access control', () => { test('should not have access to existing doc', async () => { await page.goto(restrictedUrl.edit(existingDoc.id)) - await expect(page.locator('.unauthorized')).toBeVisible() + await expect(page.locator('.not-found')).toBeVisible() }) }) diff --git a/test/dev.js b/test/dev.js index 04a64413f0..dc3b15b721 100644 --- a/test/dev.js +++ b/test/dev.js @@ -1,5 +1,4 @@ import minimist from 'minimist' -import { MongoMemoryReplSet } from 'mongodb-memory-server' import { nextDev } from 'next/dist/cli/next-dev.js' import open from 'open' import { getNextJSRootDir } from './helpers/getNextJSRootDir.js' @@ -29,15 +28,6 @@ if (args.o) { await open('http://localhost:3000/admin') } -global._mongoMemoryServer = await MongoMemoryReplSet.create({ - replSet: { - count: 3, - dbName: 'payloadmemory', - }, -}) - -process.env.MONGODB_MEMORY_SERVER_URI = global._mongoMemoryServer.getUri() - // @ts-expect-error await nextDev({ port: process.env.PORT || 3000, dirname: rootDir }, 'default', rootDir) From 518f80cbb625c15545bf5b813bea4445f4c20f86 Mon Sep 17 00:00:00 2001 From: James Date: Mon, 8 Apr 2024 22:29:41 -0400 Subject: [PATCH 007/177] chore: es --- packages/translations/src/exports/all.ts | 4 +- packages/translations/src/languages/es.ts | 784 +++++++++++----------- test/plugin-seo/config.ts | 6 + 3 files changed, 402 insertions(+), 392 deletions(-) diff --git a/packages/translations/src/exports/all.ts b/packages/translations/src/exports/all.ts index 47ad1fe1df..3e89efd7f9 100644 --- a/packages/translations/src/exports/all.ts +++ b/packages/translations/src/exports/all.ts @@ -6,7 +6,7 @@ import bg from '../languages/bg.js' import cs from '../languages/cs.js' import { de } from '../languages/de.js' import { en } from '../languages/en.js' -import es from '../languages/es.js' +import { es } from '../languages/es.js' import fa from '../languages/fa.js' import fr from '../languages/fr.js' import hr from '../languages/hr.js' @@ -38,7 +38,7 @@ export const translations = { // cs, de, en, - // es, + es, // fa, // fr, // hr, diff --git a/packages/translations/src/languages/es.ts b/packages/translations/src/languages/es.ts index 4ca648b092..e2d1918134 100644 --- a/packages/translations/src/languages/es.ts +++ b/packages/translations/src/languages/es.ts @@ -1,392 +1,396 @@ -export default { - authentication: { - account: 'Cuenta', - accountOfCurrentUser: 'Cuenta del usuario actual', - alreadyActivated: 'Ya Activado', - alreadyLoggedIn: 'Sesión iniciada', - apiKey: 'Clave API', - backToLogin: 'Regresar al inicio de sesión', - beginCreateFirstUser: 'Para empezar, crea tu primer usuario.', - changePassword: 'Cambiar contraseña', - checkYourEmailForPasswordReset: - 'Revisa tu correo con el enlace para restablecer tu contraseña de forma segura.', - confirmGeneration: 'Confirmar Generación', - confirmPassword: 'Confirmar Contraseña', - createFirstUser: 'Crear al primer usuario', - emailNotValid: 'El correo proporcionado es inválido', - emailSent: 'Correo Enviado', - enableAPIKey: 'Habilitar Clave API', - failedToUnlock: 'Desbloqueo Fallido', - forceUnlock: 'Forzar Desbloqueo', - forgotPassword: 'Olvidé mi contraseña', - forgotPasswordEmailInstructions: - 'Por favor introduce tu correo electrónico. Recibirás un mensaje con las instrucciones para restablecer tu contraseña.', - forgotPasswordQuestion: '¿Olvidaste tu contraseña?', - generate: 'Generar', - generateNewAPIKey: 'Generar Nueva Clave de API', - generatingNewAPIKeyWillInvalidate: - 'Generar una nueva clave de API <1>invalidará la clave anterior. ¿Deseas continuar?', - lockUntil: 'Bloquear Hasta', - logBackIn: 'Volver a iniciar sesión', - logOut: 'Cerrar sesión', - loggedIn: 'Para iniciar sesión con otro usuario, primero <0>cierra tu sesión.', - loggedInChangePassword: - 'Para cambiar tu contraseña, entra a <0>tu cuenta y edita la contraseña desde ahí.', - loggedOutInactivity: 'Tú sesión se cerró debido a inactividad.', - loggedOutSuccessfully: 'Tú sesión se cerró correctamente.', - login: 'Iniciar sesión', - loginAttempts: 'Login Attempts', - loginUser: 'Iniciar sesión de usuario', - loginWithAnotherUser: 'Para iniciar sesión con otro usuario, primero <0>cierra tu sesión.', - logout: 'Cerrar sesión', - logoutUser: 'Cerrar sesión de usuario', - newAPIKeyGenerated: 'Nueva Clave de API Generada.', - newAccountCreated: - 'Se ha creado una nueva cuenta para que puedas acceder a {{serverURL}}. Por favor, haz click o copia el siguiente enlace a tu navegador para verificar tu correo: {{verificationURL}}.
Una vez hayas verificado tu correo, podrás iniciar sesión.', - newPassword: 'Nueva Contraseña', - resetPassword: 'Restablecer Contraseña', - resetPasswordExpiration: 'Restablecer Caducidad de la Contraseña', - resetPasswordToken: 'Restablecer Token de la Contraseña', - resetYourPassword: 'Restablecer tu Contraseña', - stayLoggedIn: 'Mantener sesión abierta', - successfullyUnlocked: 'Desbloqueado correctamente', - unableToVerify: 'No se pudo Verificar', - verified: 'Verificado', - verifiedSuccessfully: 'Verificación Correcta', - verify: 'Verificar', - verifyUser: 'Verificar Usuario', - verifyYourEmail: 'Verifica tu correo', - youAreInactive: - 'Has estado inactivo por un tiempo y por tu seguridad se cerrará tu sesión automáticamente. ¿Deseas mantener tu sesión activa?', - 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: { - accountAlreadyActivated: 'Esta cuenta ya fue activada.', - autosaving: 'Ocurrió un problema al autoguardar este documento.', - correctInvalidFields: 'Por favor corrige los campos inválidos.', - deletingFile: 'Ocurrió un error al eliminar el archivo.', - deletingTitle: - 'Ocurrió un error al eliminar {{title}}. Por favor revisa tu conexión y vuelve a intentarlo.', - 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:', - incorrectCollection: 'Colección Incorrecta', - invalidFileType: 'Tipo de archivo inválido', - invalidFileTypeValue: 'Tipo de archivo inválido: {{value}}', - loadingDocument: 'Ocurrió un problema al cargar el documento con la ID {{id}}.', - missingEmail: 'Falta el correo.', - missingIDOfDocument: 'Falta la ID del documento a actualizar.', - missingIDOfVersion: 'Falta la ID de la versión.', - missingRequiredData: 'Falta la información obligatoria.', - noFilesUploaded: 'No se subieron archivos.', - noMatchedField: 'No se encontró un campo para "{{label}}"', - noUser: 'Sin usuario', - notAllowedToAccessPage: 'No tienes permiso para acceder a esta página.', - notAllowedToPerformAction: 'No tienes permiso para realizar esta acción.', - notFound: 'No se encontró el recurso solicitado.', - previewing: 'Ocurrió un problema al previsualizar este documento.', - problemUploadingFile: 'Ocurrió un problema al subir el archivo.', - tokenInvalidOrExpired: 'El token es inválido o ya expiró.', - unPublishingDocument: 'Ocurrió un error al despublicar este documento.', - 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.', - unknown: 'Ocurrió un error desconocido.', - unspecific: 'Ocurrió un error.', - userLocked: - 'Este usuario ha sido bloqueado debido a que tiene muchos intentos fallidos para iniciar sesión.', - valueMustBeUnique: 'El valor debe ser único', - verificationTokenInvalid: 'Token de verificación inválido.', - }, - fields: { - addLabel: 'Añadir {{label}}', - addLink: 'Añadir Enlace', - addNew: 'Añadir nuevo', - addNewLabel: 'Añadir {{label}}', - addRelationship: 'Añadir Relación', - addUpload: 'Añadir Carga', - block: 'bloque', - blockType: 'Tipo de bloque', - blocks: 'bloques', - chooseBetweenCustomTextOrDocument: - 'Elige entre ingresar una URL personalizada o enlazar a otro documento.', - chooseDocumentToLink: 'Elige un documento a enlazar', - chooseFromExisting: 'Elegir existente', - chooseLabel: 'Elegir {{label}}', - collapseAll: 'Colapsar todo', - customURL: 'URL Personalizado', - editLabelData: 'Editar información de {{label}}', - editLink: 'Editar Enlace', - editRelationship: 'Editar Relación', - enterURL: 'Ingresar URL', - internalLink: 'Enlace Interno', - itemsAndMore: '{{items}} y {{count}} más', - labelRelationship: 'Relación de {{label}}', - latitude: 'Latitud', - linkType: 'Tipo de enlace', - linkedTo: 'Enlazado a <0>{{label}}', - longitude: 'Longitud', - newLabel: 'Nuevo {{label}}', - openInNewTab: 'Abrir en nueva pestaña', - passwordsDoNotMatch: 'Las contraseñas no coinciden.', - relatedDocument: 'Documento Relacionado', - relationTo: 'Relación con', - removeRelationship: 'Eliminar relación', - removeUpload: 'Quitar Carga', - saveChanges: 'Guardar cambios', - searchForBlock: 'Buscar bloque', - selectExistingLabel: 'Seleccionar {{label}} existente', - selectFieldsToEdit: 'Seleccionar campos para editar', - showAll: 'Mostrar Todo', - swapRelationship: 'Cambiar Relación', - swapUpload: 'Cambiar carga', - textToDisplay: 'Texto a mostrar', - toggleBlock: 'Alternar bloque', - uploadNewLabel: 'Subir nuevo {{label}}', - }, - general: { - aboutToDelete: 'Estás por eliminar el {{label}} <1>{{title}}. ¿Estás seguro?', - aboutToDeleteCount_many: 'Está a punto de eliminar {{count}} {{label}}', - aboutToDeleteCount_one: 'Está a punto de eliminar {{count}} {{label}}', - aboutToDeleteCount_other: 'Está a punto de eliminar {{count}} {{label}}', - addBelow: 'Agrega abajo', - addFilter: 'Añadir filtro', - adminTheme: 'Tema del admin', - and: 'Y', - applyChanges: 'Aplicar Cambios', - ascending: 'Ascendente', - automatic: 'Automático', - backToDashboard: 'Volver al Tablero', - cancel: 'Cancelar', - changesNotSaved: - 'Tus cambios no han sido guardados. Si te sales ahora, se perderán tus cambios.', - close: 'Cerrar', - collapse: 'Colapsar', - collections: 'Colecciones', - columnToSort: 'Columna de ordenado', - columns: 'Columnas', - confirm: 'Confirmar', - confirmDeletion: 'Confirmar eliminación', - confirmDuplication: 'Confirmar duplicado', - copied: 'Copiado', - copy: 'Copiar', - create: 'Crear', - createNew: 'Crear nuevo', - createNewLabel: 'Crear nuevo {{label}}', - created: 'Creado', - createdAt: 'Fecha de creación', - creating: 'Creando', - creatingNewLabel: 'Creando nuevo {{label}}', - dark: 'Oscuro', - dashboard: 'Tablero', - delete: 'Eliminar', - deletedCountSuccessfully: 'Se eliminó {{count}} {{label}} con éxito.', - deletedSuccessfully: 'Borrado exitosamente.', - deleting: 'Eliminando...', - descending: 'Descendente', - deselectAllRows: 'Deselecciona todas las filas', - duplicate: 'Duplicar', - duplicateWithoutSaving: 'Duplicar sin guardar cambios', - edit: 'Editar', - editLabel: 'Editar {{label}}', - editing: 'Editando', - editingLabel_many: 'Edición de {{count}} {{label}}', - editingLabel_one: 'Editando {{count}} {{label}}', - editingLabel_other: 'Edición de {{count}} {{label}}', - email: 'Correo electrónico', - emailAddress: 'Dirección de Correo Electrónico', - enterAValue: 'Introduce un valor', - error: 'Error', - errors: 'Errores', - fallbackToDefaultLocale: 'Volver a la configuración regional por defecto', - filter: 'Filtro', - filterWhere: 'Filtrar {{label}} donde', - filters: 'Filtros', - globals: 'Globales', - language: 'Idioma', - lastModified: 'Última modificación', - leaveAnyway: 'Salir de todos modos', - leaveWithoutSaving: 'Salir sin guardar', - light: 'Claro', - livePreview: 'Previsualizar', - loading: 'Cargando', - locale: 'Regional', - locales: 'Locales', - menu: 'Menú', - moveDown: 'Mover abajo', - moveUp: 'Mover arriba', - newPassword: 'Nueva contraseña', - noFiltersSet: 'No hay filtros establecidos', - noLabel: '', - noOptions: 'Sin opciones', - noResults: - 'No encontramos {{label}}. Puede que no existan {{label}} todavía o no hay coincidencias con los filtros introducidos arriba.', - noValue: 'Sin valor', - none: 'Ninguna', - notFound: 'No encontrado', - nothingFound: 'No se encontró nada', - of: 'de', - open: 'Abrir', - or: 'O', - order: 'Orden', - pageNotFound: 'Página no encontrada', - password: 'Contraseña', - payloadSettings: 'Configuración de la carga', - perPage: 'Por página: {{limit}}', - remove: 'Remover', - reset: 'Reiniciar', - row: 'Fila', - rows: 'Filas', - save: 'Guardar', - saving: 'Guardando...', - searchBy: 'Buscar por {{label}}', - selectAll: 'Seleccionar todo {{count}} {{label}}', - selectAllRows: 'Selecciona todas las filas', - selectValue: 'Selecciona un valor', - selectedCount: '{{count}} {{label}} seleccionado', - showAllLabel: 'Muestra todas {{label}}', - sorryNotFound: 'Lo sentimos. No hay nada que corresponda con tu solicitud.', - sort: 'Ordenar', - sortByLabelDirection: 'Ordenar por {{label}} {{direction}}', - stayOnThisPage: 'Permanecer en esta página', - submissionSuccessful: 'Envío realizado correctamente.', - submit: 'Enviar', - successfullyCreated: '{{label}} creado correctamente.', - successfullyDuplicated: '{{label}} duplicado correctamente.', - thisLanguage: 'Español', - titleDeleted: '{{label}} {{title}} eliminado correctamente.', - unauthorized: 'No autorizado', - unsavedChangesDuplicate: 'Tienes cambios sin guardar. ¿Deseas continuar para duplicar?', - untitled: 'Sin título', - updatedAt: 'Fecha de modificado', - updatedCountSuccessfully: '{{count}} {{label}} actualizado con éxito.', - updatedSuccessfully: 'Actualizado con éxito.', - updating: 'Actualizando', - uploading: 'Subiendo', - user: 'Usuario', - users: 'Usuarios', - value: 'Valor', - welcome: 'Bienvenido', - }, - operators: { - contains: 'contiene', - equals: 'igual', - exists: 'existe', - isGreaterThan: 'es mayor que', - isGreaterThanOrEqualTo: 'es mayor o igual que', - isIn: 'está en', - isLessThan: 'es menor que', - isLessThanOrEqualTo: 'es menor o igual que', - isLike: 'es como', - isNotEqualTo: 'no es igual a', - isNotIn: 'no está en', - near: 'cerca', - }, - upload: { - crop: 'Cultivo', - cropToolDescription: - 'Arrastra las esquinas del área seleccionada, dibuja un nuevo área o ajusta los valores a continuación.', - dragAndDrop: 'Arrastra y suelta un archivo', - dragAndDropHere: 'o arrastra un archivo aquí', - editImage: 'Editar imagen', - fileName: 'Nombre del archivo', - fileSize: 'Tamaño del archivo', - focalPoint: 'Punto Focal', - focalPointDescription: - 'Arrastra el punto focal directamente en la vista previa o ajusta los valores a continuación.', - height: 'Alto', - lessInfo: 'Menos info', - moreInfo: 'Más info', - previewSizes: 'Tamaños de Vista Previa', - selectCollectionToBrowse: 'Selecciona una Colección', - selectFile: 'Selecciona un archivo', - setCropArea: 'Establecer área de cultivo', - setFocalPoint: 'Establecer punto focal', - sizes: 'Tamaños', - sizesFor: 'Tamaños para {{label}}', - width: 'Ancho', - }, - validation: { - emailAddress: 'Por favor introduce un correo electrónico válido.', - enterNumber: 'Por favor introduce un número válido.', - fieldHasNo: 'Este campo no tiene {{label}}', - 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}}.', - limitReached: 'Se ha alcanzado el límite, solo se pueden agregar {{max}} elementos.', - 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.', - requiresAtLeast: 'Este campo require al menos {{count}} {{label}}.', - 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: { - aboutToPublishSelection: - 'Está a punto de publicar todas las {{etiquetas}} de la selección. ¿Está seguro?', - aboutToRestore: - 'Estás a punto de restaurar este documento de {{label}} al estado en el que estaba en la fecha {{versionDate}}.', - aboutToRestoreGlobal: - 'Estás a punto de restaurar el {{label}} global al estado en el que estaba en la fecha {{versionDate}}.', - aboutToRevertToPublished: - 'Estás a punto de revertir los cambios de este documento a su estado publicado. ¿Estás seguro?', - aboutToUnpublish: 'Estás a punto de despublicar este documento. ¿Estás seguro?', - aboutToUnpublishSelection: - 'Está a punto de anular la publicación de todos los {{label}} de la selección. ¿Está seguro?', - autosave: 'Autoguardar', - autosavedSuccessfully: 'Guardado automáticamente con éxito.', - autosavedVersion: 'Versión Autoguardada', - changed: 'Modificado', - compareVersion: 'Comparar versión con:', - confirmPublish: 'Confirmar publicación', - confirmRevertToSaved: 'Confirmar revertir a guardado', - confirmUnpublish: 'Confirmar despublicado', - confirmVersionRestoration: 'Confirmar restauración de versión', - currentDocumentStatus: 'Documento {{docStatus}} actual', - draft: 'Borrador', - draftSavedSuccessfully: 'Borrador guardado con éxito.', - lastSavedAgo: 'Guardado por última vez hace {{distance}}', - noFurtherVersionsFound: 'No se encontraron más versiones', - noRowsFound: 'No encontramos {{label}}', - preview: 'Previsualizar', - problemRestoringVersion: 'Ocurrió un problema al restaurar esta versión', - publish: 'Publicar', - publishChanges: 'Publicar cambios', - published: 'Publicado', - publishing: 'Publicación', - restoreThisVersion: 'Restaurar esta versión', - restoredSuccessfully: 'Restaurado éxito.', - restoring: 'Restaurando...', - revertToPublished: 'Revertir a publicado', - reverting: 'Revirtiendo...', - saveDraft: 'Guardar Borrador', - selectLocales: 'Selecciona idiomas a mostrar', - selectVersionToCompare: 'Selecciona versión a comparar', - showLocales: 'Mostrar idiomas:', - showingVersionsFor: 'Mostrando versiones para:', - status: 'Estado', - type: 'Tipo', - unpublish: 'Despublicar', - unpublishing: 'Despublicando...', - version: 'Versión', - versionCount_many: '{{count}} versiones encontradas', - versionCount_none: 'No encontramos versiones', - versionCount_one: '{{count}} versión encontrada', - versionCount_other: '{{count}} versiones encontradas', - versionCreatedOn: '{{version}} creada el:', - versionID: 'ID de Versión', - versions: 'Versiones', - viewingVersion: 'Viendo versión para {{entityLabel}} {{documentTitle}}', - viewingVersionGlobal: 'Viendo versión para el global {{entityLabel}}', - viewingVersions: 'Viendo versiones para {{entityLabel}} {{documentTitle}}', - viewingVersionsGlobal: 'Viendo versiones para el global {{entityLabel}}', +export const es = { + dateFNSKey: 'es', + translations: { + authentication: { + account: 'Cuenta', + accountOfCurrentUser: 'Cuenta del usuario actual', + alreadyActivated: 'Ya Activado', + alreadyLoggedIn: 'Sesión iniciada', + apiKey: 'Clave API', + backToLogin: 'Regresar al inicio de sesión', + beginCreateFirstUser: 'Para empezar, crea tu primer usuario.', + changePassword: 'Cambiar contraseña', + checkYourEmailForPasswordReset: + 'Revisa tu correo con el enlace para restablecer tu contraseña de forma segura.', + confirmGeneration: 'Confirmar Generación', + confirmPassword: 'Confirmar Contraseña', + createFirstUser: 'Crear al primer usuario', + emailNotValid: 'El correo proporcionado es inválido', + emailSent: 'Correo Enviado', + enableAPIKey: 'Habilitar Clave API', + failedToUnlock: 'Desbloqueo Fallido', + forceUnlock: 'Forzar Desbloqueo', + forgotPassword: 'Olvidé mi contraseña', + forgotPasswordEmailInstructions: + 'Por favor introduce tu correo electrónico. Recibirás un mensaje con las instrucciones para restablecer tu contraseña.', + forgotPasswordQuestion: '¿Olvidaste tu contraseña?', + generate: 'Generar', + generateNewAPIKey: 'Generar Nueva Clave de API', + generatingNewAPIKeyWillInvalidate: + 'Generar una nueva clave de API <1>invalidará la clave anterior. ¿Deseas continuar?', + lockUntil: 'Bloquear Hasta', + logBackIn: 'Volver a iniciar sesión', + logOut: 'Cerrar sesión', + loggedIn: 'Para iniciar sesión con otro usuario, primero <0>cierra tu sesión.', + loggedInChangePassword: + 'Para cambiar tu contraseña, entra a <0>tu cuenta y edita la contraseña desde ahí.', + loggedOutInactivity: 'Tú sesión se cerró debido a inactividad.', + loggedOutSuccessfully: 'Tú sesión se cerró correctamente.', + login: 'Iniciar sesión', + loginAttempts: 'Login Attempts', + loginUser: 'Iniciar sesión de usuario', + loginWithAnotherUser: + 'Para iniciar sesión con otro usuario, primero <0>cierra tu sesión.', + logout: 'Cerrar sesión', + logoutUser: 'Cerrar sesión de usuario', + newAPIKeyGenerated: 'Nueva Clave de API Generada.', + newAccountCreated: + 'Se ha creado una nueva cuenta para que puedas acceder a {{serverURL}}. Por favor, haz click o copia el siguiente enlace a tu navegador para verificar tu correo: {{verificationURL}}.
Una vez hayas verificado tu correo, podrás iniciar sesión.', + newPassword: 'Nueva Contraseña', + resetPassword: 'Restablecer Contraseña', + resetPasswordExpiration: 'Restablecer Caducidad de la Contraseña', + resetPasswordToken: 'Restablecer Token de la Contraseña', + resetYourPassword: 'Restablecer tu Contraseña', + stayLoggedIn: 'Mantener sesión abierta', + successfullyUnlocked: 'Desbloqueado correctamente', + unableToVerify: 'No se pudo Verificar', + verified: 'Verificado', + verifiedSuccessfully: 'Verificación Correcta', + verify: 'Verificar', + verifyUser: 'Verificar Usuario', + verifyYourEmail: 'Verifica tu correo', + youAreInactive: + 'Has estado inactivo por un tiempo y por tu seguridad se cerrará tu sesión automáticamente. ¿Deseas mantener tu sesión activa?', + 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: { + accountAlreadyActivated: 'Esta cuenta ya fue activada.', + autosaving: 'Ocurrió un problema al autoguardar este documento.', + correctInvalidFields: 'Por favor corrige los campos inválidos.', + deletingFile: 'Ocurrió un error al eliminar el archivo.', + deletingTitle: + 'Ocurrió un error al eliminar {{title}}. Por favor revisa tu conexión y vuelve a intentarlo.', + 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:', + incorrectCollection: 'Colección Incorrecta', + invalidFileType: 'Tipo de archivo inválido', + invalidFileTypeValue: 'Tipo de archivo inválido: {{value}}', + loadingDocument: 'Ocurrió un problema al cargar el documento con la ID {{id}}.', + missingEmail: 'Falta el correo.', + missingIDOfDocument: 'Falta la ID del documento a actualizar.', + missingIDOfVersion: 'Falta la ID de la versión.', + missingRequiredData: 'Falta la información obligatoria.', + noFilesUploaded: 'No se subieron archivos.', + noMatchedField: 'No se encontró un campo para "{{label}}"', + noUser: 'Sin usuario', + notAllowedToAccessPage: 'No tienes permiso para acceder a esta página.', + notAllowedToPerformAction: 'No tienes permiso para realizar esta acción.', + notFound: 'No se encontró el recurso solicitado.', + previewing: 'Ocurrió un problema al previsualizar este documento.', + problemUploadingFile: 'Ocurrió un problema al subir el archivo.', + tokenInvalidOrExpired: 'El token es inválido o ya expiró.', + unPublishingDocument: 'Ocurrió un error al despublicar este documento.', + 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.', + unknown: 'Ocurrió un error desconocido.', + unspecific: 'Ocurrió un error.', + userLocked: + 'Este usuario ha sido bloqueado debido a que tiene muchos intentos fallidos para iniciar sesión.', + valueMustBeUnique: 'El valor debe ser único', + verificationTokenInvalid: 'Token de verificación inválido.', + }, + fields: { + addLabel: 'Añadir {{label}}', + addLink: 'Añadir Enlace', + addNew: 'Añadir nuevo', + addNewLabel: 'Añadir {{label}}', + addRelationship: 'Añadir Relación', + addUpload: 'Añadir Carga', + block: 'bloque', + blockType: 'Tipo de bloque', + blocks: 'bloques', + chooseBetweenCustomTextOrDocument: + 'Elige entre ingresar una URL personalizada o enlazar a otro documento.', + chooseDocumentToLink: 'Elige un documento a enlazar', + chooseFromExisting: 'Elegir existente', + chooseLabel: 'Elegir {{label}}', + collapseAll: 'Colapsar todo', + customURL: 'URL Personalizado', + editLabelData: 'Editar información de {{label}}', + editLink: 'Editar Enlace', + editRelationship: 'Editar Relación', + enterURL: 'Ingresar URL', + internalLink: 'Enlace Interno', + itemsAndMore: '{{items}} y {{count}} más', + labelRelationship: 'Relación de {{label}}', + latitude: 'Latitud', + linkType: 'Tipo de enlace', + linkedTo: 'Enlazado a <0>{{label}}', + longitude: 'Longitud', + newLabel: 'Nuevo {{label}}', + openInNewTab: 'Abrir en nueva pestaña', + passwordsDoNotMatch: 'Las contraseñas no coinciden.', + relatedDocument: 'Documento Relacionado', + relationTo: 'Relación con', + removeRelationship: 'Eliminar relación', + removeUpload: 'Quitar Carga', + saveChanges: 'Guardar cambios', + searchForBlock: 'Buscar bloque', + selectExistingLabel: 'Seleccionar {{label}} existente', + selectFieldsToEdit: 'Seleccionar campos para editar', + showAll: 'Mostrar Todo', + swapRelationship: 'Cambiar Relación', + swapUpload: 'Cambiar carga', + textToDisplay: 'Texto a mostrar', + toggleBlock: 'Alternar bloque', + uploadNewLabel: 'Subir nuevo {{label}}', + }, + general: { + aboutToDelete: 'Estás por eliminar el {{label}} <1>{{title}}. ¿Estás seguro?', + aboutToDeleteCount_many: 'Está a punto de eliminar {{count}} {{label}}', + aboutToDeleteCount_one: 'Está a punto de eliminar {{count}} {{label}}', + aboutToDeleteCount_other: 'Está a punto de eliminar {{count}} {{label}}', + addBelow: 'Agrega abajo', + addFilter: 'Añadir filtro', + adminTheme: 'Tema del admin', + and: 'Y', + applyChanges: 'Aplicar Cambios', + ascending: 'Ascendente', + automatic: 'Automático', + backToDashboard: 'Volver al Tablero', + cancel: 'Cancelar', + changesNotSaved: + 'Tus cambios no han sido guardados. Si te sales ahora, se perderán tus cambios.', + close: 'Cerrar', + collapse: 'Colapsar', + collections: 'Colecciones', + columnToSort: 'Columna de ordenado', + columns: 'Columnas', + confirm: 'Confirmar', + confirmDeletion: 'Confirmar eliminación', + confirmDuplication: 'Confirmar duplicado', + copied: 'Copiado', + copy: 'Copiar', + create: 'Crear', + createNew: 'Crear nuevo', + createNewLabel: 'Crear nuevo {{label}}', + created: 'Creado', + createdAt: 'Fecha de creación', + creating: 'Creando', + creatingNewLabel: 'Creando nuevo {{label}}', + dark: 'Oscuro', + dashboard: 'Tablero', + delete: 'Eliminar', + deletedCountSuccessfully: 'Se eliminó {{count}} {{label}} con éxito.', + deletedSuccessfully: 'Borrado exitosamente.', + deleting: 'Eliminando...', + descending: 'Descendente', + deselectAllRows: 'Deselecciona todas las filas', + duplicate: 'Duplicar', + duplicateWithoutSaving: 'Duplicar sin guardar cambios', + edit: 'Editar', + editLabel: 'Editar {{label}}', + editing: 'Editando', + editingLabel_many: 'Edición de {{count}} {{label}}', + editingLabel_one: 'Editando {{count}} {{label}}', + editingLabel_other: 'Edición de {{count}} {{label}}', + email: 'Correo electrónico', + emailAddress: 'Dirección de Correo Electrónico', + enterAValue: 'Introduce un valor', + error: 'Error', + errors: 'Errores', + fallbackToDefaultLocale: 'Volver a la configuración regional por defecto', + filter: 'Filtro', + filterWhere: 'Filtrar {{label}} donde', + filters: 'Filtros', + globals: 'Globales', + language: 'Idioma', + lastModified: 'Última modificación', + leaveAnyway: 'Salir de todos modos', + leaveWithoutSaving: 'Salir sin guardar', + light: 'Claro', + livePreview: 'Previsualizar', + loading: 'Cargando', + locale: 'Regional', + locales: 'Locales', + menu: 'Menú', + moveDown: 'Mover abajo', + moveUp: 'Mover arriba', + newPassword: 'Nueva contraseña', + noFiltersSet: 'No hay filtros establecidos', + noLabel: '', + noOptions: 'Sin opciones', + noResults: + 'No encontramos {{label}}. Puede que no existan {{label}} todavía o no hay coincidencias con los filtros introducidos arriba.', + noValue: 'Sin valor', + none: 'Ninguna', + notFound: 'No encontrado', + nothingFound: 'No se encontró nada', + of: 'de', + open: 'Abrir', + or: 'O', + order: 'Orden', + pageNotFound: 'Página no encontrada', + password: 'Contraseña', + payloadSettings: 'Configuración de la carga', + perPage: 'Por página: {{limit}}', + remove: 'Remover', + reset: 'Reiniciar', + row: 'Fila', + rows: 'Filas', + save: 'Guardar', + saving: 'Guardando...', + searchBy: 'Buscar por {{label}}', + selectAll: 'Seleccionar todo {{count}} {{label}}', + selectAllRows: 'Selecciona todas las filas', + selectValue: 'Selecciona un valor', + selectedCount: '{{count}} {{label}} seleccionado', + showAllLabel: 'Muestra todas {{label}}', + sorryNotFound: 'Lo sentimos. No hay nada que corresponda con tu solicitud.', + sort: 'Ordenar', + sortByLabelDirection: 'Ordenar por {{label}} {{direction}}', + stayOnThisPage: 'Permanecer en esta página', + submissionSuccessful: 'Envío realizado correctamente.', + submit: 'Enviar', + successfullyCreated: '{{label}} creado correctamente.', + successfullyDuplicated: '{{label}} duplicado correctamente.', + thisLanguage: 'Español', + titleDeleted: '{{label}} {{title}} eliminado correctamente.', + unauthorized: 'No autorizado', + unsavedChangesDuplicate: 'Tienes cambios sin guardar. ¿Deseas continuar para duplicar?', + untitled: 'Sin título', + updatedAt: 'Fecha de modificado', + updatedCountSuccessfully: '{{count}} {{label}} actualizado con éxito.', + updatedSuccessfully: 'Actualizado con éxito.', + updating: 'Actualizando', + uploading: 'Subiendo', + user: 'Usuario', + users: 'Usuarios', + value: 'Valor', + welcome: 'Bienvenido', + }, + operators: { + contains: 'contiene', + equals: 'igual', + exists: 'existe', + isGreaterThan: 'es mayor que', + isGreaterThanOrEqualTo: 'es mayor o igual que', + isIn: 'está en', + isLessThan: 'es menor que', + isLessThanOrEqualTo: 'es menor o igual que', + isLike: 'es como', + isNotEqualTo: 'no es igual a', + isNotIn: 'no está en', + near: 'cerca', + }, + upload: { + crop: 'Cultivo', + cropToolDescription: + 'Arrastra las esquinas del área seleccionada, dibuja un nuevo área o ajusta los valores a continuación.', + dragAndDrop: 'Arrastra y suelta un archivo', + dragAndDropHere: 'o arrastra un archivo aquí', + editImage: 'Editar imagen', + fileName: 'Nombre del archivo', + fileSize: 'Tamaño del archivo', + focalPoint: 'Punto Focal', + focalPointDescription: + 'Arrastra el punto focal directamente en la vista previa o ajusta los valores a continuación.', + height: 'Alto', + lessInfo: 'Menos info', + moreInfo: 'Más info', + previewSizes: 'Tamaños de Vista Previa', + selectCollectionToBrowse: 'Selecciona una Colección', + selectFile: 'Selecciona un archivo', + setCropArea: 'Establecer área de cultivo', + setFocalPoint: 'Establecer punto focal', + sizes: 'Tamaños', + sizesFor: 'Tamaños para {{label}}', + width: 'Ancho', + }, + validation: { + emailAddress: 'Por favor introduce un correo electrónico válido.', + enterNumber: 'Por favor introduce un número válido.', + fieldHasNo: 'Este campo no tiene {{label}}', + 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}}.', + limitReached: 'Se ha alcanzado el límite, solo se pueden agregar {{max}} elementos.', + 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.', + requiresAtLeast: 'Este campo require al menos {{count}} {{label}}.', + 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: { + type: 'Tipo', + aboutToPublishSelection: + 'Está a punto de publicar todas las {{etiquetas}} de la selección. ¿Está seguro?', + aboutToRestore: + 'Estás a punto de restaurar este documento de {{label}} al estado en el que estaba en la fecha {{versionDate}}.', + aboutToRestoreGlobal: + 'Estás a punto de restaurar el {{label}} global al estado en el que estaba en la fecha {{versionDate}}.', + aboutToRevertToPublished: + 'Estás a punto de revertir los cambios de este documento a su estado publicado. ¿Estás seguro?', + aboutToUnpublish: 'Estás a punto de despublicar este documento. ¿Estás seguro?', + aboutToUnpublishSelection: + 'Está a punto de anular la publicación de todos los {{label}} de la selección. ¿Está seguro?', + autosave: 'Autoguardar', + autosavedSuccessfully: 'Guardado automáticamente con éxito.', + autosavedVersion: 'Versión Autoguardada', + changed: 'Modificado', + compareVersion: 'Comparar versión con:', + confirmPublish: 'Confirmar publicación', + confirmRevertToSaved: 'Confirmar revertir a guardado', + confirmUnpublish: 'Confirmar despublicado', + confirmVersionRestoration: 'Confirmar restauración de versión', + currentDocumentStatus: 'Documento {{docStatus}} actual', + draft: 'Borrador', + draftSavedSuccessfully: 'Borrador guardado con éxito.', + lastSavedAgo: 'Guardado por última vez hace {{distance}}', + noFurtherVersionsFound: 'No se encontraron más versiones', + noRowsFound: 'No encontramos {{label}}', + preview: 'Previsualizar', + problemRestoringVersion: 'Ocurrió un problema al restaurar esta versión', + publish: 'Publicar', + publishChanges: 'Publicar cambios', + published: 'Publicado', + publishing: 'Publicación', + restoreThisVersion: 'Restaurar esta versión', + restoredSuccessfully: 'Restaurado éxito.', + restoring: 'Restaurando...', + revertToPublished: 'Revertir a publicado', + reverting: 'Revirtiendo...', + saveDraft: 'Guardar Borrador', + selectLocales: 'Selecciona idiomas a mostrar', + selectVersionToCompare: 'Selecciona versión a comparar', + showLocales: 'Mostrar idiomas:', + showingVersionsFor: 'Mostrando versiones para:', + status: 'Estado', + unpublish: 'Despublicar', + unpublishing: 'Despublicando...', + version: 'Versión', + versionCount_many: '{{count}} versiones encontradas', + versionCount_none: 'No encontramos versiones', + versionCount_one: '{{count}} versión encontrada', + versionCount_other: '{{count}} versiones encontradas', + versionCreatedOn: '{{version}} creada el:', + versionID: 'ID de Versión', + versions: 'Versiones', + viewingVersion: 'Viendo versión para {{entityLabel}} {{documentTitle}}', + viewingVersionGlobal: 'Viendo versión para el global {{entityLabel}}', + viewingVersions: 'Viendo versiones para {{entityLabel}} {{documentTitle}}', + viewingVersionsGlobal: 'Viendo versiones para el global {{entityLabel}}', + }, }, } diff --git a/test/plugin-seo/config.ts b/test/plugin-seo/config.ts index abfcce25b4..27f3720572 100644 --- a/test/plugin-seo/config.ts +++ b/test/plugin-seo/config.ts @@ -1,4 +1,6 @@ import { seo } from '@payloadcms/plugin-seo' +import { en } from '@payloadcms/translations/languages/en' +import { es } from '@payloadcms/translations/languages/es' import { buildConfigWithDefaults } from '../buildConfigWithDefaults.js' import { devUser } from '../credentials.js' @@ -10,6 +12,10 @@ import { seed } from './seed/index.js' export default buildConfigWithDefaults({ collections: [Users, Pages, Media], i18n: { + supportedLanguages: { + en, + es, + }, translations: { es: { 'plugin-seo': { From 5084d6dd9748b887b8b7ea0755435b4b1d3d0fa5 Mon Sep 17 00:00:00 2001 From: James Date: Mon, 8 Apr 2024 22:34:23 -0400 Subject: [PATCH 008/177] chore: attempts to de-flake live preview --- test/live-preview/e2e.spec.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/test/live-preview/e2e.spec.ts b/test/live-preview/e2e.spec.ts index 1c8371f194..38d8e3413b 100644 --- a/test/live-preview/e2e.spec.ts +++ b/test/live-preview/e2e.spec.ts @@ -222,6 +222,7 @@ describe('Live Preview', () => { test('resizes iframe to specified breakpoint', async () => { await page.goto(url.create) + await expect.poll(() => page.url(), { timeout: POLL_TOPASS_TIMEOUT }).toContain('create') await page.locator('#field-title').fill('Title 4') await page.locator('#field-slug').fill('slug-4') From 4d3ad1af35bdef5647c3d947202e4216d00352ec Mon Sep 17 00:00:00 2001 From: Jarrod Flesch Date: Mon, 8 Apr 2024 09:29:02 -0400 Subject: [PATCH 009/177] chore: run fields e2e on ci --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 4d2d3641ac..1a563a748e 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -255,7 +255,7 @@ jobs: - email - field-error-states - fields-relationship - # - fields + - fields - fields/lexical - live-preview - localization From 2154aea89f00f44f2042ae73e869d70a2c6828a0 Mon Sep 17 00:00:00 2001 From: Jarrod Flesch Date: Mon, 8 Apr 2024 09:46:11 -0400 Subject: [PATCH 010/177] chore: comment out all other test suites for now --- .github/workflows/main.yml | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 1a563a748e..88b53c8a23 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -248,22 +248,22 @@ jobs: matrix: # find test -type f -name 'e2e.spec.ts' | sort | xargs dirname | xargs -I {} basename {} suite: - - _community - - access-control - - admin - - auth - - email - - field-error-states - - fields-relationship + # - _community + # - access-control + # - admin + # - auth + # - email + # - field-error-states + # - fields-relationship - fields - - fields/lexical - - live-preview - - localization - - plugin-form-builder - - plugin-nested-docs - - plugin-seo - - versions - - uploads + # - fields/lexical + # - live-preview + # - localization + # - plugin-form-builder + # - plugin-nested-docs + # - plugin-seo + # - versions + # - uploads steps: - name: Use Node.js 18 From 318c126ae310864ed727896e217cfe3ebc266d6a Mon Sep 17 00:00:00 2001 From: James Date: Mon, 8 Apr 2024 10:32:56 -0400 Subject: [PATCH 011/177] chore: turns off prebuild for fields --- packages/payload/src/bin/loader/index.ts | 1 - test/fields/e2e.spec.ts | 6 +++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/payload/src/bin/loader/index.ts b/packages/payload/src/bin/loader/index.ts index c36db6bae6..9379d8ab04 100644 --- a/packages/payload/src/bin/loader/index.ts +++ b/packages/payload/src/bin/loader/index.ts @@ -78,7 +78,6 @@ export const resolve: ResolveFn = async (specifier, context, nextResolve) => { // and keep going let nextResult: ResolveResult - // First, try to if (!isTS) { try { nextResult = await nextResolve(specifier, context, nextResolve) diff --git a/test/fields/e2e.spec.ts b/test/fields/e2e.spec.ts index fa155eca53..0a9414aa7e 100644 --- a/test/fields/e2e.spec.ts +++ b/test/fields/e2e.spec.ts @@ -43,14 +43,14 @@ let serverURL: string describe('fields', () => { beforeAll(async ({ browser }, testInfo) => { - const prebuild = Boolean(process.env.CI) + // const prebuild = Boolean(process.env.CI) - if (prebuild) testInfo.setTimeout(testInfo.timeout * 3) + // if (prebuild) testInfo.setTimeout(testInfo.timeout * 3) process.env.SEED_IN_CONFIG_ONINIT = 'false' // Makes it so the payload config onInit seed is not run. Otherwise, the seed would be run unnecessarily twice for the initial test run - once for beforeEach and once for onInit ;({ payload, serverURL } = await initPayloadE2ENoConfig({ dirname, - prebuild, + // prebuild, })) const context = await browser.newContext() From ee7221c986404c67e17f06985d8222744919ed47 Mon Sep 17 00:00:00 2001 From: James Date: Mon, 8 Apr 2024 11:04:55 -0400 Subject: [PATCH 012/177] chore: sets maxRetries --- test/playwright.config.ts | 1 + tsconfig.json | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/test/playwright.config.ts b/test/playwright.config.ts index 09500f6eb9..586dc24577 100644 --- a/test/playwright.config.ts +++ b/test/playwright.config.ts @@ -25,4 +25,5 @@ export default defineConfig({ timeout: EXPECT_TIMEOUT, }, workers: 16, + maxFailures: 1, }) diff --git a/tsconfig.json b/tsconfig.json index 5148312920..f076b0be8f 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -37,7 +37,7 @@ ], "paths": { "@payload-config": [ - "./test/_community/config.ts" + "./test/fields/config.ts" ], "@payloadcms/live-preview": [ "./packages/live-preview/src" @@ -161,4 +161,4 @@ ".next/types/**/*.ts", "scripts/**/*.ts" ] -} +} \ No newline at end of file From 3e9bd5bb627e9342a9797ee4a4ec8544154add26 Mon Sep 17 00:00:00 2001 From: James Date: Mon, 8 Apr 2024 11:05:14 -0400 Subject: [PATCH 013/177] chore: uses ci env var to set max retries --- test/playwright.config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/playwright.config.ts b/test/playwright.config.ts index 586dc24577..0c65aabb5d 100644 --- a/test/playwright.config.ts +++ b/test/playwright.config.ts @@ -25,5 +25,5 @@ export default defineConfig({ timeout: EXPECT_TIMEOUT, }, workers: 16, - maxFailures: 1, + maxFailures: process.env.CI ? 1 : undefined, }) From 996ee47f969330be525099ea24ddf649d3a1db1c Mon Sep 17 00:00:00 2001 From: James Date: Mon, 8 Apr 2024 11:16:08 -0400 Subject: [PATCH 014/177] chore: splits out blocks and array into their own suites --- .github/workflows/main.yml | 2 + test/fields/collections/Array/e2e.spec.ts | 288 ++++++++++++++ test/fields/collections/Blocks/e2e.spec.ts | 245 ++++++++++++ test/fields/e2e.spec.ts | 428 --------------------- 4 files changed, 535 insertions(+), 428 deletions(-) create mode 100644 test/fields/collections/Array/e2e.spec.ts create mode 100644 test/fields/collections/Blocks/e2e.spec.ts diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 88b53c8a23..9768f3c2c2 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -256,6 +256,8 @@ jobs: # - field-error-states # - fields-relationship - fields + - fields/collections/Blocks + - fields/collections/Array # - fields/lexical # - live-preview # - localization diff --git a/test/fields/collections/Array/e2e.spec.ts b/test/fields/collections/Array/e2e.spec.ts new file mode 100644 index 0000000000..ef7c9b7ade --- /dev/null +++ b/test/fields/collections/Array/e2e.spec.ts @@ -0,0 +1,288 @@ +import type { Page } from '@playwright/test' + +import { expect, test } from '@playwright/test' +import path from 'path' +import { wait } from 'payload/utilities' +import { fileURLToPath } from 'url' + +import type { PayloadTestSDK } from '../../../helpers/sdk/index.js' +import type { Config } from '../../payload-types.js' + +import { + ensureAutoLoginAndCompilationIsDone, + initPageConsoleErrorCatch, + saveDocAndAssert, +} from '../../../helpers.js' +import { AdminUrlUtil } from '../../../helpers/adminUrlUtil.js' +import { initPayloadE2ENoConfig } from '../../../helpers/initPayloadE2ENoConfig.js' +import { reInitializeDB } from '../../../helpers/reInit.js' +import { RESTClient } from '../../../helpers/rest.js' + +const filename = fileURLToPath(import.meta.url) +const currentFolder = path.dirname(filename) +const dirname = path.resolve(currentFolder, '../../') + +const { beforeAll, beforeEach, describe } = test + +let payload: PayloadTestSDK +let client: RESTClient +let page: Page +let serverURL: string +// If we want to make this run in parallel: test.describe.configure({ mode: 'parallel' }) + +describe('Array', () => { + beforeAll(async ({ browser }) => { + process.env.SEED_IN_CONFIG_ONINIT = 'false' // Makes it so the payload config onInit seed is not run. Otherwise, the seed would be run unnecessarily twice for the initial test run - once for beforeEach and once for onInit + ;({ payload, serverURL } = await initPayloadE2ENoConfig({ + dirname, + })) + + const context = await browser.newContext() + page = await context.newPage() + initPageConsoleErrorCatch(page) + }) + beforeEach(async () => { + await reInitializeDB({ + serverURL, + snapshotKey: 'fieldsArrayTest', + uploadsDir: path.resolve(dirname, '../Upload/uploads'), + }) + + if (client) { + await client.logout() + } + client = new RESTClient(null, { defaultSlug: 'users', serverURL }) + await client.login() + + await ensureAutoLoginAndCompilationIsDone({ page, serverURL }) + }) + + let url: AdminUrlUtil + beforeAll(() => { + url = new AdminUrlUtil(serverURL, 'array-fields') + }) + + test('should be readOnly', async () => { + await page.goto(url.create) + const field = page.locator('#field-readOnly__0__text') + await expect(field).toBeDisabled() + }) + + test('should have defaultValue', async () => { + await page.goto(url.create) + const field = page.locator('#field-readOnly__0__text') + await expect(field).toHaveValue('defaultValue') + }) + + test('should render RowLabel using a component', async () => { + const label = 'custom row label as component' + await page.goto(url.create) + await page.locator('#field-rowLabelAsComponent >> .array-field__add-row').click() + + await page.locator('#field-rowLabelAsComponent__0__title').fill(label) + await wait(100) + const customRowLabel = page.locator( + '#rowLabelAsComponent-row-0 >> .array-field__row-header > :text("custom row label")', + ) + await expect(customRowLabel).toHaveCSS('text-transform', 'uppercase') + }) + + test('should bypass min rows validation when no rows present and field is not required', async () => { + await page.goto(url.create) + await saveDocAndAssert(page) + await expect(page.locator('.Toastify')).toContainText('successfully') + }) + + test('should fail min rows validation when rows are present', async () => { + await page.goto(url.create) + await page.locator('#field-arrayWithMinRows >> .array-field__add-row').click() + + await page.click('#action-save', { delay: 100 }) + await expect(page.locator('.Toastify')).toContainText( + 'The following field is invalid: arrayWithMinRows', + ) + }) + + describe('row manipulation', () => { + test('should add, remove and duplicate rows', async () => { + const assertText0 = 'array row 1' + const assertGroupText0 = 'text in group in row 1' + const assertText1 = 'array row 2' + const assertText3 = 'array row 3' + const assertGroupText3 = 'text in group in row 3' + await page.goto(url.create) + await page.mouse.wheel(0, 1750) + await page.locator('#field-potentiallyEmptyArray').scrollIntoViewIfNeeded() + await wait(300) + + // Add 3 rows + await page.locator('#field-potentiallyEmptyArray > .array-field__add-row').click() + await wait(300) + await page.locator('#field-potentiallyEmptyArray > .array-field__add-row').click() + await wait(300) + await page.locator('#field-potentiallyEmptyArray > .array-field__add-row').click() + await wait(300) + + // Fill out row 1 + await page.locator('#field-potentiallyEmptyArray__0__text').fill(assertText0) + await page + .locator('#field-potentiallyEmptyArray__0__groupInRow__textInGroupInRow') + .fill(assertGroupText0) + // Fill out row 2 + await page.locator('#field-potentiallyEmptyArray__1__text').fill(assertText1) + // Fill out row 3 + await page.locator('#field-potentiallyEmptyArray__2__text').fill(assertText3) + await page + .locator('#field-potentiallyEmptyArray__2__groupInRow__textInGroupInRow') + .fill(assertGroupText3) + + // Remove row 1 + await page.locator('#potentiallyEmptyArray-row-0 .array-actions__button').click() + await page + .locator('#potentiallyEmptyArray-row-0 .popup__scroll-container .array-actions__remove') + .click() + // Remove row 2 + await page.locator('#potentiallyEmptyArray-row-0 .array-actions__button').click() + await page + .locator('#potentiallyEmptyArray-row-0 .popup__scroll-container .array-actions__remove') + .click() + + // Save document + await saveDocAndAssert(page) + + // Scroll to array row (fields are not rendered in DOM until on screen) + await page.locator('#field-potentiallyEmptyArray__0__groupInRow').scrollIntoViewIfNeeded() + + // Expect the remaining row to be the third row + const input = page.locator('#field-potentiallyEmptyArray__0__groupInRow__textInGroupInRow') + await expect(input).toHaveValue(assertGroupText3) + + // Duplicate row + await page.locator('#potentiallyEmptyArray-row-0 .array-actions__button').click() + await page + .locator('#potentiallyEmptyArray-row-0 .popup__scroll-container .array-actions__duplicate') + .click() + + // Update duplicated row group field text + await page + .locator('#field-potentiallyEmptyArray__1__groupInRow__textInGroupInRow') + .fill(`${assertGroupText3} duplicate`) + + // Save document + await saveDocAndAssert(page) + + // Expect the second row to be a duplicate of the remaining row + await expect( + page.locator('#field-potentiallyEmptyArray__1__groupInRow__textInGroupInRow'), + ).toHaveValue(`${assertGroupText3} duplicate`) + + // Remove row 1 + await page.locator('#potentiallyEmptyArray-row-0 .array-actions__button').click() + await page + .locator('#potentiallyEmptyArray-row-0 .popup__scroll-container .array-actions__remove') + .click() + + // Save document + await saveDocAndAssert(page) + + // Expect the remaining row to be the copy of the duplicate row + await expect( + page.locator('#field-potentiallyEmptyArray__0__groupInRow__textInGroupInRow'), + ).toHaveValue(`${assertGroupText3} duplicate`) + }) + }) + + // TODO: re-enable this test + test.skip('should bulk update', async () => { + await payload.create({ + collection: 'array-fields', + data: { + title: 'for test 1', + items: [ + { + text: 'test 1', + }, + { + text: 'test 2', + }, + ], + }, + }) + + await payload.create({ + collection: 'array-fields', + data: { + title: 'for test 2', + items: [ + { + text: 'test 3', + }, + ], + }, + }) + + await payload.create({ + collection: 'array-fields', + data: { + title: 'for test 3', + items: [ + { + text: 'test 4', + }, + { + text: 'test 5', + }, + { + text: 'test 6', + }, + ], + }, + }) + + const bulkText = 'Bulk update text' + await page.goto(url.list) + await page.waitForSelector('.table > table > tbody > tr td.cell-title') + const rows = page.locator('.table > table > tbody > tr', { + has: page.locator('td.cell-title a', { + hasText: 'for test', + }), + }) + const count = await rows.count() + + for (let i = 0; i < count; i++) { + await rows + .nth(i) + .locator('td.cell-_select .checkbox-input__input > input[type="checkbox"]') + .click() + } + await page.locator('.edit-many__toggle').click() + await page.locator('.field-select .rs__control').click() + + const arrayOption = page.locator('.rs__option', { + hasText: 'Items', + }) + + await expect(arrayOption).toBeVisible() + + await arrayOption.click() + await wait(200) + + const addRowButton = page.locator('#field-items > .array-field__add-row') + + await expect(addRowButton).toBeVisible() + + await addRowButton.click() + await wait(200) + + const targetInput = page.locator('#field-items__0__text') + + await expect(targetInput).toBeVisible() + + await targetInput.fill(bulkText) + + await page.locator('#edit-array-fields .form-submit .edit-many__save').click() + await expect(page.locator('.Toastify__toast--success')).toContainText( + 'Updated 3 Array Fields successfully.', + ) + }) +}) diff --git a/test/fields/collections/Blocks/e2e.spec.ts b/test/fields/collections/Blocks/e2e.spec.ts new file mode 100644 index 0000000000..35854bc930 --- /dev/null +++ b/test/fields/collections/Blocks/e2e.spec.ts @@ -0,0 +1,245 @@ +import type { Page } from '@playwright/test' + +import { expect, test } from '@playwright/test' +import path from 'path' +import { fileURLToPath } from 'url' + +import { + ensureAutoLoginAndCompilationIsDone, + initPageConsoleErrorCatch, + saveDocAndAssert, +} from '../../../helpers.js' +import { AdminUrlUtil } from '../../../helpers/adminUrlUtil.js' +import { initPayloadE2ENoConfig } from '../../../helpers/initPayloadE2ENoConfig.js' +import { reInitializeDB } from '../../../helpers/reInit.js' +import { RESTClient } from '../../../helpers/rest.js' + +const filename = fileURLToPath(import.meta.url) +const currentFolder = path.dirname(filename) +const dirname = path.resolve(currentFolder, '../../') + +const { beforeAll, beforeEach, describe } = test + +let client: RESTClient +let page: Page +let serverURL: string +// If we want to make this run in parallel: test.describe.configure({ mode: 'parallel' }) + +describe('Block fields', () => { + beforeAll(async ({ browser }) => { + process.env.SEED_IN_CONFIG_ONINIT = 'false' // Makes it so the payload config onInit seed is not run. Otherwise, the seed would be run unnecessarily twice for the initial test run - once for beforeEach and once for onInit + ;({ serverURL } = await initPayloadE2ENoConfig({ + dirname, + })) + + const context = await browser.newContext() + page = await context.newPage() + initPageConsoleErrorCatch(page) + }) + beforeEach(async () => { + await reInitializeDB({ + serverURL, + snapshotKey: 'blockFieldsTest', + uploadsDir: path.resolve(dirname, '../Upload/uploads'), + }) + + if (client) { + await client.logout() + } + client = new RESTClient(null, { defaultSlug: 'users', serverURL }) + await client.login() + + await ensureAutoLoginAndCompilationIsDone({ page, serverURL }) + }) + + let url: AdminUrlUtil + beforeAll(() => { + url = new AdminUrlUtil(serverURL, 'block-fields') + }) + + test('should open blocks drawer and select first block', async () => { + await page.goto(url.create) + const addButton = page.locator('#field-blocks > .blocks-field__drawer-toggler') + await expect(addButton).toContainText('Add Block') + await addButton.click() + + const blocksDrawer = page.locator('[id^=drawer_1_blocks-drawer-]') + await expect(blocksDrawer).toBeVisible() + + // select the first block in the drawer + const firstBlockSelector = blocksDrawer + .locator('.blocks-drawer__blocks .blocks-drawer__block') + .first() + await expect(firstBlockSelector).toContainText('Content') + await firstBlockSelector.click() + + // ensure the block was appended to the rows + const addedRow = page.locator('#field-blocks .blocks-field__row').last() + await expect(addedRow).toBeVisible() + await expect(addedRow.locator('.blocks-field__block-pill-content')).toContainText('Content') + }) + + test('should open blocks drawer from block row and add below', async () => { + await page.goto(url.create) + const firstRow = page.locator('#field-blocks #blocks-row-0') + const rowActions = firstRow.locator('.collapsible__actions') + await expect(rowActions).toBeVisible() + + await rowActions.locator('.array-actions__button').click() + const addBelowButton = rowActions.locator('.array-actions__action.array-actions__add') + await expect(addBelowButton).toBeVisible() + await addBelowButton.click() + + const blocksDrawer = page.locator('[id^=drawer_1_blocks-drawer-]') + await expect(blocksDrawer).toBeVisible() + + // select the first block in the drawer + const firstBlockSelector = blocksDrawer + .locator('.blocks-drawer__blocks .blocks-drawer__block') + .first() + await expect(firstBlockSelector).toContainText('Content') + await firstBlockSelector.click() + + // ensure the block was inserted beneath the first in the rows + const addedRow = page.locator('#field-blocks #blocks-row-1') + await expect(addedRow).toBeVisible() + await expect(addedRow.locator('.blocks-field__block-pill-content')).toContainText('Content') // went from `Number` to `Content` + }) + + test('should use i18n block labels', async () => { + await page.goto(url.create) + await expect(page.locator('#field-i18nBlocks .blocks-field__header')).toContainText('Block en') + + const addButton = page.locator('#field-i18nBlocks > .blocks-field__drawer-toggler') + await expect(addButton).toContainText('Add Block en') + await addButton.click() + + const blocksDrawer = page.locator('[id^=drawer_1_blocks-drawer-]') + await expect(blocksDrawer).toBeVisible() + + // select the first block in the drawer + const firstBlockSelector = blocksDrawer + .locator('.blocks-drawer__blocks .blocks-drawer__block') + .first() + await expect(firstBlockSelector).toContainText('Text en') + await firstBlockSelector.click() + + // ensure the block was appended to the rows + const firstRow = page.locator('#field-i18nBlocks .blocks-field__row').first() + await expect(firstRow).toBeVisible() + await expect(firstRow.locator('.blocks-field__block-pill-text')).toContainText('Text en') + }) + + test('should add different blocks with similar field configs', async () => { + await page.goto(url.create) + + async function addBlock(name: 'Block A' | 'Block B') { + await page + .locator('#field-blocksWithSimilarConfigs') + .getByRole('button', { name: 'Add Blocks With Similar Config' }) + .click() + await page.getByRole('button', { name }).click() + } + + await addBlock('Block A') + + await page + .locator('#blocksWithSimilarConfigs-row-0') + .getByRole('button', { name: 'Add Item' }) + .click() + await page + .locator('input[name="blocksWithSimilarConfigs.0.items.0.title"]') + .fill('items>0>title') + + await expect( + page.locator('input[name="blocksWithSimilarConfigs.0.items.0.title"]'), + ).toHaveValue('items>0>title') + + await addBlock('Block B') + + await page + .locator('#blocksWithSimilarConfigs-row-1') + .getByRole('button', { name: 'Add Item' }) + .click() + await page + .locator('input[name="blocksWithSimilarConfigs.1.items.0.title2"]') + .fill('items>1>title') + + await expect( + page.locator('input[name="blocksWithSimilarConfigs.1.items.0.title2"]'), + ).toHaveValue('items>1>title') + }) + + test('should bypass min rows validation when no rows present and field is not required', async () => { + await page.goto(url.create) + await saveDocAndAssert(page) + await expect(page.locator('.Toastify')).toContainText('successfully') + }) + + test('should fail min rows validation when rows are present', async () => { + await page.goto(url.create) + + await page + .locator('#field-blocksWithMinRows') + .getByRole('button', { name: 'Add Blocks With Min Row' }) + .click() + + const blocksDrawer = page.locator('[id^=drawer_1_blocks-drawer-]') + await expect(blocksDrawer).toBeVisible() + + const firstBlockSelector = blocksDrawer + .locator('.blocks-drawer__blocks .blocks-drawer__block') + .first() + + await firstBlockSelector.click() + + const firstRow = page.locator('input[name="blocksWithMinRows.0.blockTitle"]') + await expect(firstRow).toBeVisible() + await firstRow.fill('first row') + await expect(firstRow).toHaveValue('first row') + + await page.click('#action-save', { delay: 100 }) + await expect(page.locator('.Toastify')).toContainText( + 'The following field is invalid: blocksWithMinRows', + ) + }) + + describe('row manipulation', () => { + describe('react hooks', () => { + test('should add 2 new block rows', async () => { + await page.goto(url.create) + + await page + .locator('.custom-blocks-field-management') + .getByRole('button', { name: 'Add Block 1' }) + .click() + + const customBlocks = page.locator( + '#field-customBlocks input[name="customBlocks.0.block1Title"]', + ) + + await page.mouse.wheel(0, 1750) + + await customBlocks.scrollIntoViewIfNeeded() + + await expect(customBlocks).toHaveValue('Block 1: Prefilled Title') + + await page + .locator('.custom-blocks-field-management') + .getByRole('button', { name: 'Add Block 2' }) + .click() + await expect( + page.locator('#field-customBlocks input[name="customBlocks.1.block2Title"]'), + ).toHaveValue('Block 2: Prefilled Title') + + await page + .locator('.custom-blocks-field-management') + .getByRole('button', { name: 'Replace Block 2' }) + .click() + await expect( + page.locator('#field-customBlocks input[name="customBlocks.1.block1Title"]'), + ).toHaveValue('REPLACED BLOCK') + }) + }) + }) +}) diff --git a/test/fields/e2e.spec.ts b/test/fields/e2e.spec.ts index 0a9414aa7e..255d4911ef 100644 --- a/test/fields/e2e.spec.ts +++ b/test/fields/e2e.spec.ts @@ -534,434 +534,6 @@ describe('fields', () => { }) }) - describe('blocks', () => { - let url: AdminUrlUtil - beforeAll(() => { - url = new AdminUrlUtil(serverURL, 'block-fields') - }) - - test('should open blocks drawer and select first block', async () => { - await page.goto(url.create) - const addButton = page.locator('#field-blocks > .blocks-field__drawer-toggler') - await expect(addButton).toContainText('Add Block') - await addButton.click() - - const blocksDrawer = page.locator('[id^=drawer_1_blocks-drawer-]') - await expect(blocksDrawer).toBeVisible() - - // select the first block in the drawer - const firstBlockSelector = blocksDrawer - .locator('.blocks-drawer__blocks .blocks-drawer__block') - .first() - await expect(firstBlockSelector).toContainText('Content') - await firstBlockSelector.click() - - // ensure the block was appended to the rows - const addedRow = page.locator('#field-blocks .blocks-field__row').last() - await expect(addedRow).toBeVisible() - await expect(addedRow.locator('.blocks-field__block-pill-content')).toContainText('Content') - }) - - test('should open blocks drawer from block row and add below', async () => { - await page.goto(url.create) - const firstRow = page.locator('#field-blocks #blocks-row-0') - const rowActions = firstRow.locator('.collapsible__actions') - await expect(rowActions).toBeVisible() - - await rowActions.locator('.array-actions__button').click() - const addBelowButton = rowActions.locator('.array-actions__action.array-actions__add') - await expect(addBelowButton).toBeVisible() - await addBelowButton.click() - - const blocksDrawer = page.locator('[id^=drawer_1_blocks-drawer-]') - await expect(blocksDrawer).toBeVisible() - - // select the first block in the drawer - const firstBlockSelector = blocksDrawer - .locator('.blocks-drawer__blocks .blocks-drawer__block') - .first() - await expect(firstBlockSelector).toContainText('Content') - await firstBlockSelector.click() - - // ensure the block was inserted beneath the first in the rows - const addedRow = page.locator('#field-blocks #blocks-row-1') - await expect(addedRow).toBeVisible() - await expect(addedRow.locator('.blocks-field__block-pill-content')).toContainText('Content') // went from `Number` to `Content` - }) - - test('should use i18n block labels', async () => { - await page.goto(url.create) - await expect(page.locator('#field-i18nBlocks .blocks-field__header')).toContainText( - 'Block en', - ) - - const addButton = page.locator('#field-i18nBlocks > .blocks-field__drawer-toggler') - await expect(addButton).toContainText('Add Block en') - await addButton.click() - - const blocksDrawer = page.locator('[id^=drawer_1_blocks-drawer-]') - await expect(blocksDrawer).toBeVisible() - - // select the first block in the drawer - const firstBlockSelector = blocksDrawer - .locator('.blocks-drawer__blocks .blocks-drawer__block') - .first() - await expect(firstBlockSelector).toContainText('Text en') - await firstBlockSelector.click() - - // ensure the block was appended to the rows - const firstRow = page.locator('#field-i18nBlocks .blocks-field__row').first() - await expect(firstRow).toBeVisible() - await expect(firstRow.locator('.blocks-field__block-pill-text')).toContainText('Text en') - }) - - test('should add different blocks with similar field configs', async () => { - await page.goto(url.create) - - async function addBlock(name: 'Block A' | 'Block B') { - await page - .locator('#field-blocksWithSimilarConfigs') - .getByRole('button', { name: 'Add Blocks With Similar Config' }) - .click() - await page.getByRole('button', { name }).click() - } - - await addBlock('Block A') - - await page - .locator('#blocksWithSimilarConfigs-row-0') - .getByRole('button', { name: 'Add Item' }) - .click() - await page - .locator('input[name="blocksWithSimilarConfigs.0.items.0.title"]') - .fill('items>0>title') - - await expect( - page.locator('input[name="blocksWithSimilarConfigs.0.items.0.title"]'), - ).toHaveValue('items>0>title') - - await addBlock('Block B') - - await page - .locator('#blocksWithSimilarConfigs-row-1') - .getByRole('button', { name: 'Add Item' }) - .click() - await page - .locator('input[name="blocksWithSimilarConfigs.1.items.0.title2"]') - .fill('items>1>title') - - await expect( - page.locator('input[name="blocksWithSimilarConfigs.1.items.0.title2"]'), - ).toHaveValue('items>1>title') - }) - - test('should bypass min rows validation when no rows present and field is not required', async () => { - await page.goto(url.create) - await saveDocAndAssert(page) - await expect(page.locator('.Toastify')).toContainText('successfully') - }) - - test('should fail min rows validation when rows are present', async () => { - await page.goto(url.create) - - await page - .locator('#field-blocksWithMinRows') - .getByRole('button', { name: 'Add Blocks With Min Row' }) - .click() - - const blocksDrawer = page.locator('[id^=drawer_1_blocks-drawer-]') - await expect(blocksDrawer).toBeVisible() - - const firstBlockSelector = blocksDrawer - .locator('.blocks-drawer__blocks .blocks-drawer__block') - .first() - - await firstBlockSelector.click() - - const firstRow = page.locator('input[name="blocksWithMinRows.0.blockTitle"]') - await expect(firstRow).toBeVisible() - await firstRow.fill('first row') - await expect(firstRow).toHaveValue('first row') - - await page.click('#action-save', { delay: 100 }) - await expect(page.locator('.Toastify')).toContainText( - 'The following field is invalid: blocksWithMinRows', - ) - }) - - describe('row manipulation', () => { - describe('react hooks', () => { - test('should add 2 new block rows', async () => { - await page.goto(url.create) - - await page - .locator('.custom-blocks-field-management') - .getByRole('button', { name: 'Add Block 1' }) - .click() - - const customBlocks = page.locator( - '#field-customBlocks input[name="customBlocks.0.block1Title"]', - ) - - await page.mouse.wheel(0, 1750) - - await customBlocks.scrollIntoViewIfNeeded() - - await expect(customBlocks).toHaveValue('Block 1: Prefilled Title') - - await page - .locator('.custom-blocks-field-management') - .getByRole('button', { name: 'Add Block 2' }) - .click() - await expect( - page.locator('#field-customBlocks input[name="customBlocks.1.block2Title"]'), - ).toHaveValue('Block 2: Prefilled Title') - - await page - .locator('.custom-blocks-field-management') - .getByRole('button', { name: 'Replace Block 2' }) - .click() - await expect( - page.locator('#field-customBlocks input[name="customBlocks.1.block1Title"]'), - ).toHaveValue('REPLACED BLOCK') - }) - }) - }) - }) - - describe('array', () => { - let url: AdminUrlUtil - beforeAll(() => { - url = new AdminUrlUtil(serverURL, 'array-fields') - }) - - test('should be readOnly', async () => { - await page.goto(url.create) - const field = page.locator('#field-readOnly__0__text') - await expect(field).toBeDisabled() - }) - - test('should have defaultValue', async () => { - await page.goto(url.create) - const field = page.locator('#field-readOnly__0__text') - await expect(field).toHaveValue('defaultValue') - }) - - test('should render RowLabel using a component', async () => { - const label = 'custom row label as component' - await page.goto(url.create) - await page.locator('#field-rowLabelAsComponent >> .array-field__add-row').click() - - await page.locator('#field-rowLabelAsComponent__0__title').fill(label) - await wait(100) - const customRowLabel = page.locator( - '#rowLabelAsComponent-row-0 >> .array-field__row-header > :text("custom row label")', - ) - await expect(customRowLabel).toHaveCSS('text-transform', 'uppercase') - }) - - test('should bypass min rows validation when no rows present and field is not required', async () => { - await page.goto(url.create) - await saveDocAndAssert(page) - await expect(page.locator('.Toastify')).toContainText('successfully') - }) - - test('should fail min rows validation when rows are present', async () => { - await page.goto(url.create) - await page.locator('#field-arrayWithMinRows >> .array-field__add-row').click() - - await page.click('#action-save', { delay: 100 }) - await expect(page.locator('.Toastify')).toContainText( - 'The following field is invalid: arrayWithMinRows', - ) - }) - - describe('row manipulation', () => { - test('should add, remove and duplicate rows', async () => { - const assertText0 = 'array row 1' - const assertGroupText0 = 'text in group in row 1' - const assertText1 = 'array row 2' - const assertText3 = 'array row 3' - const assertGroupText3 = 'text in group in row 3' - await page.goto(url.create) - await page.mouse.wheel(0, 1750) - await page.locator('#field-potentiallyEmptyArray').scrollIntoViewIfNeeded() - await wait(300) - - // Add 3 rows - await page.locator('#field-potentiallyEmptyArray > .array-field__add-row').click() - await wait(300) - await page.locator('#field-potentiallyEmptyArray > .array-field__add-row').click() - await wait(300) - await page.locator('#field-potentiallyEmptyArray > .array-field__add-row').click() - await wait(300) - - // Fill out row 1 - await page.locator('#field-potentiallyEmptyArray__0__text').fill(assertText0) - await page - .locator('#field-potentiallyEmptyArray__0__groupInRow__textInGroupInRow') - .fill(assertGroupText0) - // Fill out row 2 - await page.locator('#field-potentiallyEmptyArray__1__text').fill(assertText1) - // Fill out row 3 - await page.locator('#field-potentiallyEmptyArray__2__text').fill(assertText3) - await page - .locator('#field-potentiallyEmptyArray__2__groupInRow__textInGroupInRow') - .fill(assertGroupText3) - - // Remove row 1 - await page.locator('#potentiallyEmptyArray-row-0 .array-actions__button').click() - await page - .locator('#potentiallyEmptyArray-row-0 .popup__scroll-container .array-actions__remove') - .click() - // Remove row 2 - await page.locator('#potentiallyEmptyArray-row-0 .array-actions__button').click() - await page - .locator('#potentiallyEmptyArray-row-0 .popup__scroll-container .array-actions__remove') - .click() - - // Save document - await saveDocAndAssert(page) - - // Scroll to array row (fields are not rendered in DOM until on screen) - await page.locator('#field-potentiallyEmptyArray__0__groupInRow').scrollIntoViewIfNeeded() - - // Expect the remaining row to be the third row - const input = page.locator('#field-potentiallyEmptyArray__0__groupInRow__textInGroupInRow') - await expect(input).toHaveValue(assertGroupText3) - - // Duplicate row - await page.locator('#potentiallyEmptyArray-row-0 .array-actions__button').click() - await page - .locator( - '#potentiallyEmptyArray-row-0 .popup__scroll-container .array-actions__duplicate', - ) - .click() - - // Update duplicated row group field text - await page - .locator('#field-potentiallyEmptyArray__1__groupInRow__textInGroupInRow') - .fill(`${assertGroupText3} duplicate`) - - // Save document - await saveDocAndAssert(page) - - // Expect the second row to be a duplicate of the remaining row - await expect( - page.locator('#field-potentiallyEmptyArray__1__groupInRow__textInGroupInRow'), - ).toHaveValue(`${assertGroupText3} duplicate`) - - // Remove row 1 - await page.locator('#potentiallyEmptyArray-row-0 .array-actions__button').click() - await page - .locator('#potentiallyEmptyArray-row-0 .popup__scroll-container .array-actions__remove') - .click() - - // Save document - await saveDocAndAssert(page) - - // Expect the remaining row to be the copy of the duplicate row - await expect( - page.locator('#field-potentiallyEmptyArray__0__groupInRow__textInGroupInRow'), - ).toHaveValue(`${assertGroupText3} duplicate`) - }) - }) - - // TODO: re-enable this test - test.skip('should bulk update', async () => { - await payload.create({ - collection: 'array-fields', - data: { - title: 'for test 1', - items: [ - { - text: 'test 1', - }, - { - text: 'test 2', - }, - ], - }, - }) - - await payload.create({ - collection: 'array-fields', - data: { - title: 'for test 2', - items: [ - { - text: 'test 3', - }, - ], - }, - }) - - await payload.create({ - collection: 'array-fields', - data: { - title: 'for test 3', - items: [ - { - text: 'test 4', - }, - { - text: 'test 5', - }, - { - text: 'test 6', - }, - ], - }, - }) - - const bulkText = 'Bulk update text' - await page.goto(url.list) - await page.waitForSelector('.table > table > tbody > tr td.cell-title') - const rows = page.locator('.table > table > tbody > tr', { - has: page.locator('td.cell-title a', { - hasText: 'for test', - }), - }) - const count = await rows.count() - - for (let i = 0; i < count; i++) { - await rows - .nth(i) - .locator('td.cell-_select .checkbox-input__input > input[type="checkbox"]') - .click() - } - await page.locator('.edit-many__toggle').click() - await page.locator('.field-select .rs__control').click() - - const arrayOption = page.locator('.rs__option', { - hasText: 'Items', - }) - - await expect(arrayOption).toBeVisible() - - await arrayOption.click() - await wait(200) - - const addRowButton = page.locator('#field-items > .array-field__add-row') - - await expect(addRowButton).toBeVisible() - - await addRowButton.click() - await wait(200) - - const targetInput = page.locator('#field-items__0__text') - - await expect(targetInput).toBeVisible() - - await targetInput.fill(bulkText) - - await page.locator('#edit-array-fields .form-submit .edit-many__save').click() - await expect(page.locator('.Toastify__toast--success')).toContainText( - 'Updated 3 Array Fields successfully.', - ) - }) - }) - describe('tabs', () => { let url: AdminUrlUtil beforeAll(() => { From 0ff1e6632b00fc4967fcda1b500eeb30f85b016b Mon Sep 17 00:00:00 2001 From: James Date: Mon, 8 Apr 2024 11:27:49 -0400 Subject: [PATCH 015/177] chore: splits out relationship --- .github/workflows/main.yml | 1 + .../collections/Relationship/e2e.spec.ts | 445 ++++++++++++++++++ test/fields/e2e.spec.ts | 363 -------------- test/runE2E.ts | 9 +- 4 files changed, 447 insertions(+), 371 deletions(-) create mode 100644 test/fields/collections/Relationship/e2e.spec.ts diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 9768f3c2c2..0c017bfff4 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -258,6 +258,7 @@ jobs: - fields - fields/collections/Blocks - fields/collections/Array + - fields/collections/Relationship # - fields/lexical # - live-preview # - localization diff --git a/test/fields/collections/Relationship/e2e.spec.ts b/test/fields/collections/Relationship/e2e.spec.ts new file mode 100644 index 0000000000..1a2c646849 --- /dev/null +++ b/test/fields/collections/Relationship/e2e.spec.ts @@ -0,0 +1,445 @@ +import type { Page } from '@playwright/test' + +import { expect, test } from '@playwright/test' +import path from 'path' +import { wait } from 'payload/utilities' +import { fileURLToPath } from 'url' + +import type { PayloadTestSDK } from '../../../helpers/sdk/index.js' +import type { Config, RelationshipField, TextField } from '../../payload-types.js' + +import { + ensureAutoLoginAndCompilationIsDone, + exactText, + initPageConsoleErrorCatch, + saveDocAndAssert, + saveDocHotkeyAndAssert, +} from '../../../helpers.js' +import { AdminUrlUtil } from '../../../helpers/adminUrlUtil.js' +import { initPayloadE2ENoConfig } from '../../../helpers/initPayloadE2ENoConfig.js' +import { reInitializeDB } from '../../../helpers/reInit.js' +import { RESTClient } from '../../../helpers/rest.js' +import { POLL_TOPASS_TIMEOUT } from '../../../playwright.config.js' +import { relationshipFieldsSlug, textFieldsSlug } from '../../slugs.js' +const filename = fileURLToPath(import.meta.url) +const currentFolder = path.dirname(filename) +const dirname = path.resolve(currentFolder, '../../') + +const { beforeAll, beforeEach, describe } = test + +let payload: PayloadTestSDK +let client: RESTClient +let page: Page +let serverURL: string +// If we want to make this run in parallel: test.describe.configure({ mode: 'parallel' }) + +describe('relationship', () => { + beforeAll(async ({ browser }) => { + process.env.SEED_IN_CONFIG_ONINIT = 'false' // Makes it so the payload config onInit seed is not run. Otherwise, the seed would be run unnecessarily twice for the initial test run - once for beforeEach and once for onInit + ;({ payload, serverURL } = await initPayloadE2ENoConfig({ + dirname, + })) + + const context = await browser.newContext() + page = await context.newPage() + initPageConsoleErrorCatch(page) + }) + beforeEach(async () => { + await reInitializeDB({ + serverURL, + snapshotKey: 'fieldsRelationshipTest', + uploadsDir: path.resolve(dirname, '../Upload/uploads'), + }) + + if (client) { + await client.logout() + } + client = new RESTClient(null, { defaultSlug: 'users', serverURL }) + await client.login() + + await ensureAutoLoginAndCompilationIsDone({ page, serverURL }) + }) + + let url: AdminUrlUtil + const tableRowLocator = 'table > tbody > tr' + + beforeAll(() => { + url = new AdminUrlUtil(serverURL, 'relationship-fields') + }) + + test('should create inline relationship within field with many relations', async () => { + await page.goto(url.create) + + const button = page.locator('#relationship-add-new .relationship-add-new__add-button') + await button.click() + await page + .locator('#field-relationship .relationship-add-new__relation-button--text-fields') + .click() + + const textField = page.locator('.drawer__content #field-text') + const textValue = 'hello' + + await textField.fill(textValue) + + await page.locator('[id^=doc-drawer_text-fields_1_] #action-save').click() + await expect(page.locator('.Toastify')).toContainText('successfully') + await page.locator('[id^=close-drawer__doc-drawer_text-fields_1_]').click() + + await expect( + page.locator('#field-relationship .relationship--single-value__text'), + ).toContainText(textValue) + + await page.locator('#action-save').click() + await expect(page.locator('.Toastify')).toContainText('successfully') + }) + + test('should create nested inline relationships', async () => { + await page.goto(url.create) + await page.waitForURL(`**/${url.create}`) + // Open first modal + await page.locator('#relationToSelf-add-new .relationship-add-new__add-button').click() + + // Fill first modal's required relationship field + await page.locator('[id^=doc-drawer_relationship-fields_1_] #field-relationship').click() + await page + .locator( + '[id^=doc-drawer_relationship-fields_1_] .rs__option:has-text("Seeded text document")', + ) + .click() + + // Open second modal + await page + .locator('[id^=doc-drawer_relationship-fields_1_] #relationToSelf-add-new button') + .click() + + // Fill second modal's required relationship field + await page.locator('[id^=doc-drawer_relationship-fields_2_] #field-relationship').click() + await page + .locator( + '[id^=doc-drawer_relationship-fields_2_] .rs__option:has-text("Seeded text document")', + ) + .click() + + // Save then close the second modal + await page.locator('[id^=doc-drawer_relationship-fields_2_] #action-save').click() + await expect.poll(() => page.url(), { timeout: POLL_TOPASS_TIMEOUT }).toContain('create') + await page.locator('[id^=close-drawer__doc-drawer_relationship-fields_2_]').click() + + // Assert that the first modal is still open and the value matches + await expect(page.locator('[id^=doc-drawer_relationship-fields_1_]')).toBeVisible() + await expect( + page.locator( + '[id^=doc-drawer_relationship-fields_1_] #field-relationToSelf .relationship--single-value__text', + ), + ).toBeVisible() // TODO: use '.toContainText('doc_id')' with the doc in the second modal + + // Save then close the first modal + await page.locator('[id^=doc-drawer_relationship-fields_1_] #action-save').click() + await expect.poll(() => page.url(), { timeout: POLL_TOPASS_TIMEOUT }).toContain('create') + await page.locator('[id^=close-drawer__doc-drawer_relationship-fields_1_]').click() + + // Expect the original field to have a value filled + await expect( + page.locator('#field-relationToSelf .relationship--single-value__text'), + ).toBeVisible() + + // Fill the required field + await page.locator('#field-relationship').click() + await page.locator('.rs__option:has-text("Seeded text document")').click() + await expect.poll(() => page.url(), { timeout: POLL_TOPASS_TIMEOUT }).toContain('create') + await page.locator('#action-save').click() + + await expect(page.locator('.Toastify')).toContainText('successfully') + }) + + test('should hide relationship add new button', async () => { + await page.goto(url.create) + // expect the button to not exist in the field + const count = await page + .locator('#relationToSelfSelectOnly-add-new .relationship-add-new__add-button') + .count() + expect(count).toEqual(0) + }) + + test('should clear relationship values', async () => { + await page.goto(url.create) + + const field = page.locator('#field-relationship') + await field.click() + await page.locator('.rs__option:has-text("Seeded text document")').click() + await field.locator('.clear-indicator').click() + await expect(field.locator('.rs__placeholder')).toBeVisible() + }) + + // TODO: React-Select not loading things sometimes. Fix later + test.skip('should display `hasMany` polymorphic relationships', async () => { + await page.goto(url.create) + const field = page.locator('#field-relationHasManyPolymorphic') + await field.click() + + await page + .locator('.rs__option', { + hasText: exactText('Seeded text document'), + }) + .click() + + await expect( + page + .locator('#field-relationHasManyPolymorphic .relationship--multi-value-label__text', { + hasText: exactText('Seeded text document'), + }) + .first(), + ).toBeVisible() + + // await fill the required fields then save the document and check again + await page.locator('#field-relationship').click() + await page.locator('#field-relationship .rs__option:has-text("Seeded text document")').click() + await saveDocAndAssert(page) + + const valueAfterSave = page.locator('#field-relationHasManyPolymorphic .multi-value').first() + + await expect( + valueAfterSave + .locator('.relationship--multi-value-label__text', { + hasText: exactText('Seeded text document'), + }) + .first(), + ).toBeVisible() + }) + + test('should populate relationship dynamic default value', async () => { + await page.goto(url.create) + await expect( + page.locator('#field-relationWithDynamicDefault .relationship--single-value__text'), + ).toContainText('dev@payloadcms.com') + await expect( + page.locator('#field-relationHasManyWithDynamicDefault .relationship--single-value__text'), + ).toContainText('dev@payloadcms.com') + }) + + test('should filter relationship options', async () => { + await page.goto(url.create) + await page.locator('#field-relationship .rs__control').click() + await page.keyboard.type('seeded') + await page.locator('.rs__option:has-text("Seeded text document")').click() + await saveDocAndAssert(page) + }) + + // Related issue: https://github.com/payloadcms/payload/issues/2815 + test('should modify fields in relationship drawer', async () => { + await page.goto(url.create) + await page.waitForURL(`**/${url.create}`) + // First fill out the relationship field, as it's required + await page.locator('#relationship-add-new .relationship-add-new__add-button').click() + await page + .locator('#field-relationship .relationship-add-new__relation-button--text-fields') + .click() + + await page.locator('.drawer__content #field-text').fill('something') + + await page.locator('[id^=doc-drawer_text-fields_1_] #action-save').click() + await expect(page.locator('.Toastify')).toContainText('successfully') + await page.locator('[id^=close-drawer__doc-drawer_text-fields_1_]').click() + await page.locator('#action-save').click() + await expect(page.locator('.Toastify')).toContainText('successfully') + + // Create a new doc for the `relationshipHasMany` field + await expect.poll(() => page.url(), { timeout: POLL_TOPASS_TIMEOUT }).not.toContain('create') + await page.locator('#field-relationshipHasMany .relationship-add-new__add-button').click() + const value = 'Hello, world!' + await page.locator('.drawer__content #field-text').fill(value) + + // Save and close the drawer + await page.locator('[id^=doc-drawer_text-fields_1_] #action-save').click() + await expect(page.locator('.Toastify')).toContainText('successfully') + await page.locator('[id^=close-drawer__doc-drawer_text-fields_1_]').click() + + // Now open the drawer again to edit the `text` field _using the keyboard_ + // Mimic real user behavior by typing into the field with spaces and backspaces + // Explicitly use both `down` and `type` to cover edge cases + await page + .locator('#field-relationshipHasMany button.relationship--multi-value-label__drawer-toggler') + .click() + await page.locator('[id^=doc-drawer_text-fields_1_] #field-text').click() + await page.keyboard.down('1') + await page.keyboard.type('23') + await expect(page.locator('[id^=doc-drawer_text-fields_1_] #field-text')).toHaveValue( + `${value}123`, + ) + await page.keyboard.type('4567') + await page.keyboard.press('Backspace') + await expect(page.locator('[id^=doc-drawer_text-fields_1_] #field-text')).toHaveValue( + `${value}123456`, + ) + + // save drawer + await page.locator('[id^=doc-drawer_text-fields_1_] #action-save').click() + await expect(page.locator('.Toastify')).toContainText('successfully') + // close drawer + await page.locator('[id^=close-drawer__doc-drawer_text-fields_1_]').click() + // save document and reload + await page.locator('#action-save').click() + await expect(page.locator('.Toastify')).toContainText('successfully') + await page.reload() + + // check if the value is saved + await expect( + page.locator('#field-relationshipHasMany .relationship--multi-value-label__text'), + ).toHaveText(`${value}123456`) + }) + + // Drawers opened through the edit button are prone to issues due to the use of stopPropagation for certain + // events - specifically for drawers opened through the edit button. This test is to ensure that drawers + // opened through the edit button can be saved using the hotkey. + test('should save using hotkey in edit document drawer', async () => { + await page.goto(url.create) + // First fill out the relationship field, as it's required + await page.locator('#relationship-add-new .relationship-add-new__add-button').click() + await page.locator('#field-relationship .value-container').click() + // Select "Seeded text document" relationship + await page.getByText('Seeded text document', { exact: true }).click() + + // Need to wait to properly open drawer - without this the drawer state is flakey and closes before + // the text below can be filled before the save on the drawer + await wait(200) + + // Click edit button which opens drawer + await page.getByRole('button', { name: 'Edit Seeded text document' }).click() + + // Fill 'text' field of 'Seeded text document' + await page.locator('.drawer__content #field-text').fill('some updated text value') + + // Save drawer (not parent page) with hotkey + await saveDocHotkeyAndAssert(page) + + const seededTextDocument = await payload.find({ + collection: textFieldsSlug, + where: { + text: { + equals: 'some updated text value', + }, + }, + }) + const relationshipDocuments = await payload.find({ + collection: relationshipFieldsSlug, + }) + + // The Seeded text document should now have a text field with value 'some updated text value', + expect(seededTextDocument.docs.length).toEqual(1) + // but the relationship document should NOT exist, as the hotkey should have saved the drawer and not the parent page + expect(relationshipDocuments.docs.length).toEqual(0) + }) + + // TODO: Fix this. This test flakes due to react select + test.skip('should bypass min rows validation when no rows present and field is not required', async () => { + await page.goto(url.create) + // First fill out the relationship field, as it's required + await page.locator('#relationship-add-new .relationship-add-new__add-button').click() + await page.locator('#field-relationship .value-container').click() + await page.getByText('Seeded text document', { exact: true }).click() + + await saveDocAndAssert(page) + await expect(page.locator('.Toastify')).toContainText('successfully') + }) + + test('should fail min rows validation when rows are present', async () => { + await page.goto(url.create) + // First fill out the relationship field, as it's required + await page.locator('#relationship-add-new .relationship-add-new__add-button').click() + await page.locator('#field-relationship .value-container').click() + await page.getByText('Seeded text document', { exact: true }).click() + + // Need to wait to allow for field to retrieve documents before the save occurs + await wait(200) + + await page.locator('#field-relationshipWithMinRows .value-container').click() + + await page + .locator('#field-relationshipWithMinRows .rs__option:has-text("Seeded text document")') + .click() + + await page.click('#action-save', { delay: 100 }) + await expect(page.locator('.Toastify')).toContainText( + 'The following field is invalid: relationshipWithMinRows', + ) + }) + + test('should sort relationship options by sortOptions property (ID in ascending order)', async () => { + await page.goto(url.create) + + const field = page.locator('#field-relationship') + await field.click() + + const firstOption = page.locator('.rs__option').first() + await expect(firstOption).toBeVisible() + const firstOptionText = await firstOption.textContent() + expect(firstOptionText.trim()).toBe('Another text document') + }) + + test('should sort relationHasManyPolymorphic options by sortOptions property: text-fields collection (items in descending order)', async () => { + await page.goto(url.create) + + const field = page.locator('#field-relationHasManyPolymorphic') + await field.click() + + const firstOption = page.locator('.rs__option').first() + await expect(firstOption).toBeVisible() + const firstOptionText = await firstOption.textContent() + expect(firstOptionText.trim()).toBe('Seeded text document') + }) + + test('should allow filtering by relationship field / equals', async () => { + const textDoc = await createTextFieldDoc() + await createRelationshipFieldDoc({ value: textDoc.id, relationTo: 'text-fields' }) + + await page.goto(url.list) + + await page.locator('.list-controls__toggle-columns').click() + await page.locator('.list-controls__toggle-where').click() + await expect(page.locator('.list-controls__where.rah-static--height-auto')).toBeVisible() + await page.locator('.where-builder__add-first-filter').click() + + const conditionField = page.locator('.condition__field') + await conditionField.click() + + const dropdownFieldOptions = conditionField.locator('.rs__option') + await dropdownFieldOptions.locator('text=Relationship').nth(0).click() + + const operatorField = page.locator('.condition__operator') + await operatorField.click() + + const dropdownOperatorOptions = operatorField.locator('.rs__option') + await dropdownOperatorOptions.locator('text=equals').click() + + const valueField = page.locator('.condition__value') + await valueField.click() + const dropdownValueOptions = valueField.locator('.rs__option') + await dropdownValueOptions.locator('text=some text').click() + + await expect(page.locator(tableRowLocator)).toHaveCount(1) + }) +}) + +async function createTextFieldDoc(overrides?: Partial): Promise { + return payload.create({ + collection: 'text-fields', + data: { + text: 'some text', + localizedText: 'some localized text', + ...overrides, + }, + }) as unknown as Promise +} + +async function createRelationshipFieldDoc( + relationship: RelationshipField['relationship'], + overrides?: Partial, +): Promise { + return payload.create({ + collection: 'relationship-fields', + data: { + relationship, + ...overrides, + }, + }) as unknown as Promise +} diff --git a/test/fields/e2e.spec.ts b/test/fields/e2e.spec.ts index 255d4911ef..8c17305401 100644 --- a/test/fields/e2e.spec.ts +++ b/test/fields/e2e.spec.ts @@ -1102,369 +1102,6 @@ describe('fields', () => { }) }) - describe('relationship', () => { - let url: AdminUrlUtil - const tableRowLocator = 'table > tbody > tr' - - beforeAll(() => { - url = new AdminUrlUtil(serverURL, 'relationship-fields') - }) - - test('should create inline relationship within field with many relations', async () => { - await page.goto(url.create) - - const button = page.locator('#relationship-add-new .relationship-add-new__add-button') - await button.click() - await page - .locator('#field-relationship .relationship-add-new__relation-button--text-fields') - .click() - - const textField = page.locator('.drawer__content #field-text') - const textValue = 'hello' - - await textField.fill(textValue) - - await page.locator('[id^=doc-drawer_text-fields_1_] #action-save').click() - await expect(page.locator('.Toastify')).toContainText('successfully') - await page.locator('[id^=close-drawer__doc-drawer_text-fields_1_]').click() - - await expect( - page.locator('#field-relationship .relationship--single-value__text'), - ).toContainText(textValue) - - await page.locator('#action-save').click() - await expect(page.locator('.Toastify')).toContainText('successfully') - }) - - test('should create nested inline relationships', async () => { - await page.goto(url.create) - await page.waitForURL(`**/${url.create}`) - // Open first modal - await page.locator('#relationToSelf-add-new .relationship-add-new__add-button').click() - - // Fill first modal's required relationship field - await page.locator('[id^=doc-drawer_relationship-fields_1_] #field-relationship').click() - await page - .locator( - '[id^=doc-drawer_relationship-fields_1_] .rs__option:has-text("Seeded text document")', - ) - .click() - - // Open second modal - await page - .locator('[id^=doc-drawer_relationship-fields_1_] #relationToSelf-add-new button') - .click() - - // Fill second modal's required relationship field - await page.locator('[id^=doc-drawer_relationship-fields_2_] #field-relationship').click() - await page - .locator( - '[id^=doc-drawer_relationship-fields_2_] .rs__option:has-text("Seeded text document")', - ) - .click() - - // Save then close the second modal - await page.locator('[id^=doc-drawer_relationship-fields_2_] #action-save').click() - await expect.poll(() => page.url(), { timeout: POLL_TOPASS_TIMEOUT }).toContain('create') - await page.locator('[id^=close-drawer__doc-drawer_relationship-fields_2_]').click() - - // Assert that the first modal is still open and the value matches - await expect(page.locator('[id^=doc-drawer_relationship-fields_1_]')).toBeVisible() - await expect( - page.locator( - '[id^=doc-drawer_relationship-fields_1_] #field-relationToSelf .relationship--single-value__text', - ), - ).toBeVisible() // TODO: use '.toContainText('doc_id')' with the doc in the second modal - - // Save then close the first modal - await page.locator('[id^=doc-drawer_relationship-fields_1_] #action-save').click() - await expect.poll(() => page.url(), { timeout: POLL_TOPASS_TIMEOUT }).toContain('create') - await page.locator('[id^=close-drawer__doc-drawer_relationship-fields_1_]').click() - - // Expect the original field to have a value filled - await expect( - page.locator('#field-relationToSelf .relationship--single-value__text'), - ).toBeVisible() - - // Fill the required field - await page.locator('#field-relationship').click() - await page.locator('.rs__option:has-text("Seeded text document")').click() - await expect.poll(() => page.url(), { timeout: POLL_TOPASS_TIMEOUT }).toContain('create') - await page.locator('#action-save').click() - - await expect(page.locator('.Toastify')).toContainText('successfully') - }) - - test('should hide relationship add new button', async () => { - await page.goto(url.create) - // expect the button to not exist in the field - const count = await page - .locator('#relationToSelfSelectOnly-add-new .relationship-add-new__add-button') - .count() - expect(count).toEqual(0) - }) - - test('should clear relationship values', async () => { - await page.goto(url.create) - - const field = page.locator('#field-relationship') - await field.click() - await page.locator('.rs__option:has-text("Seeded text document")').click() - await field.locator('.clear-indicator').click() - await expect(field.locator('.rs__placeholder')).toBeVisible() - }) - - // TODO: React-Select not loading things sometimes. Fix later - test.skip('should display `hasMany` polymorphic relationships', async () => { - await page.goto(url.create) - const field = page.locator('#field-relationHasManyPolymorphic') - await field.click() - - await page - .locator('.rs__option', { - hasText: exactText('Seeded text document'), - }) - .click() - - await expect( - page - .locator('#field-relationHasManyPolymorphic .relationship--multi-value-label__text', { - hasText: exactText('Seeded text document'), - }) - .first(), - ).toBeVisible() - - // await fill the required fields then save the document and check again - await page.locator('#field-relationship').click() - await page.locator('#field-relationship .rs__option:has-text("Seeded text document")').click() - await saveDocAndAssert(page) - - const valueAfterSave = page.locator('#field-relationHasManyPolymorphic .multi-value').first() - - await expect( - valueAfterSave - .locator('.relationship--multi-value-label__text', { - hasText: exactText('Seeded text document'), - }) - .first(), - ).toBeVisible() - }) - - test('should populate relationship dynamic default value', async () => { - await page.goto(url.create) - await expect( - page.locator('#field-relationWithDynamicDefault .relationship--single-value__text'), - ).toContainText('dev@payloadcms.com') - await expect( - page.locator('#field-relationHasManyWithDynamicDefault .relationship--single-value__text'), - ).toContainText('dev@payloadcms.com') - }) - - test('should filter relationship options', async () => { - await page.goto(url.create) - await page.locator('#field-relationship .rs__control').click() - await page.keyboard.type('seeded') - await page.locator('.rs__option:has-text("Seeded text document")').click() - await saveDocAndAssert(page) - }) - - // Related issue: https://github.com/payloadcms/payload/issues/2815 - test('should modify fields in relationship drawer', async () => { - await page.goto(url.create) - await page.waitForURL(`**/${url.create}`) - // First fill out the relationship field, as it's required - await page.locator('#relationship-add-new .relationship-add-new__add-button').click() - await page - .locator('#field-relationship .relationship-add-new__relation-button--text-fields') - .click() - - await page.locator('.drawer__content #field-text').fill('something') - - await page.locator('[id^=doc-drawer_text-fields_1_] #action-save').click() - await expect(page.locator('.Toastify')).toContainText('successfully') - await page.locator('[id^=close-drawer__doc-drawer_text-fields_1_]').click() - await page.locator('#action-save').click() - await expect(page.locator('.Toastify')).toContainText('successfully') - - // Create a new doc for the `relationshipHasMany` field - await expect.poll(() => page.url(), { timeout: POLL_TOPASS_TIMEOUT }).not.toContain('create') - await page.locator('#field-relationshipHasMany .relationship-add-new__add-button').click() - const value = 'Hello, world!' - await page.locator('.drawer__content #field-text').fill(value) - - // Save and close the drawer - await page.locator('[id^=doc-drawer_text-fields_1_] #action-save').click() - await expect(page.locator('.Toastify')).toContainText('successfully') - await page.locator('[id^=close-drawer__doc-drawer_text-fields_1_]').click() - - // Now open the drawer again to edit the `text` field _using the keyboard_ - // Mimic real user behavior by typing into the field with spaces and backspaces - // Explicitly use both `down` and `type` to cover edge cases - await page - .locator( - '#field-relationshipHasMany button.relationship--multi-value-label__drawer-toggler', - ) - .click() - await page.locator('[id^=doc-drawer_text-fields_1_] #field-text').click() - await page.keyboard.down('1') - await page.keyboard.type('23') - await expect(page.locator('[id^=doc-drawer_text-fields_1_] #field-text')).toHaveValue( - `${value}123`, - ) - await page.keyboard.type('4567') - await page.keyboard.press('Backspace') - await expect(page.locator('[id^=doc-drawer_text-fields_1_] #field-text')).toHaveValue( - `${value}123456`, - ) - - // save drawer - await page.locator('[id^=doc-drawer_text-fields_1_] #action-save').click() - await expect(page.locator('.Toastify')).toContainText('successfully') - // close drawer - await page.locator('[id^=close-drawer__doc-drawer_text-fields_1_]').click() - // save document and reload - await page.locator('#action-save').click() - await expect(page.locator('.Toastify')).toContainText('successfully') - await page.reload() - - // check if the value is saved - await expect( - page.locator('#field-relationshipHasMany .relationship--multi-value-label__text'), - ).toHaveText(`${value}123456`) - }) - - // Drawers opened through the edit button are prone to issues due to the use of stopPropagation for certain - // events - specifically for drawers opened through the edit button. This test is to ensure that drawers - // opened through the edit button can be saved using the hotkey. - test('should save using hotkey in edit document drawer', async () => { - await page.goto(url.create) - // First fill out the relationship field, as it's required - await page.locator('#relationship-add-new .relationship-add-new__add-button').click() - await page.locator('#field-relationship .value-container').click() - // Select "Seeded text document" relationship - await page.getByText('Seeded text document', { exact: true }).click() - - // Need to wait to properly open drawer - without this the drawer state is flakey and closes before - // the text below can be filled before the save on the drawer - await wait(200) - - // Click edit button which opens drawer - await page.getByRole('button', { name: 'Edit Seeded text document' }).click() - - // Fill 'text' field of 'Seeded text document' - await page.locator('.drawer__content #field-text').fill('some updated text value') - - // Save drawer (not parent page) with hotkey - await saveDocHotkeyAndAssert(page) - - const seededTextDocument = await payload.find({ - collection: textFieldsSlug, - where: { - text: { - equals: 'some updated text value', - }, - }, - }) - const relationshipDocuments = await payload.find({ - collection: relationshipFieldsSlug, - }) - - // The Seeded text document should now have a text field with value 'some updated text value', - expect(seededTextDocument.docs.length).toEqual(1) - // but the relationship document should NOT exist, as the hotkey should have saved the drawer and not the parent page - expect(relationshipDocuments.docs.length).toEqual(0) - }) - - // TODO: Fix this. This test flakes due to react select - test.skip('should bypass min rows validation when no rows present and field is not required', async () => { - await page.goto(url.create) - // First fill out the relationship field, as it's required - await page.locator('#relationship-add-new .relationship-add-new__add-button').click() - await page.locator('#field-relationship .value-container').click() - await page.getByText('Seeded text document', { exact: true }).click() - - await saveDocAndAssert(page) - await expect(page.locator('.Toastify')).toContainText('successfully') - }) - - test('should fail min rows validation when rows are present', async () => { - await page.goto(url.create) - // First fill out the relationship field, as it's required - await page.locator('#relationship-add-new .relationship-add-new__add-button').click() - await page.locator('#field-relationship .value-container').click() - await page.getByText('Seeded text document', { exact: true }).click() - - // Need to wait to allow for field to retrieve documents before the save occurs - await wait(200) - - await page.locator('#field-relationshipWithMinRows .value-container').click() - - await page - .locator('#field-relationshipWithMinRows .rs__option:has-text("Seeded text document")') - .click() - - await page.click('#action-save', { delay: 100 }) - await expect(page.locator('.Toastify')).toContainText( - 'The following field is invalid: relationshipWithMinRows', - ) - }) - - test('should sort relationship options by sortOptions property (ID in ascending order)', async () => { - await page.goto(url.create) - - const field = page.locator('#field-relationship') - await field.click() - - const firstOption = page.locator('.rs__option').first() - await expect(firstOption).toBeVisible() - const firstOptionText = await firstOption.textContent() - expect(firstOptionText.trim()).toBe('Another text document') - }) - - test('should sort relationHasManyPolymorphic options by sortOptions property: text-fields collection (items in descending order)', async () => { - await page.goto(url.create) - - const field = page.locator('#field-relationHasManyPolymorphic') - await field.click() - - const firstOption = page.locator('.rs__option').first() - await expect(firstOption).toBeVisible() - const firstOptionText = await firstOption.textContent() - expect(firstOptionText.trim()).toBe('Seeded text document') - }) - - test('should allow filtering by relationship field / equals', async () => { - const textDoc = await createTextFieldDoc() - await createRelationshipFieldDoc({ value: textDoc.id, relationTo: 'text-fields' }) - - await page.goto(url.list) - - await page.locator('.list-controls__toggle-columns').click() - await page.locator('.list-controls__toggle-where').click() - await expect(page.locator('.list-controls__where.rah-static--height-auto')).toBeVisible() - await page.locator('.where-builder__add-first-filter').click() - - const conditionField = page.locator('.condition__field') - await conditionField.click() - - const dropdownFieldOptions = conditionField.locator('.rs__option') - await dropdownFieldOptions.locator('text=Relationship').nth(0).click() - - const operatorField = page.locator('.condition__operator') - await operatorField.click() - - const dropdownOperatorOptions = operatorField.locator('.rs__option') - await dropdownOperatorOptions.locator('text=equals').click() - - const valueField = page.locator('.condition__value') - await valueField.click() - const dropdownValueOptions = valueField.locator('.rs__option') - await dropdownValueOptions.locator('text=some text').click() - - await expect(page.locator(tableRowLocator)).toHaveCount(1) - }) - }) - describe('upload', () => { let url: AdminUrlUtil beforeAll(() => { diff --git a/test/runE2E.ts b/test/runE2E.ts index 81dba165e3..ece589b4fb 100644 --- a/test/runE2E.ts +++ b/test/runE2E.ts @@ -53,14 +53,7 @@ if (!suiteName) { } else { // Run specific suite clearWebpackCache() - let suitePath: string - if (suiteName.includes('/')) { - // Used for fields/lexical.e2e.spec.ts which is run from CI as fields/lexical - const suiteNameSplit = suiteName.split('/') - suitePath = path.resolve(dirname, suiteNameSplit[0], suiteNameSplit[1] + '.e2e.spec.ts') - } else { - suitePath = path.resolve(dirname, suiteName, 'e2e.spec.ts') - } + const suitePath = path.resolve(dirname, suiteName, '.e2e.spec.ts') executePlaywright(suitePath) } From ea507fbcc43e9cdbcd92c52be7b6f77f2d4e8dc2 Mon Sep 17 00:00:00 2001 From: James Date: Mon, 8 Apr 2024 11:30:15 -0400 Subject: [PATCH 016/177] chore: moves lexical tests into collection folder --- .github/workflows/main.yml | 2 +- .../Lexical/e2e.spec.ts} | 18 +++++++++--------- test/runE2E.ts | 2 +- 3 files changed, 11 insertions(+), 11 deletions(-) rename test/fields/{lexical.e2e.spec.ts => collections/Lexical/e2e.spec.ts} (98%) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 0c017bfff4..4a8d606359 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -259,7 +259,7 @@ jobs: - fields/collections/Blocks - fields/collections/Array - fields/collections/Relationship - # - fields/lexical + - fields/collections/Lexical # - live-preview # - localization # - plugin-form-builder diff --git a/test/fields/lexical.e2e.spec.ts b/test/fields/collections/Lexical/e2e.spec.ts similarity index 98% rename from test/fields/lexical.e2e.spec.ts rename to test/fields/collections/Lexical/e2e.spec.ts index 0ea4e229f9..8f6726f1fe 100644 --- a/test/fields/lexical.e2e.spec.ts +++ b/test/fields/collections/Lexical/e2e.spec.ts @@ -7,16 +7,16 @@ import { expect, test } from '@playwright/test' import path from 'path' import { fileURLToPath } from 'url' -import type { LexicalField } from './payload-types.js' +import type { LexicalField } from '../../payload-types.js' -import { initPageConsoleErrorCatch, saveDocAndAssert } from '../helpers.js' -import { AdminUrlUtil } from '../helpers/adminUrlUtil.js' -import { initPayloadE2E } from '../helpers/initPayloadE2E.js' -import { RESTClient } from '../helpers/rest.js' -import { POLL_TOPASS_TIMEOUT } from '../playwright.config.js' -import { lexicalDocData } from './collections/Lexical/data.js' -import { clearAndSeedEverything } from './seed.js' -import { lexicalFieldsSlug } from './slugs.js' +import { initPageConsoleErrorCatch, saveDocAndAssert } from '../../../helpers.js' +import { AdminUrlUtil } from '../../../helpers/adminUrlUtil.js' +import { initPayloadE2E } from '../../../helpers/initPayloadE2E.js' +import { RESTClient } from '../../../helpers/rest.js' +import { POLL_TOPASS_TIMEOUT } from '../../../playwright.config.js' +import { clearAndSeedEverything } from '../../seed.js' +import { lexicalFieldsSlug } from '../../slugs.js' +import { lexicalDocData } from './data.js' const filename = fileURLToPath(import.meta.url) const dirname = path.dirname(filename) diff --git a/test/runE2E.ts b/test/runE2E.ts index ece589b4fb..af5faf8b89 100644 --- a/test/runE2E.ts +++ b/test/runE2E.ts @@ -53,7 +53,7 @@ if (!suiteName) { } else { // Run specific suite clearWebpackCache() - const suitePath = path.resolve(dirname, suiteName, '.e2e.spec.ts') + const suitePath = path.resolve(dirname, suiteName, 'e2e.spec.ts') executePlaywright(suitePath) } From 702088375c127e794d4261e5169c61439c089fab Mon Sep 17 00:00:00 2001 From: James Date: Mon, 8 Apr 2024 11:45:05 -0400 Subject: [PATCH 017/177] chore: attempts to de-flake --- test/fields/collections/Lexical/e2e.spec.ts | 3 ++- test/fields/e2e.spec.ts | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/test/fields/collections/Lexical/e2e.spec.ts b/test/fields/collections/Lexical/e2e.spec.ts index 8f6726f1fe..9bcbb778ae 100644 --- a/test/fields/collections/Lexical/e2e.spec.ts +++ b/test/fields/collections/Lexical/e2e.spec.ts @@ -18,7 +18,8 @@ import { clearAndSeedEverything } from '../../seed.js' import { lexicalFieldsSlug } from '../../slugs.js' import { lexicalDocData } from './data.js' const filename = fileURLToPath(import.meta.url) -const dirname = path.dirname(filename) +const currentFolder = path.dirname(filename) +const dirname = path.resolve(currentFolder, '../../') const { beforeAll, beforeEach, describe } = test diff --git a/test/fields/e2e.spec.ts b/test/fields/e2e.spec.ts index 8c17305401..65d758693c 100644 --- a/test/fields/e2e.spec.ts +++ b/test/fields/e2e.spec.ts @@ -283,6 +283,8 @@ describe('fields', () => { await page.locator('#field-uniqueText').fill(uniqueText) await page.locator('#field-localizedUniqueRequiredText').fill('localizedUniqueRequired2') + await wait(500) + // attempt to save await page.click('#action-save', { delay: 200 }) From 5bfff5b7baae10f48159a4bb2d77de91d3ffd92c Mon Sep 17 00:00:00 2001 From: James Date: Mon, 8 Apr 2024 11:55:39 -0400 Subject: [PATCH 018/177] chore: ensures artifacts work --- .github/workflows/main.yml | 8 +- test/fields/collections/RichText/e2e.spec.ts | 413 +++++++++++++++++++ test/fields/e2e.spec.ts | 395 +----------------- test/runE2E.ts | 2 +- 4 files changed, 420 insertions(+), 398 deletions(-) create mode 100644 test/fields/collections/RichText/e2e.spec.ts diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 4a8d606359..34cdcb1727 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -256,10 +256,10 @@ jobs: # - field-error-states # - fields-relationship - fields - - fields/collections/Blocks - - fields/collections/Array - - fields/collections/Relationship - - fields/collections/Lexical + - fields__collections__Blocks + - fields__collections__Array + - fields__collections__Relationship + - fields__collections__Lexical # - live-preview # - localization # - plugin-form-builder diff --git a/test/fields/collections/RichText/e2e.spec.ts b/test/fields/collections/RichText/e2e.spec.ts new file mode 100644 index 0000000000..6c1b114625 --- /dev/null +++ b/test/fields/collections/RichText/e2e.spec.ts @@ -0,0 +1,413 @@ +import type { Page } from '@playwright/test' + +import { expect, test } from '@playwright/test' +import path from 'path' +import { wait } from 'payload/utilities' +import { fileURLToPath } from 'url' + +import { + ensureAutoLoginAndCompilationIsDone, + initPageConsoleErrorCatch, + saveDocAndAssert, +} from '../../../helpers.js' +import { AdminUrlUtil } from '../../../helpers/adminUrlUtil.js' +import { initPayloadE2ENoConfig } from '../../../helpers/initPayloadE2ENoConfig.js' +import { reInitializeDB } from '../../../helpers/reInit.js' +import { RESTClient } from '../../../helpers/rest.js' + +const filename = fileURLToPath(import.meta.url) +const currentFolder = path.dirname(filename) +const dirname = path.resolve(currentFolder, '../../') + +const { beforeAll, beforeEach, describe } = test + +let client: RESTClient +let page: Page +let serverURL: string +// If we want to make this run in parallel: test.describe.configure({ mode: 'parallel' }) + +describe('Rich Text', () => { + beforeAll(async ({ browser }) => { + process.env.SEED_IN_CONFIG_ONINIT = 'false' // Makes it so the payload config onInit seed is not run. Otherwise, the seed would be run unnecessarily twice for the initial test run - once for beforeEach and once for onInit + ;({ serverURL } = await initPayloadE2ENoConfig({ + dirname, + })) + + const context = await browser.newContext() + page = await context.newPage() + initPageConsoleErrorCatch(page) + }) + beforeEach(async () => { + await reInitializeDB({ + serverURL, + snapshotKey: 'fieldsRichTextTest', + uploadsDir: path.resolve(dirname, '../Upload/uploads'), + }) + + if (client) { + await client.logout() + } + client = new RESTClient(null, { defaultSlug: 'users', serverURL }) + await client.login() + + await ensureAutoLoginAndCompilationIsDone({ page, serverURL }) + }) + + async function navigateToRichTextFields() { + const url: AdminUrlUtil = new AdminUrlUtil(serverURL, 'rich-text-fields') + await page.goto(url.list) + await page.waitForURL(url.list) + await page.locator('.row-1 .cell-title a').click() + } + + describe('cell', () => { + test('ensure cells are smaller than 300px in height', async () => { + const url: AdminUrlUtil = new AdminUrlUtil(serverURL, 'rich-text-fields') + await page.goto(url.list) // Navigate to rich-text list view + + const table = page.locator('.list-controls ~ .table') + const lexicalCell = table.locator('.cell-lexicalCustomFields').first() + const lexicalHtmlCell = table.locator('.cell-lexicalCustomFields_html').first() + const entireRow = table.locator('.row-1').first() + + // Make sure each of the 3 above are no larger than 300px in height: + expect((await lexicalCell.boundingBox()).height).toBeLessThanOrEqual(300) + expect((await lexicalHtmlCell.boundingBox()).height).toBeLessThanOrEqual(300) + expect((await entireRow.boundingBox()).height).toBeLessThanOrEqual(300) + }) + }) + + describe('toolbar', () => { + test('should run url validation', async () => { + await navigateToRichTextFields() + + // Open link drawer + await page.locator('.rich-text__toolbar button:not([disabled]) .link').first().click() + + // find the drawer + const editLinkModal = page.locator('[id^=drawer_1_rich-text-link-]') + await expect(editLinkModal).toBeVisible() + + // Fill values and click Confirm + await editLinkModal.locator('#field-text').fill('link text') + await editLinkModal.locator('label[for="field-linkType-custom"]').click() + await editLinkModal.locator('#field-url').fill('') + await wait(200) + await editLinkModal.locator('button[type="submit"]').click() + await wait(400) + const errorField = page.locator( + '[id^=drawer_1_rich-text-link-] .render-fields > :nth-child(3)', + ) + const hasErrorClass = await errorField.evaluate((el) => el.classList.contains('error')) + expect(hasErrorClass).toBe(true) + }) + + test('should create new url custom link', async () => { + await navigateToRichTextFields() + + // Open link drawer + await page.locator('.rich-text__toolbar button:not([disabled]) .link').first().click() + + // find the drawer + const editLinkModal = page.locator('[id^=drawer_1_rich-text-link-]') + await expect(editLinkModal).toBeVisible() + + await wait(400) + // Fill values and click Confirm + await editLinkModal.locator('#field-text').fill('link text') + await editLinkModal.locator('label[for="field-linkType-custom"]').click() + await editLinkModal.locator('#field-url').fill('https://payloadcms.com') + await editLinkModal.locator('button[type="submit"]').click() + await wait(400) + await saveDocAndAssert(page) + + // Remove link from editor body + await page.locator('span >> text="link text"').click() + const popup = page.locator('.popup--active .rich-text-link__popup') + await expect(popup.locator('.rich-text-link__link-label')).toBeVisible() + await popup.locator('.rich-text-link__link-close').click() + await expect(page.locator('span >> text="link text"')).toHaveCount(0) + }) + + test('should create new internal link', async () => { + await navigateToRichTextFields() + + // Open link drawer + await page.locator('.rich-text__toolbar button:not([disabled]) .link').first().click() + + // find the drawer + const editLinkModal = page.locator('[id^=drawer_1_rich-text-link-]') + await expect(editLinkModal).toBeVisible() + await wait(400) + + // Fill values and click Confirm + await editLinkModal.locator('#field-text').fill('link text') + await editLinkModal.locator('label[for="field-linkType-internal"]').click() + await editLinkModal.locator('#field-doc .rs__control').click() + await page.keyboard.type('dev@') + await editLinkModal + .locator('#field-doc .rs__menu .rs__option:has-text("dev@payloadcms.com")') + .click() + // await wait(200); + await editLinkModal.locator('button[type="submit"]').click() + await saveDocAndAssert(page) + }) + + test('should not create new url link when read only', async () => { + await navigateToRichTextFields() + + // Attempt to open link popup + const modalTrigger = page.locator('.rich-text--read-only .rich-text__toolbar button .link') + await expect(modalTrigger).toBeDisabled() + }) + + test('should only list RTE enabled upload collections in drawer', async () => { + await navigateToRichTextFields() + + // Open link drawer + await page + .locator('.rich-text__toolbar button:not([disabled]) .upload-rich-text-button') + .first() + .click() + + // open the list select menu + await page.locator('.list-drawer__select-collection-wrap .rs__control').click() + + const menu = page.locator('.list-drawer__select-collection-wrap .rs__menu') + // `uploads-3` has enableRichTextRelationship set to false + await expect(menu).not.toContainText('Uploads3') + }) + + // TODO: this test can't find the selector for the search filter, but functionality works. + // Need to debug + test.skip('should search correct useAsTitle field after toggling collection in list drawer', async () => { + await navigateToRichTextFields() + + // open link drawer + const field = page.locator('#field-richText') + const button = field.locator( + 'button.rich-text-relationship__list-drawer-toggler.list-drawer__toggler', + ) + await button.click() + + // check that the search is on the `name` field of the `text-fields` collection + const drawer = page.locator('[id^=list-drawer_1_]') + + await expect(drawer.locator('.search-filter__input')).toHaveAttribute( + 'placeholder', + 'Search by Text', + ) + + // change the selected collection to `array-fields` + await page.locator('.list-drawer__select-collection-wrap .rs__control').click() + const menu = page.locator('.list-drawer__select-collection-wrap .rs__menu') + await menu.locator('.rs__option').getByText('Array Field').click() + + // check that `id` is now the default search field + await expect(drawer.locator('.search-filter__input')).toHaveAttribute( + 'placeholder', + 'Search by ID', + ) + }) + + test('should only list RTE enabled collections in link drawer', async () => { + await navigateToRichTextFields() + + await page.locator('.rich-text__toolbar button:not([disabled]) .link').first().click() + + const editLinkModal = page.locator('[id^=drawer_1_rich-text-link-]') + await expect(editLinkModal).toBeVisible() + + await editLinkModal.locator('label[for="field-linkType-internal"]').click() + await editLinkModal.locator('.relationship__wrap .rs__control').click() + + const menu = page.locator('.relationship__wrap .rs__menu') + + // array-fields has enableRichTextLink set to false + await expect(menu).not.toContainText('Array Fields') + }) + + test('should only list non-upload collections in relationship drawer', async () => { + await navigateToRichTextFields() + + // Open link drawer + await page + .locator('.rich-text__toolbar button:not([disabled]) .relationship-rich-text-button') + .first() + .click() + + await wait(300) + + // open the list select menu + await page.locator('.list-drawer__select-collection-wrap .rs__control').click() + + const menu = page.locator('.list-drawer__select-collection-wrap .rs__menu') + await expect(menu).not.toContainText('Uploads') + }) + + test('should respect customizing the default fields', async () => { + const linkText = 'link' + const value = 'test value' + await navigateToRichTextFields() + const field = page.locator('.rich-text', { + has: page.locator('#field-richTextCustomFields'), + }) + // open link drawer + const button = field.locator('button.rich-text__button.link') + await button.click() + + // fill link fields + const linkDrawer = page.locator('[id^=drawer_1_rich-text-link-]') + const fields = linkDrawer.locator('.render-fields > .field-type') + await fields.locator('#field-text').fill(linkText) + await fields.locator('#field-url').fill('https://payloadcms.com') + const input = fields.locator('#field-fields__customLinkField') + await input.fill(value) + + await wait(300) + + // submit link closing drawer + await linkDrawer.locator('button[type="submit"]').click() + const linkInEditor = field.locator(`.rich-text-link >> text="${linkText}"`) + await saveDocAndAssert(page) + + // open modal again + await linkInEditor.click() + + const popup = page.locator('.popup--active .rich-text-link__popup') + await expect(popup).toBeVisible() + + await popup.locator('.rich-text-link__link-edit').click() + + const linkDrawer2 = page.locator('[id^=drawer_1_rich-text-link-]') + const fields2 = linkDrawer2.locator('.render-fields > .field-type') + const input2 = fields2.locator('#field-fields__customLinkField') + + await expect(input2).toHaveValue(value) + }) + }) + + describe('editor', () => { + test('should populate url link', async () => { + await navigateToRichTextFields() + + // Open link popup + await page.locator('#field-richText span >> text="render links"').click() + const popup = page.locator('.popup--active .rich-text-link__popup') + await expect(popup).toBeVisible() + await expect(popup.locator('a')).toHaveAttribute('href', 'https://payloadcms.com') + + // Open the drawer + await popup.locator('.rich-text-link__link-edit').click() + const editLinkModal = page.locator('[id^=drawer_1_rich-text-link-]') + await expect(editLinkModal).toBeVisible() + + // Check the drawer values + const textField = editLinkModal.locator('#field-text') + await expect(textField).toHaveValue('render links') + + // Close the drawer + await editLinkModal.locator('button[type="submit"]').click() + await expect(editLinkModal).toBeHidden() + }) + + test('should populate relationship link', async () => { + await navigateToRichTextFields() + + // Open link popup + await page.locator('#field-richText span >> text="link to relationships"').click() + const popup = page.locator('.popup--active .rich-text-link__popup') + await expect(popup).toBeVisible() + await expect(popup.locator('a')).toHaveAttribute( + 'href', + /\/admin\/collections\/array-fields\/.*/, + ) + + // Open the drawer + await popup.locator('.rich-text-link__link-edit').click() + const editLinkModal = page.locator('[id^=drawer_1_rich-text-link-]') + await expect(editLinkModal).toBeVisible() + + // Check the drawer values + const textField = editLinkModal.locator('#field-text') + await expect(textField).toHaveValue('link to relationships') + }) + + test('should open upload drawer and render custom relationship fields', async () => { + await navigateToRichTextFields() + const field = page.locator('#field-richText') + const button = field.locator('button.rich-text-upload__upload-drawer-toggler') + + await button.click() + + const documentDrawer = page.locator('[id^=drawer_1_upload-drawer-]') + await expect(documentDrawer).toBeVisible() + const caption = documentDrawer.locator('#field-caption') + await expect(caption).toBeVisible() + }) + + test('should open upload document drawer from read-only field', async () => { + await navigateToRichTextFields() + const field = page.locator('#field-richTextReadOnly') + const button = field.locator( + 'button.rich-text-upload__doc-drawer-toggler.doc-drawer__toggler', + ) + + await button.click() + + const documentDrawer = page.locator('[id^=doc-drawer_uploads_1_]') + await expect(documentDrawer).toBeVisible() + }) + + test('should open relationship document drawer from read-only field', async () => { + await navigateToRichTextFields() + const field = page.locator('#field-richTextReadOnly') + const button = field.locator( + 'button.rich-text-relationship__doc-drawer-toggler.doc-drawer__toggler', + ) + + await button.click() + + const documentDrawer = page.locator('[id^=doc-drawer_text-fields_1_]') + await expect(documentDrawer).toBeVisible() + }) + + test('should populate new links', async () => { + await navigateToRichTextFields() + + // Highlight existing text + const headingElement = page.locator( + '#field-richText h1 >> text="Hello, I\'m a rich text field."', + ) + await headingElement.selectText() + + // click the toolbar link button + await page.locator('.rich-text__toolbar button:not([disabled]) .link').first().click() + + // find the drawer and confirm the values + const editLinkModal = page.locator('[id^=drawer_1_rich-text-link-]') + await expect(editLinkModal).toBeVisible() + const textField = editLinkModal.locator('#field-text') + await expect(textField).toHaveValue("Hello, I'm a rich text field.") + }) + test('should not take value from previous block', async () => { + await navigateToRichTextFields() + + // check first block value + const textField = page.locator('#field-blocks__0__text') + await expect(textField).toHaveValue('Regular text') + + // remove the first block + const editBlock = page.locator('#blocks-row-0 .popup-button') + await editBlock.click() + const removeButton = page.locator('#blocks-row-0').getByRole('button', { name: 'Remove' }) + await expect(removeButton).toBeVisible() + await removeButton.click() + + // check new first block value + const richTextField = page.locator('#field-blocks__0__text') + const richTextValue = await richTextField.innerText() + expect(richTextValue).toContain('Rich text') + }) + }) +}) diff --git a/test/fields/e2e.spec.ts b/test/fields/e2e.spec.ts index 65d758693c..671d8e7fe0 100644 --- a/test/fields/e2e.spec.ts +++ b/test/fields/e2e.spec.ts @@ -6,14 +6,12 @@ import { wait } from 'payload/utilities' import { fileURLToPath } from 'url' import type { PayloadTestSDK } from '../helpers/sdk/index.js' -import type { Config, RelationshipField, TextField } from './payload-types.js' +import type { Config } from './payload-types.js' import { ensureAutoLoginAndCompilationIsDone, - exactText, initPageConsoleErrorCatch, saveDocAndAssert, - saveDocHotkeyAndAssert, } from '../helpers.js' import { AdminUrlUtil } from '../helpers/adminUrlUtil.js' import { initPayloadE2ENoConfig } from '../helpers/initPayloadE2ENoConfig.js' @@ -23,13 +21,7 @@ import { POLL_TOPASS_TIMEOUT } from '../playwright.config.js' import { jsonDoc } from './collections/JSON/shared.js' import { numberDoc } from './collections/Number/shared.js' import { textDoc } from './collections/Text/shared.js' -import { - collapsibleFieldsSlug, - pointFieldsSlug, - relationshipFieldsSlug, - tabsFieldsSlug, - textFieldsSlug, -} from './slugs.js' +import { collapsibleFieldsSlug, pointFieldsSlug, tabsFieldsSlug, textFieldsSlug } from './slugs.js' const filename = fileURLToPath(import.meta.url) const dirname = path.dirname(filename) @@ -617,365 +609,6 @@ describe('fields', () => { ) }) }) - describe('richText', () => { - async function navigateToRichTextFields() { - const url: AdminUrlUtil = new AdminUrlUtil(serverURL, 'rich-text-fields') - await page.goto(url.list) - await page.waitForURL(url.list) - await page.locator('.row-1 .cell-title a').click() - } - - describe('cell', () => { - test('ensure cells are smaller than 300px in height', async () => { - const url: AdminUrlUtil = new AdminUrlUtil(serverURL, 'rich-text-fields') - await page.goto(url.list) // Navigate to rich-text list view - - const table = page.locator('.list-controls ~ .table') - const lexicalCell = table.locator('.cell-lexicalCustomFields').first() - const lexicalHtmlCell = table.locator('.cell-lexicalCustomFields_html').first() - const entireRow = table.locator('.row-1').first() - - // Make sure each of the 3 above are no larger than 300px in height: - expect((await lexicalCell.boundingBox()).height).toBeLessThanOrEqual(300) - expect((await lexicalHtmlCell.boundingBox()).height).toBeLessThanOrEqual(300) - expect((await entireRow.boundingBox()).height).toBeLessThanOrEqual(300) - }) - }) - - describe('toolbar', () => { - test('should run url validation', async () => { - await navigateToRichTextFields() - - // Open link drawer - await page.locator('.rich-text__toolbar button:not([disabled]) .link').first().click() - - // find the drawer - const editLinkModal = page.locator('[id^=drawer_1_rich-text-link-]') - await expect(editLinkModal).toBeVisible() - - // Fill values and click Confirm - await editLinkModal.locator('#field-text').fill('link text') - await editLinkModal.locator('label[for="field-linkType-custom"]').click() - await editLinkModal.locator('#field-url').fill('') - await wait(200) - await editLinkModal.locator('button[type="submit"]').click() - await wait(400) - const errorField = page.locator( - '[id^=drawer_1_rich-text-link-] .render-fields > :nth-child(3)', - ) - const hasErrorClass = await errorField.evaluate((el) => el.classList.contains('error')) - expect(hasErrorClass).toBe(true) - }) - - test('should create new url custom link', async () => { - await navigateToRichTextFields() - - // Open link drawer - await page.locator('.rich-text__toolbar button:not([disabled]) .link').first().click() - - // find the drawer - const editLinkModal = page.locator('[id^=drawer_1_rich-text-link-]') - await expect(editLinkModal).toBeVisible() - - await wait(400) - // Fill values and click Confirm - await editLinkModal.locator('#field-text').fill('link text') - await editLinkModal.locator('label[for="field-linkType-custom"]').click() - await editLinkModal.locator('#field-url').fill('https://payloadcms.com') - await editLinkModal.locator('button[type="submit"]').click() - await wait(400) - await saveDocAndAssert(page) - - // Remove link from editor body - await page.locator('span >> text="link text"').click() - const popup = page.locator('.popup--active .rich-text-link__popup') - await expect(popup.locator('.rich-text-link__link-label')).toBeVisible() - await popup.locator('.rich-text-link__link-close').click() - await expect(page.locator('span >> text="link text"')).toHaveCount(0) - }) - - test('should create new internal link', async () => { - await navigateToRichTextFields() - - // Open link drawer - await page.locator('.rich-text__toolbar button:not([disabled]) .link').first().click() - - // find the drawer - const editLinkModal = page.locator('[id^=drawer_1_rich-text-link-]') - await expect(editLinkModal).toBeVisible() - await wait(400) - - // Fill values and click Confirm - await editLinkModal.locator('#field-text').fill('link text') - await editLinkModal.locator('label[for="field-linkType-internal"]').click() - await editLinkModal.locator('#field-doc .rs__control').click() - await page.keyboard.type('dev@') - await editLinkModal - .locator('#field-doc .rs__menu .rs__option:has-text("dev@payloadcms.com")') - .click() - // await wait(200); - await editLinkModal.locator('button[type="submit"]').click() - await saveDocAndAssert(page) - }) - - test('should not create new url link when read only', async () => { - await navigateToRichTextFields() - - // Attempt to open link popup - const modalTrigger = page.locator('.rich-text--read-only .rich-text__toolbar button .link') - await expect(modalTrigger).toBeDisabled() - }) - - test('should only list RTE enabled upload collections in drawer', async () => { - await navigateToRichTextFields() - - // Open link drawer - await page - .locator('.rich-text__toolbar button:not([disabled]) .upload-rich-text-button') - .first() - .click() - - // open the list select menu - await page.locator('.list-drawer__select-collection-wrap .rs__control').click() - - const menu = page.locator('.list-drawer__select-collection-wrap .rs__menu') - // `uploads-3` has enableRichTextRelationship set to false - await expect(menu).not.toContainText('Uploads3') - }) - - // TODO: this test can't find the selector for the search filter, but functionality works. - // Need to debug - test.skip('should search correct useAsTitle field after toggling collection in list drawer', async () => { - await navigateToRichTextFields() - - // open link drawer - const field = page.locator('#field-richText') - const button = field.locator( - 'button.rich-text-relationship__list-drawer-toggler.list-drawer__toggler', - ) - await button.click() - - // check that the search is on the `name` field of the `text-fields` collection - const drawer = page.locator('[id^=list-drawer_1_]') - - await expect(drawer.locator('.search-filter__input')).toHaveAttribute( - 'placeholder', - 'Search by Text', - ) - - // change the selected collection to `array-fields` - await page.locator('.list-drawer__select-collection-wrap .rs__control').click() - const menu = page.locator('.list-drawer__select-collection-wrap .rs__menu') - await menu.locator('.rs__option').getByText('Array Field').click() - - // check that `id` is now the default search field - await expect(drawer.locator('.search-filter__input')).toHaveAttribute( - 'placeholder', - 'Search by ID', - ) - }) - - test('should only list RTE enabled collections in link drawer', async () => { - await navigateToRichTextFields() - - await page.locator('.rich-text__toolbar button:not([disabled]) .link').first().click() - - const editLinkModal = page.locator('[id^=drawer_1_rich-text-link-]') - await expect(editLinkModal).toBeVisible() - - await editLinkModal.locator('label[for="field-linkType-internal"]').click() - await editLinkModal.locator('.relationship__wrap .rs__control').click() - - const menu = page.locator('.relationship__wrap .rs__menu') - - // array-fields has enableRichTextLink set to false - await expect(menu).not.toContainText('Array Fields') - }) - - test('should only list non-upload collections in relationship drawer', async () => { - await navigateToRichTextFields() - - // Open link drawer - await page - .locator('.rich-text__toolbar button:not([disabled]) .relationship-rich-text-button') - .first() - .click() - - await wait(300) - - // open the list select menu - await page.locator('.list-drawer__select-collection-wrap .rs__control').click() - - const menu = page.locator('.list-drawer__select-collection-wrap .rs__menu') - await expect(menu).not.toContainText('Uploads') - }) - - test('should respect customizing the default fields', async () => { - const linkText = 'link' - const value = 'test value' - await navigateToRichTextFields() - const field = page.locator('.rich-text', { - has: page.locator('#field-richTextCustomFields'), - }) - // open link drawer - const button = field.locator('button.rich-text__button.link') - await button.click() - - // fill link fields - const linkDrawer = page.locator('[id^=drawer_1_rich-text-link-]') - const fields = linkDrawer.locator('.render-fields > .field-type') - await fields.locator('#field-text').fill(linkText) - await fields.locator('#field-url').fill('https://payloadcms.com') - const input = fields.locator('#field-fields__customLinkField') - await input.fill(value) - - await wait(300) - - // submit link closing drawer - await linkDrawer.locator('button[type="submit"]').click() - const linkInEditor = field.locator(`.rich-text-link >> text="${linkText}"`) - await saveDocAndAssert(page) - - // open modal again - await linkInEditor.click() - - const popup = page.locator('.popup--active .rich-text-link__popup') - await expect(popup).toBeVisible() - - await popup.locator('.rich-text-link__link-edit').click() - - const linkDrawer2 = page.locator('[id^=drawer_1_rich-text-link-]') - const fields2 = linkDrawer2.locator('.render-fields > .field-type') - const input2 = fields2.locator('#field-fields__customLinkField') - - await expect(input2).toHaveValue(value) - }) - }) - - describe('editor', () => { - test('should populate url link', async () => { - await navigateToRichTextFields() - - // Open link popup - await page.locator('#field-richText span >> text="render links"').click() - const popup = page.locator('.popup--active .rich-text-link__popup') - await expect(popup).toBeVisible() - await expect(popup.locator('a')).toHaveAttribute('href', 'https://payloadcms.com') - - // Open the drawer - await popup.locator('.rich-text-link__link-edit').click() - const editLinkModal = page.locator('[id^=drawer_1_rich-text-link-]') - await expect(editLinkModal).toBeVisible() - - // Check the drawer values - const textField = editLinkModal.locator('#field-text') - await expect(textField).toHaveValue('render links') - - // Close the drawer - await editLinkModal.locator('button[type="submit"]').click() - await expect(editLinkModal).toBeHidden() - }) - - test('should populate relationship link', async () => { - await navigateToRichTextFields() - - // Open link popup - await page.locator('#field-richText span >> text="link to relationships"').click() - const popup = page.locator('.popup--active .rich-text-link__popup') - await expect(popup).toBeVisible() - await expect(popup.locator('a')).toHaveAttribute( - 'href', - /\/admin\/collections\/array-fields\/.*/, - ) - - // Open the drawer - await popup.locator('.rich-text-link__link-edit').click() - const editLinkModal = page.locator('[id^=drawer_1_rich-text-link-]') - await expect(editLinkModal).toBeVisible() - - // Check the drawer values - const textField = editLinkModal.locator('#field-text') - await expect(textField).toHaveValue('link to relationships') - }) - - test('should open upload drawer and render custom relationship fields', async () => { - await navigateToRichTextFields() - const field = page.locator('#field-richText') - const button = field.locator('button.rich-text-upload__upload-drawer-toggler') - - await button.click() - - const documentDrawer = page.locator('[id^=drawer_1_upload-drawer-]') - await expect(documentDrawer).toBeVisible() - const caption = documentDrawer.locator('#field-caption') - await expect(caption).toBeVisible() - }) - - test('should open upload document drawer from read-only field', async () => { - await navigateToRichTextFields() - const field = page.locator('#field-richTextReadOnly') - const button = field.locator( - 'button.rich-text-upload__doc-drawer-toggler.doc-drawer__toggler', - ) - - await button.click() - - const documentDrawer = page.locator('[id^=doc-drawer_uploads_1_]') - await expect(documentDrawer).toBeVisible() - }) - - test('should open relationship document drawer from read-only field', async () => { - await navigateToRichTextFields() - const field = page.locator('#field-richTextReadOnly') - const button = field.locator( - 'button.rich-text-relationship__doc-drawer-toggler.doc-drawer__toggler', - ) - - await button.click() - - const documentDrawer = page.locator('[id^=doc-drawer_text-fields_1_]') - await expect(documentDrawer).toBeVisible() - }) - - test('should populate new links', async () => { - await navigateToRichTextFields() - - // Highlight existing text - const headingElement = page.locator( - '#field-richText h1 >> text="Hello, I\'m a rich text field."', - ) - await headingElement.selectText() - - // click the toolbar link button - await page.locator('.rich-text__toolbar button:not([disabled]) .link').first().click() - - // find the drawer and confirm the values - const editLinkModal = page.locator('[id^=drawer_1_rich-text-link-]') - await expect(editLinkModal).toBeVisible() - const textField = editLinkModal.locator('#field-text') - await expect(textField).toHaveValue("Hello, I'm a rich text field.") - }) - test('should not take value from previous block', async () => { - await navigateToRichTextFields() - - // check first block value - const textField = page.locator('#field-blocks__0__text') - await expect(textField).toHaveValue('Regular text') - - // remove the first block - const editBlock = page.locator('#blocks-row-0 .popup-button') - await editBlock.click() - const removeButton = page.locator('#blocks-row-0').getByRole('button', { name: 'Remove' }) - await expect(removeButton).toBeVisible() - await removeButton.click() - - // check new first block value - const richTextField = page.locator('#field-blocks__0__text') - const richTextValue = await richTextField.innerText() - expect(richTextValue).toContain('Rich text') - }) - }) - }) describe('date', () => { let url: AdminUrlUtil @@ -1352,27 +985,3 @@ describe('fields', () => { }) }) }) - -async function createTextFieldDoc(overrides?: Partial): Promise { - return payload.create({ - collection: 'text-fields', - data: { - text: 'some text', - localizedText: 'some localized text', - ...overrides, - }, - }) as unknown as Promise -} - -async function createRelationshipFieldDoc( - relationship: RelationshipField['relationship'], - overrides?: Partial, -): Promise { - return payload.create({ - collection: 'relationship-fields', - data: { - relationship, - ...overrides, - }, - }) as unknown as Promise -} diff --git a/test/runE2E.ts b/test/runE2E.ts index af5faf8b89..d8fbcd6ed5 100644 --- a/test/runE2E.ts +++ b/test/runE2E.ts @@ -53,7 +53,7 @@ if (!suiteName) { } else { // Run specific suite clearWebpackCache() - const suitePath = path.resolve(dirname, suiteName, 'e2e.spec.ts') + const suitePath = path.resolve(dirname, suiteName, 'e2e.spec.ts').replace('__', '/') executePlaywright(suitePath) } From 09c2fb10f39711a013ccfbd8c82527194a520a6b Mon Sep 17 00:00:00 2001 From: James Date: Mon, 8 Apr 2024 12:07:34 -0400 Subject: [PATCH 019/177] chore: bug in ci --- test/runE2E.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/runE2E.ts b/test/runE2E.ts index d8fbcd6ed5..78da3ee816 100644 --- a/test/runE2E.ts +++ b/test/runE2E.ts @@ -53,7 +53,7 @@ if (!suiteName) { } else { // Run specific suite clearWebpackCache() - const suitePath = path.resolve(dirname, suiteName, 'e2e.spec.ts').replace('__', '/') + const suitePath = path.resolve(dirname, suiteName, 'e2e.spec.ts').replaceAll('__', '/') executePlaywright(suitePath) } From 0ddeedb0b3d1a9ca109fd5bf7f53ba701da42471 Mon Sep 17 00:00:00 2001 From: James Date: Mon, 8 Apr 2024 12:24:25 -0400 Subject: [PATCH 020/177] chore: de-flakes relationship suite --- test/fields/collections/Relationship/e2e.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/fields/collections/Relationship/e2e.spec.ts b/test/fields/collections/Relationship/e2e.spec.ts index 1a2c646849..a38bec314c 100644 --- a/test/fields/collections/Relationship/e2e.spec.ts +++ b/test/fields/collections/Relationship/e2e.spec.ts @@ -301,7 +301,7 @@ describe('relationship', () => { // Need to wait to properly open drawer - without this the drawer state is flakey and closes before // the text below can be filled before the save on the drawer - await wait(200) + await wait(1000) // Click edit button which opens drawer await page.getByRole('button', { name: 'Edit Seeded text document' }).click() From 2fc50b1a1f4d6c6c8bd43537b08aa8840ccc1585 Mon Sep 17 00:00:00 2001 From: James Date: Mon, 8 Apr 2024 12:35:23 -0400 Subject: [PATCH 021/177] chore: de-flakes array --- test/fields/collections/Array/e2e.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/fields/collections/Array/e2e.spec.ts b/test/fields/collections/Array/e2e.spec.ts index ef7c9b7ade..fd01392807 100644 --- a/test/fields/collections/Array/e2e.spec.ts +++ b/test/fields/collections/Array/e2e.spec.ts @@ -87,10 +87,10 @@ describe('Array', () => { await expect(customRowLabel).toHaveCSS('text-transform', 'uppercase') }) + // eslint-disable-next-line playwright/expect-expect test('should bypass min rows validation when no rows present and field is not required', async () => { await page.goto(url.create) await saveDocAndAssert(page) - await expect(page.locator('.Toastify')).toContainText('successfully') }) test('should fail min rows validation when rows are present', async () => { From d0c79b65f8cf4d0fbd25b73b80ab9dd31136fc8b Mon Sep 17 00:00:00 2001 From: James Date: Mon, 8 Apr 2024 12:51:29 -0400 Subject: [PATCH 022/177] chore: skips index to see what remains --- test/fields/e2e.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/fields/e2e.spec.ts b/test/fields/e2e.spec.ts index 671d8e7fe0..0c86f11abb 100644 --- a/test/fields/e2e.spec.ts +++ b/test/fields/e2e.spec.ts @@ -254,7 +254,7 @@ describe('fields', () => { }) // TODO - This test is flaky. Rarely, but sometimes it randomly fails. - test('should display unique constraint error in ui', async () => { + test.skip('should display unique constraint error in ui', async () => { const uniqueText = 'uniqueText' await payload.create({ collection: 'indexed-fields', From a5d14ef4c1ed35ea16dc8e5c60c3422dd9cdb18d Mon Sep 17 00:00:00 2001 From: James Date: Mon, 8 Apr 2024 13:12:57 -0400 Subject: [PATCH 023/177] chore: de-flakes tabs --- test/fields/e2e.spec.ts | 2 +- test/playwright.config.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/test/fields/e2e.spec.ts b/test/fields/e2e.spec.ts index 0c86f11abb..483691ca30 100644 --- a/test/fields/e2e.spec.ts +++ b/test/fields/e2e.spec.ts @@ -541,7 +541,7 @@ describe('fields', () => { await page.goto(url.create) - await wait(300) + await wait(1000) await page.locator('.tabs-field__tab-button:has-text("Tab with Row")').click() await page.locator('#field-textInRow').fill(textInRowValue) diff --git a/test/playwright.config.ts b/test/playwright.config.ts index 0c65aabb5d..3d7445ccb3 100644 --- a/test/playwright.config.ts +++ b/test/playwright.config.ts @@ -15,7 +15,7 @@ export default defineConfig({ // Look for test files in the "test" directory, relative to this configuration file testDir: '', testMatch: '*e2e.spec.ts', - timeout: 240000, // 4 minutes + timeout: 120000, use: { screenshot: 'only-on-failure', trace: 'retain-on-failure', From 73298a80f08c8f9185c685b7ba55927462b19114 Mon Sep 17 00:00:00 2001 From: James Date: Mon, 8 Apr 2024 13:13:40 -0400 Subject: [PATCH 024/177] chore: adds more de-flake to tabs --- test/fields/e2e.spec.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/fields/e2e.spec.ts b/test/fields/e2e.spec.ts index 483691ca30..291a9c46c2 100644 --- a/test/fields/e2e.spec.ts +++ b/test/fields/e2e.spec.ts @@ -566,14 +566,14 @@ describe('fields', () => { await page.goto(url.list) await page.locator('.cell-id a').click() - await wait(300) + await wait(500) // Go to Row tab, update the value await page.locator('.tabs-field__tab-button:has-text("Tab with Row")').click() await page.locator('#field-textInRow').fill(textInRowValue) await page.locator('.json-field .inputarea').fill(jsonValue) - await wait(250) + await wait(500) // Go to Array tab, then back to Row. Make sure new value is still there await page.locator('.tabs-field__tab-button:has-text("Tab with Array")').click() @@ -586,7 +586,7 @@ describe('fields', () => { await page.locator('.tabs-field__tab-button:has-text("Tab with Array")').click() await page.click('#action-save', { delay: 100 }) - await wait(250) + await wait(500) // Go back to row tab, make sure the new value is still present await page.locator('.tabs-field__tab-button:has-text("Tab with Row")').click() From 1a975b31cf75f42ced7472905211d2b3c0a81ea9 Mon Sep 17 00:00:00 2001 From: Elliot DeNolf Date: Tue, 9 Apr 2024 09:26:41 -0400 Subject: [PATCH 025/177] chore(release): v3.0.0-alpha.60 [skip ci] --- package.json | 2 +- packages/create-payload-app/package.json | 2 +- packages/db-mongodb/package.json | 2 +- packages/db-postgres/package.json | 2 +- packages/graphql/package.json | 2 +- packages/next/package.json | 2 +- packages/payload/package.json | 2 +- packages/plugin-cloud-storage/package.json | 2 +- packages/plugin-cloud/package.json | 2 +- packages/plugin-form-builder/package.json | 2 +- packages/plugin-nested-docs/package.json | 2 +- packages/plugin-redirects/package.json | 2 +- packages/plugin-search/package.json | 2 +- packages/plugin-seo/package.json | 2 +- packages/richtext-lexical/package.json | 2 +- packages/richtext-slate/package.json | 2 +- packages/translations/package.json | 2 +- packages/ui/package.json | 2 +- 18 files changed, 18 insertions(+), 18 deletions(-) diff --git a/package.json b/package.json index ec204bc31c..2a578fd892 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "payload-monorepo", - "version": "3.0.0-alpha.59", + "version": "3.0.0-alpha.60", "private": true, "type": "module", "workspaces:": [ diff --git a/packages/create-payload-app/package.json b/packages/create-payload-app/package.json index a56cff25f7..0c2682b48b 100644 --- a/packages/create-payload-app/package.json +++ b/packages/create-payload-app/package.json @@ -1,6 +1,6 @@ { "name": "create-payload-app", - "version": "3.0.0-alpha.59", + "version": "3.0.0-alpha.60", "license": "MIT", "type": "module", "homepage": "https://payloadcms.com", diff --git a/packages/db-mongodb/package.json b/packages/db-mongodb/package.json index 6de410c56d..9b68bbcc99 100644 --- a/packages/db-mongodb/package.json +++ b/packages/db-mongodb/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/db-mongodb", - "version": "3.0.0-alpha.59", + "version": "3.0.0-alpha.60", "description": "The officially supported MongoDB database adapter for Payload", "repository": { "type": "git", diff --git a/packages/db-postgres/package.json b/packages/db-postgres/package.json index c72f29b6cb..4ec3be5cb4 100644 --- a/packages/db-postgres/package.json +++ b/packages/db-postgres/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/db-postgres", - "version": "3.0.0-alpha.59", + "version": "3.0.0-alpha.60", "description": "The officially supported Postgres database adapter for Payload", "repository": { "type": "git", diff --git a/packages/graphql/package.json b/packages/graphql/package.json index f7993cad45..ff2095c4cf 100644 --- a/packages/graphql/package.json +++ b/packages/graphql/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/graphql", - "version": "3.0.0-alpha.59", + "version": "3.0.0-alpha.60", "main": "./src/index.ts", "types": "./src/index.d.ts", "type": "module", diff --git a/packages/next/package.json b/packages/next/package.json index 7f0f168d3b..c68d5ffff3 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/next", - "version": "3.0.0-alpha.59", + "version": "3.0.0-alpha.60", "main": "./src/index.js", "types": "./src/index.js", "type": "module", diff --git a/packages/payload/package.json b/packages/payload/package.json index 9d761f23f8..5c7de4bcea 100644 --- a/packages/payload/package.json +++ b/packages/payload/package.json @@ -1,6 +1,6 @@ { "name": "payload", - "version": "3.0.0-alpha.59", + "version": "3.0.0-alpha.60", "description": "Node, React and MongoDB Headless CMS and Application Framework", "license": "MIT", "main": "./src/index.ts", diff --git a/packages/plugin-cloud-storage/package.json b/packages/plugin-cloud-storage/package.json index 5be7e024a4..f405d0e375 100644 --- a/packages/plugin-cloud-storage/package.json +++ b/packages/plugin-cloud-storage/package.json @@ -1,7 +1,7 @@ { "name": "@payloadcms/plugin-cloud-storage", "description": "The official cloud storage plugin for Payload CMS", - "version": "3.0.0-alpha.59", + "version": "3.0.0-alpha.60", "main": "./src/index.ts", "types": "./src/index.ts", "type": "module", diff --git a/packages/plugin-cloud/package.json b/packages/plugin-cloud/package.json index e6c9eb2eca..3ba9f4ac63 100644 --- a/packages/plugin-cloud/package.json +++ b/packages/plugin-cloud/package.json @@ -1,7 +1,7 @@ { "name": "@payloadcms/plugin-cloud", "description": "The official Payload Cloud plugin", - "version": "3.0.0-alpha.59", + "version": "3.0.0-alpha.60", "main": "./src/index.ts", "types": "./src/index.ts", "license": "MIT", diff --git a/packages/plugin-form-builder/package.json b/packages/plugin-form-builder/package.json index a0971ea42c..1c883b6151 100644 --- a/packages/plugin-form-builder/package.json +++ b/packages/plugin-form-builder/package.json @@ -1,7 +1,7 @@ { "name": "@payloadcms/plugin-form-builder", "description": "Form builder plugin for Payload CMS", - "version": "3.0.0-alpha.59", + "version": "3.0.0-alpha.60", "homepage:": "https://payloadcms.com", "repository": { "type": "git", diff --git a/packages/plugin-nested-docs/package.json b/packages/plugin-nested-docs/package.json index 160835a94d..bbf42e969c 100644 --- a/packages/plugin-nested-docs/package.json +++ b/packages/plugin-nested-docs/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-nested-docs", - "version": "3.0.0-alpha.59", + "version": "3.0.0-alpha.60", "description": "The official Nested Docs plugin for Payload", "repository": { "type": "git", diff --git a/packages/plugin-redirects/package.json b/packages/plugin-redirects/package.json index 905931424a..cc228114a2 100644 --- a/packages/plugin-redirects/package.json +++ b/packages/plugin-redirects/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-redirects", - "version": "3.0.0-alpha.59", + "version": "3.0.0-alpha.60", "homepage:": "https://payloadcms.com", "repository": { "type": "git", diff --git a/packages/plugin-search/package.json b/packages/plugin-search/package.json index eaf1ed5295..fa4424e91c 100644 --- a/packages/plugin-search/package.json +++ b/packages/plugin-search/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-search", - "version": "3.0.0-alpha.59", + "version": "3.0.0-alpha.60", "homepage:": "https://payloadcms.com", "repository": { "type": "git", diff --git a/packages/plugin-seo/package.json b/packages/plugin-seo/package.json index cbadbca0a1..595c5b5909 100644 --- a/packages/plugin-seo/package.json +++ b/packages/plugin-seo/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-seo", - "version": "3.0.0-alpha.59", + "version": "3.0.0-alpha.60", "homepage:": "https://payloadcms.com", "repository": { "type": "git", diff --git a/packages/richtext-lexical/package.json b/packages/richtext-lexical/package.json index 0294df53e1..4f0a9d9f30 100644 --- a/packages/richtext-lexical/package.json +++ b/packages/richtext-lexical/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/richtext-lexical", - "version": "3.0.0-alpha.59", + "version": "3.0.0-alpha.60", "description": "The officially supported Lexical richtext adapter for Payload", "repository": { "type": "git", diff --git a/packages/richtext-slate/package.json b/packages/richtext-slate/package.json index ad507b8ff0..7091415b9d 100644 --- a/packages/richtext-slate/package.json +++ b/packages/richtext-slate/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/richtext-slate", - "version": "3.0.0-alpha.59", + "version": "3.0.0-alpha.60", "description": "The officially supported Slate richtext adapter for Payload", "repository": { "type": "git", diff --git a/packages/translations/package.json b/packages/translations/package.json index ec569d6fd8..4ecf430e3c 100644 --- a/packages/translations/package.json +++ b/packages/translations/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/translations", - "version": "3.0.0-alpha.59", + "version": "3.0.0-alpha.60", "main": "./src/exports/index.ts", "types": "./src/types.ts", "type": "module", diff --git a/packages/ui/package.json b/packages/ui/package.json index 2fa5575a44..32690f0b42 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/ui", - "version": "3.0.0-alpha.59", + "version": "3.0.0-alpha.60", "type": "module", "homepage": "https://payloadcms.com", "repository": { From 5826048e7becb8dc0aec510e03476c9f31442a59 Mon Sep 17 00:00:00 2001 From: Elliot DeNolf Date: Tue, 9 Apr 2024 09:50:15 -0400 Subject: [PATCH 026/177] ci: publish script throttling --- scripts/release.ts | 92 +++++++++++++++++++++++----------------------- 1 file changed, 46 insertions(+), 46 deletions(-) diff --git a/scripts/release.ts b/scripts/release.ts index dd270a6d84..6eeb1ac4eb 100755 --- a/scripts/release.ts +++ b/scripts/release.ts @@ -6,19 +6,23 @@ import execa from 'execa' import fse from 'fs-extra' import minimist from 'minimist' import { fileURLToPath } from 'node:url' -import pMap from 'p-map' +import pLimit from 'p-limit' import path from 'path' import prompts from 'prompts' import semver from 'semver' import { simpleGit } from 'simple-git' +import type { PackageDetails } from './lib/getPackageDetails.js' + import { getPackageDetails } from './lib/getPackageDetails.js' import { updateChangelog } from './utils/updateChangelog.js' +const npmPublishLimit = pLimit(2) + // Update this list with any packages to publish const packageWhitelist = [ 'payload', - // 'translations', + 'translations', 'ui', 'next', 'graphql', @@ -27,7 +31,7 @@ const packageWhitelist = [ 'richtext-slate', 'richtext-lexical', - // 'create-payload-app', + 'create-payload-app', // Plugins 'plugin-cloud', @@ -143,26 +147,13 @@ async function main() { await execa('pnpm', ['install'], execaOpts) - const buildResult = await execa('pnpm', ['build:core', '--output-logs=errors-only'], execaOpts) - // const buildResult = execSync('pnpm build:all', execOpts) + const buildResult = await execa('pnpm', ['build:all', '--output-logs=errors-only'], execaOpts) if (buildResult.exitCode !== 0) { console.error(chalk.bold.red('Build failed')) console.log(buildResult.stderr) abort('Build failed') } - const buildPluginsResult = await execa( - 'pnpm', - ['build:plugins', '--output-logs=errors-only'], - execaOpts, - ) - - if (buildPluginsResult.exitCode !== 0) { - console.error(chalk.bold.red('Build failed')) - console.log(buildPluginsResult.stderr) - abort('Build failed') - } - // Update changelog if (changelog) { header(`${logPrefix}📝 Updating changelog...`) @@ -209,35 +200,8 @@ async function main() { abort('2FA code is required') } - // Publish - const results: { name: string; success: boolean; details?: string }[] = await Promise.all( - packageDetails.map(async (pkg) => { - try { - console.log(logPrefix, chalk.bold(`🚀 ${pkg.name} publishing...`)) - const cmdArgs = ['publish', '-C', pkg.packagePath, '--no-git-checks', '--tag', tag] - if (dryRun) { - cmdArgs.push('--dry-run') - } else { - cmdArgs.push('--otp', otp) - } - const { exitCode, stderr } = await execa('pnpm', cmdArgs, { - cwd, - stdio: ['ignore', 'ignore', 'pipe'], - // stdio: 'inherit', - }) - - if (exitCode !== 0) { - console.log(chalk.bold.red(`\n\n❌ ${pkg.name} ERROR: pnpm publish failed\n\n`)) - return { name: pkg.name, success: false, details: stderr } - } - - console.log(`${logPrefix} ${chalk.green(`✅ ${pkg.name} published`)}`) - return { name: pkg.name, success: true } - } catch (error) { - console.error(chalk.bold.red(`\n\n❌ ${pkg.name} ERROR: ${error.message}\n\n`)) - return { name: pkg.name, success: false } - } - }), + const results = await Promise.all( + packageDetails.map((pkg) => publishPackageThrottled(pkg, { dryRun, otp })), ) console.log(chalk.bold.green(`\n\nResults:\n`)) @@ -270,6 +234,42 @@ main().catch((error) => { process.exit(1) }) +/** Publish with promise concurrency throttling */ +async function publishPackageThrottled( + pkg: PackageDetails, + opts?: { dryRun?: boolean; otp?: string }, +) { + const { dryRun = false, otp } = opts ?? {} + return npmPublishLimit(() => publishSinglePackage(pkg, { dryRun, otp })) +} + +async function publishSinglePackage( + pkg: PackageDetails, + opts?: { dryRun?: boolean; otp?: string }, +) { + const { dryRun = false, otp } = opts ?? {} + console.log(chalk.bold(`🚀 ${pkg.name} publishing...`)) + const cmdArgs = ['publish', '-C', pkg.packagePath, '--no-git-checks', '--json', '--tag', tag] + if (dryRun) { + cmdArgs.push('--dry-run') + } else { + cmdArgs.push('--otp', otp) + } + const { exitCode, stderr } = await execa('pnpm', cmdArgs, { + cwd, + stdio: ['ignore', 'ignore', 'pipe'], + // stdio: 'inherit', + }) + + if (exitCode !== 0) { + console.log(chalk.bold.red(`\n\n❌ ${pkg.name} ERROR: pnpm publish failed\n\n${stderr}`)) + return { name: pkg.name, success: false, details: stderr } + } + + console.log(`${logPrefix} ${chalk.green(`✅ ${pkg.name} published`)}`) + return { name: pkg.name, success: true } +} + function abort(message = 'Abort', exitCode = 1) { console.error(chalk.bold.red(`\n${message}\n`)) process.exit(exitCode) From 817d57bd124b289866705fb90c5ca148dfeed758 Mon Sep 17 00:00:00 2001 From: Jarrod Flesch Date: Tue, 9 Apr 2024 11:05:35 -0400 Subject: [PATCH 027/177] chore: migrate langs --- packages/translations/src/exports/all.ts | 104 +-- packages/translations/src/exports/index.ts | 3 +- packages/translations/src/languages/ar.ts | 4 +- packages/translations/src/languages/az.ts | 785 ++++++++--------- packages/translations/src/languages/bg.ts | 781 ++++++++--------- packages/translations/src/languages/cs.ts | 778 ++++++++--------- packages/translations/src/languages/de.ts | 4 +- packages/translations/src/languages/en.ts | 4 +- packages/translations/src/languages/es.ts | 4 +- packages/translations/src/languages/fa.ts | 780 ++++++++--------- packages/translations/src/languages/fr.ts | 803 +++++++++--------- packages/translations/src/languages/hr.ts | 779 ++++++++--------- packages/translations/src/languages/hu.ts | 791 ++++++++--------- packages/translations/src/languages/it.ts | 793 ++++++++--------- packages/translations/src/languages/ja.ts | 780 ++++++++--------- packages/translations/src/languages/ko.ts | 773 ++++++++--------- packages/translations/src/languages/my.ts | 795 ++++++++--------- packages/translations/src/languages/nb.ts | 783 ++++++++--------- packages/translations/src/languages/nl.ts | 790 ++++++++--------- packages/translations/src/languages/pl.ts | 787 ++++++++--------- packages/translations/src/languages/pt.ts | 786 ++++++++--------- packages/translations/src/languages/ro.ts | 797 ++++++++--------- packages/translations/src/languages/rs.ts | 775 ++++++++--------- .../translations/src/languages/rsLatin.ts | 776 ++++++++--------- packages/translations/src/languages/ru.ts | 787 ++++++++--------- packages/translations/src/languages/sv.ts | 782 ++++++++--------- packages/translations/src/languages/th.ts | 768 ++++++++--------- packages/translations/src/languages/tr.ts | 786 ++++++++--------- packages/translations/src/languages/ua.ts | 781 ++++++++--------- packages/translations/src/languages/vi.ts | 772 ++++++++--------- packages/translations/src/languages/zh.ts | 754 ++++++++-------- packages/translations/src/languages/zhTw.ts | 754 ++++++++-------- 32 files changed, 10302 insertions(+), 10137 deletions(-) diff --git a/packages/translations/src/exports/all.ts b/packages/translations/src/exports/all.ts index 3e89efd7f9..fc651f4ce9 100644 --- a/packages/translations/src/exports/all.ts +++ b/packages/translations/src/exports/all.ts @@ -1,65 +1,65 @@ import type { SupportedLanguages } from '../types.js' import { ar } from '../languages/ar.js' -import az from '../languages/az.js' -import bg from '../languages/bg.js' -import cs from '../languages/cs.js' +import { az } from '../languages/az.js' +import { bg } from '../languages/bg.js' +import { cs } from '../languages/cs.js' import { de } from '../languages/de.js' import { en } from '../languages/en.js' import { es } from '../languages/es.js' -import fa from '../languages/fa.js' -import fr from '../languages/fr.js' -import hr from '../languages/hr.js' -import hu from '../languages/hu.js' -import it from '../languages/it.js' -import ja from '../languages/ja.js' -import ko from '../languages/ko.js' -import my from '../languages/my.js' -import nb from '../languages/nb.js' -import nl from '../languages/nl.js' -import pl from '../languages/pl.js' -import pt from '../languages/pt.js' -import ro from '../languages/ro.js' -import rs from '../languages/rs.js' -import rsLatin from '../languages/rsLatin.js' -import ru from '../languages/ru.js' -import sv from '../languages/sv.js' -import th from '../languages/th.js' -import tr from '../languages/tr.js' -import ua from '../languages/ua.js' -import vi from '../languages/vi.js' -import zh from '../languages/zh.js' -import zhTw from '../languages/zhTw.js' +import { fa } from '../languages/fa.js' +import { fr } from '../languages/fr.js' +import { hr } from '../languages/hr.js' +import { hu } from '../languages/hu.js' +import { it } from '../languages/it.js' +import { ja } from '../languages/ja.js' +import { ko } from '../languages/ko.js' +import { my } from '../languages/my.js' +import { nb } from '../languages/nb.js' +import { nl } from '../languages/nl.js' +import { pl } from '../languages/pl.js' +import { pt } from '../languages/pt.js' +import { ro } from '../languages/ro.js' +import { rs } from '../languages/rs.js' +import { rsLatin } from '../languages/rsLatin.js' +import { ru } from '../languages/ru.js' +import { sv } from '../languages/sv.js' +import { th } from '../languages/th.js' +import { tr } from '../languages/tr.js' +import { ua } from '../languages/ua.js' +import { vi } from '../languages/vi.js' +import { zh } from '../languages/zh.js' +import { zhTw } from '../languages/zhTw.js' export const translations = { ar, - // az, - // bg, - // cs, + az, + bg, + cs, de, en, es, - // fa, - // fr, - // hr, - // hu, - // it, - // ja, - // ko, - // my, - // nb, - // nl, - // pl, - // pt, - // ro, - // rs, - // 'rs-latin': rsLatin, - // ru, - // sv, - // th, - // tr, - // ua, - // vi, - // zh, - // 'zh-tw': zhTw, + fa, + fr, + hr, + hu, + it, + ja, + ko, + my, + nb, + nl, + pl, + pt, + ro, + rs, + 'rs-latin': rsLatin, + ru, + sv, + th, + tr, + ua, + vi, + zh, + 'zh-tw': zhTw, } as SupportedLanguages diff --git a/packages/translations/src/exports/index.ts b/packages/translations/src/exports/index.ts index 22927f88f3..fa5c314f56 100644 --- a/packages/translations/src/exports/index.ts +++ b/packages/translations/src/exports/index.ts @@ -1,4 +1,5 @@ export { importDateFNSLocale } from '../importDateFNSLocale.js' export { getTranslation } from '../utilities/getTranslation.js' -export { initI18n, matchLanguage, t } from '../utilities/init.js' +export { initI18n, t } from '../utilities/init.js' +export { acceptedLanguages, matchLanguage, rtlLanguages } from '../utilities/languages.js' export type * from '../types.js' diff --git a/packages/translations/src/languages/ar.ts b/packages/translations/src/languages/ar.ts index 0df82f376f..4ed5cf375c 100644 --- a/packages/translations/src/languages/ar.ts +++ b/packages/translations/src/languages/ar.ts @@ -1,4 +1,6 @@ -export const ar = { +import type { Language } from '../types.js' + +export const ar: Language = { dateFNSKey: 'ar', translations: { authentication: { diff --git a/packages/translations/src/languages/az.ts b/packages/translations/src/languages/az.ts index 387a45b473..d796f61d21 100644 --- a/packages/translations/src/languages/az.ts +++ b/packages/translations/src/languages/az.ts @@ -1,392 +1,397 @@ -export default { - authentication: { - account: 'Hesab', - accountOfCurrentUser: 'Cari istifadəçinin hesabı', - alreadyActivated: 'Artıq Aktivləşdirilib', - alreadyLoggedIn: 'Artıq daxil olunub', - apiKey: 'API Açarı', - backToLogin: 'Girişə qayıt', - beginCreateFirstUser: 'Başlamaq üçün ilk istifadəçinizi yaradın.', - changePassword: 'Parolu dəyişdir', - checkYourEmailForPasswordReset: - 'Parolunuzu təhlükəsiz şəkildə sıfırlamağa imkan verəcək link üçün e-poçt ünvanınızı yoxlayın.', - confirmGeneration: 'Generasiyani təsdiqlə', - confirmPassword: 'Şifrəni təsdiq et', - createFirstUser: 'İlk istifadəçini yaradın', - emailNotValid: 'Təqdim olunan e-poçt etibarlı deyil', - emailSent: 'E-poçt göndərildi', - enableAPIKey: 'API açarını aktivləşdir', - failedToUnlock: 'Kilidi açmaq alınmadı', - forceUnlock: 'Kilidi zorla aç', - forgotPassword: 'Şifrəni unutmusan', - forgotPasswordEmailInstructions: - 'Zəhmət olmasa, e-poçt ünvanınızı aşağıda daxil edin. Siz parolunuzu necə sıfırlamaq barədə təlimatları olan e-poçt mesajı alacaqsınız.', - forgotPasswordQuestion: 'Şifrəni unutmusan?', - generate: 'Yarad', - generateNewAPIKey: 'Yeni API açarı yarad', - generatingNewAPIKeyWillInvalidate: - 'Yeni API açarının yaradılması əvvəlki açarı etibarsız edəcək. Davam etmək istədiyinizə əminsiniz?', - lockUntil: 'Klidklə', - logBackIn: 'Yenidən daxil ol', - logOut: 'Çıxış et', - loggedIn: 'Başqa istifadəçi ilə daxil olmaq üçün əvvəlcə çıxış etməlisiniz.', - loggedInChangePassword: - 'Parolu dəyişdirmək üçün hesabınıza get və orada şifrənizi redaktə edin.', - loggedOutInactivity: 'Hərəkətsizlik səbəbindən sistemdən çıxmısınız.', - loggedOutSuccessfully: 'Siz uğurla çıxış etdiniz.', - login: 'Giriş', - loginAttempts: 'Giriş cəhdləri', - loginUser: 'Giriş istifadəçisi', - loginWithAnotherUser: 'Başqa istifadəçi ilə daxil olmaq üçün əvvəlcə çıxış etməlisiniz.', - logout: 'Çıxış', - logoutUser: 'Sistemdən çıxış', - newAPIKeyGenerated: 'Yeni API Açarı Yaradıldı.', - newAccountCreated: - 'Sizin üçün yeni hesab yaradıldı. Zəhmət olmasa, e-poçtunuzu doğrulamaq üçün aşağıdakı linke klikləyin: {{verificationURL}}. E-poçtunuzu doğruladıqdan sonra uğurla daxil ola bilərsiniz.', - newPassword: 'Yeni şifrə', - resetPassword: 'Şifrəni sıfırla', - resetPasswordExpiration: 'Şifrənin müddətini sıfırla', - resetPasswordToken: 'Şifrə Tokenini Sıfırla', - resetYourPassword: 'Şifrənizi sıfırlayın', - stayLoggedIn: 'Sistemdə qal', - successfullyUnlocked: 'Uğurla kilidi açıldı', - unableToVerify: 'Doğrulamaq mümkün deyil', - verified: 'Doğrulanmış', - verifiedSuccessfully: 'Uğurla doğrulandı', - verify: 'Doğrula', - verifyUser: 'İstifadəçini doğrula', - verifyYourEmail: 'E-poçtunuzu doğrulayın', - youAreInactive: - 'Siz bir müddətdir aktiv deyilsiniz və tezliklə öz təhlükəsizliyiniz üçün avtomatik olaraq sistemdən çıxacaqsınız. Daxil olmaq istərdinizmi?', - 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: { - accountAlreadyActivated: 'Bu hesab artıq aktivləşdirilib.', - autosaving: 'Bu sənədin avto yadda saxlanılması zamanı problem yarandı.', - correctInvalidFields: 'Zəhmət olmasa, yanlış sahələri düzəlt.', - deletingFile: 'Faylın silinməsində xəta baş verdi.', - deletingTitle: - '{{title}} silinərkən xəta baş verdi. Zəhmət olmasa, bağlantınızı yoxlayın və yenidən cəhd edin.', - 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:', - incorrectCollection: 'Yanlış Kolleksiya', - invalidFileType: 'Yanlış fayl növü', - invalidFileTypeValue: 'Yanlış fayl növü: {{value}}', - loadingDocument: '{{id}} ID-li sənədin yüklənməsində problem baş verdi.', - missingEmail: 'E-poçt adresi çatışmır.', - missingIDOfDocument: 'Yeniləmək üçün sənədin ID-si çatışmır.', - missingIDOfVersion: 'Versiyanın ID-si çatışmır.', - missingRequiredData: 'Tələb olunan məlumat çatışmır.', - noFilesUploaded: 'Heç bir fayl yüklənilməyib.', - noMatchedField: '"{{label}}" üçün uyğun sahə tapılmadı', - noUser: 'İstifadəçi Yoxdur', - notAllowedToAccessPage: 'Bu səhifəyə girməyə icazəniz yoxdur.', - notAllowedToPerformAction: 'Bu əməliyyatı icra etməyə icazəniz yoxdur.', - notFound: 'Tələb olunan resurs tapılmadı.', - previewing: 'Bu sənədin ön baxışı zamanı problem yarandı.', - problemUploadingFile: 'Faylın yüklənməsi zamanı problem yarandı.', - tokenInvalidOrExpired: 'Token ya yanlışdır və ya müddəti bitib.', - unPublishingDocument: 'Bu sənədin nəşrini ləğv etmək zamanı problem baş verdi.', - 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.', - unknown: 'Naməlum bir xəta baş verdi.', - unspecific: 'Xəta baş verdi.', - 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', - verificationTokenInvalid: 'Doğrulama tokenı yanlışdır.', - }, - fields: { - addLabel: '{{label}} əlavə et', - addLink: 'Keçid əlavə et', - addNew: 'Yenisini əlavə et', - addNewLabel: 'Yeni {{label}} əlavə et', - addRelationship: 'Relationship əlavə et', - addUpload: 'Yükləmə əlavə et', - block: 'blok', - blockType: 'Blok Növü', - blocks: 'bloklar', - 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', - chooseFromExisting: 'Mövcuddan seçin', - chooseLabel: '{{label}} seçin', - collapseAll: 'Hamısını Bağla', - customURL: 'Xüsusi URL', - editLabelData: '{{label}} məlumatını redaktə et', - editLink: 'Keçidi redaktə et', - editRelationship: 'Relationship redaktə et', - enterURL: 'URL daxil edin', - internalLink: 'Daxili Keçid', - itemsAndMore: '{{items}} və daha {{count}} nəfər', - labelRelationship: '{{label}} Relationship', - latitude: 'Enlik', - linkType: 'Keçid Növü', - linkedTo: '<0>{{label}} ilə əlaqəli', - longitude: 'Uzunluq', - newLabel: 'Yeni {{label}}', - openInNewTab: 'Yeni sekmede aç', - passwordsDoNotMatch: 'Şifrələr uyğun gəlmir.', - relatedDocument: 'Əlaqəli Sənəd', - relationTo: 'Relationship', - removeRelationship: 'Relationship sil', - removeUpload: 'Yükləməni sil', - saveChanges: 'Dəyişiklikləri saxla', - searchForBlock: 'Blok üçün axtarış', - selectExistingLabel: 'Mövcud {{label}} seçin', - selectFieldsToEdit: 'Redaktə ediləcək sahələri seçin', - showAll: 'Hamısını Göstər', - swapRelationship: 'Relationship dəyiş', - swapUpload: 'Yükləməni dəyiş', - textToDisplay: 'Göstəriləcək mətn', - toggleBlock: 'Bloku keç', - uploadNewLabel: 'Yeni {{label}} yüklə', - }, - general: { - aboutToDelete: 'Siz {{label}} <1>{{title}} silməyə hazırsınız. Eminsiniz?', - aboutToDeleteCount_many: 'Siz {{count}} {{label}} silməyə hazırsınız.', - aboutToDeleteCount_one: 'Siz {{count}} {{label}} silməyə hazırsınız.', - aboutToDeleteCount_other: 'Siz {{count}} {{label}} silməyə hazırsınız.', - addBelow: 'Aşağıya əlavə et', - addFilter: 'Filter əlavə et', - adminTheme: 'Admin Mövzusu', - and: 'Və', - applyChanges: 'Dəyişiklikləri Tətbiq Edin', - ascending: 'Artan', - automatic: 'Avtomatik', - backToDashboard: 'Panelə qayıdın', - cancel: 'Ləğv et', - changesNotSaved: - 'Dəyişiklikləriniz saxlanılmayıb. İndi çıxsanız, dəyişikliklərinizi itirəcəksiniz.', - close: 'Bağla', - collapse: 'Bağla', - collections: 'Kolleksiyalar', - columnToSort: 'Sıralamağa sütun', - columns: 'Sütunlar', - confirm: 'Təsdiqlə', - confirmDeletion: 'Silməni təsdiqlə', - confirmDuplication: 'Dublikasiyanı təsdiqlə', - copied: 'Kopyalandı', - copy: 'Kopyala', - create: 'Yarat', - createNew: 'Yeni yarat', - createNewLabel: 'Yeni {{label}} yarat', - created: 'Yaradıldı', - createdAt: 'Yaradıldığı tarix', - creating: 'Yaradılır', - creatingNewLabel: 'Yeni {{label}} yaradılır', - dark: 'Tünd', - dashboard: 'Panel', - delete: 'Sil', - deletedCountSuccessfully: '{{count}} {{label}} uğurla silindi.', - deletedSuccessfully: 'Uğurla silindi.', - deleting: 'Silinir...', - descending: 'Azalan', - deselectAllRows: 'Bütün sıraları seçimi ləğv edin', - duplicate: 'Dublikat', - duplicateWithoutSaving: 'Dəyişiklikləri saxlamadan dublikatla', - edit: 'Redaktə et', - editLabel: '{{label}} redaktə et', - editing: 'Redaktə olunur', - editingLabel_many: '{{count}} {{label}} redaktə olunur', - editingLabel_one: '{{count}} {{label}} redaktə olunur', - editingLabel_other: '{{count}} {{label}} redaktə olunur', - email: 'Elektron poçt', - emailAddress: 'Elektron poçt ünvanı', - enterAValue: 'Bir dəyər daxil edin', - error: 'Xəta', - errors: 'Xətalar', - fallbackToDefaultLocale: 'Standart lokalə keçid', - filter: 'Filter', - filterWhere: '{{label}} filtrlə', - filters: 'Filtərlər', - globals: 'Qloballar', - language: 'Dil', - lastModified: 'Son dəyişdirildi', - leaveAnyway: 'Heç olmasa çıx', - leaveWithoutSaving: 'Saxlamadan çıx', - light: 'Açıq', - livePreview: 'Öncədən baxış', - loading: 'Yüklənir', - locale: 'Lokal', - locales: 'Dillər', - menu: 'Menyu', - moveDown: 'Aşağı hərəkət et', - moveUp: 'Yuxarı hərəkət et', - newPassword: 'Yeni şifrə', - noFiltersSet: 'Filter təyin edilməyib', - noLabel: '', - noOptions: 'Heç bir seçim yoxdur', - noResults: - 'Heç bir {{label}} tapılmadı. Ya hələ {{label}} yoxdur, ya da yuxarıda göstərdiyiniz filtrlərə uyğun gəlmir.', - noValue: 'Dəyər yoxdur', - none: 'Heç bir', - notFound: 'Tapılmadı', - nothingFound: 'Heç nə tapılmadı', - of: 'dən', - open: 'Aç', - or: 'Və ya', - order: 'Sıra', - pageNotFound: 'Səhifə tapılmadı', - password: 'Şifrə', - payloadSettings: 'Payload Parametrləri', - perPage: 'Hər səhifədə: {{limit}}', - remove: 'Sil', - reset: 'Yenidən başlat', - row: 'Sətir', - rows: 'Sətirlər', - save: 'Saxla', - saving: 'Saxlanılır...', - searchBy: '{{label}} ilə axtar', - selectAll: 'Bütün {{count}} {{label}} seç', - selectAllRows: 'Bütün sıraları seçin', - selectValue: 'Dəyər seçin', - selectedCount: '{{count}} {{label}} seçildi', - showAllLabel: 'Bütün {{label}}-ı göstər', - sorryNotFound: 'Üzr istəyirik - sizin tələbinizə uyğun heç nə yoxdur.', - sort: 'Sırala', - sortByLabelDirection: '{{label}} {{direction}} ilə sırala', - stayOnThisPage: 'Bu səhifədə qal', - submissionSuccessful: 'Təqdimat uğurlu oldu.', - submit: 'Təqdim et', - successfullyCreated: '{{label}} uğurla yaradıldı.', - successfullyDuplicated: '{{label}} uğurla dublikatlandı.', - thisLanguage: 'Azərbaycan dili', - titleDeleted: '{{label}} "{{title}}" uğurla silindi.', - unauthorized: 'İcazəsiz', - unsavedChangesDuplicate: - 'Saxlanılmamış dəyişiklikləriniz var. Dublikatla davam etmək istəyirsiniz?', - untitled: 'Başlıqsız', - updatedAt: 'Yeniləndiyi tarix', - updatedCountSuccessfully: '{{count}} {{label}} uğurla yeniləndi.', - updatedSuccessfully: 'Uğurla yeniləndi.', - updating: 'Yenilənir', - uploading: 'Yüklənir', - user: 'İstifadəçi', - users: 'İstifadəçilər', - value: 'Dəyər', - welcome: 'Xoş gəldiniz', - }, - operators: { - contains: 'daxilində', - equals: 'bərabərdir', - exists: 'mövcuddur', - isGreaterThan: 'dən böyük', - isGreaterThanOrEqualTo: 'böyük və ya bərabər', - isIn: 'daxildir', - isLessThan: 'dən kiçik', - isLessThanOrEqualTo: 'kiçik və ya bərabər', - isLike: 'kimi', - isNotEqualTo: 'bərabər deyil', - isNotIn: 'daxil deyil', - near: 'yaxın', - }, - upload: { - crop: 'Məhsul', - cropToolDescription: - 'Seçilmiş sahənin köşələrini sürükləyin, yeni bir sahə çəkin və ya aşağıdakı dəyərləri düzəltin.', - dragAndDrop: 'Faylı buraya sürükləyin və buraxın', - dragAndDropHere: 'və ya faylı buraya sürükləyin və buraxın', - editImage: 'Şəkili Redaktə Et', - fileName: 'Faylın Adı', - fileSize: 'Faylım Ölçüsü', - focalPoint: 'Mərkəzi Nöqtə', - focalPointDescription: - 'Fokus nöqtəsini birbaşa önizləməyə sürükləyin və ya aşağıdakı dəyərləri düzəltin.', - height: 'Hündürlük', - lessInfo: 'Daha az məlumat', - moreInfo: 'Daha çox məlumat', - previewSizes: 'Öncədən baxış ölçüləri', - selectCollectionToBrowse: 'Gözdən keçirmək üçün bir Kolleksiya seçin', - selectFile: 'Fayl seçin', - setCropArea: 'Məhsul sahəsini təyin et', - setFocalPoint: 'Fokus nöqtəsi təyin et', - sizes: 'Ölçülər', - sizesFor: '{{label}} üçün ö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.', - fieldHasNo: 'Bu sahədə heç bir {{label}} yoxdur', - 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.', - limitReached: 'Limitə çatdınız, yalnız {{max}} element əlavə edilə bilər.', - 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.', - requiresAtLeast: 'Bu sahə ən azı {{count}} {{label}} tələb edir.', - 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: { - aboutToPublishSelection: 'Seçimdə olan bütün {{label}}-i dərc etməyə hazırsınız. Əminsiniz?', - aboutToRestore: - 'Bu {{label}} sənədini {{versionDate}} tarixindəki vəziyyətinə bərpa etmək üzrəsiniz.', - aboutToRestoreGlobal: - 'Qlobal {{label}}-i {{versionDate}} tarixindəki vəziyyətinə bərpa etmək üzrəsiniz.', - aboutToRevertToPublished: - 'Bu sənədin dəyişikliklərini dərc edilmiş vəziyyətinə qaytarmağa hazırsınız. Əminsiniz?', - aboutToUnpublish: 'Bu sənədi dərcdən çıxartmağa hazırsınız. Əminsiniz?', - aboutToUnpublishSelection: - 'Seçimdə olan bütün {{label}}-i dərcdən çıxartmağa hazırsınız. Əminsiniz?', - autosave: 'Avtomatik yadda saxlama', - autosavedSuccessfully: 'Uğurla avtomatik olaraq yadda saxlandı.', - autosavedVersion: 'Avtomatik yadda saxlanmış versiya', - changed: 'Dəyişdirildi', - compareVersion: 'Versiyanı müqayisə et:', - confirmPublish: 'Dərci təsdiq edin', - confirmRevertToSaved: 'Yadda saxlanana qayıtmağı təsdiq edin', - confirmUnpublish: 'Dərcdən çıxartmağı təsdiq edin', - confirmVersionRestoration: 'Versiyanın bərpasını təsdiq edin', - currentDocumentStatus: 'Cari {{docStatus}} sənədi', - draft: 'Qaralama', - draftSavedSuccessfully: 'Qaralama uğurla yadda saxlandı.', - lastSavedAgo: '{{distance}} əvvəl son yadda saxlanıldı', - noFurtherVersionsFound: 'Başqa versiyalar tapılmadı', - noRowsFound: 'Heç bir {{label}} tapılmadı', - preview: 'Öncədən baxış', - problemRestoringVersion: 'Bu versiyanın bərpasında problem yaşandı', - publish: 'Dərc et', - publishChanges: 'Dəyişiklikləri dərc et', - published: 'Dərc edilmiş', - publishing: 'Nəşr', - restoreThisVersion: 'Bu versiyanı bərpa et', - restoredSuccessfully: 'Uğurla bərpa edildi.', - restoring: 'Bərpa olunur...', - revertToPublished: 'Dərc edilmişə qayıt', - reverting: 'Qayıdılır...', - saveDraft: 'Qaralamayı yadda saxla', - selectLocales: 'Göstərmək üçün lokalları seçin', - selectVersionToCompare: 'Müqayisə üçün bir versiya seçin', - showLocales: 'Lokalları göstər:', - showingVersionsFor: 'Göstərilən versiyalar üçün:', - status: 'Status', - type: 'Növ', - unpublish: 'Dərcdən çıxart', - unpublishing: 'Dərcdən çıxarılır...', - version: 'Versiya', - versionCount_many: '{{count}} versiya tapıldı', - versionCount_none: 'Versiya tapılmadı', - versionCount_one: '{{count}} versiya tapıldı', - versionCount_other: '{{count}} versiya tapıldı', - versionCreatedOn: '{{version}} tarixində yaradıldı:', - versionID: 'Versiyanın ID-si', - versions: 'Versiyalar', - viewingVersion: '{{entityLabel}} {{documentTitle}} üçün versiyanı göstərir', - viewingVersionGlobal: 'Qlobal {{entityLabel}} üçün versiyanı göstərir', - viewingVersions: '{{entityLabel}} {{documentTitle}} üçün versiyaları göstərir', - viewingVersionsGlobal: 'Qlobal {{entityLabel}} üçün versiyaları göstərir', +import type { Language } from '../types.js' + +export const az: Language = { + dateFNSKey: 'az', + translations: { + authentication: { + account: 'Hesab', + accountOfCurrentUser: 'Cari istifadəçinin hesabı', + alreadyActivated: 'Artıq Aktivləşdirilib', + alreadyLoggedIn: 'Artıq daxil olunub', + apiKey: 'API Açarı', + backToLogin: 'Girişə qayıt', + beginCreateFirstUser: 'Başlamaq üçün ilk istifadəçinizi yaradın.', + changePassword: 'Parolu dəyişdir', + checkYourEmailForPasswordReset: + 'Parolunuzu təhlükəsiz şəkildə sıfırlamağa imkan verəcək link üçün e-poçt ünvanınızı yoxlayın.', + confirmGeneration: 'Generasiyani təsdiqlə', + confirmPassword: 'Şifrəni təsdiq et', + createFirstUser: 'İlk istifadəçini yaradın', + emailNotValid: 'Təqdim olunan e-poçt etibarlı deyil', + emailSent: 'E-poçt göndərildi', + enableAPIKey: 'API açarını aktivləşdir', + failedToUnlock: 'Kilidi açmaq alınmadı', + forceUnlock: 'Kilidi zorla aç', + forgotPassword: 'Şifrəni unutmusan', + forgotPasswordEmailInstructions: + 'Zəhmət olmasa, e-poçt ünvanınızı aşağıda daxil edin. Siz parolunuzu necə sıfırlamaq barədə təlimatları olan e-poçt mesajı alacaqsınız.', + forgotPasswordQuestion: 'Şifrəni unutmusan?', + generate: 'Yarad', + generateNewAPIKey: 'Yeni API açarı yarad', + generatingNewAPIKeyWillInvalidate: + 'Yeni API açarının yaradılması əvvəlki açarı etibarsız edəcək. Davam etmək istədiyinizə əminsiniz?', + lockUntil: 'Klidklə', + logBackIn: 'Yenidən daxil ol', + logOut: 'Çıxış et', + loggedIn: 'Başqa istifadəçi ilə daxil olmaq üçün əvvəlcə çıxış etməlisiniz.', + loggedInChangePassword: + 'Parolu dəyişdirmək üçün hesabınıza get və orada şifrənizi redaktə edin.', + loggedOutInactivity: 'Hərəkətsizlik səbəbindən sistemdən çıxmısınız.', + loggedOutSuccessfully: 'Siz uğurla çıxış etdiniz.', + login: 'Giriş', + loginAttempts: 'Giriş cəhdləri', + loginUser: 'Giriş istifadəçisi', + loginWithAnotherUser: 'Başqa istifadəçi ilə daxil olmaq üçün əvvəlcə çıxış etməlisiniz.', + logout: 'Çıxış', + logoutUser: 'Sistemdən çıxış', + newAPIKeyGenerated: 'Yeni API Açarı Yaradıldı.', + newAccountCreated: + 'Sizin üçün yeni hesab yaradıldı. Zəhmət olmasa, e-poçtunuzu doğrulamaq üçün aşağıdakı linke klikləyin: {{verificationURL}}. E-poçtunuzu doğruladıqdan sonra uğurla daxil ola bilərsiniz.', + newPassword: 'Yeni şifrə', + resetPassword: 'Şifrəni sıfırla', + resetPasswordExpiration: 'Şifrənin müddətini sıfırla', + resetPasswordToken: 'Şifrə Tokenini Sıfırla', + resetYourPassword: 'Şifrənizi sıfırlayın', + stayLoggedIn: 'Sistemdə qal', + successfullyUnlocked: 'Uğurla kilidi açıldı', + unableToVerify: 'Doğrulamaq mümkün deyil', + verified: 'Doğrulanmış', + verifiedSuccessfully: 'Uğurla doğrulandı', + verify: 'Doğrula', + verifyUser: 'İstifadəçini doğrula', + verifyYourEmail: 'E-poçtunuzu doğrulayın', + youAreInactive: + 'Siz bir müddətdir aktiv deyilsiniz və tezliklə öz təhlükəsizliyiniz üçün avtomatik olaraq sistemdən çıxacaqsınız. Daxil olmaq istərdinizmi?', + 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: { + accountAlreadyActivated: 'Bu hesab artıq aktivləşdirilib.', + autosaving: 'Bu sənədin avto yadda saxlanılması zamanı problem yarandı.', + correctInvalidFields: 'Zəhmət olmasa, yanlış sahələri düzəlt.', + deletingFile: 'Faylın silinməsində xəta baş verdi.', + deletingTitle: + '{{title}} silinərkən xəta baş verdi. Zəhmət olmasa, bağlantınızı yoxlayın və yenidən cəhd edin.', + 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:', + incorrectCollection: 'Yanlış Kolleksiya', + invalidFileType: 'Yanlış fayl növü', + invalidFileTypeValue: 'Yanlış fayl növü: {{value}}', + loadingDocument: '{{id}} ID-li sənədin yüklənməsində problem baş verdi.', + missingEmail: 'E-poçt adresi çatışmır.', + missingIDOfDocument: 'Yeniləmək üçün sənədin ID-si çatışmır.', + missingIDOfVersion: 'Versiyanın ID-si çatışmır.', + missingRequiredData: 'Tələb olunan məlumat çatışmır.', + noFilesUploaded: 'Heç bir fayl yüklənilməyib.', + noMatchedField: '"{{label}}" üçün uyğun sahə tapılmadı', + noUser: 'İstifadəçi Yoxdur', + notAllowedToAccessPage: 'Bu səhifəyə girməyə icazəniz yoxdur.', + notAllowedToPerformAction: 'Bu əməliyyatı icra etməyə icazəniz yoxdur.', + notFound: 'Tələb olunan resurs tapılmadı.', + previewing: 'Bu sənədin ön baxışı zamanı problem yarandı.', + problemUploadingFile: 'Faylın yüklənməsi zamanı problem yarandı.', + tokenInvalidOrExpired: 'Token ya yanlışdır və ya müddəti bitib.', + unPublishingDocument: 'Bu sənədin nəşrini ləğv etmək zamanı problem baş verdi.', + 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.', + unknown: 'Naməlum bir xəta baş verdi.', + unspecific: 'Xəta baş verdi.', + 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', + verificationTokenInvalid: 'Doğrulama tokenı yanlışdır.', + }, + fields: { + addLabel: '{{label}} əlavə et', + addLink: 'Keçid əlavə et', + addNew: 'Yenisini əlavə et', + addNewLabel: 'Yeni {{label}} əlavə et', + addRelationship: 'Relationship əlavə et', + addUpload: 'Yükləmə əlavə et', + block: 'blok', + blockType: 'Blok Növü', + blocks: 'bloklar', + 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', + chooseFromExisting: 'Mövcuddan seçin', + chooseLabel: '{{label}} seçin', + collapseAll: 'Hamısını Bağla', + customURL: 'Xüsusi URL', + editLabelData: '{{label}} məlumatını redaktə et', + editLink: 'Keçidi redaktə et', + editRelationship: 'Relationship redaktə et', + enterURL: 'URL daxil edin', + internalLink: 'Daxili Keçid', + itemsAndMore: '{{items}} və daha {{count}} nəfər', + labelRelationship: '{{label}} Relationship', + latitude: 'Enlik', + linkType: 'Keçid Növü', + linkedTo: '<0>{{label}} ilə əlaqəli', + longitude: 'Uzunluq', + newLabel: 'Yeni {{label}}', + openInNewTab: 'Yeni sekmede aç', + passwordsDoNotMatch: 'Şifrələr uyğun gəlmir.', + relatedDocument: 'Əlaqəli Sənəd', + relationTo: 'Relationship', + removeRelationship: 'Relationship sil', + removeUpload: 'Yükləməni sil', + saveChanges: 'Dəyişiklikləri saxla', + searchForBlock: 'Blok üçün axtarış', + selectExistingLabel: 'Mövcud {{label}} seçin', + selectFieldsToEdit: 'Redaktə ediləcək sahələri seçin', + showAll: 'Hamısını Göstər', + swapRelationship: 'Relationship dəyiş', + swapUpload: 'Yükləməni dəyiş', + textToDisplay: 'Göstəriləcək mətn', + toggleBlock: 'Bloku keç', + uploadNewLabel: 'Yeni {{label}} yüklə', + }, + general: { + aboutToDelete: 'Siz {{label}} <1>{{title}} silməyə hazırsınız. Eminsiniz?', + aboutToDeleteCount_many: 'Siz {{count}} {{label}} silməyə hazırsınız.', + aboutToDeleteCount_one: 'Siz {{count}} {{label}} silməyə hazırsınız.', + aboutToDeleteCount_other: 'Siz {{count}} {{label}} silməyə hazırsınız.', + addBelow: 'Aşağıya əlavə et', + addFilter: 'Filter əlavə et', + adminTheme: 'Admin Mövzusu', + and: 'Və', + applyChanges: 'Dəyişiklikləri Tətbiq Edin', + ascending: 'Artan', + automatic: 'Avtomatik', + backToDashboard: 'Panelə qayıdın', + cancel: 'Ləğv et', + changesNotSaved: + 'Dəyişiklikləriniz saxlanılmayıb. İndi çıxsanız, dəyişikliklərinizi itirəcəksiniz.', + close: 'Bağla', + collapse: 'Bağla', + collections: 'Kolleksiyalar', + columnToSort: 'Sıralamağa sütun', + columns: 'Sütunlar', + confirm: 'Təsdiqlə', + confirmDeletion: 'Silməni təsdiqlə', + confirmDuplication: 'Dublikasiyanı təsdiqlə', + copied: 'Kopyalandı', + copy: 'Kopyala', + create: 'Yarat', + createNew: 'Yeni yarat', + createNewLabel: 'Yeni {{label}} yarat', + created: 'Yaradıldı', + createdAt: 'Yaradıldığı tarix', + creating: 'Yaradılır', + creatingNewLabel: 'Yeni {{label}} yaradılır', + dark: 'Tünd', + dashboard: 'Panel', + delete: 'Sil', + deletedCountSuccessfully: '{{count}} {{label}} uğurla silindi.', + deletedSuccessfully: 'Uğurla silindi.', + deleting: 'Silinir...', + descending: 'Azalan', + deselectAllRows: 'Bütün sıraları seçimi ləğv edin', + duplicate: 'Dublikat', + duplicateWithoutSaving: 'Dəyişiklikləri saxlamadan dublikatla', + edit: 'Redaktə et', + editLabel: '{{label}} redaktə et', + editing: 'Redaktə olunur', + editingLabel_many: '{{count}} {{label}} redaktə olunur', + editingLabel_one: '{{count}} {{label}} redaktə olunur', + editingLabel_other: '{{count}} {{label}} redaktə olunur', + email: 'Elektron poçt', + emailAddress: 'Elektron poçt ünvanı', + enterAValue: 'Bir dəyər daxil edin', + error: 'Xəta', + errors: 'Xətalar', + fallbackToDefaultLocale: 'Standart lokalə keçid', + filter: 'Filter', + filterWhere: '{{label}} filtrlə', + filters: 'Filtərlər', + globals: 'Qloballar', + language: 'Dil', + lastModified: 'Son dəyişdirildi', + leaveAnyway: 'Heç olmasa çıx', + leaveWithoutSaving: 'Saxlamadan çıx', + light: 'Açıq', + livePreview: 'Öncədən baxış', + loading: 'Yüklənir', + locale: 'Lokal', + locales: 'Dillər', + menu: 'Menyu', + moveDown: 'Aşağı hərəkət et', + moveUp: 'Yuxarı hərəkət et', + newPassword: 'Yeni şifrə', + noFiltersSet: 'Filter təyin edilməyib', + noLabel: '', + noOptions: 'Heç bir seçim yoxdur', + noResults: + 'Heç bir {{label}} tapılmadı. Ya hələ {{label}} yoxdur, ya da yuxarıda göstərdiyiniz filtrlərə uyğun gəlmir.', + noValue: 'Dəyər yoxdur', + none: 'Heç bir', + notFound: 'Tapılmadı', + nothingFound: 'Heç nə tapılmadı', + of: 'dən', + open: 'Aç', + or: 'Və ya', + order: 'Sıra', + pageNotFound: 'Səhifə tapılmadı', + password: 'Şifrə', + payloadSettings: 'Payload Parametrləri', + perPage: 'Hər səhifədə: {{limit}}', + remove: 'Sil', + reset: 'Yenidən başlat', + row: 'Sətir', + rows: 'Sətirlər', + save: 'Saxla', + saving: 'Saxlanılır...', + searchBy: '{{label}} ilə axtar', + selectAll: 'Bütün {{count}} {{label}} seç', + selectAllRows: 'Bütün sıraları seçin', + selectValue: 'Dəyər seçin', + selectedCount: '{{count}} {{label}} seçildi', + showAllLabel: 'Bütün {{label}}-ı göstər', + sorryNotFound: 'Üzr istəyirik - sizin tələbinizə uyğun heç nə yoxdur.', + sort: 'Sırala', + sortByLabelDirection: '{{label}} {{direction}} ilə sırala', + stayOnThisPage: 'Bu səhifədə qal', + submissionSuccessful: 'Təqdimat uğurlu oldu.', + submit: 'Təqdim et', + successfullyCreated: '{{label}} uğurla yaradıldı.', + successfullyDuplicated: '{{label}} uğurla dublikatlandı.', + thisLanguage: 'Azərbaycan dili', + titleDeleted: '{{label}} "{{title}}" uğurla silindi.', + unauthorized: 'İcazəsiz', + unsavedChangesDuplicate: + 'Saxlanılmamış dəyişiklikləriniz var. Dublikatla davam etmək istəyirsiniz?', + untitled: 'Başlıqsız', + updatedAt: 'Yeniləndiyi tarix', + updatedCountSuccessfully: '{{count}} {{label}} uğurla yeniləndi.', + updatedSuccessfully: 'Uğurla yeniləndi.', + updating: 'Yenilənir', + uploading: 'Yüklənir', + user: 'İstifadəçi', + users: 'İstifadəçilər', + value: 'Dəyər', + welcome: 'Xoş gəldiniz', + }, + operators: { + contains: 'daxilində', + equals: 'bərabərdir', + exists: 'mövcuddur', + isGreaterThan: 'dən böyük', + isGreaterThanOrEqualTo: 'böyük və ya bərabər', + isIn: 'daxildir', + isLessThan: 'dən kiçik', + isLessThanOrEqualTo: 'kiçik və ya bərabər', + isLike: 'kimi', + isNotEqualTo: 'bərabər deyil', + isNotIn: 'daxil deyil', + near: 'yaxın', + }, + upload: { + crop: 'Məhsul', + cropToolDescription: + 'Seçilmiş sahənin köşələrini sürükləyin, yeni bir sahə çəkin və ya aşağıdakı dəyərləri düzəltin.', + dragAndDrop: 'Faylı buraya sürükləyin və buraxın', + dragAndDropHere: 'və ya faylı buraya sürükləyin və buraxın', + editImage: 'Şəkili Redaktə Et', + fileName: 'Faylın Adı', + fileSize: 'Faylım Ölçüsü', + focalPoint: 'Mərkəzi Nöqtə', + focalPointDescription: + 'Fokus nöqtəsini birbaşa önizləməyə sürükləyin və ya aşağıdakı dəyərləri düzəltin.', + height: 'Hündürlük', + lessInfo: 'Daha az məlumat', + moreInfo: 'Daha çox məlumat', + previewSizes: 'Öncədən baxış ölçüləri', + selectCollectionToBrowse: 'Gözdən keçirmək üçün bir Kolleksiya seçin', + selectFile: 'Fayl seçin', + setCropArea: 'Məhsul sahəsini təyin et', + setFocalPoint: 'Fokus nöqtəsi təyin et', + sizes: 'Ölçülər', + sizesFor: '{{label}} üçün ö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.', + fieldHasNo: 'Bu sahədə heç bir {{label}} yoxdur', + 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.', + limitReached: 'Limitə çatdınız, yalnız {{max}} element əlavə edilə bilər.', + 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.', + requiresAtLeast: 'Bu sahə ən azı {{count}} {{label}} tələb edir.', + 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: { + type: 'Növ', + aboutToPublishSelection: 'Seçimdə olan bütün {{label}}-i dərc etməyə hazırsınız. Əminsiniz?', + aboutToRestore: + 'Bu {{label}} sənədini {{versionDate}} tarixindəki vəziyyətinə bərpa etmək üzrəsiniz.', + aboutToRestoreGlobal: + 'Qlobal {{label}}-i {{versionDate}} tarixindəki vəziyyətinə bərpa etmək üzrəsiniz.', + aboutToRevertToPublished: + 'Bu sənədin dəyişikliklərini dərc edilmiş vəziyyətinə qaytarmağa hazırsınız. Əminsiniz?', + aboutToUnpublish: 'Bu sənədi dərcdən çıxartmağa hazırsınız. Əminsiniz?', + aboutToUnpublishSelection: + 'Seçimdə olan bütün {{label}}-i dərcdən çıxartmağa hazırsınız. Əminsiniz?', + autosave: 'Avtomatik yadda saxlama', + autosavedSuccessfully: 'Uğurla avtomatik olaraq yadda saxlandı.', + autosavedVersion: 'Avtomatik yadda saxlanmış versiya', + changed: 'Dəyişdirildi', + compareVersion: 'Versiyanı müqayisə et:', + confirmPublish: 'Dərci təsdiq edin', + confirmRevertToSaved: 'Yadda saxlanana qayıtmağı təsdiq edin', + confirmUnpublish: 'Dərcdən çıxartmağı təsdiq edin', + confirmVersionRestoration: 'Versiyanın bərpasını təsdiq edin', + currentDocumentStatus: 'Cari {{docStatus}} sənədi', + draft: 'Qaralama', + draftSavedSuccessfully: 'Qaralama uğurla yadda saxlandı.', + lastSavedAgo: '{{distance}} əvvəl son yadda saxlanıldı', + noFurtherVersionsFound: 'Başqa versiyalar tapılmadı', + noRowsFound: 'Heç bir {{label}} tapılmadı', + preview: 'Öncədən baxış', + problemRestoringVersion: 'Bu versiyanın bərpasında problem yaşandı', + publish: 'Dərc et', + publishChanges: 'Dəyişiklikləri dərc et', + published: 'Dərc edilmiş', + publishing: 'Nəşr', + restoreThisVersion: 'Bu versiyanı bərpa et', + restoredSuccessfully: 'Uğurla bərpa edildi.', + restoring: 'Bərpa olunur...', + revertToPublished: 'Dərc edilmişə qayıt', + reverting: 'Qayıdılır...', + saveDraft: 'Qaralamayı yadda saxla', + selectLocales: 'Göstərmək üçün lokalları seçin', + selectVersionToCompare: 'Müqayisə üçün bir versiya seçin', + showLocales: 'Lokalları göstər:', + showingVersionsFor: 'Göstərilən versiyalar üçün:', + status: 'Status', + unpublish: 'Dərcdən çıxart', + unpublishing: 'Dərcdən çıxarılır...', + version: 'Versiya', + versionCount_many: '{{count}} versiya tapıldı', + versionCount_none: 'Versiya tapılmadı', + versionCount_one: '{{count}} versiya tapıldı', + versionCount_other: '{{count}} versiya tapıldı', + versionCreatedOn: '{{version}} tarixində yaradıldı:', + versionID: 'Versiyanın ID-si', + versions: 'Versiyalar', + viewingVersion: '{{entityLabel}} {{documentTitle}} üçün versiyanı göstərir', + viewingVersionGlobal: 'Qlobal {{entityLabel}} üçün versiyanı göstərir', + viewingVersions: '{{entityLabel}} {{documentTitle}} üçün versiyaları göstərir', + viewingVersionsGlobal: 'Qlobal {{entityLabel}} üçün versiyaları göstərir', + }, }, } diff --git a/packages/translations/src/languages/bg.ts b/packages/translations/src/languages/bg.ts index e386679e99..ff8674cc5e 100644 --- a/packages/translations/src/languages/bg.ts +++ b/packages/translations/src/languages/bg.ts @@ -1,390 +1,395 @@ -export default { - authentication: { - account: 'Профил', - accountOfCurrentUser: 'Профил на текущия потребител', - alreadyActivated: 'Вече активиран', - alreadyLoggedIn: 'Вече влязъл', - apiKey: 'API ключ', - backToLogin: 'Обратно към влизане', - beginCreateFirstUser: 'За да започнеш, създай първия си потребител', - changePassword: 'Промяна на паролата', - checkYourEmailForPasswordReset: - 'Провери имейла си за връзка, която ще ти позволи да промениш паролата си', - confirmGeneration: 'Потвърди генерация', - confirmPassword: 'Потвърди парола', - createFirstUser: 'Създай първи потребител', - emailNotValid: 'Даденият имейл не е валиден', - emailSent: 'Имейлът е изпратен', - enableAPIKey: 'Активирай API ключ', - failedToUnlock: 'Неуспешно отключване', - forceUnlock: 'Принудително отключване', - forgotPassword: 'Забравена парола', - forgotPasswordEmailInstructions: - 'Моля, въведи имейла си по-долу. Ще получиш съобщение с насоки как да промениш паролата си.', - forgotPasswordQuestion: 'Забравена парола?', - generate: 'Генерирай', - generateNewAPIKey: 'Генерирай нов API ключ', - generatingNewAPIKeyWillInvalidate: - 'Генерирането на нов API ключ ще <1>инвалидира предишния. Сигурен ли си, че искаш да продължиш?', - lockUntil: 'Заключи до', - logBackIn: 'Влез обратно', - logOut: 'Изход', - loggedIn: 'За да влезеш с друг потребител, първо трябва да <0>излезеш.', - loggedInChangePassword: - 'За да промениш паролата си, отиди в своя <0>профил и я промени оттам.', - loggedOutInactivity: 'Ти беше изкаран поради неактивност.', - loggedOutSuccessfully: 'Излезе успешно.', - login: 'Вход', - loginAttempts: 'Опити за вход', - loginUser: 'Вкарай потребител', - loginWithAnotherUser: 'За да влезеш с друг потребител, първо трябва да <0>излезеш.', - logout: 'Изход', - logoutUser: 'Изкарай потребител', - newAPIKeyGenerated: 'Нов API ключ генериран.', - newAccountCreated: - 'Току-що беше създаден нов профил за достъп до {{serverURL}} Моля, въведи връзката в браузъра си, за да потвърдиш имейла си: {{verificationURL}}
След като потвърдиш имейла си, ще можеш да влезеш успешно.', - newPassword: 'Нова парола', - resetPassword: 'Възстанови парола', - resetPasswordExpiration: 'Изтичане на възстановяването на парола', - resetPasswordToken: 'Ключ за възстановяване на парола', - resetYourPassword: 'Възстанови паролата си', - stayLoggedIn: 'Запомни ме', - successfullyUnlocked: 'Успешно отключен', - unableToVerify: 'Неуспешно потвърждение', - verified: 'Потвърден', - verifiedSuccessfully: 'Потвърден успешно', - verify: 'Потвърди', - verifyUser: 'Потвърди потребител', - verifyYourEmail: 'Потвърди имейла си', - youAreInactive: - 'Не си активен от известно време и ще бъдеш изкаран за собствената си сигурност. Би ли пожелал да останеш вписан?', - youAreReceivingResetPassword: - 'Получаваш това, защото ти (или някой друг) е заявил възстановяване на паролата. Натисни връзката или постави това в браузъра си, за да довършиш процеса:', - youDidNotRequestPassword: - 'Ако не си заявил това, игнорирай този имейл и паролата ти ще остане непроменена.', - }, - error: { - accountAlreadyActivated: 'Този профил вече е активиран.', - autosaving: 'Имаше проблем в автоматичното запазване на този документ.', - correctInvalidFields: 'Моля, поправи некоректните полета.', - deletingFile: 'Имаше грешка при изтриването на файла.', - deletingTitle: - 'Имаше проблем при изтриването на {{title}}. Моля провери връзката си и опитай отново.', - emailOrPasswordIncorrect: 'Имейлът или паролата не са правилни.', - followingFieldsInvalid_one: 'Следното поле е некоректно:', - followingFieldsInvalid_other: 'Следните полета са некоректни:', - incorrectCollection: 'Некоректно събиране', - invalidFileType: 'Невалиден тип на файл', - invalidFileTypeValue: 'Невалиден тип на файл: {{value}}', - loadingDocument: 'Имаше проблем при зареждането на документа с идентификатор {{id}}.', - missingEmail: 'Липсващ имейл.', - missingIDOfDocument: 'Липсващ идентификатор на документа за обновяване.', - missingIDOfVersion: 'Липсващ идентификатор на версия.', - missingRequiredData: 'Липсва задължителна информация.', - noFilesUploaded: 'Никакви файлове не бяха качени.', - noMatchedField: 'Поле не беше открито за "{{label}}"', - noUser: 'Липсващ потребител', - notAllowedToAccessPage: 'Нямаш право на достъп до тази страница.', - notAllowedToPerformAction: 'Нямаш право да извършиш това действие.', - notFound: 'Заявеният ресурс не беше намерен.', - previewing: 'Имаше проблем при предварителното разглеждане на документа.', - problemUploadingFile: 'Имаше проблем при качването на файла.', - tokenInvalidOrExpired: 'Ключът е невалиден или изтекъл.', - unPublishingDocument: 'Имаше проблем при скриването на този документ.', - unableToDeleteCount: 'Не беше възможно да се изтрият {{count}} от {{total}} {{label}}.', - unableToUpdateCount: 'Не беше възможно да се обновят {{count}} от {{total}} {{label}}.', - unauthorized: 'Неавторизиран, трябва да влезеш, за да извършиш тази заявка.', - unknown: 'Неизвестна грешка.', - unspecific: 'Грешка.', - userLocked: 'Този потребител има прекалено много невалидни опити за влизане и е заключен.', - valueMustBeUnique: 'Стойността трябва да е уникална', - verificationTokenInvalid: 'Ключът за верификация е невалиден.', - }, - fields: { - addLabel: 'Добави {{label}}', - addLink: 'Добави нова връзка', - addNew: 'Добави нов', - addNewLabel: 'Добави нов {{label}}', - addRelationship: 'Добави отношение', - addUpload: 'Качи', - block: 'блок', - blockType: 'Тип блок', - blocks: 'блокове', - chooseBetweenCustomTextOrDocument: - 'Избери между това да въведеш текстова връзка или да свържеш с друг документ.', - chooseDocumentToLink: 'Избери документ, с който да свържеш', - chooseFromExisting: 'Избери от съществуващите', - chooseLabel: 'Избери {{label}}', - collapseAll: 'Свий всички', - customURL: 'Връзка', - editLabelData: 'Редактирай информацията за {{label}}', - editLink: 'Редактирай връзка', - editRelationship: 'Редактирай отношение', - enterURL: 'Въведи връзка', - internalLink: 'Вътрешна връзка', - itemsAndMore: '{{items}} и {{count}} повече', - labelRelationship: '{{label}} връзка', - latitude: 'Географска ширина', - linkType: 'Тип на връзката', - linkedTo: 'Свързано с <0>{{label}}', - longitude: 'Географска дължина', - newLabel: 'Нов {{label}}', - openInNewTab: 'Отвори в нов раздел', - passwordsDoNotMatch: 'Паролите не са еднакви.', - relatedDocument: 'Свързан документ', - relationTo: 'Отношение с', - removeRelationship: 'Премахни отношение', - removeUpload: 'Премахни качване', - saveChanges: 'Запази промените', - searchForBlock: 'Търси блок', - selectExistingLabel: 'Избери съществуващ {{label}}', - selectFieldsToEdit: 'Избери полета за редактиране', - showAll: 'Покажи всички', - swapRelationship: 'Смени отношение', - swapUpload: 'Смени качване', - textToDisplay: 'Текст към дисплей', - toggleBlock: 'Превключи блок', - uploadNewLabel: 'Качи нов {{label}}', - }, - general: { - aboutToDelete: 'На път си да изтриеш {{label}} <1>{{title}}. Сигурен ли си?', - aboutToDeleteCount_many: 'На път си да изтриеш {{count}} {{label}}', - aboutToDeleteCount_one: 'На път си да изтриеш {{count}} {{label}}', - aboutToDeleteCount_other: 'На път си да изтриеш {{count}} {{label}}', - addBelow: 'Добави отдолу', - addFilter: 'Добави филтър', - adminTheme: 'Цветова тема', - and: 'И', - applyChanges: 'Приложи промените', - ascending: 'Възходящ', - automatic: 'Автоматична', - backToDashboard: 'Обратно към таблото', - cancel: 'Отмени', - changesNotSaved: 'Промените ти не са запазени. Ако напуснеш сега, ще ги загубиш.', - close: 'Затвори', - collapse: 'Свий', - collections: 'Колекции', - columnToSort: 'Колона за сортиране', - columns: 'Колони', - confirm: 'Потвърди', - confirmDeletion: 'Потвърди изтриване', - confirmDuplication: 'Потвърди дупликация', - copied: 'Копирано', - copy: 'Копирай', - create: 'Създай', - createNew: 'Създай нов', - createNewLabel: 'Създай нов {{label}}', - created: 'Създаден', - createdAt: 'Създаден на', - creating: 'Създава се', - creatingNewLabel: 'Създаване на нов {{label}}', - dark: 'Тъмна', - dashboard: 'Табло', - delete: 'Изтрий', - deletedCountSuccessfully: 'Изтрити {{count}} {{label}} успешно.', - deletedSuccessfully: 'Изтрито успешно.', - deleting: 'Изтриване...', - descending: 'Низходящо', - deselectAllRows: 'Деселектирай всички редове', - duplicate: 'Дупликирай', - duplicateWithoutSaving: 'Дупликирай без да запазваш промените', - edit: 'Редактирай', - editLabel: 'Редактирай {{label}}', - editing: 'Редактиране', - editingLabel_many: 'Редактиране на {{count}} {{label}}', - editingLabel_one: 'Редактиране на {{count}} {{label}}', - editingLabel_other: 'Редактиране на {{count}} {{label}}', - email: 'Имейл', - emailAddress: 'Имейл адрес', - enterAValue: 'Въведи стойност', - error: 'Грешка', - errors: 'Грешки', - fallbackToDefaultLocale: 'Използвай локализация по подразбиране', - filter: 'Филтрирай', - filterWhere: 'Филтрирай {{label}} където', - filters: 'Филтри', - globals: 'Глобални', - language: 'Език', - lastModified: 'Последно променено', - leaveAnyway: 'Напусни въпреки това', - leaveWithoutSaving: 'Напусни без да запазиш', - light: 'Светла', - livePreview: 'Предварителен преглед', - loading: 'Зарежда се', - locale: 'Локализация', - locales: 'Локализации', - menu: 'Меню', - moveDown: 'Надолу', - moveUp: 'Нагоре', - newPassword: 'Нова парола', - noFiltersSet: 'Няма зададени филтри', - noLabel: '<Няма {{label}}>', - noOptions: 'Няма опции', - noResults: - '{{label}} не е открит. {{label}} не съществува или никой не отговаря на зададените филтри.', - noValue: 'Няма стойност', - none: 'Никакъв', - notFound: 'Няма открит', - nothingFound: 'Нищо не беше открито', - of: 'от', - open: 'Отвори', - or: 'Или', - order: 'Ред', - pageNotFound: 'Страницата не беше открита', - password: 'Парола', - payloadSettings: 'Настройки на Payload', - perPage: 'На страница: {{limit}}', - remove: 'Премахни', - reset: 'Нулиране', - row: 'ред', - rows: 'Редове', - save: 'Запази', - saving: 'Запазване...', - searchBy: 'Търси по {{label}}', - selectAll: 'Избери всички {{count}} {{label}}', - selectAllRows: 'Избери всички редове', - selectValue: 'Избери стойност', - selectedCount: '{{count}} {{label}} избрани', - showAllLabel: 'Покажи всички {{label}}', - sorryNotFound: 'Съжаляваме-няма нищо, което да отговаря на търсенето ти.', - sort: 'Сортирай', - sortByLabelDirection: 'Сортирай по {{label}} {{direction}}', - stayOnThisPage: 'Остани на тази страница', - submissionSuccessful: 'Успешно подаване.', - submit: 'Подай', - successfullyCreated: '{{label}} успешно създаден.', - successfullyDuplicated: '{{label}} успешно дупликиран.', - thisLanguage: 'Български', - titleDeleted: '{{label}} "{{title}}" успешно изтрит.', - unauthorized: 'Неавторизиран', - unsavedChangesDuplicate: 'Имаш незапазени промени. Искаш ли да продължиш да дупликираш?', - untitled: 'Неозаглавен', - updatedAt: 'Обновен на', - updatedCountSuccessfully: 'Обновени {{count}} {{label}} успешно.', - updatedSuccessfully: 'Обновен успешно.', - updating: 'Обновява се', - uploading: 'Качва се', - user: 'Потребител', - users: 'Потребители', - value: 'Стойност', - welcome: 'Добре дошъл', - }, - operators: { - contains: 'съдържа', - equals: 'е равно на', - exists: 'съществува', - isGreaterThan: 'е по-голямо от', - isGreaterThanOrEqualTo: 'е по-голямо от или равно на', - isIn: 'е в', - isLessThan: 'е по-малко от', - isLessThanOrEqualTo: 'е по-малко от или равно на', - isLike: 'е като', - isNotEqualTo: 'не е равно на', - isNotIn: 'не е в', - near: 'близко', - }, - upload: { - crop: 'Изрязване', - cropToolDescription: - 'Плъзни ъглите на избраната област, избери нова област или коригирай стойностите по-долу.', - dragAndDrop: 'Дръпни и пусни файл', - dragAndDropHere: 'или дръпни и пусни файла тук', - editImage: 'Редактирай изображение', - fileName: 'Име на файла', - fileSize: 'Големина на файла', - focalPoint: 'Фокусна точка', - focalPointDescription: - 'Премести фокусната точка директно върху визуализацията или регулирай стойностите по-долу.', - height: 'Височина', - lessInfo: 'По-малко информация', - moreInfo: 'Повече информация', - previewSizes: 'Преглед на размери', - selectCollectionToBrowse: 'Избери колекция, която да разгледаш', - selectFile: 'Избери файл', - setCropArea: 'Задай област за изрязване', - setFocalPoint: 'Задай фокусна точка', - sizes: 'Големини', - sizesFor: 'Размери за {{label}}', - width: 'Ширина', - }, - validation: { - emailAddress: 'Моля, въведи валиден имейл адрес.', - enterNumber: 'Моля, въведи валиден номер.', - fieldHasNo: 'Това поле няма {{label}}', - greaterThanMax: '{{value}} е по-голямо от максимално допустимото {{label}} от {{max}}.', - invalidInput: 'Това поле има невалиден вход.', - invalidSelection: 'Това поле има невалидна селекция.', - invalidSelections: 'Това поле има следните невалидни селекции:', - lessThanMin: '{{value}} е по-малко от минимално допустимото {{label}} от {{min}}.', - limitReached: 'Достигнат е лимитът, могат да бъдат добавени само {{max}} елемента.', - longerThanMin: - 'Тази стойност трябва да е по-голяма от минималната стойност от {{minLength}} символа.', - notValidDate: '"{{value}}" не е валидна дата.', - required: 'Това поле е задължително.', - requiresAtLeast: 'Това поле изисква поне {{count}} {{label}}.', - requiresNoMoreThan: 'Това поле изисква не повече от {{count}} {{label}}.', - requiresTwoNumbers: 'Това поле изисква 2 числа.', - shorterThanMax: - 'Тази стойност трябва да е по-малка от максималната стойност от {{maxLength}} символа.', - trueOrFalse: 'Това поле може да бъде само "true" или "false".', - validUploadID: 'Това поле не е валиден идентификатор на качването.', - }, - version: { - aboutToPublishSelection: 'На път си да публикуваш всички избрани {{label}}. Сигурен ли си?', - aboutToRestore: - 'На път си да възстановиш този {{label}} документ до състоянието му от {{versionDate}}.', - aboutToRestoreGlobal: - 'На път си да възстановиш глобалния докумнт {{label}} до състоянието му от {{versionDate}}.', - aboutToRevertToPublished: - 'На път си да възстановиш промените на този документ до публикуваното му състояние. Сигурен ли си?', - aboutToUnpublish: 'На път си да скриеш този документ. Сигурен ли си?', - aboutToUnpublishSelection: 'На път си да скриеш всички избрани {{label}}. Сигурен ли си?', - autosave: 'Автоматично запазване', - autosavedSuccessfully: 'Успешно автоматично запазване.', - autosavedVersion: 'Автоматично запазена версия', - changed: 'Променен', - compareVersion: 'Сравни версия с:', - confirmPublish: 'Потвърди публикуване', - confirmRevertToSaved: 'Потвърди възстановяване до запазен', - confirmUnpublish: 'Потвърди скриване', - confirmVersionRestoration: 'Потвърди възстановяване на версия', - currentDocumentStatus: 'Сегашен статус на документа: {{docStatus}}', - draft: 'Чернова', - draftSavedSuccessfully: 'Чернова запазена успешно.', - lastSavedAgo: 'последно запазено преди {{distance}}', - noFurtherVersionsFound: 'Не са открити повече версии', - noRowsFound: 'Не е открит {{label}}', - preview: 'Предварителен преглед', - problemRestoringVersion: 'Имаше проблем при възстановяването на тази версия', - publish: 'Публикувай', - publishChanges: 'Публикувай промените', - published: 'Публикувано', - publishing: 'Публикуване', - restoreThisVersion: 'Възстанови тази версия', - restoredSuccessfully: 'Успешно възстановяване.', - restoring: 'Възстановяване...', - revertToPublished: 'Върни се до публикуваното', - reverting: 'Връщане..', - saveDraft: 'Запази чернова', - selectLocales: 'Избери локализации за показване', - selectVersionToCompare: 'Избери версия за сравняване', - showLocales: 'Покажи преводи:', - showingVersionsFor: 'Показване на версии за:', - status: 'Статус', - type: 'Тип', - unpublish: 'Скрий', - unpublishing: 'Скриване...', - version: 'Версия', - versionCount_many: '{{count}} открити версии', - versionCount_none: 'Няма открити версии', - versionCount_one: '{{count}} окрита версия', - versionCount_other: '{{count}} открити версии', - versionCreatedOn: '{{version}} създадена на:', - versionID: 'Идентификатор на версията', - versions: 'Версии', - viewingVersion: 'Гледане на версия за {{entityLabel}} {{documentTitle}}', - viewingVersionGlobal: 'Гледане на версия за глобалния документ {{entityLabel}}', - viewingVersions: 'Гледане на версии за {{entityLabel}} {{documentTitle}}', - viewingVersionsGlobal: 'Гледане на версии за глобалния документ {{entityLabel}}', +import type { Language } from '../types.js' + +export const bg: Language = { + dateFNSKey: 'bg', + translations: { + authentication: { + account: 'Профил', + accountOfCurrentUser: 'Профил на текущия потребител', + alreadyActivated: 'Вече активиран', + alreadyLoggedIn: 'Вече влязъл', + apiKey: 'API ключ', + backToLogin: 'Обратно към влизане', + beginCreateFirstUser: 'За да започнеш, създай първия си потребител', + changePassword: 'Промяна на паролата', + checkYourEmailForPasswordReset: + 'Провери имейла си за връзка, която ще ти позволи да промениш паролата си', + confirmGeneration: 'Потвърди генерация', + confirmPassword: 'Потвърди парола', + createFirstUser: 'Създай първи потребител', + emailNotValid: 'Даденият имейл не е валиден', + emailSent: 'Имейлът е изпратен', + enableAPIKey: 'Активирай API ключ', + failedToUnlock: 'Неуспешно отключване', + forceUnlock: 'Принудително отключване', + forgotPassword: 'Забравена парола', + forgotPasswordEmailInstructions: + 'Моля, въведи имейла си по-долу. Ще получиш съобщение с насоки как да промениш паролата си.', + forgotPasswordQuestion: 'Забравена парола?', + generate: 'Генерирай', + generateNewAPIKey: 'Генерирай нов API ключ', + generatingNewAPIKeyWillInvalidate: + 'Генерирането на нов API ключ ще <1>инвалидира предишния. Сигурен ли си, че искаш да продължиш?', + lockUntil: 'Заключи до', + logBackIn: 'Влез обратно', + logOut: 'Изход', + loggedIn: 'За да влезеш с друг потребител, първо трябва да <0>излезеш.', + loggedInChangePassword: + 'За да промениш паролата си, отиди в своя <0>профил и я промени оттам.', + loggedOutInactivity: 'Ти беше изкаран поради неактивност.', + loggedOutSuccessfully: 'Излезе успешно.', + login: 'Вход', + loginAttempts: 'Опити за вход', + loginUser: 'Вкарай потребител', + loginWithAnotherUser: 'За да влезеш с друг потребител, първо трябва да <0>излезеш.', + logout: 'Изход', + logoutUser: 'Изкарай потребител', + newAPIKeyGenerated: 'Нов API ключ генериран.', + newAccountCreated: + 'Току-що беше създаден нов профил за достъп до {{serverURL}} Моля, въведи връзката в браузъра си, за да потвърдиш имейла си: {{verificationURL}}
След като потвърдиш имейла си, ще можеш да влезеш успешно.', + newPassword: 'Нова парола', + resetPassword: 'Възстанови парола', + resetPasswordExpiration: 'Изтичане на възстановяването на парола', + resetPasswordToken: 'Ключ за възстановяване на парола', + resetYourPassword: 'Възстанови паролата си', + stayLoggedIn: 'Запомни ме', + successfullyUnlocked: 'Успешно отключен', + unableToVerify: 'Неуспешно потвърждение', + verified: 'Потвърден', + verifiedSuccessfully: 'Потвърден успешно', + verify: 'Потвърди', + verifyUser: 'Потвърди потребител', + verifyYourEmail: 'Потвърди имейла си', + youAreInactive: + 'Не си активен от известно време и ще бъдеш изкаран за собствената си сигурност. Би ли пожелал да останеш вписан?', + youAreReceivingResetPassword: + 'Получаваш това, защото ти (или някой друг) е заявил възстановяване на паролата. Натисни връзката или постави това в браузъра си, за да довършиш процеса:', + youDidNotRequestPassword: + 'Ако не си заявил това, игнорирай този имейл и паролата ти ще остане непроменена.', + }, + error: { + accountAlreadyActivated: 'Този профил вече е активиран.', + autosaving: 'Имаше проблем в автоматичното запазване на този документ.', + correctInvalidFields: 'Моля, поправи некоректните полета.', + deletingFile: 'Имаше грешка при изтриването на файла.', + deletingTitle: + 'Имаше проблем при изтриването на {{title}}. Моля провери връзката си и опитай отново.', + emailOrPasswordIncorrect: 'Имейлът или паролата не са правилни.', + followingFieldsInvalid_one: 'Следното поле е некоректно:', + followingFieldsInvalid_other: 'Следните полета са некоректни:', + incorrectCollection: 'Некоректно събиране', + invalidFileType: 'Невалиден тип на файл', + invalidFileTypeValue: 'Невалиден тип на файл: {{value}}', + loadingDocument: 'Имаше проблем при зареждането на документа с идентификатор {{id}}.', + missingEmail: 'Липсващ имейл.', + missingIDOfDocument: 'Липсващ идентификатор на документа за обновяване.', + missingIDOfVersion: 'Липсващ идентификатор на версия.', + missingRequiredData: 'Липсва задължителна информация.', + noFilesUploaded: 'Никакви файлове не бяха качени.', + noMatchedField: 'Поле не беше открито за "{{label}}"', + noUser: 'Липсващ потребител', + notAllowedToAccessPage: 'Нямаш право на достъп до тази страница.', + notAllowedToPerformAction: 'Нямаш право да извършиш това действие.', + notFound: 'Заявеният ресурс не беше намерен.', + previewing: 'Имаше проблем при предварителното разглеждане на документа.', + problemUploadingFile: 'Имаше проблем при качването на файла.', + tokenInvalidOrExpired: 'Ключът е невалиден или изтекъл.', + unPublishingDocument: 'Имаше проблем при скриването на този документ.', + unableToDeleteCount: 'Не беше възможно да се изтрият {{count}} от {{total}} {{label}}.', + unableToUpdateCount: 'Не беше възможно да се обновят {{count}} от {{total}} {{label}}.', + unauthorized: 'Неавторизиран, трябва да влезеш, за да извършиш тази заявка.', + unknown: 'Неизвестна грешка.', + unspecific: 'Грешка.', + userLocked: 'Този потребител има прекалено много невалидни опити за влизане и е заключен.', + valueMustBeUnique: 'Стойността трябва да е уникална', + verificationTokenInvalid: 'Ключът за верификация е невалиден.', + }, + fields: { + addLabel: 'Добави {{label}}', + addLink: 'Добави нова връзка', + addNew: 'Добави нов', + addNewLabel: 'Добави нов {{label}}', + addRelationship: 'Добави отношение', + addUpload: 'Качи', + block: 'блок', + blockType: 'Тип блок', + blocks: 'блокове', + chooseBetweenCustomTextOrDocument: + 'Избери между това да въведеш текстова връзка или да свържеш с друг документ.', + chooseDocumentToLink: 'Избери документ, с който да свържеш', + chooseFromExisting: 'Избери от съществуващите', + chooseLabel: 'Избери {{label}}', + collapseAll: 'Свий всички', + customURL: 'Връзка', + editLabelData: 'Редактирай информацията за {{label}}', + editLink: 'Редактирай връзка', + editRelationship: 'Редактирай отношение', + enterURL: 'Въведи връзка', + internalLink: 'Вътрешна връзка', + itemsAndMore: '{{items}} и {{count}} повече', + labelRelationship: '{{label}} връзка', + latitude: 'Географска ширина', + linkType: 'Тип на връзката', + linkedTo: 'Свързано с <0>{{label}}', + longitude: 'Географска дължина', + newLabel: 'Нов {{label}}', + openInNewTab: 'Отвори в нов раздел', + passwordsDoNotMatch: 'Паролите не са еднакви.', + relatedDocument: 'Свързан документ', + relationTo: 'Отношение с', + removeRelationship: 'Премахни отношение', + removeUpload: 'Премахни качване', + saveChanges: 'Запази промените', + searchForBlock: 'Търси блок', + selectExistingLabel: 'Избери съществуващ {{label}}', + selectFieldsToEdit: 'Избери полета за редактиране', + showAll: 'Покажи всички', + swapRelationship: 'Смени отношение', + swapUpload: 'Смени качване', + textToDisplay: 'Текст към дисплей', + toggleBlock: 'Превключи блок', + uploadNewLabel: 'Качи нов {{label}}', + }, + general: { + aboutToDelete: 'На път си да изтриеш {{label}} <1>{{title}}. Сигурен ли си?', + aboutToDeleteCount_many: 'На път си да изтриеш {{count}} {{label}}', + aboutToDeleteCount_one: 'На път си да изтриеш {{count}} {{label}}', + aboutToDeleteCount_other: 'На път си да изтриеш {{count}} {{label}}', + addBelow: 'Добави отдолу', + addFilter: 'Добави филтър', + adminTheme: 'Цветова тема', + and: 'И', + applyChanges: 'Приложи промените', + ascending: 'Възходящ', + automatic: 'Автоматична', + backToDashboard: 'Обратно към таблото', + cancel: 'Отмени', + changesNotSaved: 'Промените ти не са запазени. Ако напуснеш сега, ще ги загубиш.', + close: 'Затвори', + collapse: 'Свий', + collections: 'Колекции', + columnToSort: 'Колона за сортиране', + columns: 'Колони', + confirm: 'Потвърди', + confirmDeletion: 'Потвърди изтриване', + confirmDuplication: 'Потвърди дупликация', + copied: 'Копирано', + copy: 'Копирай', + create: 'Създай', + createNew: 'Създай нов', + createNewLabel: 'Създай нов {{label}}', + created: 'Създаден', + createdAt: 'Създаден на', + creating: 'Създава се', + creatingNewLabel: 'Създаване на нов {{label}}', + dark: 'Тъмна', + dashboard: 'Табло', + delete: 'Изтрий', + deletedCountSuccessfully: 'Изтрити {{count}} {{label}} успешно.', + deletedSuccessfully: 'Изтрито успешно.', + deleting: 'Изтриване...', + descending: 'Низходящо', + deselectAllRows: 'Деселектирай всички редове', + duplicate: 'Дупликирай', + duplicateWithoutSaving: 'Дупликирай без да запазваш промените', + edit: 'Редактирай', + editLabel: 'Редактирай {{label}}', + editing: 'Редактиране', + editingLabel_many: 'Редактиране на {{count}} {{label}}', + editingLabel_one: 'Редактиране на {{count}} {{label}}', + editingLabel_other: 'Редактиране на {{count}} {{label}}', + email: 'Имейл', + emailAddress: 'Имейл адрес', + enterAValue: 'Въведи стойност', + error: 'Грешка', + errors: 'Грешки', + fallbackToDefaultLocale: 'Използвай локализация по подразбиране', + filter: 'Филтрирай', + filterWhere: 'Филтрирай {{label}} където', + filters: 'Филтри', + globals: 'Глобални', + language: 'Език', + lastModified: 'Последно променено', + leaveAnyway: 'Напусни въпреки това', + leaveWithoutSaving: 'Напусни без да запазиш', + light: 'Светла', + livePreview: 'Предварителен преглед', + loading: 'Зарежда се', + locale: 'Локализация', + locales: 'Локализации', + menu: 'Меню', + moveDown: 'Надолу', + moveUp: 'Нагоре', + newPassword: 'Нова парола', + noFiltersSet: 'Няма зададени филтри', + noLabel: '<Няма {{label}}>', + noOptions: 'Няма опции', + noResults: + '{{label}} не е открит. {{label}} не съществува или никой не отговаря на зададените филтри.', + noValue: 'Няма стойност', + none: 'Никакъв', + notFound: 'Няма открит', + nothingFound: 'Нищо не беше открито', + of: 'от', + open: 'Отвори', + or: 'Или', + order: 'Ред', + pageNotFound: 'Страницата не беше открита', + password: 'Парола', + payloadSettings: 'Настройки на Payload', + perPage: 'На страница: {{limit}}', + remove: 'Премахни', + reset: 'Нулиране', + row: 'ред', + rows: 'Редове', + save: 'Запази', + saving: 'Запазване...', + searchBy: 'Търси по {{label}}', + selectAll: 'Избери всички {{count}} {{label}}', + selectAllRows: 'Избери всички редове', + selectValue: 'Избери стойност', + selectedCount: '{{count}} {{label}} избрани', + showAllLabel: 'Покажи всички {{label}}', + sorryNotFound: 'Съжаляваме-няма нищо, което да отговаря на търсенето ти.', + sort: 'Сортирай', + sortByLabelDirection: 'Сортирай по {{label}} {{direction}}', + stayOnThisPage: 'Остани на тази страница', + submissionSuccessful: 'Успешно подаване.', + submit: 'Подай', + successfullyCreated: '{{label}} успешно създаден.', + successfullyDuplicated: '{{label}} успешно дупликиран.', + thisLanguage: 'Български', + titleDeleted: '{{label}} "{{title}}" успешно изтрит.', + unauthorized: 'Неавторизиран', + unsavedChangesDuplicate: 'Имаш незапазени промени. Искаш ли да продължиш да дупликираш?', + untitled: 'Неозаглавен', + updatedAt: 'Обновен на', + updatedCountSuccessfully: 'Обновени {{count}} {{label}} успешно.', + updatedSuccessfully: 'Обновен успешно.', + updating: 'Обновява се', + uploading: 'Качва се', + user: 'Потребител', + users: 'Потребители', + value: 'Стойност', + welcome: 'Добре дошъл', + }, + operators: { + contains: 'съдържа', + equals: 'е равно на', + exists: 'съществува', + isGreaterThan: 'е по-голямо от', + isGreaterThanOrEqualTo: 'е по-голямо от или равно на', + isIn: 'е в', + isLessThan: 'е по-малко от', + isLessThanOrEqualTo: 'е по-малко от или равно на', + isLike: 'е като', + isNotEqualTo: 'не е равно на', + isNotIn: 'не е в', + near: 'близко', + }, + upload: { + crop: 'Изрязване', + cropToolDescription: + 'Плъзни ъглите на избраната област, избери нова област или коригирай стойностите по-долу.', + dragAndDrop: 'Дръпни и пусни файл', + dragAndDropHere: 'или дръпни и пусни файла тук', + editImage: 'Редактирай изображение', + fileName: 'Име на файла', + fileSize: 'Големина на файла', + focalPoint: 'Фокусна точка', + focalPointDescription: + 'Премести фокусната точка директно върху визуализацията или регулирай стойностите по-долу.', + height: 'Височина', + lessInfo: 'По-малко информация', + moreInfo: 'Повече информация', + previewSizes: 'Преглед на размери', + selectCollectionToBrowse: 'Избери колекция, която да разгледаш', + selectFile: 'Избери файл', + setCropArea: 'Задай област за изрязване', + setFocalPoint: 'Задай фокусна точка', + sizes: 'Големини', + sizesFor: 'Размери за {{label}}', + width: 'Ширина', + }, + validation: { + emailAddress: 'Моля, въведи валиден имейл адрес.', + enterNumber: 'Моля, въведи валиден номер.', + fieldHasNo: 'Това поле няма {{label}}', + greaterThanMax: '{{value}} е по-голямо от максимално допустимото {{label}} от {{max}}.', + invalidInput: 'Това поле има невалиден вход.', + invalidSelection: 'Това поле има невалидна селекция.', + invalidSelections: 'Това поле има следните невалидни селекции:', + lessThanMin: '{{value}} е по-малко от минимално допустимото {{label}} от {{min}}.', + limitReached: 'Достигнат е лимитът, могат да бъдат добавени само {{max}} елемента.', + longerThanMin: + 'Тази стойност трябва да е по-голяма от минималната стойност от {{minLength}} символа.', + notValidDate: '"{{value}}" не е валидна дата.', + required: 'Това поле е задължително.', + requiresAtLeast: 'Това поле изисква поне {{count}} {{label}}.', + requiresNoMoreThan: 'Това поле изисква не повече от {{count}} {{label}}.', + requiresTwoNumbers: 'Това поле изисква 2 числа.', + shorterThanMax: + 'Тази стойност трябва да е по-малка от максималната стойност от {{maxLength}} символа.', + trueOrFalse: 'Това поле може да бъде само "true" или "false".', + validUploadID: 'Това поле не е валиден идентификатор на качването.', + }, + version: { + type: 'Тип', + aboutToPublishSelection: 'На път си да публикуваш всички избрани {{label}}. Сигурен ли си?', + aboutToRestore: + 'На път си да възстановиш този {{label}} документ до състоянието му от {{versionDate}}.', + aboutToRestoreGlobal: + 'На път си да възстановиш глобалния докумнт {{label}} до състоянието му от {{versionDate}}.', + aboutToRevertToPublished: + 'На път си да възстановиш промените на този документ до публикуваното му състояние. Сигурен ли си?', + aboutToUnpublish: 'На път си да скриеш този документ. Сигурен ли си?', + aboutToUnpublishSelection: 'На път си да скриеш всички избрани {{label}}. Сигурен ли си?', + autosave: 'Автоматично запазване', + autosavedSuccessfully: 'Успешно автоматично запазване.', + autosavedVersion: 'Автоматично запазена версия', + changed: 'Променен', + compareVersion: 'Сравни версия с:', + confirmPublish: 'Потвърди публикуване', + confirmRevertToSaved: 'Потвърди възстановяване до запазен', + confirmUnpublish: 'Потвърди скриване', + confirmVersionRestoration: 'Потвърди възстановяване на версия', + currentDocumentStatus: 'Сегашен статус на документа: {{docStatus}}', + draft: 'Чернова', + draftSavedSuccessfully: 'Чернова запазена успешно.', + lastSavedAgo: 'последно запазено преди {{distance}}', + noFurtherVersionsFound: 'Не са открити повече версии', + noRowsFound: 'Не е открит {{label}}', + preview: 'Предварителен преглед', + problemRestoringVersion: 'Имаше проблем при възстановяването на тази версия', + publish: 'Публикувай', + publishChanges: 'Публикувай промените', + published: 'Публикувано', + publishing: 'Публикуване', + restoreThisVersion: 'Възстанови тази версия', + restoredSuccessfully: 'Успешно възстановяване.', + restoring: 'Възстановяване...', + revertToPublished: 'Върни се до публикуваното', + reverting: 'Връщане..', + saveDraft: 'Запази чернова', + selectLocales: 'Избери локализации за показване', + selectVersionToCompare: 'Избери версия за сравняване', + showLocales: 'Покажи преводи:', + showingVersionsFor: 'Показване на версии за:', + status: 'Статус', + unpublish: 'Скрий', + unpublishing: 'Скриване...', + version: 'Версия', + versionCount_many: '{{count}} открити версии', + versionCount_none: 'Няма открити версии', + versionCount_one: '{{count}} окрита версия', + versionCount_other: '{{count}} открити версии', + versionCreatedOn: '{{version}} създадена на:', + versionID: 'Идентификатор на версията', + versions: 'Версии', + viewingVersion: 'Гледане на версия за {{entityLabel}} {{documentTitle}}', + viewingVersionGlobal: 'Гледане на версия за глобалния документ {{entityLabel}}', + viewingVersions: 'Гледане на версии за {{entityLabel}} {{documentTitle}}', + viewingVersionsGlobal: 'Гледане на версии за глобалния документ {{entityLabel}}', + }, }, } diff --git a/packages/translations/src/languages/cs.ts b/packages/translations/src/languages/cs.ts index 81454aa2fc..a11c8e78df 100644 --- a/packages/translations/src/languages/cs.ts +++ b/packages/translations/src/languages/cs.ts @@ -1,388 +1,394 @@ -export default { - authentication: { - account: 'Účet', - accountOfCurrentUser: 'Účet současného uživatele', - alreadyActivated: 'Již aktivováno', - alreadyLoggedIn: 'Již přihlášen', - apiKey: 'Klíč API', - backToLogin: 'Zpět na přihlášení', - beginCreateFirstUser: 'Začněte vytvořením svého prvního uživatele.', - changePassword: 'Změnit heslo', - checkYourEmailForPasswordReset: - 'Zkontrolujte svůj email a najděte v něm odkaz, který vám umožní bezpečně resetovat vaše heslo.', - confirmGeneration: 'Potvrdit generaci', - confirmPassword: 'Potvrdit heslo', - createFirstUser: 'Vytvořit prvního uživatele', - emailNotValid: 'Zadaný email není platný', - emailSent: 'Email odeslán', - enableAPIKey: 'Povolit klíč API', - failedToUnlock: 'Nepodařilo se odemknout', - forceUnlock: 'Vynutit odemčení', - forgotPassword: 'Zapomněli jste heslo?', - forgotPasswordEmailInstructions: - 'Zadejte svůj email níže. Obdržíte email s instrukcemi, jak resetovat vaše heslo.', - forgotPasswordQuestion: 'Zapomněli jste heslo?', - generate: 'Generovat', - generateNewAPIKey: 'Generovat nový klíč API', - generatingNewAPIKeyWillInvalidate: - 'Vytvoření nového klíče API <1>zneplatní předchozí klíč. Opravdu chcete pokračovat?', - lockUntil: 'Uzamknout do', - logBackIn: 'Znovu se přihlásit', - logOut: 'Odhlásit se', - loggedIn: 'Abyste se mohli přihlásit s jiným uživatelem, nejdříve se <0>odhlaste.', - loggedInChangePassword: 'Pro změnu hesla přejděte do svého <0>účtu a zde si heslo upravte.', - loggedOutInactivity: 'Byli jste odhlášeni z důvodu neaktivity.', - loggedOutSuccessfully: 'Byli jste úspěšně odhlášeni.', - login: 'Přihlásit se', - loginAttempts: 'Pokusy o přihlášení', - loginUser: 'Přihlásit uživatele', - loginWithAnotherUser: - 'Abyste se mohli přihlásit s jiným uživatelem, nejdříve se <0>odhlaste.', - logout: 'Odhlásit se', - logoutUser: 'Odhlásit uživatele', - newAPIKeyGenerated: 'Byl vygenerován nový klíč API.', - newAccountCreated: - 'Pro přístup k {{serverURL}} 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: {{verificationURL}}
Po ověření vašeho emailu se budete moci úspěšně přihlásit.', - newPassword: 'Nové heslo', - resetPassword: 'Resetovat heslo', - resetPasswordExpiration: 'Expirace resetování hesla', - resetPasswordToken: 'Token pro resetování hesla', - resetYourPassword: 'Resetujte své heslo', - stayLoggedIn: 'Zůstat přihlášen', - successfullyUnlocked: 'Úspěšně odemčeno', - unableToVerify: 'Nepodařilo se ověřit', - verified: 'Ověřeno', - verifiedSuccessfully: 'Úspěšně ověřeno', - verify: 'Ověřit', - verifyUser: 'Ověřit uživatele', - verifyYourEmail: 'Ověřte svůj email', - youAreInactive: - 'Nějakou dobu jste nebyli aktivní a brzy budete automaticky odhlášeni z bezpečnostních důvodů. Chcete zůstat přihlášen?', - 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: { - accountAlreadyActivated: 'Tento účet již byl aktivován.', - autosaving: 'Při automatickém ukládání tohoto dokumentu došlo k chybě.', - correctInvalidFields: 'Opravte neplatná pole.', - deletingFile: 'Při mazání souboru došlo k chybě.', - deletingTitle: - 'Při mazání {{title}} došlo k chybě. Zkontrolujte své připojení a zkuste to znovu.', - emailOrPasswordIncorrect: 'Zadaný email nebo heslo není správné.', - followingFieldsInvalid_one: 'Následující pole je neplatné:', - followingFieldsInvalid_other: 'Následující pole jsou neplatná:', - incorrectCollection: 'Nesprávná kolekce', - invalidFileType: 'Neplatný typ souboru', - invalidFileTypeValue: 'Neplatný typ souboru: {{value}}', - loadingDocument: 'Při načítání dokumentu s ID {{id}} došlo k chybě.', - missingEmail: 'Chybějící email.', - missingIDOfDocument: 'Chybějící ID dokumentu pro aktualizaci.', - missingIDOfVersion: 'Chybějící ID verze.', - missingRequiredData: 'Chybějící povinná data.', - noFilesUploaded: 'Nebyly nahrány žádné soubory.', - noMatchedField: 'Pro "{{label}}" nebylo nalezeno žádné odpovídající pole', - noUser: 'Žádný uživatel', - notAllowedToAccessPage: 'Nemáte povolení přistupovat k této stránce.', - notAllowedToPerformAction: 'Nemáte povolení provádět tuto akci.', - notFound: 'Požadovaný zdroj nebyl nalezen.', - previewing: 'Při náhledu tohoto dokumentu došlo k chybě.', - problemUploadingFile: 'Při nahrávání souboru došlo k chybě.', - tokenInvalidOrExpired: 'Token je neplatný nebo vypršel.', - unPublishingDocument: 'Při zrušení publikování tohoto dokumentu 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.', - unknown: 'Došlo k neznámé chybě.', - unspecific: 'Došlo k chybě.', - 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á', - verificationTokenInvalid: 'Ověřovací token je neplatný.', - }, - fields: { - addLabel: 'Přidat {{label}}', - addLink: 'Přidat Odkaz', - addNew: 'Přidat nový', - addNewLabel: 'Přidat nový {{label}}', - addRelationship: 'Přidat vztah', - addUpload: 'Přidat nahrávání', - block: 'blok', - blockType: 'Typ bloku', - blocks: 'bloky', - 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', - chooseFromExisting: 'Vybrat z existujících', - chooseLabel: 'Vybrat {{label}}', - collapseAll: 'Sbalit vše', - customURL: 'Vlastní URL', - editLabelData: 'Upravit data {{label}}', - editLink: 'Upravit odkaz', - editRelationship: 'Upravit vztah', - enterURL: 'Zadejte URL', - internalLink: 'Interní odkaz', - itemsAndMore: '{{items}} a {{count}} dalších', - labelRelationship: 'Vztah {{label}}', - latitude: 'Zeměpisná šířka', - linkType: 'Typ odkazu', - linkedTo: 'Odkaz na <0>{{label}}', - longitude: 'Zeměpisná délka', - newLabel: 'Nový {{label}}', - openInNewTab: 'Otevřít v nové záložce', - passwordsDoNotMatch: 'Hesla se neshodují.', - relatedDocument: 'Související dokument', - relationTo: 'Vztah k', - removeRelationship: 'Odstranit vztah', - removeUpload: 'Odstranit nahrání', - saveChanges: 'Uložit změny', - searchForBlock: 'Hledat blok', - selectExistingLabel: 'Vybrat existující {{label}}', - selectFieldsToEdit: 'Vyberte pole, která chcete upravit', - showAll: 'Zobrazit vše', - swapRelationship: 'Zaměnit vztah', - swapUpload: 'Vyměnit nahrání', - textToDisplay: 'Text k zobrazení', - toggleBlock: 'Přepnout blok', - uploadNewLabel: 'Nahrát nový {{label}}', - }, - general: { - aboutToDelete: 'Chystáte se odstranit {{label}} <1>{{title}}. Jste si jisti?', - aboutToDeleteCount_many: 'Chystáte se smazat {{count}} {{label}}', - aboutToDeleteCount_one: 'Chystáte se smazat {{count}} {{label}}', - aboutToDeleteCount_other: 'Chystáte se smazat {{count}} {{label}}', - addBelow: 'Přidat pod', - addFilter: 'Přidat filtr', - adminTheme: 'Motiv administračního rozhraní', - and: 'A', - applyChanges: 'Použít změny', - ascending: 'Vzestupně', - automatic: 'Automatické', - backToDashboard: 'Zpět na nástěnku', - cancel: 'Zrušit', - changesNotSaved: 'Vaše změny nebyly uloženy. Pokud teď odejdete, ztratíte své změny.', - close: 'Zavřít', - collapse: 'Sbalit', - collections: 'Kolekce', - columnToSort: 'Sloupec k seřazení', - columns: 'Sloupce', - confirm: 'Potvrdit', - confirmDeletion: 'Potvrdit odstranění', - confirmDuplication: 'Potvrdit duplikaci', - copied: 'Zkopírováno', - copy: 'Kopírovat', - create: 'Vytvořit', - createNew: 'Vytvořit nové', - createNewLabel: 'Vytvořit nový {{label}}', - created: 'Vytvořeno', - createdAt: 'Vytvořeno v', - creating: 'Vytváření', - creatingNewLabel: 'Vytváření nového {{label}}', - dark: 'Tmavé', - dashboard: 'Nástěnka', - delete: 'Odstranit', - deletedCountSuccessfully: 'Úspěšně smazáno {{count}} {{label}}.', - deletedSuccessfully: 'Úspěšně odstraněno.', - deleting: 'Odstraňování...', - descending: 'Sestupně', - deselectAllRows: 'Zrušte výběr všech řádků', - duplicate: 'Duplikovat', - duplicateWithoutSaving: 'Duplikovat bez uložení změn', - edit: 'Upravit', - editLabel: 'Upravit {{label}}', - editing: 'Úpravy', - editingLabel_many: 'Úprava {{count}} {{label}}', - editingLabel_one: 'Úprava {{count}} {{label}}', - editingLabel_other: 'Úprava {{count}} {{label}}', - email: 'E-mail', - emailAddress: 'E-mailová adresa', - enterAValue: 'Zadejte hodnotu', - error: 'Chyba', - errors: 'Chyby', - fallbackToDefaultLocale: 'Zpětné přepnutí do výchozího locale', - filter: 'Filtr', - filterWhere: 'Filtrovat {{label}} kde', - filters: 'Filtry', - globals: 'Globální', - language: 'Jazyk', - lastModified: 'Naposledy změněno', - leaveAnyway: 'Přesto odejít', - leaveWithoutSaving: 'Odejít bez uložení', - light: 'Světlé', - livePreview: 'Náhled', - loading: 'Načítání', - locale: 'Místní verze', - locales: 'Lokality', - menu: 'Jídelní lístek', - moveDown: 'Posunout dolů', - moveUp: 'Posunout nahoru', - newPassword: 'Nové heslo', - noFiltersSet: 'Nenastaveny žádné filtry', - noLabel: '<Žádný {{label}}>', - noOptions: 'Žádné možnosti', - noResults: - 'Nebyly nalezeny žádné {{label}}. Buď ještě neexistují žádné {{label}}, nebo žádné nesplňují filtry, které jste zadali výše.', - noValue: 'Žádná hodnota', - none: 'Žádné', - notFound: 'Nenalezeno', - nothingFound: 'Nic nenalezeno', - of: 'z', - open: 'Otevřít', - or: 'Nebo', - order: 'Pořadí', - pageNotFound: 'Stránka nenalezena', - password: 'Heslo', - payloadSettings: 'Nastavení datového záběru', - perPage: 'Na stránku: {{limit}}', - remove: 'Odstranit', - reset: 'Resetovat', - row: 'Řádek', - rows: 'Řádky', - save: 'Uložit', - saving: 'Ukládání...', - searchBy: 'Vyhledat podle {{label}}', - selectAll: 'Vybrat vše {{count}} {{label}}', - selectAllRows: 'Vyberte všechny řádky', - selectValue: 'Vyberte hodnotu', - selectedCount: 'Vybráno {{count}} {{label}}', - showAllLabel: 'Zobrazit všechny {{label}}', - sorryNotFound: 'Je nám líto, ale neexistuje nic, co by odpovídalo vašemu požadavku.', - sort: 'Třídit', - sortByLabelDirection: 'Seřadit podle {{label}} {{direction}}', - stayOnThisPage: 'Zůstat na této stránce', - submissionSuccessful: 'Odeslání úspěšné.', - submit: 'Odeslat', - successfullyCreated: '{{label}} úspěšně vytvořeno.', - successfullyDuplicated: '{{label}} úspěšně duplikováno.', - thisLanguage: 'Čeština', - titleDeleted: '{{label}} "{{title}}" úspěšně smazáno.', - unauthorized: 'Neoprávněný', - unsavedChangesDuplicate: 'Máte neuložené změny. Chtěli byste pokračovat v duplikování?', - untitled: 'Bez názvu', - updatedAt: 'Aktualizováno v', - updatedCountSuccessfully: 'Úspěšně aktualizováno {{count}} {{label}}.', - updatedSuccessfully: 'Úspěšně aktualizováno.', - updating: 'Aktualizace', - uploading: 'Nahrávání', - user: 'Uživatel', - users: 'Uživatelé', - value: 'Hodnota', - welcome: 'Vítejte', - }, - operators: { - contains: 'obsahuje', - equals: 'rovná se', - exists: 'existuje', - isGreaterThan: 'je větší než', - isGreaterThanOrEqualTo: 'je větší nebo rovno', - isIn: 'je v', - isLessThan: 'je menší než', - isLessThanOrEqualTo: 'je menší nebo rovno', - isLike: 'je jako', - isNotEqualTo: 'není rovno', - isNotIn: 'není in', - near: 'blízko', - }, - upload: { - crop: 'Plodina', - cropToolDescription: - 'Přetáhněte rohy vybrané oblasti, nakreslete novou oblast nebo upravte hodnoty níže.', - dragAndDrop: 'Přetáhněte soubor', - dragAndDropHere: 'nebo sem přetáhněte soubor', - editImage: 'Upravit obrázek', - fileName: 'Název souboru', - fileSize: 'Velikost souboru', - focalPoint: 'Středobod', - focalPointDescription: 'Přetáhněte bod zaměření přímo na náhled nebo upravte hodnoty níže.', - height: 'Výška', - lessInfo: 'Méně informací', - moreInfo: 'Více informací', - previewSizes: 'Náhled velikostí', - selectCollectionToBrowse: 'Vyberte kolekci pro procházení', - selectFile: 'Vyberte soubor', - setCropArea: 'Nastavit oblast ořezu', - setFocalPoint: 'Nastavit ohnisko', - sizes: 'Velikosti', - sizesFor: 'Velikosti pro {{label}}', - width: 'Šířka', - }, - validation: { - emailAddress: 'Zadejte prosím platnou e-mailovou adresu.', - enterNumber: 'Zadejte prosím platné číslo.', - fieldHasNo: 'Toto pole nemá {{label}}', - 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}}.', - limitReached: 'Dosáhnutý limit, mohou být přidány pouze {{max}} položky.', - longerThanMin: 'Tato hodnota musí být delší než minimální délka {{minLength}} znaků.', - notValidDate: '"{{value}}" není platné datum.', - required: 'Toto pole je povinné.', - requiresAtLeast: 'Toto pole vyžaduje alespoň {{count}} {{label}}.', - 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: { - aboutToPublishSelection: 'Chystáte se publikovat všechny {{label}} ve výběru. Jsi si jistá?', - aboutToRestore: - 'Chystáte se obnovit tento {{label}} dokument do stavu, v jakém byl {{versionDate}}.', - aboutToRestoreGlobal: - 'Chystáte se obnovit globální {{label}} do stavu, v jakém byl {{versionDate}}.', - aboutToRevertToPublished: - 'Chystáte se vrátit změny tohoto dokumentu do jeho publikovaného stavu. Jste si jisti?', - aboutToUnpublish: 'Chystáte se zrušit publikování tohoto dokumentu. Jste si jisti?', - aboutToUnpublishSelection: - 'Chystáte se zrušit publikování všech {{label}} ve výběru. Jsi si jistá?', - autosave: 'Automatické uložení', - autosavedSuccessfully: 'Úspěšně uloženo automaticky.', - autosavedVersion: 'Verze automatického uložení', - changed: 'Změněno', - compareVersion: 'Porovnat verzi s:', - confirmPublish: 'Potvrďte publikování', - confirmRevertToSaved: 'Potvrdit vrácení k uloženému', - confirmUnpublish: 'Potvrdit zrušení publikování', - confirmVersionRestoration: 'Potvrdit obnovení verze', - currentDocumentStatus: 'Současný {{docStatus}} dokument', - draft: 'Koncept', - draftSavedSuccessfully: 'Koncept úspěšně uložen.', - lastSavedAgo: 'Naposledy uloženo před {{distance}}', - noFurtherVersionsFound: 'Nenalezeny další verze', - noRowsFound: 'Nenalezen {{label}}', - preview: 'Náhled', - problemRestoringVersion: 'Při obnovování této verze došlo k problému', - publish: 'Publikovat', - publishChanges: 'Publikovat změny', - published: 'Publikováno', - publishing: 'Publikování', - restoreThisVersion: 'Obnovit tuto verzi', - restoredSuccessfully: 'Úspěšně obnoveno.', - restoring: 'Obnovování...', - revertToPublished: 'Vrátit se k publikovanému', - reverting: 'Vracení...', - saveDraft: 'Uložit koncept', - selectLocales: 'Vyberte místní verze pro zobrazení', - selectVersionToCompare: 'Vyberte verzi pro porovnání', - showLocales: 'Zobrazit místní verze:', - showingVersionsFor: 'Zobrazují se verze pro:', - status: 'Stav', - type: 'Typ', - unpublish: 'Zrušit publikování', - unpublishing: 'Zrušuji publikování...', - version: 'Verze', - versionCount_many: '{{count}} verzí nalezeno', - versionCount_none: 'Žádné verze nenalezeny', - versionCount_one: '{{count}} verze nalezena', - versionCount_other: '{{count}} verzí nalezeno', - versionCreatedOn: '{{version}} vytvořena:', - versionID: 'ID verze', - versions: 'Verze', - viewingVersion: 'Zobrazuji verzi pro {{entityLabel}} {{documentTitle}}', - viewingVersionGlobal: 'Zobrazuji verzi pro globální {{entityLabel}}', - viewingVersions: 'Zobrazuji verze pro {{entityLabel}} {{documentTitle}}', - viewingVersionsGlobal: 'Zobrazuji verze pro globální {{entityLabel}}', +import type { Language } from '../types.js' + +export const cs: Language = { + dateFNSKey: 'cs', + translations: { + authentication: { + account: 'Účet', + accountOfCurrentUser: 'Účet současného uživatele', + alreadyActivated: 'Již aktivováno', + alreadyLoggedIn: 'Již přihlášen', + apiKey: 'Klíč API', + backToLogin: 'Zpět na přihlášení', + beginCreateFirstUser: 'Začněte vytvořením svého prvního uživatele.', + changePassword: 'Změnit heslo', + checkYourEmailForPasswordReset: + 'Zkontrolujte svůj email a najděte v něm odkaz, který vám umožní bezpečně resetovat vaše heslo.', + confirmGeneration: 'Potvrdit generaci', + confirmPassword: 'Potvrdit heslo', + createFirstUser: 'Vytvořit prvního uživatele', + emailNotValid: 'Zadaný email není platný', + emailSent: 'Email odeslán', + enableAPIKey: 'Povolit klíč API', + failedToUnlock: 'Nepodařilo se odemknout', + forceUnlock: 'Vynutit odemčení', + forgotPassword: 'Zapomněli jste heslo?', + forgotPasswordEmailInstructions: + 'Zadejte svůj email níže. Obdržíte email s instrukcemi, jak resetovat vaše heslo.', + forgotPasswordQuestion: 'Zapomněli jste heslo?', + generate: 'Generovat', + generateNewAPIKey: 'Generovat nový klíč API', + generatingNewAPIKeyWillInvalidate: + 'Vytvoření nového klíče API <1>zneplatní předchozí klíč. Opravdu chcete pokračovat?', + lockUntil: 'Uzamknout do', + logBackIn: 'Znovu se přihlásit', + logOut: 'Odhlásit se', + loggedIn: 'Abyste se mohli přihlásit s jiným uživatelem, nejdříve se <0>odhlaste.', + loggedInChangePassword: + 'Pro změnu hesla přejděte do svého <0>účtu a zde si heslo upravte.', + loggedOutInactivity: 'Byli jste odhlášeni z důvodu neaktivity.', + loggedOutSuccessfully: 'Byli jste úspěšně odhlášeni.', + login: 'Přihlásit se', + loginAttempts: 'Pokusy o přihlášení', + loginUser: 'Přihlásit uživatele', + loginWithAnotherUser: + 'Abyste se mohli přihlásit s jiným uživatelem, nejdříve se <0>odhlaste.', + logout: 'Odhlásit se', + logoutUser: 'Odhlásit uživatele', + newAPIKeyGenerated: 'Byl vygenerován nový klíč API.', + newAccountCreated: + 'Pro přístup k {{serverURL}} 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: {{verificationURL}}
Po ověření vašeho emailu se budete moci úspěšně přihlásit.', + newPassword: 'Nové heslo', + resetPassword: 'Resetovat heslo', + resetPasswordExpiration: 'Expirace resetování hesla', + resetPasswordToken: 'Token pro resetování hesla', + resetYourPassword: 'Resetujte své heslo', + stayLoggedIn: 'Zůstat přihlášen', + successfullyUnlocked: 'Úspěšně odemčeno', + unableToVerify: 'Nepodařilo se ověřit', + verified: 'Ověřeno', + verifiedSuccessfully: 'Úspěšně ověřeno', + verify: 'Ověřit', + verifyUser: 'Ověřit uživatele', + verifyYourEmail: 'Ověřte svůj email', + youAreInactive: + 'Nějakou dobu jste nebyli aktivní a brzy budete automaticky odhlášeni z bezpečnostních důvodů. Chcete zůstat přihlášen?', + 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: { + accountAlreadyActivated: 'Tento účet již byl aktivován.', + autosaving: 'Při automatickém ukládání tohoto dokumentu došlo k chybě.', + correctInvalidFields: 'Opravte neplatná pole.', + deletingFile: 'Při mazání souboru došlo k chybě.', + deletingTitle: + 'Při mazání {{title}} došlo k chybě. Zkontrolujte své připojení a zkuste to znovu.', + emailOrPasswordIncorrect: 'Zadaný email nebo heslo není správné.', + followingFieldsInvalid_one: 'Následující pole je neplatné:', + followingFieldsInvalid_other: 'Následující pole jsou neplatná:', + incorrectCollection: 'Nesprávná kolekce', + invalidFileType: 'Neplatný typ souboru', + invalidFileTypeValue: 'Neplatný typ souboru: {{value}}', + loadingDocument: 'Při načítání dokumentu s ID {{id}} došlo k chybě.', + missingEmail: 'Chybějící email.', + missingIDOfDocument: 'Chybějící ID dokumentu pro aktualizaci.', + missingIDOfVersion: 'Chybějící ID verze.', + missingRequiredData: 'Chybějící povinná data.', + noFilesUploaded: 'Nebyly nahrány žádné soubory.', + noMatchedField: 'Pro "{{label}}" nebylo nalezeno žádné odpovídající pole', + noUser: 'Žádný uživatel', + notAllowedToAccessPage: 'Nemáte povolení přistupovat k této stránce.', + notAllowedToPerformAction: 'Nemáte povolení provádět tuto akci.', + notFound: 'Požadovaný zdroj nebyl nalezen.', + previewing: 'Při náhledu tohoto dokumentu došlo k chybě.', + problemUploadingFile: 'Při nahrávání souboru došlo k chybě.', + tokenInvalidOrExpired: 'Token je neplatný nebo vypršel.', + unPublishingDocument: 'Při zrušení publikování tohoto dokumentu 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.', + unknown: 'Došlo k neznámé chybě.', + unspecific: 'Došlo k chybě.', + 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á', + verificationTokenInvalid: 'Ověřovací token je neplatný.', + }, + fields: { + addLabel: 'Přidat {{label}}', + addLink: 'Přidat Odkaz', + addNew: 'Přidat nový', + addNewLabel: 'Přidat nový {{label}}', + addRelationship: 'Přidat vztah', + addUpload: 'Přidat nahrávání', + block: 'blok', + blockType: 'Typ bloku', + blocks: 'bloky', + 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', + chooseFromExisting: 'Vybrat z existujících', + chooseLabel: 'Vybrat {{label}}', + collapseAll: 'Sbalit vše', + customURL: 'Vlastní URL', + editLabelData: 'Upravit data {{label}}', + editLink: 'Upravit odkaz', + editRelationship: 'Upravit vztah', + enterURL: 'Zadejte URL', + internalLink: 'Interní odkaz', + itemsAndMore: '{{items}} a {{count}} dalších', + labelRelationship: 'Vztah {{label}}', + latitude: 'Zeměpisná šířka', + linkType: 'Typ odkazu', + linkedTo: 'Odkaz na <0>{{label}}', + longitude: 'Zeměpisná délka', + newLabel: 'Nový {{label}}', + openInNewTab: 'Otevřít v nové záložce', + passwordsDoNotMatch: 'Hesla se neshodují.', + relatedDocument: 'Související dokument', + relationTo: 'Vztah k', + removeRelationship: 'Odstranit vztah', + removeUpload: 'Odstranit nahrání', + saveChanges: 'Uložit změny', + searchForBlock: 'Hledat blok', + selectExistingLabel: 'Vybrat existující {{label}}', + selectFieldsToEdit: 'Vyberte pole, která chcete upravit', + showAll: 'Zobrazit vše', + swapRelationship: 'Zaměnit vztah', + swapUpload: 'Vyměnit nahrání', + textToDisplay: 'Text k zobrazení', + toggleBlock: 'Přepnout blok', + uploadNewLabel: 'Nahrát nový {{label}}', + }, + general: { + aboutToDelete: 'Chystáte se odstranit {{label}} <1>{{title}}. Jste si jisti?', + aboutToDeleteCount_many: 'Chystáte se smazat {{count}} {{label}}', + aboutToDeleteCount_one: 'Chystáte se smazat {{count}} {{label}}', + aboutToDeleteCount_other: 'Chystáte se smazat {{count}} {{label}}', + addBelow: 'Přidat pod', + addFilter: 'Přidat filtr', + adminTheme: 'Motiv administračního rozhraní', + and: 'A', + applyChanges: 'Použít změny', + ascending: 'Vzestupně', + automatic: 'Automatické', + backToDashboard: 'Zpět na nástěnku', + cancel: 'Zrušit', + changesNotSaved: 'Vaše změny nebyly uloženy. Pokud teď odejdete, ztratíte své změny.', + close: 'Zavřít', + collapse: 'Sbalit', + collections: 'Kolekce', + columnToSort: 'Sloupec k seřazení', + columns: 'Sloupce', + confirm: 'Potvrdit', + confirmDeletion: 'Potvrdit odstranění', + confirmDuplication: 'Potvrdit duplikaci', + copied: 'Zkopírováno', + copy: 'Kopírovat', + create: 'Vytvořit', + createNew: 'Vytvořit nové', + createNewLabel: 'Vytvořit nový {{label}}', + created: 'Vytvořeno', + createdAt: 'Vytvořeno v', + creating: 'Vytváření', + creatingNewLabel: 'Vytváření nového {{label}}', + dark: 'Tmavé', + dashboard: 'Nástěnka', + delete: 'Odstranit', + deletedCountSuccessfully: 'Úspěšně smazáno {{count}} {{label}}.', + deletedSuccessfully: 'Úspěšně odstraněno.', + deleting: 'Odstraňování...', + descending: 'Sestupně', + deselectAllRows: 'Zrušte výběr všech řádků', + duplicate: 'Duplikovat', + duplicateWithoutSaving: 'Duplikovat bez uložení změn', + edit: 'Upravit', + editLabel: 'Upravit {{label}}', + editing: 'Úpravy', + editingLabel_many: 'Úprava {{count}} {{label}}', + editingLabel_one: 'Úprava {{count}} {{label}}', + editingLabel_other: 'Úprava {{count}} {{label}}', + email: 'E-mail', + emailAddress: 'E-mailová adresa', + enterAValue: 'Zadejte hodnotu', + error: 'Chyba', + errors: 'Chyby', + fallbackToDefaultLocale: 'Zpětné přepnutí do výchozího locale', + filter: 'Filtr', + filterWhere: 'Filtrovat {{label}} kde', + filters: 'Filtry', + globals: 'Globální', + language: 'Jazyk', + lastModified: 'Naposledy změněno', + leaveAnyway: 'Přesto odejít', + leaveWithoutSaving: 'Odejít bez uložení', + light: 'Světlé', + livePreview: 'Náhled', + loading: 'Načítání', + locale: 'Místní verze', + locales: 'Lokality', + menu: 'Jídelní lístek', + moveDown: 'Posunout dolů', + moveUp: 'Posunout nahoru', + newPassword: 'Nové heslo', + noFiltersSet: 'Nenastaveny žádné filtry', + noLabel: '<Žádný {{label}}>', + noOptions: 'Žádné možnosti', + noResults: + 'Nebyly nalezeny žádné {{label}}. Buď ještě neexistují žádné {{label}}, nebo žádné nesplňují filtry, které jste zadali výše.', + noValue: 'Žádná hodnota', + none: 'Žádné', + notFound: 'Nenalezeno', + nothingFound: 'Nic nenalezeno', + of: 'z', + open: 'Otevřít', + or: 'Nebo', + order: 'Pořadí', + pageNotFound: 'Stránka nenalezena', + password: 'Heslo', + payloadSettings: 'Nastavení datového záběru', + perPage: 'Na stránku: {{limit}}', + remove: 'Odstranit', + reset: 'Resetovat', + row: 'Řádek', + rows: 'Řádky', + save: 'Uložit', + saving: 'Ukládání...', + searchBy: 'Vyhledat podle {{label}}', + selectAll: 'Vybrat vše {{count}} {{label}}', + selectAllRows: 'Vyberte všechny řádky', + selectValue: 'Vyberte hodnotu', + selectedCount: 'Vybráno {{count}} {{label}}', + showAllLabel: 'Zobrazit všechny {{label}}', + sorryNotFound: 'Je nám líto, ale neexistuje nic, co by odpovídalo vašemu požadavku.', + sort: 'Třídit', + sortByLabelDirection: 'Seřadit podle {{label}} {{direction}}', + stayOnThisPage: 'Zůstat na této stránce', + submissionSuccessful: 'Odeslání úspěšné.', + submit: 'Odeslat', + successfullyCreated: '{{label}} úspěšně vytvořeno.', + successfullyDuplicated: '{{label}} úspěšně duplikováno.', + thisLanguage: 'Čeština', + titleDeleted: '{{label}} "{{title}}" úspěšně smazáno.', + unauthorized: 'Neoprávněný', + unsavedChangesDuplicate: 'Máte neuložené změny. Chtěli byste pokračovat v duplikování?', + untitled: 'Bez názvu', + updatedAt: 'Aktualizováno v', + updatedCountSuccessfully: 'Úspěšně aktualizováno {{count}} {{label}}.', + updatedSuccessfully: 'Úspěšně aktualizováno.', + updating: 'Aktualizace', + uploading: 'Nahrávání', + user: 'Uživatel', + users: 'Uživatelé', + value: 'Hodnota', + welcome: 'Vítejte', + }, + operators: { + contains: 'obsahuje', + equals: 'rovná se', + exists: 'existuje', + isGreaterThan: 'je větší než', + isGreaterThanOrEqualTo: 'je větší nebo rovno', + isIn: 'je v', + isLessThan: 'je menší než', + isLessThanOrEqualTo: 'je menší nebo rovno', + isLike: 'je jako', + isNotEqualTo: 'není rovno', + isNotIn: 'není in', + near: 'blízko', + }, + upload: { + crop: 'Plodina', + cropToolDescription: + 'Přetáhněte rohy vybrané oblasti, nakreslete novou oblast nebo upravte hodnoty níže.', + dragAndDrop: 'Přetáhněte soubor', + dragAndDropHere: 'nebo sem přetáhněte soubor', + editImage: 'Upravit obrázek', + fileName: 'Název souboru', + fileSize: 'Velikost souboru', + focalPoint: 'Středobod', + focalPointDescription: 'Přetáhněte bod zaměření přímo na náhled nebo upravte hodnoty níže.', + height: 'Výška', + lessInfo: 'Méně informací', + moreInfo: 'Více informací', + previewSizes: 'Náhled velikostí', + selectCollectionToBrowse: 'Vyberte kolekci pro procházení', + selectFile: 'Vyberte soubor', + setCropArea: 'Nastavit oblast ořezu', + setFocalPoint: 'Nastavit ohnisko', + sizes: 'Velikosti', + sizesFor: 'Velikosti pro {{label}}', + width: 'Šířka', + }, + validation: { + emailAddress: 'Zadejte prosím platnou e-mailovou adresu.', + enterNumber: 'Zadejte prosím platné číslo.', + fieldHasNo: 'Toto pole nemá {{label}}', + 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}}.', + limitReached: 'Dosáhnutý limit, mohou být přidány pouze {{max}} položky.', + longerThanMin: 'Tato hodnota musí být delší než minimální délka {{minLength}} znaků.', + notValidDate: '"{{value}}" není platné datum.', + required: 'Toto pole je povinné.', + requiresAtLeast: 'Toto pole vyžaduje alespoň {{count}} {{label}}.', + 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: { + type: 'Typ', + aboutToPublishSelection: 'Chystáte se publikovat všechny {{label}} ve výběru. Jsi si jistá?', + aboutToRestore: + 'Chystáte se obnovit tento {{label}} dokument do stavu, v jakém byl {{versionDate}}.', + aboutToRestoreGlobal: + 'Chystáte se obnovit globální {{label}} do stavu, v jakém byl {{versionDate}}.', + aboutToRevertToPublished: + 'Chystáte se vrátit změny tohoto dokumentu do jeho publikovaného stavu. Jste si jisti?', + aboutToUnpublish: 'Chystáte se zrušit publikování tohoto dokumentu. Jste si jisti?', + aboutToUnpublishSelection: + 'Chystáte se zrušit publikování všech {{label}} ve výběru. Jsi si jistá?', + autosave: 'Automatické uložení', + autosavedSuccessfully: 'Úspěšně uloženo automaticky.', + autosavedVersion: 'Verze automatického uložení', + changed: 'Změněno', + compareVersion: 'Porovnat verzi s:', + confirmPublish: 'Potvrďte publikování', + confirmRevertToSaved: 'Potvrdit vrácení k uloženému', + confirmUnpublish: 'Potvrdit zrušení publikování', + confirmVersionRestoration: 'Potvrdit obnovení verze', + currentDocumentStatus: 'Současný {{docStatus}} dokument', + draft: 'Koncept', + draftSavedSuccessfully: 'Koncept úspěšně uložen.', + lastSavedAgo: 'Naposledy uloženo před {{distance}}', + noFurtherVersionsFound: 'Nenalezeny další verze', + noRowsFound: 'Nenalezen {{label}}', + preview: 'Náhled', + problemRestoringVersion: 'Při obnovování této verze došlo k problému', + publish: 'Publikovat', + publishChanges: 'Publikovat změny', + published: 'Publikováno', + publishing: 'Publikování', + restoreThisVersion: 'Obnovit tuto verzi', + restoredSuccessfully: 'Úspěšně obnoveno.', + restoring: 'Obnovování...', + revertToPublished: 'Vrátit se k publikovanému', + reverting: 'Vracení...', + saveDraft: 'Uložit koncept', + selectLocales: 'Vyberte místní verze pro zobrazení', + selectVersionToCompare: 'Vyberte verzi pro porovnání', + showLocales: 'Zobrazit místní verze:', + showingVersionsFor: 'Zobrazují se verze pro:', + status: 'Stav', + unpublish: 'Zrušit publikování', + unpublishing: 'Zrušuji publikování...', + version: 'Verze', + versionCount_many: '{{count}} verzí nalezeno', + versionCount_none: 'Žádné verze nenalezeny', + versionCount_one: '{{count}} verze nalezena', + versionCount_other: '{{count}} verzí nalezeno', + versionCreatedOn: '{{version}} vytvořena:', + versionID: 'ID verze', + versions: 'Verze', + viewingVersion: 'Zobrazuji verzi pro {{entityLabel}} {{documentTitle}}', + viewingVersionGlobal: 'Zobrazuji verzi pro globální {{entityLabel}}', + viewingVersions: 'Zobrazuji verze pro {{entityLabel}} {{documentTitle}}', + viewingVersionsGlobal: 'Zobrazuji verze pro globální {{entityLabel}}', + }, }, } diff --git a/packages/translations/src/languages/de.ts b/packages/translations/src/languages/de.ts index 7d21b25f49..dbbd739570 100644 --- a/packages/translations/src/languages/de.ts +++ b/packages/translations/src/languages/de.ts @@ -1,4 +1,6 @@ -export const de = { +import type { Language } from '../types.js' + +export const de: Language = { dateFNSKey: 'de', translations: { authentication: { diff --git a/packages/translations/src/languages/en.ts b/packages/translations/src/languages/en.ts index 97f46eab9a..f80053a1c8 100644 --- a/packages/translations/src/languages/en.ts +++ b/packages/translations/src/languages/en.ts @@ -1,4 +1,6 @@ -export const en = { +import type { Language } from '../types.js' + +export const en: Language = { dateFNSKey: 'en-US', translations: { authentication: { diff --git a/packages/translations/src/languages/es.ts b/packages/translations/src/languages/es.ts index e2d1918134..5cccd3886c 100644 --- a/packages/translations/src/languages/es.ts +++ b/packages/translations/src/languages/es.ts @@ -1,4 +1,6 @@ -export const es = { +import type { Language } from '../types.js' + +export const es: Language = { dateFNSKey: 'es', translations: { authentication: { diff --git a/packages/translations/src/languages/fa.ts b/packages/translations/src/languages/fa.ts index 67771203c4..914b9ff468 100644 --- a/packages/translations/src/languages/fa.ts +++ b/packages/translations/src/languages/fa.ts @@ -1,388 +1,396 @@ -export default { - authentication: { - account: 'نمایه', - accountOfCurrentUser: 'نمایه کاربر فعلی', - alreadyActivated: 'قبلاً فعال شده است', - alreadyLoggedIn: 'قبلاً وارد شده‌اید', - apiKey: 'کلید اِی‌پی‌آی', - backToLogin: 'بازگشت به برگه ورود', - beginCreateFirstUser: 'برای آغاز، نخستین کاربر خود را بسازید.', - changePassword: 'تغییر گذرواژه', - checkYourEmailForPasswordReset: - 'برای بازیابی ایمن گذرواژه خود، پیامی که به رایانامه شما فرستادیم و دارای پیوند بازنشانی گذرواژه است را بررسی نمایید.', - confirmGeneration: 'تأیید ساخت', - confirmPassword: 'تأیید گذرواژه', - createFirstUser: 'ایجاد کاربر نخست', - emailNotValid: 'رایانامه ارائه‌شده درست نیست', - emailSent: 'رایانامه فرستاده شد', - enableAPIKey: 'فعال‌سازی کلید اِی‌پی‌آی', - failedToUnlock: 'باز کردن قفل ناموفق بود', - forceUnlock: 'باز کردن قفل اجباری', - forgotPassword: 'بازیابی گذرواژه', - forgotPasswordEmailInstructions: - 'لطفا نام کاربری یا نشانی رایانامه خود را وارد نمایید. شما یک پیام با دستورالعمل راه‌اندازی مجدد گذرواژه خود دریافت خواهید کرد.', - forgotPasswordQuestion: 'بازیابی گذرواژه؟', - generate: 'ساخت', - generateNewAPIKey: 'ساخت کلید اِی‌پی‌آی تازه', - generatingNewAPIKeyWillInvalidate: - 'ساخت کلید اِی‌پی‌آی تازه انجام خواهد شد، اما کلیدهای پیشین را <1>باطلخواهد کرد، تمایل دارید ادامه دهید؟', - lockUntil: 'قفل تا', - logBackIn: 'دوباره وارد شوید', - logOut: 'خروج', - loggedIn: 'برای ورود با کاربر دیگر، باید اول <0>خارج شوید.', - loggedInChangePassword: - 'برای تغییر گذرواژه، به <0>نمایه بروید تا گذرواژه خود را ویرایش کنید.', - loggedOutInactivity: 'شما به دلیل عدم فعالیت از سیستم خارج شده اید.', - loggedOutSuccessfully: 'شما با موفقیت از سیستم خارج شدید.', - login: 'وارد شدن', - loginAttempts: 'تلاش برای ورود', - loginUser: 'ورود کاربر', - loginWithAnotherUser: 'برای ورود با کاربر دیگر، باید اول<0>خارج شوید.', - logout: 'خروج', - logoutUser: 'خروج از کاربر', - newAPIKeyGenerated: 'کلید اِی‌پی‌آی تازه ساخته شد.', - newAccountCreated: - 'یک نمایه کاربری تازه برای دسترسی شما ساخته شده است {{serverURL}} لطفاً روی پیوند زیر کلیک کنید یا آدرس زیر را در مرورگر خود قرار دهید تا رایانامه خود را تأیید کنید: {{verificationURL}}
پس از تایید رایانامه خود، می توانید وارد سیستم شوید.', - newPassword: 'گذرواژه تازه', - resetPassword: 'بازنشانی گذرواژه', - resetPasswordExpiration: 'زمان انقضاء بازنشانی گذرواژه', - resetPasswordToken: 'ژتون بازیابی گذرواژه', - resetYourPassword: 'گذرواژه خود را بازنشانی کنید', - stayLoggedIn: 'وارد سیستم بمانید', - successfullyUnlocked: 'با موفقیت باز شد', - unableToVerify: 'امکان تأیید نیست', - verified: 'تأیید شده', - verifiedSuccessfully: 'با موفقیت تأیید شد', - verify: 'تأیید', - verifyUser: 'تأیید کاربر', - verifyYourEmail: 'رایانامه خود را تأیید کنید', - youAreInactive: - 'مدتی است که فعال نبوده‌اید و به زودی جهت حفظ امنیت شما به صورت خودکار از سیستم خارج خواهید شد. ادامه می‌دهید؟', - youAreReceivingResetPassword: - 'درخواست بازنشانی گذرواژه نمایه توسط شما یا فرد دیگری فرستاده شده است، اگر این درخواست از سمت شما بوده روی پیوند مقابل کلیک کنید یا در مرورگر وب خود پیوند را کپی کنید تا مراحل بازنشانی گذرواژه تکمیل شود، در غیر این صورت جای نگرانی نیست این پیام را نادیده بگیرید:', - youDidNotRequestPassword: - 'اگر شما این درخواست را ندادید، لطفاً این رایانامه را نادیده بگیرید و گذرواژه شما تغییری نخواهد کرد.', - }, - error: { - accountAlreadyActivated: 'این حساب قبلاً فعال شده است.', - autosaving: 'هنگام ذخیره خودکار این سند خطایی رخ داد.', - correctInvalidFields: 'لطفا کادرهای نامعتبر را تصحیح کنید.', - deletingFile: 'هنگام حذف فایل خطایی روی داد.', - deletingTitle: 'هنگام حذف {{title}} خطایی رخ داد. لطفاً وضعیت اتصال اینترنت خود را بررسی کنید.', - emailOrPasswordIncorrect: 'رایانامه یا گذرواژه ارائه شده نادرست است.', - followingFieldsInvalid_one: 'کادر زیر نامعتبر است:', - followingFieldsInvalid_other: 'کادرهای زیر نامعتبر هستند:', - incorrectCollection: 'مجموعه نادرست', - invalidFileType: 'نوع رسانه نامعتبر است', - invalidFileTypeValue: 'نوع رسانه نامعتبر: {{value}}', - loadingDocument: 'مشکلی در بارگیری رسانه با شناسه {{id}} پیش آمد.', - missingEmail: 'رایانامه وارد نشده.', - missingIDOfDocument: 'شناسه سند جهت بروزرسانی نامعتبر است.', - missingIDOfVersion: 'شناسه نگارش وارد نشده.', - missingRequiredData: 'داده های مورد نیاز وجود ندارد.', - noFilesUploaded: 'هیچ رسانه‌ای بارگذاری نشده.', - noMatchedField: 'کادر منطبقی با"{{label}}" یافت نشد', - noUser: 'بدون کاربر', - notAllowedToAccessPage: 'شما اجازه دسترسی به این برگه را ندارید.', - notAllowedToPerformAction: 'این عملیات برای شما مجاز نیست.', - notFound: 'منبع درخواست شده یافت نشد.', - previewing: 'مشکلی در پیش‌نمایش این رسانه رخ داد.', - problemUploadingFile: 'هنگام بارگذاری سند خطایی رخ داد.', - tokenInvalidOrExpired: 'ژتون شما نامعتبر یا منقضی شده است.', - unPublishingDocument: 'هنگام لغو انتشار این سند خطایی رخ داد.', - unableToDeleteCount: 'نمی‌توان {{count}} از {{total}} {{label}} را حذف کرد.', - unableToUpdateCount: 'امکان به روز رسانی {{count}} خارج از {{total}} {{label}} وجود ندارد.', - unauthorized: 'درخواست نامعتبر، جهت فرستادن این درخواست باید وارد شوید.', - unknown: 'یک خطای ناشناخته رخ داد.', - unspecific: 'خطایی رخ داد.', - userLocked: 'این کاربر به دلیل تلاش های زیاد برای ورود ناموفق قفل شده است.', - valueMustBeUnique: 'مقدار باید منحصر به فرد باشد', - verificationTokenInvalid: 'ژتون تأیید نامعتبر است.', - }, - fields: { - addLabel: 'افزودن {{label}}', - addLink: 'افزودن پیوند', - addNew: 'افزودن', - addNewLabel: 'افزودن {{label}} تازه', - addRelationship: 'افزودن پیوستگی', - addUpload: 'افزودن بارگذار', - block: 'بلوک', - blockType: 'نوع بلوک', - blocks: 'بلوک‌ها', - chooseBetweenCustomTextOrDocument: - 'بین یک نشانی وب یا پیوند دادن به سندی دیگری یکی را انتخاب کنید.', - chooseDocumentToLink: 'یک سند را برای پیوند دادن برگزینید', - chooseFromExisting: 'برگزیدن از بین ورودی‌ها', - chooseLabel: 'انتخاب {{label}}', - collapseAll: 'بستن همه', - customURL: 'URL سفارشی', - editLabelData: 'ویرایش {{label}} داده', - editLink: 'نگارش پیوند', - editRelationship: 'نگارش پیوستگی', - enterURL: 'یک نشانی وب وارد کنید', - internalLink: 'پیوند درونی', - itemsAndMore: '{{items}} و {{count}} بیش‌تر', - labelRelationship: '{{label}} پیوستگی', - latitude: 'عرض جغرافیایی', - linkType: 'نوع پیوند', - linkedTo: 'مرتبط با <0>{{label}}', - longitude: 'طول جغرافیایی', - newLabel: 'تازه {{label}}', - openInNewTab: 'بازکردن درزبانه تازه', - passwordsDoNotMatch: 'گذرواژه‌های وارد شده مطابقت ندارند.', - relatedDocument: 'اسناد مرتبط', - relationTo: 'پیوست به', - removeRelationship: 'حذف پیوستگی', - removeUpload: 'حذف بارگذار', - saveChanges: 'ذخیره تغییرات', - searchForBlock: 'جست‌وجو برای بلوک', - selectExistingLabel: 'انتخاب موارد {{label}}', - selectFieldsToEdit: 'انتخاب کادرها برای نگارش', - showAll: 'نمایش کل', - swapRelationship: 'تبادل پیوستگی', - swapUpload: 'تبادل بارگذار', - textToDisplay: 'متن برای نمایش', - toggleBlock: 'کارگذاری بلوک', - uploadNewLabel: 'بارگذاری تازه {{label}}', - }, - general: { - aboutToDelete: 'شما در حال پاک کردن {{label}} <1>{{title}} هستید. اطمینان دارید؟', - aboutToDeleteCount_many: 'شما در حال پاک کردن {{count}} تعداد {{label}} هستید', - aboutToDeleteCount_one: 'شما در حال پاک کردن {{count}} تعداد {{label}} هستید', - aboutToDeleteCount_other: 'شما در شرف حذف هستید {{count}} {{label}}', - addBelow: 'افزودن به زیر', - addFilter: 'افزودن علامت', - adminTheme: 'پوسته پیشخوان', - and: 'و', - applyChanges: 'اعمال تغییرات', - ascending: 'صعودی', - automatic: 'خودکار', - backToDashboard: 'بازگشت به پیشخوان', - cancel: 'لغو', - changesNotSaved: - 'تغییرات شما ذخیره نشده، اگر این برگه را ترک کنید. تمام تغییرات از دست خواهد رفت.', - close: 'بستن', - collapse: 'بستن', - collections: 'مجموعه‌ها', - columnToSort: 'ستون برای مرتب‌سازی', - columns: 'ستون‌ها', - confirm: 'تأیید', - confirmDeletion: 'تأئید عملیات حذف', - confirmDuplication: 'تأئید رونوشت', - copied: 'رونوشت شده', - copy: 'رونوشت', - create: 'ساختن', - createNew: 'ساختن تازه', - createNewLabel: 'ساختن {{label}} تازه', - created: 'ساخته شده', - createdAt: 'ساخته شده در', - creating: 'در حال ساخت', - creatingNewLabel: 'در حال ساختن {{label}} تازه', - dark: 'تاریک', - dashboard: 'پیشخوان', - delete: 'حذف', - deletedCountSuccessfully: 'تعداد {{count}} {{label}} با موفقیت پاک گردید.', - deletedSuccessfully: 'با موفقیت حذف شد.', - deleting: 'در حال حذف...', - descending: 'رو به پایین', - deselectAllRows: 'تمام سطرها را از انتخاب خارج کنید', - duplicate: 'تکراری', - duplicateWithoutSaving: 'رونوشت بدون ذخیره کردن تغییرات', - edit: 'نگارش', - editLabel: 'نگارش {{label}}', - editing: 'در حال نگارش', - editingLabel_many: 'در حال نگارش {{count}} از {{label}}', - editingLabel_one: 'در حال نگارش {{count}} از {{label}}', - editingLabel_other: 'در حال نگارش {{count}} از {{label}}', - email: 'رایانامه', - emailAddress: 'نشانی رایانامه', - enterAValue: 'یک مقدار وارد کنید', - error: 'خطا', - errors: 'خطاها', - fallbackToDefaultLocale: 'بازگردان پیشفرض زبان', - filter: 'علامت‌گذاری', - filterWhere: 'علامت گذاری کردن {{label}} جایی که', - filters: 'علامت‌گذاری‌ها', - globals: 'سراسری', - language: 'زبان', - lastModified: 'آخرین نگارش', - leaveAnyway: 'به هر حال ترک کن', - leaveWithoutSaving: 'ترک کردن بدون ذخیره', - light: 'روشن', - livePreview: 'پیش‌نمایش', - loading: 'در حال بارگذاری', - locale: 'زبان', - locales: 'زبان‌ها', - menu: 'منو', - moveDown: 'حرکت به پایین', - moveUp: 'حرکت به بالا', - newPassword: 'گذرواژه تازه', - noFiltersSet: 'هیچ علامت‌گذاری تنظیم نشده', - noLabel: '', - noOptions: 'بدون گزینه', - noResults: - 'هیچ {{label}} یافت نشد. {{label}} یا هنوز وجود ندارد یا هیچ کدام با علامت‌گذاری‌هایی که در بالا مشخص کرده اید مطابقت ندارد.', - noValue: 'بدون مقدار', - none: 'هیچ یک', - notFound: 'یافت نشد', - nothingFound: 'چیزی یافت نشد', - of: 'از', - open: 'باز کردن', - or: 'یا', - order: 'چیدمان', - pageNotFound: 'برگه یافت نشد', - password: 'گذرواژه', - payloadSettings: 'تنظیمات پی‌لود', - perPage: 'هر برگه: {{limit}}', - remove: 'برداشتن', - reset: 'بازنشانی', - row: 'ردیف', - rows: 'ردیف‌ها', - save: 'ذخیره', - saving: 'در حال ذخیره...', - searchBy: 'جستجو بر اساس {{label}}', - selectAll: 'انتخاب همه {{count}} {{label}}', - selectAllRows: 'انتخاب تمام سطرها', - selectValue: 'یک مقدار را انتخاب کنید', - selectedCount: '{{count}} {{label}} انتخاب شد', - showAllLabel: 'نمایش همه {{label}}', - sorryNotFound: 'متأسفانه چیزی برای مطابقت با درخواست شما وجود ندارد.', - sort: 'مرتب‌سازی', - sortByLabelDirection: 'مرتب کردن بر اساس {{label}} {{direction}}', - stayOnThisPage: 'ماندن در این برگه', - submissionSuccessful: 'با موفقیت ثبت شد.', - submit: 'فرستادن', - successfullyCreated: '{{label}} با موفقیت ساخته شد.', - successfullyDuplicated: '{{label}} با موفقیت رونوشت شد.', - thisLanguage: 'فارسی', - titleDeleted: '{{label}} "{{title}}" با موفقیت پاک شد.', - unauthorized: 'غیرمجاز', - unsavedChangesDuplicate: 'شما تغییرات ذخیره نشده دارید. مطمئنید میخواهید به رونوشت ادامه دهید؟', - untitled: 'بدون عنوان', - updatedAt: 'بروز شده در', - updatedCountSuccessfully: 'تعداد {{count}} با عنوان {{label}} با موفقیت بروزرسانی شدند.', - updatedSuccessfully: 'با موفقیت به‌روز شد.', - updating: 'در حال به‌روزرسانی', - uploading: 'در حال بارگذاری', - user: 'کاربر', - users: 'کاربران', - value: 'مقدار', - welcome: 'خوش‌آمدید', - }, - operators: { - contains: 'شامل', - equals: 'برابر با', - exists: 'وجود دارد', - isGreaterThan: 'بزرگتر است از', - isGreaterThanOrEqualTo: 'بزرگتر یا مساوی است', - isIn: 'هست در', - isLessThan: 'کمتر است از', - isLessThanOrEqualTo: 'کمتر یا مساوی است', - isLike: 'مانند این است', - isNotEqualTo: 'برابر نیست', - isNotIn: 'در این نیست', - near: 'نزدیک', - }, - upload: { - crop: 'محصول', - cropToolDescription: - 'گوشه‌های منطقه انتخاب شده را بکشید، یک منطقه جدید رسم کنید یا مقادیر زیر را تنظیم کنید.', - dragAndDrop: 'یک سند را بکشید و رها کنید', - dragAndDropHere: 'یا یک سند را به اینجا بکشید و رها کنید', - editImage: 'ویرایش تصویر', - fileName: 'نام رسانه', - fileSize: 'حجم رسانه', - focalPoint: 'نقطه متمرکز', - focalPointDescription: - 'نقطه کانونی را مستقیماً روی پیش نمایش بکشید یا مقادیر زیر را تنظیم کنید.', - height: 'ارتفاع', - lessInfo: 'اطلاعات کمتر', - moreInfo: 'اطلاعات بیشتر', - previewSizes: 'اندازه های پیش نمایش', - selectCollectionToBrowse: 'یک مجموعه را برای مرور انتخاب کنید', - selectFile: 'برگزیدن رسانه', - setCropArea: 'تنظیم ناحیه برش', - setFocalPoint: 'تنظیم نقطه کانونی', - sizes: 'اندازه‌ها', - sizesFor: 'اندازه‌ها برای {{label}}', - width: 'پهنا', - }, - validation: { - emailAddress: 'لطفاً یک نشانی رایانامه معتبر وارد کنید.', - enterNumber: 'لطفاً یک شماره درست وارد کنید.', - fieldHasNo: 'این کادر شامل هیچ {{label}} نمی‌شود', - greaterThanMax: '{{value}} بیشتر از حداکثر مجاز برای {{label}} است که {{max}} است.', - invalidInput: 'این کادر دارای ورودی نامعتبر است.', - invalidSelection: 'این کادر دارای یک انتخاب نامعتبر است.', - invalidSelections: 'این کادر دارای انتخاب‌های نامعتبر زیر است:', - lessThanMin: '{{value}} کمتر از حداقل مجاز برای {{label}} است که {{min}} است.', - limitReached: 'محدودیت رسیده است، فقط {{max}} مورد می تواند اضافه شود.', - longerThanMin: 'ورودی باید بیش از حداقل {{minLength}} واژه باشد.', - notValidDate: '"{{value}}" یک تاریخ معتبر نیست.', - required: 'این کادر اجباری است.', - requiresAtLeast: 'این رشته حداقل نیازمند {{count}} {{label}}.', - requiresNoMoreThan: 'این رشته به بیش از {{count}} {{label}} نیاز دارد.', - requiresTwoNumbers: 'این کادر به دو عدد نیاز دارد.', - shorterThanMax: 'ورودی باید کمتر از {{maxLength}} واژه باشد.', - trueOrFalse: 'این کادر فقط می تواند به صورت true یا false باشد.', - validUploadID: 'این فیلد یک شناسه بارگذاری معتبر نیست.', - }, - version: { - aboutToPublishSelection: - 'شما در حال انتشار همه {{label}} برگزیده هستید از این کار اطمینان دارید؟', - aboutToRestore: - 'شما در شرف بازیابی این هستید {{label}} سند به ایالتی که در آن بود {{versionDate}}.', - aboutToRestoreGlobal: 'شما در حال بازگردانی کلی {{label}} در این {{versionDate}} هستید.', - aboutToRevertToPublished: - 'شما در حال بازگردانی تغییرات این رسانه به وضعیت منتشر شده آن هستید. از این کار اطمینان دارید؟', - aboutToUnpublish: 'شما در حال لغو انتشار این سند هستید، آیا از این کار اطمینان دارید؟', - aboutToUnpublishSelection: 'شما در شرف لغو انتشار {{label}} برگزیده هستید. ایا اطمینان دارید؟', - autosave: 'ذخیره خودکار', - autosavedSuccessfully: 'با موفقیت ذخیره خودکار شد.', - autosavedVersion: 'نگارش ذخیره شده خودکار', - changed: 'تغییر کرد', - compareVersion: 'مقایسه نگارش با:', - confirmPublish: 'تأیید انتشار', - confirmRevertToSaved: 'تأیید بازگردانی نگارش ذخیره شده', - confirmUnpublish: 'تأیید لغو انتشار', - confirmVersionRestoration: 'تأیید بازیابی نگارش', - currentDocumentStatus: 'جاری {{docStatus}} سند', - draft: 'پیش‌نویس', - draftSavedSuccessfully: 'پیش‌نویس با موفقیت ذخیره شد.', - lastSavedAgo: 'آخرین بار {{distance}} پیش ذخیره شد', - noFurtherVersionsFound: 'نگارش دیگری یافت نشد', - noRowsFound: 'هیچ {{label}} یافت نشد', - preview: 'پیش‌نمایش', - problemRestoringVersion: 'مشکلی در بازیابی این نگارش وجود دارد', - publish: 'انتشار', - publishChanges: 'انتشار تغییرات', - published: 'انتشار یافته', - publishing: 'انتشار', - restoreThisVersion: 'این نگارش را بازیابی کنید', - restoredSuccessfully: 'با موفقیت بازیابی شد.', - restoring: 'در حال بازیابی...', - revertToPublished: 'بازگردانی به انتشار یافته', - reverting: 'در حال بازگردانی...', - saveDraft: 'ذخیره پیش‌نویس', - selectLocales: 'زبان‌ها را برای نمایش انتخاب کنید', - selectVersionToCompare: 'نگارشی را برای مقایسه انتخاب کنید', - showLocales: 'نمایش زبان‌ها:', - showingVersionsFor: 'نمایش نگارش‌ها برای:', - status: 'وضعیت', - type: 'تایپ کنید', - unpublish: 'لغو انتشار', - unpublishing: 'در حال لغو انتشار...', - version: 'نگارش', - versionCount_many: '{{count}} نگارش‌ یافت شد', - versionCount_none: 'هیچ نگارشی یافت نشد', - versionCount_one: '{{count}} نگارش یافت شد', - versionCount_other: '{{count}} نگارش یافت شد', - versionCreatedOn: '{{version}} ساخته شده در:', - versionID: 'شناسه نگارش', - versions: 'نگارش‌ها', - viewingVersion: 'در حال مشاهده نگارش برای {{entityLabel}} {{documentTitle}}', - viewingVersionGlobal: 'در حال مشاهده نگارش‌های کلی {{entityLabel}}', - viewingVersions: 'مشاهده نگارش‌ها برای {{entityLabel}} {{documentTitle}}', - viewingVersionsGlobal: 'مشاهده نگارش‌های کلی {{entityLabel}}', +import type { Language } from '../types.js' + +export const fa: Language = { + dateFNSKey: 'fa', + translations: { + authentication: { + account: 'نمایه', + accountOfCurrentUser: 'نمایه کاربر فعلی', + alreadyActivated: 'قبلاً فعال شده است', + alreadyLoggedIn: 'قبلاً وارد شده‌اید', + apiKey: 'کلید اِی‌پی‌آی', + backToLogin: 'بازگشت به برگه ورود', + beginCreateFirstUser: 'برای آغاز، نخستین کاربر خود را بسازید.', + changePassword: 'تغییر گذرواژه', + checkYourEmailForPasswordReset: + 'برای بازیابی ایمن گذرواژه خود، پیامی که به رایانامه شما فرستادیم و دارای پیوند بازنشانی گذرواژه است را بررسی نمایید.', + confirmGeneration: 'تأیید ساخت', + confirmPassword: 'تأیید گذرواژه', + createFirstUser: 'ایجاد کاربر نخست', + emailNotValid: 'رایانامه ارائه‌شده درست نیست', + emailSent: 'رایانامه فرستاده شد', + enableAPIKey: 'فعال‌سازی کلید اِی‌پی‌آی', + failedToUnlock: 'باز کردن قفل ناموفق بود', + forceUnlock: 'باز کردن قفل اجباری', + forgotPassword: 'بازیابی گذرواژه', + forgotPasswordEmailInstructions: + 'لطفا نام کاربری یا نشانی رایانامه خود را وارد نمایید. شما یک پیام با دستورالعمل راه‌اندازی مجدد گذرواژه خود دریافت خواهید کرد.', + forgotPasswordQuestion: 'بازیابی گذرواژه؟', + generate: 'ساخت', + generateNewAPIKey: 'ساخت کلید اِی‌پی‌آی تازه', + generatingNewAPIKeyWillInvalidate: + 'ساخت کلید اِی‌پی‌آی تازه انجام خواهد شد، اما کلیدهای پیشین را <1>باطلخواهد کرد، تمایل دارید ادامه دهید؟', + lockUntil: 'قفل تا', + logBackIn: 'دوباره وارد شوید', + logOut: 'خروج', + loggedIn: 'برای ورود با کاربر دیگر، باید اول <0>خارج شوید.', + loggedInChangePassword: + 'برای تغییر گذرواژه، به <0>نمایه بروید تا گذرواژه خود را ویرایش کنید.', + loggedOutInactivity: 'شما به دلیل عدم فعالیت از سیستم خارج شده اید.', + loggedOutSuccessfully: 'شما با موفقیت از سیستم خارج شدید.', + login: 'وارد شدن', + loginAttempts: 'تلاش برای ورود', + loginUser: 'ورود کاربر', + loginWithAnotherUser: 'برای ورود با کاربر دیگر، باید اول<0>خارج شوید.', + logout: 'خروج', + logoutUser: 'خروج از کاربر', + newAPIKeyGenerated: 'کلید اِی‌پی‌آی تازه ساخته شد.', + newAccountCreated: + 'یک نمایه کاربری تازه برای دسترسی شما ساخته شده است {{serverURL}} لطفاً روی پیوند زیر کلیک کنید یا آدرس زیر را در مرورگر خود قرار دهید تا رایانامه خود را تأیید کنید: {{verificationURL}}
پس از تایید رایانامه خود، می توانید وارد سیستم شوید.', + newPassword: 'گذرواژه تازه', + resetPassword: 'بازنشانی گذرواژه', + resetPasswordExpiration: 'زمان انقضاء بازنشانی گذرواژه', + resetPasswordToken: 'ژتون بازیابی گذرواژه', + resetYourPassword: 'گذرواژه خود را بازنشانی کنید', + stayLoggedIn: 'وارد سیستم بمانید', + successfullyUnlocked: 'با موفقیت باز شد', + unableToVerify: 'امکان تأیید نیست', + verified: 'تأیید شده', + verifiedSuccessfully: 'با موفقیت تأیید شد', + verify: 'تأیید', + verifyUser: 'تأیید کاربر', + verifyYourEmail: 'رایانامه خود را تأیید کنید', + youAreInactive: + 'مدتی است که فعال نبوده‌اید و به زودی جهت حفظ امنیت شما به صورت خودکار از سیستم خارج خواهید شد. ادامه می‌دهید؟', + youAreReceivingResetPassword: + 'درخواست بازنشانی گذرواژه نمایه توسط شما یا فرد دیگری فرستاده شده است، اگر این درخواست از سمت شما بوده روی پیوند مقابل کلیک کنید یا در مرورگر وب خود پیوند را کپی کنید تا مراحل بازنشانی گذرواژه تکمیل شود، در غیر این صورت جای نگرانی نیست این پیام را نادیده بگیرید:', + youDidNotRequestPassword: + 'اگر شما این درخواست را ندادید، لطفاً این رایانامه را نادیده بگیرید و گذرواژه شما تغییری نخواهد کرد.', + }, + error: { + accountAlreadyActivated: 'این حساب قبلاً فعال شده است.', + autosaving: 'هنگام ذخیره خودکار این سند خطایی رخ داد.', + correctInvalidFields: 'لطفا کادرهای نامعتبر را تصحیح کنید.', + deletingFile: 'هنگام حذف فایل خطایی روی داد.', + deletingTitle: + 'هنگام حذف {{title}} خطایی رخ داد. لطفاً وضعیت اتصال اینترنت خود را بررسی کنید.', + emailOrPasswordIncorrect: 'رایانامه یا گذرواژه ارائه شده نادرست است.', + followingFieldsInvalid_one: 'کادر زیر نامعتبر است:', + followingFieldsInvalid_other: 'کادرهای زیر نامعتبر هستند:', + incorrectCollection: 'مجموعه نادرست', + invalidFileType: 'نوع رسانه نامعتبر است', + invalidFileTypeValue: 'نوع رسانه نامعتبر: {{value}}', + loadingDocument: 'مشکلی در بارگیری رسانه با شناسه {{id}} پیش آمد.', + missingEmail: 'رایانامه وارد نشده.', + missingIDOfDocument: 'شناسه سند جهت بروزرسانی نامعتبر است.', + missingIDOfVersion: 'شناسه نگارش وارد نشده.', + missingRequiredData: 'داده های مورد نیاز وجود ندارد.', + noFilesUploaded: 'هیچ رسانه‌ای بارگذاری نشده.', + noMatchedField: 'کادر منطبقی با"{{label}}" یافت نشد', + noUser: 'بدون کاربر', + notAllowedToAccessPage: 'شما اجازه دسترسی به این برگه را ندارید.', + notAllowedToPerformAction: 'این عملیات برای شما مجاز نیست.', + notFound: 'منبع درخواست شده یافت نشد.', + previewing: 'مشکلی در پیش‌نمایش این رسانه رخ داد.', + problemUploadingFile: 'هنگام بارگذاری سند خطایی رخ داد.', + tokenInvalidOrExpired: 'ژتون شما نامعتبر یا منقضی شده است.', + unPublishingDocument: 'هنگام لغو انتشار این سند خطایی رخ داد.', + unableToDeleteCount: 'نمی‌توان {{count}} از {{total}} {{label}} را حذف کرد.', + unableToUpdateCount: 'امکان به روز رسانی {{count}} خارج از {{total}} {{label}} وجود ندارد.', + unauthorized: 'درخواست نامعتبر، جهت فرستادن این درخواست باید وارد شوید.', + unknown: 'یک خطای ناشناخته رخ داد.', + unspecific: 'خطایی رخ داد.', + userLocked: 'این کاربر به دلیل تلاش های زیاد برای ورود ناموفق قفل شده است.', + valueMustBeUnique: 'مقدار باید منحصر به فرد باشد', + verificationTokenInvalid: 'ژتون تأیید نامعتبر است.', + }, + fields: { + addLabel: 'افزودن {{label}}', + addLink: 'افزودن پیوند', + addNew: 'افزودن', + addNewLabel: 'افزودن {{label}} تازه', + addRelationship: 'افزودن پیوستگی', + addUpload: 'افزودن بارگذار', + block: 'بلوک', + blockType: 'نوع بلوک', + blocks: 'بلوک‌ها', + chooseBetweenCustomTextOrDocument: + 'بین یک نشانی وب یا پیوند دادن به سندی دیگری یکی را انتخاب کنید.', + chooseDocumentToLink: 'یک سند را برای پیوند دادن برگزینید', + chooseFromExisting: 'برگزیدن از بین ورودی‌ها', + chooseLabel: 'انتخاب {{label}}', + collapseAll: 'بستن همه', + customURL: 'URL سفارشی', + editLabelData: 'ویرایش {{label}} داده', + editLink: 'نگارش پیوند', + editRelationship: 'نگارش پیوستگی', + enterURL: 'یک نشانی وب وارد کنید', + internalLink: 'پیوند درونی', + itemsAndMore: '{{items}} و {{count}} بیش‌تر', + labelRelationship: '{{label}} پیوستگی', + latitude: 'عرض جغرافیایی', + linkType: 'نوع پیوند', + linkedTo: 'مرتبط با <0>{{label}}', + longitude: 'طول جغرافیایی', + newLabel: 'تازه {{label}}', + openInNewTab: 'بازکردن درزبانه تازه', + passwordsDoNotMatch: 'گذرواژه‌های وارد شده مطابقت ندارند.', + relatedDocument: 'اسناد مرتبط', + relationTo: 'پیوست به', + removeRelationship: 'حذف پیوستگی', + removeUpload: 'حذف بارگذار', + saveChanges: 'ذخیره تغییرات', + searchForBlock: 'جست‌وجو برای بلوک', + selectExistingLabel: 'انتخاب موارد {{label}}', + selectFieldsToEdit: 'انتخاب کادرها برای نگارش', + showAll: 'نمایش کل', + swapRelationship: 'تبادل پیوستگی', + swapUpload: 'تبادل بارگذار', + textToDisplay: 'متن برای نمایش', + toggleBlock: 'کارگذاری بلوک', + uploadNewLabel: 'بارگذاری تازه {{label}}', + }, + general: { + aboutToDelete: 'شما در حال پاک کردن {{label}} <1>{{title}} هستید. اطمینان دارید؟', + aboutToDeleteCount_many: 'شما در حال پاک کردن {{count}} تعداد {{label}} هستید', + aboutToDeleteCount_one: 'شما در حال پاک کردن {{count}} تعداد {{label}} هستید', + aboutToDeleteCount_other: 'شما در شرف حذف هستید {{count}} {{label}}', + addBelow: 'افزودن به زیر', + addFilter: 'افزودن علامت', + adminTheme: 'پوسته پیشخوان', + and: 'و', + applyChanges: 'اعمال تغییرات', + ascending: 'صعودی', + automatic: 'خودکار', + backToDashboard: 'بازگشت به پیشخوان', + cancel: 'لغو', + changesNotSaved: + 'تغییرات شما ذخیره نشده، اگر این برگه را ترک کنید. تمام تغییرات از دست خواهد رفت.', + close: 'بستن', + collapse: 'بستن', + collections: 'مجموعه‌ها', + columnToSort: 'ستون برای مرتب‌سازی', + columns: 'ستون‌ها', + confirm: 'تأیید', + confirmDeletion: 'تأئید عملیات حذف', + confirmDuplication: 'تأئید رونوشت', + copied: 'رونوشت شده', + copy: 'رونوشت', + create: 'ساختن', + createNew: 'ساختن تازه', + createNewLabel: 'ساختن {{label}} تازه', + created: 'ساخته شده', + createdAt: 'ساخته شده در', + creating: 'در حال ساخت', + creatingNewLabel: 'در حال ساختن {{label}} تازه', + dark: 'تاریک', + dashboard: 'پیشخوان', + delete: 'حذف', + deletedCountSuccessfully: 'تعداد {{count}} {{label}} با موفقیت پاک گردید.', + deletedSuccessfully: 'با موفقیت حذف شد.', + deleting: 'در حال حذف...', + descending: 'رو به پایین', + deselectAllRows: 'تمام سطرها را از انتخاب خارج کنید', + duplicate: 'تکراری', + duplicateWithoutSaving: 'رونوشت بدون ذخیره کردن تغییرات', + edit: 'نگارش', + editLabel: 'نگارش {{label}}', + editing: 'در حال نگارش', + editingLabel_many: 'در حال نگارش {{count}} از {{label}}', + editingLabel_one: 'در حال نگارش {{count}} از {{label}}', + editingLabel_other: 'در حال نگارش {{count}} از {{label}}', + email: 'رایانامه', + emailAddress: 'نشانی رایانامه', + enterAValue: 'یک مقدار وارد کنید', + error: 'خطا', + errors: 'خطاها', + fallbackToDefaultLocale: 'بازگردان پیشفرض زبان', + filter: 'علامت‌گذاری', + filterWhere: 'علامت گذاری کردن {{label}} جایی که', + filters: 'علامت‌گذاری‌ها', + globals: 'سراسری', + language: 'زبان', + lastModified: 'آخرین نگارش', + leaveAnyway: 'به هر حال ترک کن', + leaveWithoutSaving: 'ترک کردن بدون ذخیره', + light: 'روشن', + livePreview: 'پیش‌نمایش', + loading: 'در حال بارگذاری', + locale: 'زبان', + locales: 'زبان‌ها', + menu: 'منو', + moveDown: 'حرکت به پایین', + moveUp: 'حرکت به بالا', + newPassword: 'گذرواژه تازه', + noFiltersSet: 'هیچ علامت‌گذاری تنظیم نشده', + noLabel: '', + noOptions: 'بدون گزینه', + noResults: + 'هیچ {{label}} یافت نشد. {{label}} یا هنوز وجود ندارد یا هیچ کدام با علامت‌گذاری‌هایی که در بالا مشخص کرده اید مطابقت ندارد.', + noValue: 'بدون مقدار', + none: 'هیچ یک', + notFound: 'یافت نشد', + nothingFound: 'چیزی یافت نشد', + of: 'از', + open: 'باز کردن', + or: 'یا', + order: 'چیدمان', + pageNotFound: 'برگه یافت نشد', + password: 'گذرواژه', + payloadSettings: 'تنظیمات پی‌لود', + perPage: 'هر برگه: {{limit}}', + remove: 'برداشتن', + reset: 'بازنشانی', + row: 'ردیف', + rows: 'ردیف‌ها', + save: 'ذخیره', + saving: 'در حال ذخیره...', + searchBy: 'جستجو بر اساس {{label}}', + selectAll: 'انتخاب همه {{count}} {{label}}', + selectAllRows: 'انتخاب تمام سطرها', + selectValue: 'یک مقدار را انتخاب کنید', + selectedCount: '{{count}} {{label}} انتخاب شد', + showAllLabel: 'نمایش همه {{label}}', + sorryNotFound: 'متأسفانه چیزی برای مطابقت با درخواست شما وجود ندارد.', + sort: 'مرتب‌سازی', + sortByLabelDirection: 'مرتب کردن بر اساس {{label}} {{direction}}', + stayOnThisPage: 'ماندن در این برگه', + submissionSuccessful: 'با موفقیت ثبت شد.', + submit: 'فرستادن', + successfullyCreated: '{{label}} با موفقیت ساخته شد.', + successfullyDuplicated: '{{label}} با موفقیت رونوشت شد.', + thisLanguage: 'فارسی', + titleDeleted: '{{label}} "{{title}}" با موفقیت پاک شد.', + unauthorized: 'غیرمجاز', + unsavedChangesDuplicate: + 'شما تغییرات ذخیره نشده دارید. مطمئنید میخواهید به رونوشت ادامه دهید؟', + untitled: 'بدون عنوان', + updatedAt: 'بروز شده در', + updatedCountSuccessfully: 'تعداد {{count}} با عنوان {{label}} با موفقیت بروزرسانی شدند.', + updatedSuccessfully: 'با موفقیت به‌روز شد.', + updating: 'در حال به‌روزرسانی', + uploading: 'در حال بارگذاری', + user: 'کاربر', + users: 'کاربران', + value: 'مقدار', + welcome: 'خوش‌آمدید', + }, + operators: { + contains: 'شامل', + equals: 'برابر با', + exists: 'وجود دارد', + isGreaterThan: 'بزرگتر است از', + isGreaterThanOrEqualTo: 'بزرگتر یا مساوی است', + isIn: 'هست در', + isLessThan: 'کمتر است از', + isLessThanOrEqualTo: 'کمتر یا مساوی است', + isLike: 'مانند این است', + isNotEqualTo: 'برابر نیست', + isNotIn: 'در این نیست', + near: 'نزدیک', + }, + upload: { + crop: 'محصول', + cropToolDescription: + 'گوشه‌های منطقه انتخاب شده را بکشید، یک منطقه جدید رسم کنید یا مقادیر زیر را تنظیم کنید.', + dragAndDrop: 'یک سند را بکشید و رها کنید', + dragAndDropHere: 'یا یک سند را به اینجا بکشید و رها کنید', + editImage: 'ویرایش تصویر', + fileName: 'نام رسانه', + fileSize: 'حجم رسانه', + focalPoint: 'نقطه متمرکز', + focalPointDescription: + 'نقطه کانونی را مستقیماً روی پیش نمایش بکشید یا مقادیر زیر را تنظیم کنید.', + height: 'ارتفاع', + lessInfo: 'اطلاعات کمتر', + moreInfo: 'اطلاعات بیشتر', + previewSizes: 'اندازه های پیش نمایش', + selectCollectionToBrowse: 'یک مجموعه را برای مرور انتخاب کنید', + selectFile: 'برگزیدن رسانه', + setCropArea: 'تنظیم ناحیه برش', + setFocalPoint: 'تنظیم نقطه کانونی', + sizes: 'اندازه‌ها', + sizesFor: 'اندازه‌ها برای {{label}}', + width: 'پهنا', + }, + validation: { + emailAddress: 'لطفاً یک نشانی رایانامه معتبر وارد کنید.', + enterNumber: 'لطفاً یک شماره درست وارد کنید.', + fieldHasNo: 'این کادر شامل هیچ {{label}} نمی‌شود', + greaterThanMax: '{{value}} بیشتر از حداکثر مجاز برای {{label}} است که {{max}} است.', + invalidInput: 'این کادر دارای ورودی نامعتبر است.', + invalidSelection: 'این کادر دارای یک انتخاب نامعتبر است.', + invalidSelections: 'این کادر دارای انتخاب‌های نامعتبر زیر است:', + lessThanMin: '{{value}} کمتر از حداقل مجاز برای {{label}} است که {{min}} است.', + limitReached: 'محدودیت رسیده است، فقط {{max}} مورد می تواند اضافه شود.', + longerThanMin: 'ورودی باید بیش از حداقل {{minLength}} واژه باشد.', + notValidDate: '"{{value}}" یک تاریخ معتبر نیست.', + required: 'این کادر اجباری است.', + requiresAtLeast: 'این رشته حداقل نیازمند {{count}} {{label}}.', + requiresNoMoreThan: 'این رشته به بیش از {{count}} {{label}} نیاز دارد.', + requiresTwoNumbers: 'این کادر به دو عدد نیاز دارد.', + shorterThanMax: 'ورودی باید کمتر از {{maxLength}} واژه باشد.', + trueOrFalse: 'این کادر فقط می تواند به صورت true یا false باشد.', + validUploadID: 'این فیلد یک شناسه بارگذاری معتبر نیست.', + }, + version: { + type: 'تایپ کنید', + aboutToPublishSelection: + 'شما در حال انتشار همه {{label}} برگزیده هستید از این کار اطمینان دارید؟', + aboutToRestore: + 'شما در شرف بازیابی این هستید {{label}} سند به ایالتی که در آن بود {{versionDate}}.', + aboutToRestoreGlobal: 'شما در حال بازگردانی کلی {{label}} در این {{versionDate}} هستید.', + aboutToRevertToPublished: + 'شما در حال بازگردانی تغییرات این رسانه به وضعیت منتشر شده آن هستید. از این کار اطمینان دارید؟', + aboutToUnpublish: 'شما در حال لغو انتشار این سند هستید، آیا از این کار اطمینان دارید؟', + aboutToUnpublishSelection: + 'شما در شرف لغو انتشار {{label}} برگزیده هستید. ایا اطمینان دارید؟', + autosave: 'ذخیره خودکار', + autosavedSuccessfully: 'با موفقیت ذخیره خودکار شد.', + autosavedVersion: 'نگارش ذخیره شده خودکار', + changed: 'تغییر کرد', + compareVersion: 'مقایسه نگارش با:', + confirmPublish: 'تأیید انتشار', + confirmRevertToSaved: 'تأیید بازگردانی نگارش ذخیره شده', + confirmUnpublish: 'تأیید لغو انتشار', + confirmVersionRestoration: 'تأیید بازیابی نگارش', + currentDocumentStatus: 'جاری {{docStatus}} سند', + draft: 'پیش‌نویس', + draftSavedSuccessfully: 'پیش‌نویس با موفقیت ذخیره شد.', + lastSavedAgo: 'آخرین بار {{distance}} پیش ذخیره شد', + noFurtherVersionsFound: 'نگارش دیگری یافت نشد', + noRowsFound: 'هیچ {{label}} یافت نشد', + preview: 'پیش‌نمایش', + problemRestoringVersion: 'مشکلی در بازیابی این نگارش وجود دارد', + publish: 'انتشار', + publishChanges: 'انتشار تغییرات', + published: 'انتشار یافته', + publishing: 'انتشار', + restoreThisVersion: 'این نگارش را بازیابی کنید', + restoredSuccessfully: 'با موفقیت بازیابی شد.', + restoring: 'در حال بازیابی...', + revertToPublished: 'بازگردانی به انتشار یافته', + reverting: 'در حال بازگردانی...', + saveDraft: 'ذخیره پیش‌نویس', + selectLocales: 'زبان‌ها را برای نمایش انتخاب کنید', + selectVersionToCompare: 'نگارشی را برای مقایسه انتخاب کنید', + showLocales: 'نمایش زبان‌ها:', + showingVersionsFor: 'نمایش نگارش‌ها برای:', + status: 'وضعیت', + unpublish: 'لغو انتشار', + unpublishing: 'در حال لغو انتشار...', + version: 'نگارش', + versionCount_many: '{{count}} نگارش‌ یافت شد', + versionCount_none: 'هیچ نگارشی یافت نشد', + versionCount_one: '{{count}} نگارش یافت شد', + versionCount_other: '{{count}} نگارش یافت شد', + versionCreatedOn: '{{version}} ساخته شده در:', + versionID: 'شناسه نگارش', + versions: 'نگارش‌ها', + viewingVersion: 'در حال مشاهده نگارش برای {{entityLabel}} {{documentTitle}}', + viewingVersionGlobal: 'در حال مشاهده نگارش‌های کلی {{entityLabel}}', + viewingVersions: 'مشاهده نگارش‌ها برای {{entityLabel}} {{documentTitle}}', + viewingVersionsGlobal: 'مشاهده نگارش‌های کلی {{entityLabel}}', + }, }, } diff --git a/packages/translations/src/languages/fr.ts b/packages/translations/src/languages/fr.ts index 8e2c6fca23..547daa8a91 100644 --- a/packages/translations/src/languages/fr.ts +++ b/packages/translations/src/languages/fr.ts @@ -1,401 +1,406 @@ -export default { - authentication: { - account: 'Compte', - accountOfCurrentUser: "Compte de l'utilisateur actuel", - alreadyActivated: 'Déjà activé', - alreadyLoggedIn: 'Déjà connecté', - apiKey: 'Clé API', - backToLogin: 'Retour à la connexion', - beginCreateFirstUser: 'Pour commencer, créez votre premier utilisateur.', - changePassword: 'Changer le mot de passe', - checkYourEmailForPasswordReset: - 'Vérifiez votre e-mail, nous vous avons envoyé un lien qui vous permettra de réinitialiser votre mot de passe en toute sécurité.', - confirmGeneration: 'Confirmer la génération', - confirmPassword: 'Confirmez le mot de passe', - createFirstUser: 'Créer le premier utilisateur', - emailNotValid: "L'adresse e-mail fourni n'est pas valide", - emailSent: 'E-mail envoyé', - enableAPIKey: 'Activer la clé API', - failedToUnlock: 'Déverrouillage échoué', - forceUnlock: 'Forcer le déverrouillage', - forgotPassword: 'Mot de passe oublié', - forgotPasswordEmailInstructions: - 'Veuillez saisir votre e-mail ci-dessous. Vous recevrez un e-mail avec des instructions concernant comment réinitialiser votre mot de passe.', - forgotPasswordQuestion: 'Mot de passe oublié ?', - generate: 'Générer', - generateNewAPIKey: 'Générer une nouvelle clé API', - generatingNewAPIKeyWillInvalidate: - "La génération d'une nouvelle clé API <1>invalidera la clé précédente. Êtes-vous sûr de vouloir continuer ?", - lockUntil: "Verrouiller jusqu'à", - logBackIn: 'Se reconnecter', - logOut: 'Se déconnecter', - loggedIn: - "Pour vous connecter en tant qu'un autre utilisateur, vous devez d'abord vous <0>déconnecter.", - loggedInChangePassword: - 'Pour changer votre mot de passe, rendez-vous sur votre <0>compte puis modifiez-y votre mot de passe.', - loggedOutInactivity: "Vous avez été déconnecté pour cause d'inactivité.", - loggedOutSuccessfully: 'Vous avez été déconnecté avec succès.', - login: 'Se connecter', - loginAttempts: 'Tentatives de connexion', - loginUser: "Connecter l'utilisateur", - loginWithAnotherUser: - "Pour vous connecter en tant qu'un autre utilisateur, vous devez d'abord vous <0>déconnecter.", - logout: 'Se déconnecter', - logoutUser: "Déconnecter l'utilisateur", - newAPIKeyGenerated: 'Nouvelle clé API générée.', - newAccountCreated: - 'Un nouveau compte vient d\'être créé pour vous permettre d\'accéder {{serverURL}}. Veuillez cliquer sur le lien suivant ou collez l\'URL ci-dessous dans votre navigateur pour vérifier votre adresse e-mail: {{verificationURL}}
. Après avoir vérifié votre adresse e-mail, vous pourrez vous connecter avec succès.', - newPassword: 'Nouveau mot de passe', - resetPassword: 'Réinitialiser le mot de passe', - resetPasswordExpiration: "Réinitialiser l'expiration du mot de passe", - resetPasswordToken: 'Réinitialiser le jeton de mot de passe', - resetYourPassword: 'Réinitialisez votre mot de passe', - stayLoggedIn: 'Rester connecté', - successfullyUnlocked: 'Déverrouillé avec succès', - unableToVerify: 'Vérification échoué', - verified: 'Vérifié', - verifiedSuccessfully: 'Vérifié avec succès', - verify: 'Vérifier', - verifyUser: "Vérifier l'utilisateur", - verifyYourEmail: 'Vérifiez votre e-mail', - youAreInactive: - "Vous n'avez pas été actif depuis un moment alors vous serez bientôt automatiquement déconnecté pour votre propre sécurité. Souhaitez-vous rester connecté ?", - 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: { - accountAlreadyActivated: 'Ce compte a déjà été activé.', - autosaving: "Un problème est survenu lors de l'enregistrement automatique de ce document.", - correctInvalidFields: 'Veuillez corriger les champs invalides.', - deletingFile: "Une erreur s'est produite lors de la suppression du fichier.", - deletingTitle: - "Une erreur s'est produite lors de la suppression de {{title}}. Veuillez vérifier votre connexion puis réessayer.", - 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 :', - incorrectCollection: 'Collection incorrecte', - invalidFileType: 'Type de fichier invalide', - invalidFileTypeValue: 'Type de fichier invalide : {{value}}', - loadingDocument: - 'Un problème est survenu lors du chargement du document qui a pour identifiant {{id}}.', - missingEmail: 'E-mail manquant.', - missingIDOfDocument: "Il manque l'identifiant du document à mettre à jour.", - missingIDOfVersion: "Il manque l'identifiant de la version.", - missingRequiredData: 'Données requises manquantes.', - noFilesUploaded: "Aucun fichier n'a été téléversé.", - noMatchedField: 'Aucun champ correspondant n\'a été trouvé pour "{{label}}"', - noUser: 'Aucun utilisateur', - notAllowedToAccessPage: "Vous n'êtes pas autorisé à accéder à cette page.", - notAllowedToPerformAction: "Vous n'êtes pas autorisé à effectuer cette action.", - notFound: "La ressource demandée n'a pas été trouvée.", - previewing: "Un problème est survenu lors de l'aperçu de ce document.", - problemUploadingFile: 'Il y a eu un problème lors du téléversement du fichier.', - tokenInvalidOrExpired: "Le jeton n'est soit pas valide ou a expiré.", - unPublishingDocument: - "Un problème est survenu lors de l'annulation de la publication de ce document.", - 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.', - unknown: "Une erreur inconnue s'est produite.", - unspecific: 'Une erreur est survenue.', - userLocked: - "Cet utilisateur est verrouillé en raison d'un trop grand nombre de tentatives de connexion infructueuses.", - valueMustBeUnique: 'La valeur doit être unique', - verificationTokenInvalid: "Le jeton de vérification n'est pas valide.", - }, - fields: { - addLabel: 'Ajouter {{label}}', - addLink: 'Ajouter un Lien', - addNew: 'Ajouter nouveau ou nouvelle', - addNewLabel: 'Ajouter nouveau ou nouvelle {{label}}', - addRelationship: 'Ajouter une relation', - addUpload: 'Ajouter le téléchargement', - block: 'bloc', - blockType: 'Type de bloc', - blocks: 'blocs', - 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', - chooseFromExisting: 'Choisir parmi les existant(e)s', - chooseLabel: 'Choisir un(e) {{label}}', - collapseAll: 'Tout réduire', - customURL: 'URL personnalisée', - editLabelData: 'Modifier les données de ou du {{label}}', - editLink: 'Modifier le lien', - editRelationship: 'Modifier la relation', - enterURL: 'Entrez une URL', - internalLink: 'Lien interne', - itemsAndMore: '{{items}} et {{count}} de plus', - labelRelationship: 'Relation de ou du {{label}} ', - latitude: 'Latitude', - linkType: 'Type de lien', - linkedTo: 'Lié à <0>{{label}}', - longitude: 'Longitude', - newLabel: 'Nouveau ou nouvelle {{label}}', - openInNewTab: 'Ouvrir dans un nouvel onglet', - passwordsDoNotMatch: 'Les mots de passe ne correspondent pas.', - relatedDocument: 'Document connexe', - relationTo: 'Lié à', - removeRelationship: 'Supprimer la relation', - removeUpload: 'Supprimer le Téléversement', - saveChanges: 'Sauvegarder les modifications', - searchForBlock: 'Rechercher un bloc', - selectExistingLabel: 'Sélectionnez {{label}} existant', - selectFieldsToEdit: 'Sélectionnez les champs à modifier', - showAll: 'Afficher tout', - swapRelationship: 'Changer de relation', - swapUpload: 'Changer de Fichier', - textToDisplay: 'Texte à afficher', - toggleBlock: 'Bloc bascule', - uploadNewLabel: 'Téléverser un(e) nouveau ou nouvelle {{label}}', - }, - general: { - aboutToDelete: - 'Vous êtes sur le point de supprimer ce ou cette {{label}} <1>{{title}}. Êtes-vous sûr ?', - aboutToDeleteCount_many: 'Vous êtes sur le point de supprimer {{count}} {{label}}', - aboutToDeleteCount_one: 'Vous êtes sur le point de supprimer {{count}} {{label}}', - aboutToDeleteCount_other: 'Vous êtes sur le point de supprimer {{count}} {{label}}', - addBelow: 'Ajoutez ci-dessous', - addFilter: 'Ajouter un filtre', - adminTheme: "Thème d'administration", - and: 'Et', - applyChanges: 'Appliquer les modifications', - ascending: 'Ascendant', - automatic: 'Automatique', - backToDashboard: 'Retour au tableau de bord', - cancel: 'Annuler', - changesNotSaved: - "Vos modifications n'ont pas été enregistrées. Vous perdrez vos modifications si vous quittez maintenant.", - close: 'Fermer', - collapse: 'Réduire', - collections: 'Collections', - columnToSort: 'Colonne à trier', - columns: 'Colonnes', - confirm: 'Confirmer', - confirmDeletion: 'Confirmer la suppression', - confirmDuplication: 'Confirmer la duplication', - copied: 'Copié', - copy: 'Copie', - create: 'Créer', - createNew: 'Créer un(e) nouveau ou nouvelle', - createNewLabel: 'Créer un(e) nouveau ou nouvelle {{label}}', - created: 'Créé(e)', - createdAt: 'Créé(e) à', - creating: 'création en cours', - creatingNewLabel: "Création d'un(e) nouveau ou nouvelle {{label}}", - dark: 'Nuit', - dashboard: 'Tableau de bord', - delete: 'Supprimer', - deletedCountSuccessfully: '{{count}} {{label}} supprimé avec succès.', - deletedSuccessfully: 'Supprimé(e) avec succès.', - deleting: 'Suppression en cours...', - descending: 'Descendant(e)', - deselectAllRows: 'Désélectionner toutes les lignes', - duplicate: 'Dupliquer', - duplicateWithoutSaving: 'Dupliquer sans enregistrer les modifications', - edit: 'Éditer', - editLabel: 'Modifier {{label}}', - editing: 'Modification en cours', - editingLabel_many: 'Modification des {{count}} {{label}}', - editingLabel_one: 'Modification de {{count}} {{label}}', - editingLabel_other: 'Modification des {{count}} {{label}}', - email: 'E-mail', - emailAddress: 'Adresse e-mail', - enterAValue: 'Entrez une valeur', - error: 'Erreur', - errors: 'Erreurs', - fallbackToDefaultLocale: 'Retour à la locale par défaut', - filter: 'Filtrer', - filterWhere: 'Filtrer {{label}} où', - filters: 'Filtres', - globals: 'Globals(es)', - language: 'Langue', - lastModified: 'Dernière modification', - leaveAnyway: 'Quitter quand même', - leaveWithoutSaving: 'Quitter sans sauvegarder', - light: 'Lumière ou Jour', - livePreview: 'Aperçu', - loading: 'Chargement en cours', - locale: 'Paramètres régionaux', - locales: 'Paramètres régionaux', - menu: 'Menu', - moveDown: 'Déplacer vers le bas', - moveUp: 'Déplacer vers le haut', - newPassword: 'Nouveau mot de passe', - noFiltersSet: 'Aucun filtre défini', - noLabel: '', - noOptions: 'Aucune option', - noResults: - "Aucun(e) {{label}} trouvé(e). Soit aucun(e) {{label}} n'existe encore, soit aucun(e) ne correspond aux filtres que vous avez spécifiés ci-dessus", - noValue: 'Aucune valeur', - none: 'Aucun(e)', - notFound: 'Pas trouvé', - nothingFound: "Rien n'a été trouvé", - of: 'de', - open: 'Ouvrir', - or: 'ou', - order: 'Ordre', - pageNotFound: 'Page non trouvée', - password: 'Mot de passe', - payloadSettings: 'Paramètres de Payload', - perPage: 'Par Page: {{limit}}', - remove: 'Retirer', - reset: 'Réinitialiser', - row: 'Ligne', - rows: 'Lignes', - save: 'Sauvegarder', - saving: 'Sauvegarde en cours...', - searchBy: 'Rechercher par {{label}}', - selectAll: 'Tout sélectionner {{count}} {{label}}', - selectAllRows: 'Sélectionnez toutes les lignes', - selectValue: 'Sélectionnez une valeur', - selectedCount: '{{count}} {{label}} sélectionné', - showAllLabel: 'Afficher tous les {{label}}', - sorryNotFound: 'Désolé, rien ne correspond à votre demande.', - sort: 'Trier', - sortByLabelDirection: 'Trier par {{label}} {{direction}}', - stayOnThisPage: 'Rester sur cette page', - submissionSuccessful: 'Soumission réussie.', - submit: 'Soumettre', - successfullyCreated: '{{label}} créé(e) avec succès.', - successfullyDuplicated: '{{label}} dupliqué(e) avec succès.', - thisLanguage: 'Français', - titleDeleted: '{{label}} "{{title}}" supprimé(e) avec succès.', - unauthorized: 'Non autorisé', - unsavedChangesDuplicate: - 'Vous avez des changements non enregistrés. Souhaitez-vous continuer la duplication ?', - untitled: 'Sans titre', - updatedAt: 'Modifié le', - updatedCountSuccessfully: '{{count}} {{label}} mis à jour avec succès.', - updatedSuccessfully: 'Mis à jour avec succés.', - updating: 'Mise à jour', - uploading: 'Téléchargement', - user: 'Utilisateur', - users: 'Utilisateurs', - value: 'Valeur', - welcome: 'Bienvenu(e)', - }, - operators: { - contains: 'contient', - equals: 'est égal à', - exists: 'existe', - isGreaterThan: 'est supérieur à', - isGreaterThanOrEqualTo: 'est supérieur ou égal à', - isIn: 'est dans', - isLessThan: 'est inférieur à', - isLessThanOrEqualTo: 'est inférieur ou égal à', - isLike: 'est comme', - isNotEqualTo: "n'est pas égal à", - isNotIn: "n'est pas dans", - near: 'proche', - }, - upload: { - crop: 'Récolte', - cropToolDescription: - 'Faites glisser les coins de la zone sélectionnée, dessinez une nouvelle zone ou ajustez les valeurs ci-dessous.', - dragAndDrop: 'Glisser-déposer un fichier', - dragAndDropHere: 'ou glissez-déposez un fichier ici', - editImage: "Modifier l'image", - fileName: 'Nom du fichier', - fileSize: 'Taille du fichier', - focalPoint: 'Point focal', - focalPointDescription: - "Faites glisser le point focal directement sur l'aperçu ou ajustez les valeurs ci-dessous.", - height: 'Hauteur', - lessInfo: "Moins d'infos", - moreInfo: "Plus d'infos", - previewSizes: "Tailles d'aperçu", - selectCollectionToBrowse: 'Sélectionnez une collection à parcourir', - selectFile: 'Sélectionnez un fichier', - setCropArea: 'Définir la zone de recadrage', - setFocalPoint: 'Définir le point focal', - sizes: 'Tailles', - sizesFor: 'Tailles pour {{label}}', - 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.", - fieldHasNo: "Ce champ n'a pas de {{label}}", - 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}}.', - limitReached: 'Limite atteinte, seulement {{max}} éléments peuvent être ajoutés.', - 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.', - requiresAtLeast: 'Ce champ doit avoir au moins {{count}} {{label}}.', - 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: { - aboutToPublishSelection: - 'Vous êtes sur le point de publier tous les {{label}} de la sélection. Es-tu sûr?', - aboutToRestore: - "Vous êtes sur le point de restaurer le document {{label}} à l'état où il se trouvait le {{versionDate}}.", - aboutToRestoreGlobal: - "Vous êtes sur le point de restaurer le ou la {{label}} global(e) à l'état où il ou elle se trouvait le {{versionDate}}.", - aboutToRevertToPublished: - 'Vous êtes sur le point de rétablir les modifications apportées à ce document à la version publiée. Êtes-vous sûr ?', - aboutToUnpublish: - "Vous êtes sur le point d'annuler la publication de ce document. Êtes-vous sûr ?", - aboutToUnpublishSelection: - 'Vous êtes sur le point de dépublier tous les {{label}} de la sélection. Es-tu sûr?', - autosave: 'Enregistrement automatique', - autosavedSuccessfully: 'Enregistrement automatique réussi.', - autosavedVersion: 'Version enregistrée automatiquement', - changed: 'Modifié', - compareVersion: 'Comparez cette version à :', - confirmPublish: 'Confirmer la publication', - confirmRevertToSaved: 'Confirmer la restauration', - confirmUnpublish: "Confirmer l'annulation", - confirmVersionRestoration: 'Confirmer la restauration de la version', - currentDocumentStatus: 'Document {{docStatus}} actuel', - draft: 'Brouillon', - draftSavedSuccessfully: 'Brouillon enregistré avec succès.', - lastSavedAgo: 'Dernière sauvegarde il y a {{distance}}', - noFurtherVersionsFound: 'Aucune autre version trouvée', - noRowsFound: 'Aucun(e) {{label}} trouvé(e)', - preview: 'Aperçu', - problemRestoringVersion: 'Un problème est survenu lors de la restauration de cette version', - publish: 'Publier', - publishChanges: 'Publier les modifications', - published: 'Publié', - publishing: 'Publication', - restoreThisVersion: 'Restaurer cette version', - restoredSuccessfully: 'Restauré(e) avec succès.', - restoring: 'Restauration en cours...', - revertToPublished: 'Republier', - reverting: 'Republication en cours...', - saveDraft: 'Enregistrer le brouillon', - selectLocales: 'Sélectionnez les paramètres régionaux à afficher', - selectVersionToCompare: 'Sélectionnez une version à comparer', - showLocales: 'Afficher les paramètres régionaux :', - showingVersionsFor: 'Affichage des versions pour :', - status: 'Statut', - type: 'Type', - unpublish: 'Annuler la publication', - unpublishing: 'Annulation en cours...', - version: 'Version', - versionCount_many: '{{count}} versions trouvées', - versionCount_none: 'Aucune version trouvée', - versionCount_one: '{{count}} version trouvée', - versionCount_other: '{{count}} versions trouvées', - versionCreatedOn: '{{version}} créé(e) le :', - versionID: 'Identifiant de la version', - versions: 'Versions', - viewingVersion: 'Affichage de la version de ou du {{entityLabel}} {{documentTitle}}', - viewingVersionGlobal: 'Affichage de la version globale de ou du {{entityLabel}}', - viewingVersions: 'Affichage des versions de ou du {{entityLabel}} {{documentTitle}}', - viewingVersionsGlobal: 'Affichage des versions globales de ou du {{entityLabel}}', +import type { Language } from '../types.js' + +export const fr: Language = { + dateFNSKey: 'fr', + translations: { + authentication: { + account: 'Compte', + accountOfCurrentUser: "Compte de l'utilisateur actuel", + alreadyActivated: 'Déjà activé', + alreadyLoggedIn: 'Déjà connecté', + apiKey: 'Clé API', + backToLogin: 'Retour à la connexion', + beginCreateFirstUser: 'Pour commencer, créez votre premier utilisateur.', + changePassword: 'Changer le mot de passe', + checkYourEmailForPasswordReset: + 'Vérifiez votre e-mail, nous vous avons envoyé un lien qui vous permettra de réinitialiser votre mot de passe en toute sécurité.', + confirmGeneration: 'Confirmer la génération', + confirmPassword: 'Confirmez le mot de passe', + createFirstUser: 'Créer le premier utilisateur', + emailNotValid: "L'adresse e-mail fourni n'est pas valide", + emailSent: 'E-mail envoyé', + enableAPIKey: 'Activer la clé API', + failedToUnlock: 'Déverrouillage échoué', + forceUnlock: 'Forcer le déverrouillage', + forgotPassword: 'Mot de passe oublié', + forgotPasswordEmailInstructions: + 'Veuillez saisir votre e-mail ci-dessous. Vous recevrez un e-mail avec des instructions concernant comment réinitialiser votre mot de passe.', + forgotPasswordQuestion: 'Mot de passe oublié ?', + generate: 'Générer', + generateNewAPIKey: 'Générer une nouvelle clé API', + generatingNewAPIKeyWillInvalidate: + "La génération d'une nouvelle clé API <1>invalidera la clé précédente. Êtes-vous sûr de vouloir continuer ?", + lockUntil: "Verrouiller jusqu'à", + logBackIn: 'Se reconnecter', + logOut: 'Se déconnecter', + loggedIn: + "Pour vous connecter en tant qu'un autre utilisateur, vous devez d'abord vous <0>déconnecter.", + loggedInChangePassword: + 'Pour changer votre mot de passe, rendez-vous sur votre <0>compte puis modifiez-y votre mot de passe.', + loggedOutInactivity: "Vous avez été déconnecté pour cause d'inactivité.", + loggedOutSuccessfully: 'Vous avez été déconnecté avec succès.', + login: 'Se connecter', + loginAttempts: 'Tentatives de connexion', + loginUser: "Connecter l'utilisateur", + loginWithAnotherUser: + "Pour vous connecter en tant qu'un autre utilisateur, vous devez d'abord vous <0>déconnecter.", + logout: 'Se déconnecter', + logoutUser: "Déconnecter l'utilisateur", + newAPIKeyGenerated: 'Nouvelle clé API générée.', + newAccountCreated: + 'Un nouveau compte vient d\'être créé pour vous permettre d\'accéder {{serverURL}}. Veuillez cliquer sur le lien suivant ou collez l\'URL ci-dessous dans votre navigateur pour vérifier votre adresse e-mail: {{verificationURL}}
. Après avoir vérifié votre adresse e-mail, vous pourrez vous connecter avec succès.', + newPassword: 'Nouveau mot de passe', + resetPassword: 'Réinitialiser le mot de passe', + resetPasswordExpiration: "Réinitialiser l'expiration du mot de passe", + resetPasswordToken: 'Réinitialiser le jeton de mot de passe', + resetYourPassword: 'Réinitialisez votre mot de passe', + stayLoggedIn: 'Rester connecté', + successfullyUnlocked: 'Déverrouillé avec succès', + unableToVerify: 'Vérification échoué', + verified: 'Vérifié', + verifiedSuccessfully: 'Vérifié avec succès', + verify: 'Vérifier', + verifyUser: "Vérifier l'utilisateur", + verifyYourEmail: 'Vérifiez votre e-mail', + youAreInactive: + "Vous n'avez pas été actif depuis un moment alors vous serez bientôt automatiquement déconnecté pour votre propre sécurité. Souhaitez-vous rester connecté ?", + 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: { + accountAlreadyActivated: 'Ce compte a déjà été activé.', + autosaving: "Un problème est survenu lors de l'enregistrement automatique de ce document.", + correctInvalidFields: 'Veuillez corriger les champs invalides.', + deletingFile: "Une erreur s'est produite lors de la suppression du fichier.", + deletingTitle: + "Une erreur s'est produite lors de la suppression de {{title}}. Veuillez vérifier votre connexion puis réessayer.", + 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 :', + incorrectCollection: 'Collection incorrecte', + invalidFileType: 'Type de fichier invalide', + invalidFileTypeValue: 'Type de fichier invalide : {{value}}', + loadingDocument: + 'Un problème est survenu lors du chargement du document qui a pour identifiant {{id}}.', + missingEmail: 'E-mail manquant.', + missingIDOfDocument: "Il manque l'identifiant du document à mettre à jour.", + missingIDOfVersion: "Il manque l'identifiant de la version.", + missingRequiredData: 'Données requises manquantes.', + noFilesUploaded: "Aucun fichier n'a été téléversé.", + noMatchedField: 'Aucun champ correspondant n\'a été trouvé pour "{{label}}"', + noUser: 'Aucun utilisateur', + notAllowedToAccessPage: "Vous n'êtes pas autorisé à accéder à cette page.", + notAllowedToPerformAction: "Vous n'êtes pas autorisé à effectuer cette action.", + notFound: "La ressource demandée n'a pas été trouvée.", + previewing: "Un problème est survenu lors de l'aperçu de ce document.", + problemUploadingFile: 'Il y a eu un problème lors du téléversement du fichier.', + tokenInvalidOrExpired: "Le jeton n'est soit pas valide ou a expiré.", + unPublishingDocument: + "Un problème est survenu lors de l'annulation de la publication de ce document.", + 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.', + unknown: "Une erreur inconnue s'est produite.", + unspecific: 'Une erreur est survenue.', + userLocked: + "Cet utilisateur est verrouillé en raison d'un trop grand nombre de tentatives de connexion infructueuses.", + valueMustBeUnique: 'La valeur doit être unique', + verificationTokenInvalid: "Le jeton de vérification n'est pas valide.", + }, + fields: { + addLabel: 'Ajouter {{label}}', + addLink: 'Ajouter un Lien', + addNew: 'Ajouter nouveau ou nouvelle', + addNewLabel: 'Ajouter nouveau ou nouvelle {{label}}', + addRelationship: 'Ajouter une relation', + addUpload: 'Ajouter le téléchargement', + block: 'bloc', + blockType: 'Type de bloc', + blocks: 'blocs', + 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', + chooseFromExisting: 'Choisir parmi les existant(e)s', + chooseLabel: 'Choisir un(e) {{label}}', + collapseAll: 'Tout réduire', + customURL: 'URL personnalisée', + editLabelData: 'Modifier les données de ou du {{label}}', + editLink: 'Modifier le lien', + editRelationship: 'Modifier la relation', + enterURL: 'Entrez une URL', + internalLink: 'Lien interne', + itemsAndMore: '{{items}} et {{count}} de plus', + labelRelationship: 'Relation de ou du {{label}} ', + latitude: 'Latitude', + linkType: 'Type de lien', + linkedTo: 'Lié à <0>{{label}}', + longitude: 'Longitude', + newLabel: 'Nouveau ou nouvelle {{label}}', + openInNewTab: 'Ouvrir dans un nouvel onglet', + passwordsDoNotMatch: 'Les mots de passe ne correspondent pas.', + relatedDocument: 'Document connexe', + relationTo: 'Lié à', + removeRelationship: 'Supprimer la relation', + removeUpload: 'Supprimer le Téléversement', + saveChanges: 'Sauvegarder les modifications', + searchForBlock: 'Rechercher un bloc', + selectExistingLabel: 'Sélectionnez {{label}} existant', + selectFieldsToEdit: 'Sélectionnez les champs à modifier', + showAll: 'Afficher tout', + swapRelationship: 'Changer de relation', + swapUpload: 'Changer de Fichier', + textToDisplay: 'Texte à afficher', + toggleBlock: 'Bloc bascule', + uploadNewLabel: 'Téléverser un(e) nouveau ou nouvelle {{label}}', + }, + general: { + aboutToDelete: + 'Vous êtes sur le point de supprimer ce ou cette {{label}} <1>{{title}}. Êtes-vous sûr ?', + aboutToDeleteCount_many: 'Vous êtes sur le point de supprimer {{count}} {{label}}', + aboutToDeleteCount_one: 'Vous êtes sur le point de supprimer {{count}} {{label}}', + aboutToDeleteCount_other: 'Vous êtes sur le point de supprimer {{count}} {{label}}', + addBelow: 'Ajoutez ci-dessous', + addFilter: 'Ajouter un filtre', + adminTheme: "Thème d'administration", + and: 'Et', + applyChanges: 'Appliquer les modifications', + ascending: 'Ascendant', + automatic: 'Automatique', + backToDashboard: 'Retour au tableau de bord', + cancel: 'Annuler', + changesNotSaved: + "Vos modifications n'ont pas été enregistrées. Vous perdrez vos modifications si vous quittez maintenant.", + close: 'Fermer', + collapse: 'Réduire', + collections: 'Collections', + columnToSort: 'Colonne à trier', + columns: 'Colonnes', + confirm: 'Confirmer', + confirmDeletion: 'Confirmer la suppression', + confirmDuplication: 'Confirmer la duplication', + copied: 'Copié', + copy: 'Copie', + create: 'Créer', + createNew: 'Créer un(e) nouveau ou nouvelle', + createNewLabel: 'Créer un(e) nouveau ou nouvelle {{label}}', + created: 'Créé(e)', + createdAt: 'Créé(e) à', + creating: 'création en cours', + creatingNewLabel: "Création d'un(e) nouveau ou nouvelle {{label}}", + dark: 'Nuit', + dashboard: 'Tableau de bord', + delete: 'Supprimer', + deletedCountSuccessfully: '{{count}} {{label}} supprimé avec succès.', + deletedSuccessfully: 'Supprimé(e) avec succès.', + deleting: 'Suppression en cours...', + descending: 'Descendant(e)', + deselectAllRows: 'Désélectionner toutes les lignes', + duplicate: 'Dupliquer', + duplicateWithoutSaving: 'Dupliquer sans enregistrer les modifications', + edit: 'Éditer', + editLabel: 'Modifier {{label}}', + editing: 'Modification en cours', + editingLabel_many: 'Modification des {{count}} {{label}}', + editingLabel_one: 'Modification de {{count}} {{label}}', + editingLabel_other: 'Modification des {{count}} {{label}}', + email: 'E-mail', + emailAddress: 'Adresse e-mail', + enterAValue: 'Entrez une valeur', + error: 'Erreur', + errors: 'Erreurs', + fallbackToDefaultLocale: 'Retour à la locale par défaut', + filter: 'Filtrer', + filterWhere: 'Filtrer {{label}} où', + filters: 'Filtres', + globals: 'Globals(es)', + language: 'Langue', + lastModified: 'Dernière modification', + leaveAnyway: 'Quitter quand même', + leaveWithoutSaving: 'Quitter sans sauvegarder', + light: 'Lumière ou Jour', + livePreview: 'Aperçu', + loading: 'Chargement en cours', + locale: 'Paramètres régionaux', + locales: 'Paramètres régionaux', + menu: 'Menu', + moveDown: 'Déplacer vers le bas', + moveUp: 'Déplacer vers le haut', + newPassword: 'Nouveau mot de passe', + noFiltersSet: 'Aucun filtre défini', + noLabel: '', + noOptions: 'Aucune option', + noResults: + "Aucun(e) {{label}} trouvé(e). Soit aucun(e) {{label}} n'existe encore, soit aucun(e) ne correspond aux filtres que vous avez spécifiés ci-dessus", + noValue: 'Aucune valeur', + none: 'Aucun(e)', + notFound: 'Pas trouvé', + nothingFound: "Rien n'a été trouvé", + of: 'de', + open: 'Ouvrir', + or: 'ou', + order: 'Ordre', + pageNotFound: 'Page non trouvée', + password: 'Mot de passe', + payloadSettings: 'Paramètres de Payload', + perPage: 'Par Page: {{limit}}', + remove: 'Retirer', + reset: 'Réinitialiser', + row: 'Ligne', + rows: 'Lignes', + save: 'Sauvegarder', + saving: 'Sauvegarde en cours...', + searchBy: 'Rechercher par {{label}}', + selectAll: 'Tout sélectionner {{count}} {{label}}', + selectAllRows: 'Sélectionnez toutes les lignes', + selectValue: 'Sélectionnez une valeur', + selectedCount: '{{count}} {{label}} sélectionné', + showAllLabel: 'Afficher tous les {{label}}', + sorryNotFound: 'Désolé, rien ne correspond à votre demande.', + sort: 'Trier', + sortByLabelDirection: 'Trier par {{label}} {{direction}}', + stayOnThisPage: 'Rester sur cette page', + submissionSuccessful: 'Soumission réussie.', + submit: 'Soumettre', + successfullyCreated: '{{label}} créé(e) avec succès.', + successfullyDuplicated: '{{label}} dupliqué(e) avec succès.', + thisLanguage: 'Français', + titleDeleted: '{{label}} "{{title}}" supprimé(e) avec succès.', + unauthorized: 'Non autorisé', + unsavedChangesDuplicate: + 'Vous avez des changements non enregistrés. Souhaitez-vous continuer la duplication ?', + untitled: 'Sans titre', + updatedAt: 'Modifié le', + updatedCountSuccessfully: '{{count}} {{label}} mis à jour avec succès.', + updatedSuccessfully: 'Mis à jour avec succés.', + updating: 'Mise à jour', + uploading: 'Téléchargement', + user: 'Utilisateur', + users: 'Utilisateurs', + value: 'Valeur', + welcome: 'Bienvenu(e)', + }, + operators: { + contains: 'contient', + equals: 'est égal à', + exists: 'existe', + isGreaterThan: 'est supérieur à', + isGreaterThanOrEqualTo: 'est supérieur ou égal à', + isIn: 'est dans', + isLessThan: 'est inférieur à', + isLessThanOrEqualTo: 'est inférieur ou égal à', + isLike: 'est comme', + isNotEqualTo: "n'est pas égal à", + isNotIn: "n'est pas dans", + near: 'proche', + }, + upload: { + crop: 'Récolte', + cropToolDescription: + 'Faites glisser les coins de la zone sélectionnée, dessinez une nouvelle zone ou ajustez les valeurs ci-dessous.', + dragAndDrop: 'Glisser-déposer un fichier', + dragAndDropHere: 'ou glissez-déposez un fichier ici', + editImage: "Modifier l'image", + fileName: 'Nom du fichier', + fileSize: 'Taille du fichier', + focalPoint: 'Point focal', + focalPointDescription: + "Faites glisser le point focal directement sur l'aperçu ou ajustez les valeurs ci-dessous.", + height: 'Hauteur', + lessInfo: "Moins d'infos", + moreInfo: "Plus d'infos", + previewSizes: "Tailles d'aperçu", + selectCollectionToBrowse: 'Sélectionnez une collection à parcourir', + selectFile: 'Sélectionnez un fichier', + setCropArea: 'Définir la zone de recadrage', + setFocalPoint: 'Définir le point focal', + sizes: 'Tailles', + sizesFor: 'Tailles pour {{label}}', + 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.", + fieldHasNo: "Ce champ n'a pas de {{label}}", + 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}}.', + limitReached: 'Limite atteinte, seulement {{max}} éléments peuvent être ajoutés.', + 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.', + requiresAtLeast: 'Ce champ doit avoir au moins {{count}} {{label}}.', + 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: { + type: 'Type', + aboutToPublishSelection: + 'Vous êtes sur le point de publier tous les {{label}} de la sélection. Es-tu sûr?', + aboutToRestore: + "Vous êtes sur le point de restaurer le document {{label}} à l'état où il se trouvait le {{versionDate}}.", + aboutToRestoreGlobal: + "Vous êtes sur le point de restaurer le ou la {{label}} global(e) à l'état où il ou elle se trouvait le {{versionDate}}.", + aboutToRevertToPublished: + 'Vous êtes sur le point de rétablir les modifications apportées à ce document à la version publiée. Êtes-vous sûr ?', + aboutToUnpublish: + "Vous êtes sur le point d'annuler la publication de ce document. Êtes-vous sûr ?", + aboutToUnpublishSelection: + 'Vous êtes sur le point de dépublier tous les {{label}} de la sélection. Es-tu sûr?', + autosave: 'Enregistrement automatique', + autosavedSuccessfully: 'Enregistrement automatique réussi.', + autosavedVersion: 'Version enregistrée automatiquement', + changed: 'Modifié', + compareVersion: 'Comparez cette version à :', + confirmPublish: 'Confirmer la publication', + confirmRevertToSaved: 'Confirmer la restauration', + confirmUnpublish: "Confirmer l'annulation", + confirmVersionRestoration: 'Confirmer la restauration de la version', + currentDocumentStatus: 'Document {{docStatus}} actuel', + draft: 'Brouillon', + draftSavedSuccessfully: 'Brouillon enregistré avec succès.', + lastSavedAgo: 'Dernière sauvegarde il y a {{distance}}', + noFurtherVersionsFound: 'Aucune autre version trouvée', + noRowsFound: 'Aucun(e) {{label}} trouvé(e)', + preview: 'Aperçu', + problemRestoringVersion: 'Un problème est survenu lors de la restauration de cette version', + publish: 'Publier', + publishChanges: 'Publier les modifications', + published: 'Publié', + publishing: 'Publication', + restoreThisVersion: 'Restaurer cette version', + restoredSuccessfully: 'Restauré(e) avec succès.', + restoring: 'Restauration en cours...', + revertToPublished: 'Republier', + reverting: 'Republication en cours...', + saveDraft: 'Enregistrer le brouillon', + selectLocales: 'Sélectionnez les paramètres régionaux à afficher', + selectVersionToCompare: 'Sélectionnez une version à comparer', + showLocales: 'Afficher les paramètres régionaux :', + showingVersionsFor: 'Affichage des versions pour :', + status: 'Statut', + unpublish: 'Annuler la publication', + unpublishing: 'Annulation en cours...', + version: 'Version', + versionCount_many: '{{count}} versions trouvées', + versionCount_none: 'Aucune version trouvée', + versionCount_one: '{{count}} version trouvée', + versionCount_other: '{{count}} versions trouvées', + versionCreatedOn: '{{version}} créé(e) le :', + versionID: 'Identifiant de la version', + versions: 'Versions', + viewingVersion: 'Affichage de la version de ou du {{entityLabel}} {{documentTitle}}', + viewingVersionGlobal: 'Affichage de la version globale de ou du {{entityLabel}}', + viewingVersions: 'Affichage des versions de ou du {{entityLabel}} {{documentTitle}}', + viewingVersionsGlobal: 'Affichage des versions globales de ou du {{entityLabel}}', + }, }, } diff --git a/packages/translations/src/languages/hr.ts b/packages/translations/src/languages/hr.ts index eee54265e7..ecee035662 100644 --- a/packages/translations/src/languages/hr.ts +++ b/packages/translations/src/languages/hr.ts @@ -1,388 +1,395 @@ -export default { - authentication: { - account: 'Račun', - accountOfCurrentUser: 'Račun od trenutnog korisnika', - alreadyActivated: 'Već aktivirano', - alreadyLoggedIn: 'Već prijavljen', - apiKey: 'API ključ', - backToLogin: 'Nazad na prijavu', - beginCreateFirstUser: 'Za početak, kreiraj svog prvog korisnika.', - changePassword: 'Promjeni lozinku', - checkYourEmailForPasswordReset: - 'Provjerite email s poveznicom koja će Vam omogućiti sigurnu promjenu lozinke.', - confirmGeneration: 'Potvrdi kreiranje', - confirmPassword: 'Potvrdi lozinku', - createFirstUser: 'Kreiraj prvog korisnika', - emailNotValid: 'Email nije ispravan', - emailSent: 'Email poslan', - enableAPIKey: 'Omogući API ključ', - failedToUnlock: 'Neuspješno otključavanje.', - forceUnlock: 'Prisilno otključaj', - forgotPassword: 'Zaboravljena lozinka', - forgotPasswordEmailInstructions: - 'Molim unesite svoj email. Primit ćete poruku s uputama za ponovno postavljanje lozinke.', - forgotPasswordQuestion: 'Zaboravljena lozinka?', - generate: 'Generiraj', - generateNewAPIKey: 'Generiraj novi API ključ', - generatingNewAPIKeyWillInvalidate: - 'Generiranje novog API ključa će <1>poništiti prethodni ključ. Jeste li sigurni da želite nastaviti?', - lockUntil: 'Zaključaj dok', - logBackIn: 'Ponovna prijava', - logOut: 'Odjava', - loggedIn: 'Za prijavu s drugim korisničkim računom potrebno je prvo <0>odjaviti se', - loggedInChangePassword: - 'Da biste promijenili lozinku, otvorite svoj <0>račun i promijenite lozinku tamo.', - loggedOutInactivity: 'Odjavljeni se zbog neaktivnosti.', - loggedOutSuccessfully: 'Uspješno ste odjavljeni..', - login: 'Prijava', - loginAttempts: 'Pokušaji prijave', - loginUser: 'Prijava korisnika', - loginWithAnotherUser: - 'Za prijavu s drugim korisničkim računom potrebno je prvo <0>odjaviti se', - logout: 'Odjava', - logoutUser: 'Odjava korisnika', - newAPIKeyGenerated: 'Novi API ključ generiran.', - newAccountCreated: - 'Novi račun je kreiran. Pristupite računu klikom na {{serverURL}}. Molim kliknite na sljedeći link ili zalijepite URL, koji se nalazi ispod, u preglednik da biste potvrdili svoj email: {{verificationURL}}
Nakon što potvrdite email, moći ćete se prijaviti.', - newPassword: 'Nova lozinka', - resetPassword: 'Restartiranje lozinke', - resetPasswordExpiration: 'Restartiranje roka trajanja lozinke', - resetPasswordToken: 'Restartiranje lozinke tokena', - resetYourPassword: 'Restartiraj svoju lozinku', - stayLoggedIn: 'Ostani prijavljen', - successfullyUnlocked: 'Uspješno otključano', - unableToVerify: 'Nije moguće potvrditi', - verified: 'Potvrđeno', - verifiedSuccessfully: 'Uspješno potvrđeno', - verify: 'Potvrdi', - verifyUser: 'Potvrdi korisnika', - verifyYourEmail: 'Potvrdi svoj email', - youAreInactive: - 'Neaktivni ste neko vrijeme i uskoro ćete biti automatski odjavljeni zbog vlastite sigurnosti. Želite li ostati prijavljeni?', - youAreReceivingResetPassword: - 'Primili ste ovo jer ste Vi (ili netko drugi) zatražili promjenu lozinke za Vaš račun. Molim kliknite na poveznicu ili zalijepite ovo u svoje preglednik da biste završili proces:', - youDidNotRequestPassword: - 'Ako niste zatražili ovo, molim ignorirajte ovaj email i Vaša lozinka ostat će nepromijenjena.', - }, - error: { - accountAlreadyActivated: 'Ovaj račun je već aktiviran.', - autosaving: 'Nastao je problem pri automatskom spremanju ovog dokumenta.', - correctInvalidFields: 'Molim ispravite nevaljana polja.', - deletingFile: 'Dogodila se pogreška pri brisanju datoteke.', - deletingTitle: - 'Dogodila se pogreška pri brisanju {{title}}. Molim provjerite svoju internetsku vezu i pokušajte ponovno.', - emailOrPasswordIncorrect: 'Email ili lozinka netočni.', - followingFieldsInvalid_one: ' Ovo polje je nevaljano:', - followingFieldsInvalid_other: 'Ova polja su nevaljana:', - incorrectCollection: 'Nevaljana kolekcija', - invalidFileType: 'Nevaljan tip datoteke', - invalidFileTypeValue: 'Nevaljan tip datoteke: {{value}}', - loadingDocument: 'Pojavio se problem pri učitavanju dokumenta čiji je ID {{id}}.', - missingEmail: 'Nedostaje email.', - missingIDOfDocument: 'Nedostaje ID dokumenta da bi se ažurirao.', - missingIDOfVersion: 'Nedostaje ID verzije.', - missingRequiredData: 'Nedostaju obvezni podaci.', - noFilesUploaded: 'Nijedna datoteka nije učitana.', - noMatchedField: 'Nema podudarajućih polja za "{{label}}"', - noUser: 'Nema korisnika', - notAllowedToAccessPage: 'Nemate dopuštenje pristupiti ovoj stranici.', - notAllowedToPerformAction: 'Nemate dopuštenje izvršiti ovu radnju.', - notFound: 'Traženi resurs nije pronađen.', - previewing: 'Pojavio se problem pri pregledavanju ovog dokumenta.', - problemUploadingFile: 'Pojavio se problem pri učitavanju datoteke.', - tokenInvalidOrExpired: 'Token je nevaljan ili je istekao.', - unPublishingDocument: 'Pojavio se problem pri poništavanju objave ovog dokumenta.', - unableToDeleteCount: 'Nije moguće izbrisati {{count}} od {{total}} {{label}}.', - unableToUpdateCount: 'Nije moguće ažurirati {{count}} od {{total}} {{label}}.', - unauthorized: 'Neovlašten, morate biti prijavljeni da biste uputili ovaj zahtjev.', - unknown: 'Došlo je do nepoznate pogreške.', - unspecific: 'Došlo je do pogreške.', - userLocked: 'Ovaj korisnik je zaključan zbog previše neuspješnih pokušaja prijave.', - valueMustBeUnique: 'Vrijednost mora biti jedinstvena.', - verificationTokenInvalid: 'Verifikacijski token je nevaljan.', - }, - fields: { - addLabel: 'Dodaj {{label}}', - addLink: 'Dodaj poveznicu', - addNew: 'Dodaj novi', - addNewLabel: 'Dodaj novi {{label}}', - addRelationship: 'Dodaj odnos', - addUpload: 'Dodaj učitavanje', - block: 'blokiranje', - blockType: 'Vrsta blokiranja', - blocks: 'blokiranja', - chooseBetweenCustomTextOrDocument: - 'Izaberite između unošenja prilagođenog teksta URL ili poveznice na drugi dokument.', - chooseDocumentToLink: 'Odaberite dokument koji želite povezati.', - chooseFromExisting: 'Odaberite iz postojećih.', - chooseLabel: 'Odaberite {{label}}', - collapseAll: 'Sažmi sve', - customURL: 'Prilagođeni URL', - editLabelData: 'Uredi {{label}} podatke', - editLink: 'Uredi poveznicu', - editRelationship: 'Uredi odnos', - enterURL: 'Unesi URL', - internalLink: 'Interna poveznika', - itemsAndMore: '{{items}} i {{count}} više', - labelRelationship: '{{label}} veza', - latitude: 'Zemljopisna širina', - linkType: 'Tip poveznce', - linkedTo: 'Povezabi sa <0>{{label}}', - longitude: 'Zemljopisna dužina', - newLabel: 'Novo {{label}}', - openInNewTab: 'Otvori u novoj kartici.', - passwordsDoNotMatch: 'Lozinke nisu iste.', - relatedDocument: 'Povezani dokument', - relationTo: 'Veza sa', - removeRelationship: 'Ukloni vezu', - removeUpload: 'Ukloni prijenos', - saveChanges: 'Spremi promjene', - searchForBlock: 'Potraži blok', - selectExistingLabel: 'Odaberi postojeće{{label}}', - selectFieldsToEdit: 'Odaberite polja za uređivanje', - showAll: 'Pokaži sve', - swapRelationship: 'Zamijeni vezu', - swapUpload: 'Zamijeni prijenos', - textToDisplay: 'Tekst za prikaz', - toggleBlock: 'Prebaci blok', - uploadNewLabel: 'Učitaj novi {{label}}', - }, - general: { - aboutToDelete: 'Izbrisat ćete {{label}} <1>{{title}}. Jeste li sigurni?', - aboutToDeleteCount_many: 'Upravo ćete izbrisati {{count}} {{label}}', - aboutToDeleteCount_one: 'Upravo ćete izbrisati {{count}} {{label}}', - aboutToDeleteCount_other: 'Upravo ćete izbrisati {{count}} {{label}}', - addBelow: 'Dodaj ispod', - addFilter: 'Dodaj filter', - adminTheme: 'Administratorska tema', - and: 'I', - applyChanges: 'Primijeni promjene', - ascending: 'Uzlazno', - automatic: 'Automatsko', - backToDashboard: 'Natrag na nadzornu ploču', - cancel: 'Otkaži', - changesNotSaved: 'Vaše promjene nisu spremljene. Ako izađete sada, izgubit ćete promjene.', - close: 'Zatvori', - collapse: 'Sažmi', - collections: 'Kolekcije', - columnToSort: 'Stupac za sortiranje', - columns: 'Stupci', - confirm: 'Potvrdi', - confirmDeletion: 'Potvrdi brisanje', - confirmDuplication: 'Potvrdi duplikaciju', - copied: 'Kopirano', - copy: 'Kopiraj', - create: 'Kreiraj', - createNew: 'Kreiraj novo', - createNewLabel: 'Kreiraj novo {{label}}', - created: 'Kreirano', - createdAt: 'Kreirano u', - creating: 'Kreira se', - creatingNewLabel: 'Kreiranje novog {{label}}', - dark: 'Tamno', - dashboard: 'Nadzorna ploča', - delete: 'Obriši', - deletedCountSuccessfully: 'Uspješno izbrisano {{count}} {{label}}.', - deletedSuccessfully: 'Uspješno obrisano.', - deleting: 'Brisanje...', - descending: 'Silazno', - deselectAllRows: 'Odznači sve redove', - duplicate: 'Duplikat', - duplicateWithoutSaving: 'Dupliciraj bez spremanja promjena', - edit: 'Uredi', - editLabel: 'Uredi {{label}}', - editing: 'Uređivanje', - editingLabel_many: 'Uređivanje {{count}} {{label}}', - editingLabel_one: 'Uređivanje {{count}} {{label}}', - editingLabel_other: 'Uređivanje {{count}} {{label}}', - email: 'Email', - emailAddress: 'Email adresa', - enterAValue: 'Unesi vrijednost', - error: 'Greška', - errors: 'Greške', - fallbackToDefaultLocale: 'Vraćanje na zadani jezik', - filter: 'Filter', - filterWhere: 'Filter {{label}} gdje', - filters: 'Filteri', - globals: 'Globali', - language: 'Jezik', - lastModified: 'Zadnja promjena', - leaveAnyway: 'Svejedno napusti', - leaveWithoutSaving: 'Napusti bez spremanja', - light: 'Svijetlo', - livePreview: 'Pregled', - loading: 'Učitavanje', - locale: 'Jezik', - locales: 'Prijevodi', - menu: 'Izbornik', - moveDown: 'Pomakni dolje', - moveUp: 'Pomakni gore', - newPassword: 'Nova lozinka', - noFiltersSet: 'Nema postavljenih filtera', - noLabel: '', - noOptions: 'Nema opcija', - noResults: - 'Nema pronađenih {{label}}. Ili {{label}} još uvijek ne postoji ili nijedan od odgovara postavljenim filterima.', - noValue: 'Bez vrijednosti', - none: 'Nijedan', - notFound: 'Nije pronađeno', - nothingFound: 'Ništa nije pronađeno', - of: 'Od', - open: 'Otvori', - or: 'Ili', - order: 'Poredak', - pageNotFound: 'Stranica nije pronađena', - password: 'Lozinka', - payloadSettings: 'Payload postavke', - perPage: 'Po stranici: {{limit}}', - remove: 'Ukloni', - reset: 'Ponovno postavi', - row: 'Red', - rows: 'Redovi', - save: 'Spremi', - saving: 'Spremanje...', - searchBy: 'Traži po {{label}}', - selectAll: 'Odaberite sve {{count}} {{label}}', - selectAllRows: 'Odaberite sve redove', - selectValue: 'Odaberi vrijednost', - selectedCount: '{{count}} {{label}} odabrano', - showAllLabel: 'Prikaži sve {{label}}', - sorryNotFound: 'Nažalost, ne postoji ništa što odgovara vašem zahtjevu.', - sort: 'Sortiraj', - sortByLabelDirection: 'Sortiraj prema {{label}} {{direction}}', - stayOnThisPage: 'Ostani na ovoj stranici', - submissionSuccessful: 'Uspješno slanje', - submit: 'Podnesi', - successfullyCreated: '{{label}} uspješno kreirano.', - successfullyDuplicated: '{{label}} uspješno duplicirano.', - thisLanguage: 'Hrvatski', - titleDeleted: '{{label}} "{{title}}" uspješno obrisano.', - unauthorized: 'Neovlašteno', - unsavedChangesDuplicate: 'Imate nespremljene promjene. Želite li nastaviti s dupliciranjem?', - untitled: 'Bez naslova', - updatedAt: 'Ažurirano u', - updatedCountSuccessfully: 'Uspješno ažurirano {{count}} {{label}}.', - updatedSuccessfully: 'Uspješno ažurirano.', - updating: 'Ažuriranje', - uploading: 'Prijenos', - user: 'Korisnik', - users: 'Korisnici', - value: 'Attribute', - welcome: 'Dobrodošli', - }, - operators: { - contains: 'sadrži', - equals: 'jednako', - exists: 'postoji', - isGreaterThan: 'je veće od', - isGreaterThanOrEqualTo: 'je veće od ili jednako', - isIn: 'je u', - isLessThan: 'manje je od', - isLessThanOrEqualTo: 'manje je ili jednako', - isLike: 'je kao', - isNotEqualTo: 'nije jednako', - isNotIn: 'nije unutra', - near: 'blizu', - }, - upload: { - crop: 'Usjev', - cropToolDescription: - 'Povucite kutove odabranog područja, nacrtajte novo područje ili prilagodite vrijednosti ispod.', - dragAndDrop: 'Povucite i ispustite datoteku', - dragAndDropHere: 'ili povucite i ispustite datoteku ovdje', - editImage: 'Uredi sliku', - fileName: 'Ime datoteke', - fileSize: 'Veličina datoteke', - focalPoint: 'Središnja točka', - focalPointDescription: - 'Povucite središnju točku izravno na pregledu ili prilagodite vrijednosti ispod.', - height: 'Visina', - lessInfo: 'Manje informacija', - moreInfo: 'Više informacija', - previewSizes: 'Veličine pregleda', - selectCollectionToBrowse: 'Odaberite kolekciju za pregled', - selectFile: 'Odaberite datoteku', - setCropArea: 'Postavi područje usjeva', - setFocalPoint: 'Postavi fokusnu točku', - sizes: 'Veličine', - sizesFor: 'Veličine za {{label}}', - width: 'Širina', - }, - validation: { - emailAddress: 'Molim unestie valjanu email adresu.', - enterNumber: 'Molim unesite valjani broj.', - fieldHasNo: 'Ovo polje nema {{label}}', - greaterThanMax: '{{value}} exceeds the maximum allowable {{label}} limit of {{max}}.', - invalidInput: 'Ovo polje ima nevaljan unos.', - invalidSelection: 'Ovo polje ima nevaljan odabir.', - invalidSelections: 'Ovo polje ima sljedeće nevaljane odabire:', - lessThanMin: '{{value}} is below the minimum allowable {{label}} limit of {{min}}.', - limitReached: 'Dosegnut je limit, može se dodati samo {{max}} stavki.', - longerThanMin: 'Ova vrijednost mora biti duža od minimalne dužine od {{minLength}} znakova', - notValidDate: '"{{value}}" nije valjan datum.', - required: 'Ovo polje je obvezno.', - requiresAtLeast: 'Ovo polje zahtjeva minimalno {{count}} {{label}}.', - requiresNoMoreThan: 'Ovo polje zahtjeva ne više od {{count}} {{label}}.', - requiresTwoNumbers: 'Ovo polje zahtjeva dva broja.', - shorterThanMax: 'Ova vrijednost mora biti kraća od maksimalne dužine od {{maxLength}} znakova', - trueOrFalse: 'Ovo polje može biti samo točno ili netočno', - validUploadID: 'Ovo polje nije valjani ID prijenosa.', - }, - version: { - aboutToPublishSelection: 'Upravo ćete objaviti sve {{label}} u izboru. Jesi li siguran?', - aboutToRestore: 'Vratit ćete {{label}} dokument u stanje u kojem je bio {{versionDate}}', - aboutToRestoreGlobal: 'Vratit ćete globalni {{label}} u stanje u kojem je bio {{versionDate}}.', - aboutToRevertToPublished: - 'Vratit ćete promjene u dokumentu u objavljeno stanje. Jeste li sigurni? ', - aboutToUnpublish: 'Poništit ćete objavu ovog dokumenta. Jeste li sigurni?', - aboutToUnpublishSelection: - 'Upravo ćete poništiti objavu svih {{label}} u odabiru. Jesi li siguran?', - autosave: 'Automatsko spremanje', - autosavedSuccessfully: 'Automatsko spremanje uspješno.', - autosavedVersion: 'Verzija automatski spremljenog dokumenta', - changed: 'Promijenjeno', - compareVersion: 'Usporedi verziju sa:', - confirmPublish: 'Potvrdi objavu', - confirmRevertToSaved: 'Potvrdite vraćanje na spremljeno', - confirmUnpublish: 'Potvrdite poništavanje objave', - confirmVersionRestoration: 'Potvrdite vraćanje verzije', - currentDocumentStatus: 'Trenutni {{docStatus}} dokumenta', - draft: 'Nacrt', - draftSavedSuccessfully: 'Nacrt uspješno spremljen.', - lastSavedAgo: 'Zadnji put spremljeno prije {{distance}', - noFurtherVersionsFound: 'Nisu pronađene daljnje verzije', - noRowsFound: '{{label}} nije pronađeno', - preview: 'Pregled', - problemRestoringVersion: 'Nastao je problem pri vraćanju ove verzije', - publish: 'Objaviti', - publishChanges: 'Objavi promjene', - published: 'Objavljeno', - publishing: 'Objavljivanje', - restoreThisVersion: 'Vrati ovu verziju', - restoredSuccessfully: 'Uspješno vraćeno.', - restoring: 'Vraćanje...', - revertToPublished: 'Vrati na objavljeno', - reverting: 'Vraćanje...', - saveDraft: 'Sačuvaj nacrt', - selectLocales: 'Odaberite jezike', - selectVersionToCompare: 'Odaberite verziju za usporedbu', - showLocales: 'Prikaži jezike:', - showingVersionsFor: 'Pokazujem verzije za:', - status: 'Status', - type: 'Tip', - unpublish: 'Poništi objavu', - unpublishing: 'Poništavanje objave...', - version: 'Verzija', - versionCount_many: '{{count}} pronađenih verzija', - versionCount_none: 'Nema pronađenih verzija', - versionCount_one: '{{count}} pronađena verzija', - versionCount_other: '{{count}} pronađenih verzija', - versionCreatedOn: '{{version}} kreiranih:', - versionID: 'ID verzije', - versions: 'Verzije', - viewingVersion: 'Pregled verzije za {{entityLabel}} {{documentTitle}}', - viewingVersionGlobal: 'Pregled verzije za globalni {{entityLabel}}', - viewingVersions: 'Pregled verzija za {{entityLabel}} {{documentTitle}}', - viewingVersionsGlobal: 'Pregled verzije za globalni {{entityLabel}}', +import type { Language } from '../types.js' + +export const hr: Language = { + dateFNSKey: 'hr', + translations: { + authentication: { + account: 'Račun', + accountOfCurrentUser: 'Račun od trenutnog korisnika', + alreadyActivated: 'Već aktivirano', + alreadyLoggedIn: 'Već prijavljen', + apiKey: 'API ključ', + backToLogin: 'Nazad na prijavu', + beginCreateFirstUser: 'Za početak, kreiraj svog prvog korisnika.', + changePassword: 'Promjeni lozinku', + checkYourEmailForPasswordReset: + 'Provjerite email s poveznicom koja će Vam omogućiti sigurnu promjenu lozinke.', + confirmGeneration: 'Potvrdi kreiranje', + confirmPassword: 'Potvrdi lozinku', + createFirstUser: 'Kreiraj prvog korisnika', + emailNotValid: 'Email nije ispravan', + emailSent: 'Email poslan', + enableAPIKey: 'Omogući API ključ', + failedToUnlock: 'Neuspješno otključavanje.', + forceUnlock: 'Prisilno otključaj', + forgotPassword: 'Zaboravljena lozinka', + forgotPasswordEmailInstructions: + 'Molim unesite svoj email. Primit ćete poruku s uputama za ponovno postavljanje lozinke.', + forgotPasswordQuestion: 'Zaboravljena lozinka?', + generate: 'Generiraj', + generateNewAPIKey: 'Generiraj novi API ključ', + generatingNewAPIKeyWillInvalidate: + 'Generiranje novog API ključa će <1>poništiti prethodni ključ. Jeste li sigurni da želite nastaviti?', + lockUntil: 'Zaključaj dok', + logBackIn: 'Ponovna prijava', + logOut: 'Odjava', + loggedIn: 'Za prijavu s drugim korisničkim računom potrebno je prvo <0>odjaviti se', + loggedInChangePassword: + 'Da biste promijenili lozinku, otvorite svoj <0>račun i promijenite lozinku tamo.', + loggedOutInactivity: 'Odjavljeni se zbog neaktivnosti.', + loggedOutSuccessfully: 'Uspješno ste odjavljeni..', + login: 'Prijava', + loginAttempts: 'Pokušaji prijave', + loginUser: 'Prijava korisnika', + loginWithAnotherUser: + 'Za prijavu s drugim korisničkim računom potrebno je prvo <0>odjaviti se', + logout: 'Odjava', + logoutUser: 'Odjava korisnika', + newAPIKeyGenerated: 'Novi API ključ generiran.', + newAccountCreated: + 'Novi račun je kreiran. Pristupite računu klikom na {{serverURL}}. Molim kliknite na sljedeći link ili zalijepite URL, koji se nalazi ispod, u preglednik da biste potvrdili svoj email: {{verificationURL}}
Nakon što potvrdite email, moći ćete se prijaviti.', + newPassword: 'Nova lozinka', + resetPassword: 'Restartiranje lozinke', + resetPasswordExpiration: 'Restartiranje roka trajanja lozinke', + resetPasswordToken: 'Restartiranje lozinke tokena', + resetYourPassword: 'Restartiraj svoju lozinku', + stayLoggedIn: 'Ostani prijavljen', + successfullyUnlocked: 'Uspješno otključano', + unableToVerify: 'Nije moguće potvrditi', + verified: 'Potvrđeno', + verifiedSuccessfully: 'Uspješno potvrđeno', + verify: 'Potvrdi', + verifyUser: 'Potvrdi korisnika', + verifyYourEmail: 'Potvrdi svoj email', + youAreInactive: + 'Neaktivni ste neko vrijeme i uskoro ćete biti automatski odjavljeni zbog vlastite sigurnosti. Želite li ostati prijavljeni?', + youAreReceivingResetPassword: + 'Primili ste ovo jer ste Vi (ili netko drugi) zatražili promjenu lozinke za Vaš račun. Molim kliknite na poveznicu ili zalijepite ovo u svoje preglednik da biste završili proces:', + youDidNotRequestPassword: + 'Ako niste zatražili ovo, molim ignorirajte ovaj email i Vaša lozinka ostat će nepromijenjena.', + }, + error: { + accountAlreadyActivated: 'Ovaj račun je već aktiviran.', + autosaving: 'Nastao je problem pri automatskom spremanju ovog dokumenta.', + correctInvalidFields: 'Molim ispravite nevaljana polja.', + deletingFile: 'Dogodila se pogreška pri brisanju datoteke.', + deletingTitle: + 'Dogodila se pogreška pri brisanju {{title}}. Molim provjerite svoju internetsku vezu i pokušajte ponovno.', + emailOrPasswordIncorrect: 'Email ili lozinka netočni.', + followingFieldsInvalid_one: ' Ovo polje je nevaljano:', + followingFieldsInvalid_other: 'Ova polja su nevaljana:', + incorrectCollection: 'Nevaljana kolekcija', + invalidFileType: 'Nevaljan tip datoteke', + invalidFileTypeValue: 'Nevaljan tip datoteke: {{value}}', + loadingDocument: 'Pojavio se problem pri učitavanju dokumenta čiji je ID {{id}}.', + missingEmail: 'Nedostaje email.', + missingIDOfDocument: 'Nedostaje ID dokumenta da bi se ažurirao.', + missingIDOfVersion: 'Nedostaje ID verzije.', + missingRequiredData: 'Nedostaju obvezni podaci.', + noFilesUploaded: 'Nijedna datoteka nije učitana.', + noMatchedField: 'Nema podudarajućih polja za "{{label}}"', + noUser: 'Nema korisnika', + notAllowedToAccessPage: 'Nemate dopuštenje pristupiti ovoj stranici.', + notAllowedToPerformAction: 'Nemate dopuštenje izvršiti ovu radnju.', + notFound: 'Traženi resurs nije pronađen.', + previewing: 'Pojavio se problem pri pregledavanju ovog dokumenta.', + problemUploadingFile: 'Pojavio se problem pri učitavanju datoteke.', + tokenInvalidOrExpired: 'Token je nevaljan ili je istekao.', + unPublishingDocument: 'Pojavio se problem pri poništavanju objave ovog dokumenta.', + unableToDeleteCount: 'Nije moguće izbrisati {{count}} od {{total}} {{label}}.', + unableToUpdateCount: 'Nije moguće ažurirati {{count}} od {{total}} {{label}}.', + unauthorized: 'Neovlašten, morate biti prijavljeni da biste uputili ovaj zahtjev.', + unknown: 'Došlo je do nepoznate pogreške.', + unspecific: 'Došlo je do pogreške.', + userLocked: 'Ovaj korisnik je zaključan zbog previše neuspješnih pokušaja prijave.', + valueMustBeUnique: 'Vrijednost mora biti jedinstvena.', + verificationTokenInvalid: 'Verifikacijski token je nevaljan.', + }, + fields: { + addLabel: 'Dodaj {{label}}', + addLink: 'Dodaj poveznicu', + addNew: 'Dodaj novi', + addNewLabel: 'Dodaj novi {{label}}', + addRelationship: 'Dodaj odnos', + addUpload: 'Dodaj učitavanje', + block: 'blokiranje', + blockType: 'Vrsta blokiranja', + blocks: 'blokiranja', + chooseBetweenCustomTextOrDocument: + 'Izaberite između unošenja prilagođenog teksta URL ili poveznice na drugi dokument.', + chooseDocumentToLink: 'Odaberite dokument koji želite povezati.', + chooseFromExisting: 'Odaberite iz postojećih.', + chooseLabel: 'Odaberite {{label}}', + collapseAll: 'Sažmi sve', + customURL: 'Prilagođeni URL', + editLabelData: 'Uredi {{label}} podatke', + editLink: 'Uredi poveznicu', + editRelationship: 'Uredi odnos', + enterURL: 'Unesi URL', + internalLink: 'Interna poveznika', + itemsAndMore: '{{items}} i {{count}} više', + labelRelationship: '{{label}} veza', + latitude: 'Zemljopisna širina', + linkType: 'Tip poveznce', + linkedTo: 'Povezabi sa <0>{{label}}', + longitude: 'Zemljopisna dužina', + newLabel: 'Novo {{label}}', + openInNewTab: 'Otvori u novoj kartici.', + passwordsDoNotMatch: 'Lozinke nisu iste.', + relatedDocument: 'Povezani dokument', + relationTo: 'Veza sa', + removeRelationship: 'Ukloni vezu', + removeUpload: 'Ukloni prijenos', + saveChanges: 'Spremi promjene', + searchForBlock: 'Potraži blok', + selectExistingLabel: 'Odaberi postojeće{{label}}', + selectFieldsToEdit: 'Odaberite polja za uređivanje', + showAll: 'Pokaži sve', + swapRelationship: 'Zamijeni vezu', + swapUpload: 'Zamijeni prijenos', + textToDisplay: 'Tekst za prikaz', + toggleBlock: 'Prebaci blok', + uploadNewLabel: 'Učitaj novi {{label}}', + }, + general: { + aboutToDelete: 'Izbrisat ćete {{label}} <1>{{title}}. Jeste li sigurni?', + aboutToDeleteCount_many: 'Upravo ćete izbrisati {{count}} {{label}}', + aboutToDeleteCount_one: 'Upravo ćete izbrisati {{count}} {{label}}', + aboutToDeleteCount_other: 'Upravo ćete izbrisati {{count}} {{label}}', + addBelow: 'Dodaj ispod', + addFilter: 'Dodaj filter', + adminTheme: 'Administratorska tema', + and: 'I', + applyChanges: 'Primijeni promjene', + ascending: 'Uzlazno', + automatic: 'Automatsko', + backToDashboard: 'Natrag na nadzornu ploču', + cancel: 'Otkaži', + changesNotSaved: 'Vaše promjene nisu spremljene. Ako izađete sada, izgubit ćete promjene.', + close: 'Zatvori', + collapse: 'Sažmi', + collections: 'Kolekcije', + columnToSort: 'Stupac za sortiranje', + columns: 'Stupci', + confirm: 'Potvrdi', + confirmDeletion: 'Potvrdi brisanje', + confirmDuplication: 'Potvrdi duplikaciju', + copied: 'Kopirano', + copy: 'Kopiraj', + create: 'Kreiraj', + createNew: 'Kreiraj novo', + createNewLabel: 'Kreiraj novo {{label}}', + created: 'Kreirano', + createdAt: 'Kreirano u', + creating: 'Kreira se', + creatingNewLabel: 'Kreiranje novog {{label}}', + dark: 'Tamno', + dashboard: 'Nadzorna ploča', + delete: 'Obriši', + deletedCountSuccessfully: 'Uspješno izbrisano {{count}} {{label}}.', + deletedSuccessfully: 'Uspješno obrisano.', + deleting: 'Brisanje...', + descending: 'Silazno', + deselectAllRows: 'Odznači sve redove', + duplicate: 'Duplikat', + duplicateWithoutSaving: 'Dupliciraj bez spremanja promjena', + edit: 'Uredi', + editLabel: 'Uredi {{label}}', + editing: 'Uređivanje', + editingLabel_many: 'Uređivanje {{count}} {{label}}', + editingLabel_one: 'Uređivanje {{count}} {{label}}', + editingLabel_other: 'Uređivanje {{count}} {{label}}', + email: 'Email', + emailAddress: 'Email adresa', + enterAValue: 'Unesi vrijednost', + error: 'Greška', + errors: 'Greške', + fallbackToDefaultLocale: 'Vraćanje na zadani jezik', + filter: 'Filter', + filterWhere: 'Filter {{label}} gdje', + filters: 'Filteri', + globals: 'Globali', + language: 'Jezik', + lastModified: 'Zadnja promjena', + leaveAnyway: 'Svejedno napusti', + leaveWithoutSaving: 'Napusti bez spremanja', + light: 'Svijetlo', + livePreview: 'Pregled', + loading: 'Učitavanje', + locale: 'Jezik', + locales: 'Prijevodi', + menu: 'Izbornik', + moveDown: 'Pomakni dolje', + moveUp: 'Pomakni gore', + newPassword: 'Nova lozinka', + noFiltersSet: 'Nema postavljenih filtera', + noLabel: '', + noOptions: 'Nema opcija', + noResults: + 'Nema pronađenih {{label}}. Ili {{label}} još uvijek ne postoji ili nijedan od odgovara postavljenim filterima.', + noValue: 'Bez vrijednosti', + none: 'Nijedan', + notFound: 'Nije pronađeno', + nothingFound: 'Ništa nije pronađeno', + of: 'Od', + open: 'Otvori', + or: 'Ili', + order: 'Poredak', + pageNotFound: 'Stranica nije pronađena', + password: 'Lozinka', + payloadSettings: 'Payload postavke', + perPage: 'Po stranici: {{limit}}', + remove: 'Ukloni', + reset: 'Ponovno postavi', + row: 'Red', + rows: 'Redovi', + save: 'Spremi', + saving: 'Spremanje...', + searchBy: 'Traži po {{label}}', + selectAll: 'Odaberite sve {{count}} {{label}}', + selectAllRows: 'Odaberite sve redove', + selectValue: 'Odaberi vrijednost', + selectedCount: '{{count}} {{label}} odabrano', + showAllLabel: 'Prikaži sve {{label}}', + sorryNotFound: 'Nažalost, ne postoji ništa što odgovara vašem zahtjevu.', + sort: 'Sortiraj', + sortByLabelDirection: 'Sortiraj prema {{label}} {{direction}}', + stayOnThisPage: 'Ostani na ovoj stranici', + submissionSuccessful: 'Uspješno slanje', + submit: 'Podnesi', + successfullyCreated: '{{label}} uspješno kreirano.', + successfullyDuplicated: '{{label}} uspješno duplicirano.', + thisLanguage: 'Hrvatski', + titleDeleted: '{{label}} "{{title}}" uspješno obrisano.', + unauthorized: 'Neovlašteno', + unsavedChangesDuplicate: 'Imate nespremljene promjene. Želite li nastaviti s dupliciranjem?', + untitled: 'Bez naslova', + updatedAt: 'Ažurirano u', + updatedCountSuccessfully: 'Uspješno ažurirano {{count}} {{label}}.', + updatedSuccessfully: 'Uspješno ažurirano.', + updating: 'Ažuriranje', + uploading: 'Prijenos', + user: 'Korisnik', + users: 'Korisnici', + value: 'Attribute', + welcome: 'Dobrodošli', + }, + operators: { + contains: 'sadrži', + equals: 'jednako', + exists: 'postoji', + isGreaterThan: 'je veće od', + isGreaterThanOrEqualTo: 'je veće od ili jednako', + isIn: 'je u', + isLessThan: 'manje je od', + isLessThanOrEqualTo: 'manje je ili jednako', + isLike: 'je kao', + isNotEqualTo: 'nije jednako', + isNotIn: 'nije unutra', + near: 'blizu', + }, + upload: { + crop: 'Usjev', + cropToolDescription: + 'Povucite kutove odabranog područja, nacrtajte novo područje ili prilagodite vrijednosti ispod.', + dragAndDrop: 'Povucite i ispustite datoteku', + dragAndDropHere: 'ili povucite i ispustite datoteku ovdje', + editImage: 'Uredi sliku', + fileName: 'Ime datoteke', + fileSize: 'Veličina datoteke', + focalPoint: 'Središnja točka', + focalPointDescription: + 'Povucite središnju točku izravno na pregledu ili prilagodite vrijednosti ispod.', + height: 'Visina', + lessInfo: 'Manje informacija', + moreInfo: 'Više informacija', + previewSizes: 'Veličine pregleda', + selectCollectionToBrowse: 'Odaberite kolekciju za pregled', + selectFile: 'Odaberite datoteku', + setCropArea: 'Postavi područje usjeva', + setFocalPoint: 'Postavi fokusnu točku', + sizes: 'Veličine', + sizesFor: 'Veličine za {{label}}', + width: 'Širina', + }, + validation: { + emailAddress: 'Molim unestie valjanu email adresu.', + enterNumber: 'Molim unesite valjani broj.', + fieldHasNo: 'Ovo polje nema {{label}}', + greaterThanMax: '{{value}} exceeds the maximum allowable {{label}} limit of {{max}}.', + invalidInput: 'Ovo polje ima nevaljan unos.', + invalidSelection: 'Ovo polje ima nevaljan odabir.', + invalidSelections: 'Ovo polje ima sljedeće nevaljane odabire:', + lessThanMin: '{{value}} is below the minimum allowable {{label}} limit of {{min}}.', + limitReached: 'Dosegnut je limit, može se dodati samo {{max}} stavki.', + longerThanMin: 'Ova vrijednost mora biti duža od minimalne dužine od {{minLength}} znakova', + notValidDate: '"{{value}}" nije valjan datum.', + required: 'Ovo polje je obvezno.', + requiresAtLeast: 'Ovo polje zahtjeva minimalno {{count}} {{label}}.', + requiresNoMoreThan: 'Ovo polje zahtjeva ne više od {{count}} {{label}}.', + requiresTwoNumbers: 'Ovo polje zahtjeva dva broja.', + shorterThanMax: + 'Ova vrijednost mora biti kraća od maksimalne dužine od {{maxLength}} znakova', + trueOrFalse: 'Ovo polje može biti samo točno ili netočno', + validUploadID: 'Ovo polje nije valjani ID prijenosa.', + }, + version: { + type: 'Tip', + aboutToPublishSelection: 'Upravo ćete objaviti sve {{label}} u izboru. Jesi li siguran?', + aboutToRestore: 'Vratit ćete {{label}} dokument u stanje u kojem je bio {{versionDate}}', + aboutToRestoreGlobal: + 'Vratit ćete globalni {{label}} u stanje u kojem je bio {{versionDate}}.', + aboutToRevertToPublished: + 'Vratit ćete promjene u dokumentu u objavljeno stanje. Jeste li sigurni? ', + aboutToUnpublish: 'Poništit ćete objavu ovog dokumenta. Jeste li sigurni?', + aboutToUnpublishSelection: + 'Upravo ćete poništiti objavu svih {{label}} u odabiru. Jesi li siguran?', + autosave: 'Automatsko spremanje', + autosavedSuccessfully: 'Automatsko spremanje uspješno.', + autosavedVersion: 'Verzija automatski spremljenog dokumenta', + changed: 'Promijenjeno', + compareVersion: 'Usporedi verziju sa:', + confirmPublish: 'Potvrdi objavu', + confirmRevertToSaved: 'Potvrdite vraćanje na spremljeno', + confirmUnpublish: 'Potvrdite poništavanje objave', + confirmVersionRestoration: 'Potvrdite vraćanje verzije', + currentDocumentStatus: 'Trenutni {{docStatus}} dokumenta', + draft: 'Nacrt', + draftSavedSuccessfully: 'Nacrt uspješno spremljen.', + lastSavedAgo: 'Zadnji put spremljeno prije {{distance}', + noFurtherVersionsFound: 'Nisu pronađene daljnje verzije', + noRowsFound: '{{label}} nije pronađeno', + preview: 'Pregled', + problemRestoringVersion: 'Nastao je problem pri vraćanju ove verzije', + publish: 'Objaviti', + publishChanges: 'Objavi promjene', + published: 'Objavljeno', + publishing: 'Objavljivanje', + restoreThisVersion: 'Vrati ovu verziju', + restoredSuccessfully: 'Uspješno vraćeno.', + restoring: 'Vraćanje...', + revertToPublished: 'Vrati na objavljeno', + reverting: 'Vraćanje...', + saveDraft: 'Sačuvaj nacrt', + selectLocales: 'Odaberite jezike', + selectVersionToCompare: 'Odaberite verziju za usporedbu', + showLocales: 'Prikaži jezike:', + showingVersionsFor: 'Pokazujem verzije za:', + status: 'Status', + unpublish: 'Poništi objavu', + unpublishing: 'Poništavanje objave...', + version: 'Verzija', + versionCount_many: '{{count}} pronađenih verzija', + versionCount_none: 'Nema pronađenih verzija', + versionCount_one: '{{count}} pronađena verzija', + versionCount_other: '{{count}} pronađenih verzija', + versionCreatedOn: '{{version}} kreiranih:', + versionID: 'ID verzije', + versions: 'Verzije', + viewingVersion: 'Pregled verzije za {{entityLabel}} {{documentTitle}}', + viewingVersionGlobal: 'Pregled verzije za globalni {{entityLabel}}', + viewingVersions: 'Pregled verzija za {{entityLabel}} {{documentTitle}}', + viewingVersionsGlobal: 'Pregled verzije za globalni {{entityLabel}}', + }, }, } diff --git a/packages/translations/src/languages/hu.ts b/packages/translations/src/languages/hu.ts index 08bade90e8..1d4320d6b5 100644 --- a/packages/translations/src/languages/hu.ts +++ b/packages/translations/src/languages/hu.ts @@ -1,395 +1,400 @@ -export default { - authentication: { - account: 'Fiók', - accountOfCurrentUser: 'Az aktuális felhasználó fiókja', - alreadyActivated: 'Már aktiválva van', - alreadyLoggedIn: 'Már bejelentkezett', - apiKey: 'API-kulcs', - backToLogin: 'Vissza a bejelentkezéshez', - beginCreateFirstUser: 'Kezdésként hozza létre az első felhasználót.', - changePassword: 'Jelszó módosítása', - checkYourEmailForPasswordReset: - 'Ellenőrizze az e-mailjét, a linkért, amellyel biztonságosan visszaállíthatja jelszavát.', - confirmGeneration: 'Generálás megerősítése', - confirmPassword: 'Jelszó megerősítése', - createFirstUser: 'Első felhasználó létrehozása', - emailNotValid: 'A megadott e-mail cím érvénytelen', - emailSent: 'E-mail elküldve', - enableAPIKey: 'API-kulcs engedélyezése', - failedToUnlock: 'Nem sikerült feloldani', - forceUnlock: 'Kényszerített feloldás', - forgotPassword: 'Elfelejtett jelszó', - forgotPasswordEmailInstructions: - 'Kérjük, adja meg e-mail címét alább. Kapni fog egy e-mail üzenetet a jelszó visszaállításához szükséges utasításokkal.', - forgotPasswordQuestion: 'Elfelejtette jelszavát?', - generate: 'Generálás', - generateNewAPIKey: 'Új API-kulcs generálása', - generatingNewAPIKeyWillInvalidate: - 'Az új API-kulcs generálása <1>érvényteleníti az előző kulcsot. Biztos, hogy folytatni szeretné?', - lockUntil: 'Zárolás eddig', - logBackIn: 'Jelentkezzen be újra', - logOut: 'Kijelentkezés', - loggedIn: - 'Ha egy másik felhasználóval szeretne bejelentkezni, először <0>ki kell jelentkeznie.', - loggedInChangePassword: - 'Jelszavának megváltoztatásához lépjen be <0>fiókjába, és ott szerkessze jelszavát.', - loggedOutInactivity: 'Inaktivitás miatt kijelentkeztünk.', - loggedOutSuccessfully: 'Sikeresen kijelentkezett.', - login: 'Bejelentkezés', - loginAttempts: 'Bejelentkezési kísérletek', - loginUser: 'Bejelentkezés felhasználó', - loginWithAnotherUser: - 'Ha egy másik felhasználóval szeretne bejelentkezni, először <0>ki kell jelentkeznie.', - logout: 'Kijelentkezés', - logoutUser: 'Felhasználó kijelentkezése', - newAPIKeyGenerated: 'Új API-kulcs generálva.', - newAccountCreated: - 'Létrehoztunk egy új fiókot, amellyel hozzáférhet a következőhöz {{serverURL}} Kérjük, kattintson a következő linkre, vagy illessze be az alábbi URL-t a böngészőbe az e-mail-cím ellenőrzéséhez : {{verificationURL}}
Az e-mail-cím ellenőrzése után sikeresen be tud majd jelentkezni.', - newPassword: 'Új jelszó', - resetPassword: 'Jelszó visszaállítása', - resetPasswordExpiration: 'Jelszóvisszaállítás lejárata', - resetPasswordToken: 'Jelszóvisszaállító token', - resetYourPassword: 'Jelszó visszaállítása', - stayLoggedIn: 'Maradjon bejelentkezve', - successfullyUnlocked: 'Sikeresen feloldva', - unableToVerify: 'Sikertelen megerősítés', - verified: 'Megerősítve', - verifiedSuccessfully: 'Sikeresen megerősítve', - verify: 'Megerősítés', - verifyUser: 'Felhasználó megerősítése', - verifyYourEmail: 'Erősítse meg az e-mail címét', - youAreInactive: - 'Már egy ideje nem volt aktív, és hamarosan automatikusan kijelentkeztetjük saját biztonsága érdekében. Szeretne bejelentkezve maradni?', - youAreReceivingResetPassword: - 'Ezt azért kapja, mert Ön (vagy valaki más) kérte fiókja jelszavának visszaállítását. A folyamat befejezéséhez kattintson a következő linkre, vagy illessze be böngészőjébe:', - youDidNotRequestPassword: - 'Ha nem Ön kérte ezt, kérjük, hagyja figyelmen kívül ezt az e-mailt, és jelszava változatlan marad.', - }, - error: { - accountAlreadyActivated: 'Ez a fiók már aktiválva van.', - autosaving: 'Hiba történt a dokumentum automatikus mentése közben.', - correctInvalidFields: 'Kérjük, javítsa ki az érvénytelen mezőket.', - deletingFile: 'Hiba történt a fájl törlésekor.', - deletingTitle: - 'Hiba történt a {{title}} törlése közben. Kérjük, ellenőrizze a kapcsolatot, és próbálja meg újra.', - emailOrPasswordIncorrect: 'A megadott e-mail-cím vagy jelszó helytelen.', - followingFieldsInvalid_one: 'A következő mező érvénytelen:', - followingFieldsInvalid_other: 'A következő mezők érvénytelenek:', - incorrectCollection: 'Helytelen gyűjtemény', - invalidFileType: 'Érvénytelen fájltípus', - invalidFileTypeValue: 'Érvénytelen fájltípus: {{value}}', - loadingDocument: 'Hiba történt a {{id}} azonosítójú dokumentum betöltésekor.', - missingEmail: 'Hiányzó e-mail.', - missingIDOfDocument: 'Hiányzik a frissítendő dokumentum azonosítója.', - missingIDOfVersion: 'A verzió azonosítója hiányzik.', - missingRequiredData: 'Hiányoznak kötelező adatok.', - noFilesUploaded: 'Nem került fájl feltöltésre.', - noMatchedField: 'Nem található egyező mező a következőhöz: "{{label}}"', - noUser: 'Nincs felhasználó', - notAllowedToAccessPage: 'Ehhez az oldalhoz nem férhet hozzá.', - notAllowedToPerformAction: 'Ezt a műveletet nem hajthatja végre.', - notFound: 'A kért erőforrás nem található.', - previewing: 'Hiba történt a dokumentum előnézetének megtekintése közben.', - problemUploadingFile: 'Hiba történt a fájl feltöltése közben.', - tokenInvalidOrExpired: 'A token érvénytelen vagy lejárt.', - unPublishingDocument: 'Hiba történt a dokumentum közzétételének visszavonása közben.', - unableToDeleteCount: 'Nem sikerült törölni {{count}}/{{total}} {{label}}.', - unableToUpdateCount: 'Nem sikerült frissíteni {{count}}/{{total}} {{label}}.', - unauthorized: 'Jogosulatlan, a kéréshez be kell jelentkeznie.', - unknown: 'Ismeretlen hiba történt.', - unspecific: 'Hiba történt.', - userLocked: 'Ez a felhasználó túl sok sikertelen bejelentkezési kísérlet miatt zárolva van.', - valueMustBeUnique: 'Az értéknek egyedinek kell lennie', - verificationTokenInvalid: 'Az ellenőrző token érvénytelen.', - }, - fields: { - addLabel: '{{label}} hozzáadása', - addLink: 'Link hozzáadása', - addNew: 'Új hozzáadása', - addNewLabel: 'Új {{label}} hozzáadása', - addRelationship: 'Kapcsolat hozzáadása', - addUpload: 'Feltöltés hozzáadása', - block: 'blokk', - blockType: 'Blokk típusa', - blocks: 'blokkok', - chooseBetweenCustomTextOrDocument: - 'Válasszon egy egyéni szöveges URL-cím megadása vagy egy másik dokumentumra való hivatkozás között.', - chooseDocumentToLink: 'Válassza ki a dokumentumot, amelyre hivatkozni kíván', - chooseFromExisting: 'Válasszon a meglévők közül', - chooseLabel: 'Válassza ki a {{label}}', - collapseAll: 'Mindet összecsuk', - customURL: 'Egyéni URL', - editLabelData: '{{label}} adatok szerkesztése', - editLink: 'Link szerkesztése', - editRelationship: 'Kapcsolat hozzáadása', - enterURL: 'Adjon meg egy URL-t', - internalLink: 'Belső link', - itemsAndMore: '{{items}} és további {{count}}', - labelRelationship: '{{label}} Kapcsolat', - latitude: 'Szélesség', - linkType: 'Link típusa', - linkedTo: 'Kapcsolódik a <0>{{label}}', - longitude: 'Hosszúság', - newLabel: 'Új {{label}}', - openInNewTab: 'Megnyitás új lapon', - passwordsDoNotMatch: 'A jelszavak nem egyeznek.', - relatedDocument: 'Kapcsolódó dokumentum', - relationTo: 'Kapcsolat a következővel:', - removeRelationship: 'Kapcsolat eltávolítása', - removeUpload: 'Feltöltés eltávolítása', - saveChanges: 'Módosítások mentése', - searchForBlock: 'Blokk keresése', - selectExistingLabel: 'Meglévő {{label}} kiválasztása', - selectFieldsToEdit: 'Válassza ki a szerkeszteni kívánt mezőket', - showAll: 'Az összes megjelenítése', - swapRelationship: 'Kapcsolat csere', - swapUpload: 'Feltöltés csere', - textToDisplay: 'Megjelenítendő szöveg', - toggleBlock: 'Blokk kinyitása', - uploadNewLabel: 'Új {{label}} feltöltése', - }, - general: { - aboutToDelete: 'A {{label}} <1>{{title}} törlésére készül. Biztos benne?', - aboutToDeleteCount_many: 'Törölni készül {{count}} {{label}}', - aboutToDeleteCount_one: 'Törölni készül {{count}} {{label}}', - aboutToDeleteCount_other: 'Törölni készül {{count}} {{label}}', - addBelow: 'Hozzáadás lent', - addFilter: 'Szűrő hozzáadása', - adminTheme: 'Admin téma', - and: 'És', - applyChanges: 'Változtatások alkalmazása', - ascending: 'Növekvő', - automatic: 'Automatikus', - backToDashboard: 'Vissza az irányítópultra', - cancel: 'Mégsem', - changesNotSaved: - 'A módosítások nem lettek mentve. Ha most távozik, elveszíti a változtatásokat.', - close: 'Bezárás', - collapse: 'Összecsukás', - collections: 'Gyűjtemények', - columnToSort: 'Rendezendő oszlop', - columns: 'Oszlopok', - confirm: 'Megerősítés', - confirmDeletion: 'Törlés megerősítése', - confirmDuplication: 'Duplikáció megerősítése', - copied: 'Másolva', - copy: 'Másolás', - create: 'Létrehozás', - createNew: 'Új létrehozása', - createNewLabel: 'Új {{label}} létrehozása', - created: 'Létrehozva', - createdAt: 'Létrehozva:', - creating: 'Létrehozás', - creatingNewLabel: 'Új {{label}} létrehozása', - dark: 'Sötét', - dashboard: 'Irányítópult', - delete: 'Törlés', - deletedCountSuccessfully: '{{count}} {{label}} sikeresen törölve.', - deletedSuccessfully: 'Sikeresen törölve.', - deleting: 'Törlés...', - descending: 'Csökkenő', - deselectAllRows: 'Jelölje ki az összes sort', - duplicate: 'Duplikálás', - duplicateWithoutSaving: 'Duplikálás a módosítások mentése nélkül', - edit: 'Szerkesztés', - editLabel: '{{label}} szerkesztése', - editing: 'Szerkesztés', - editingLabel_many: '{{count}} {{label}} szerkesztése', - editingLabel_one: '{{count}} {{label}} szerkesztése', - editingLabel_other: '{{count}} {{label}} szerkesztése', - email: 'E-mail', - emailAddress: 'E-mail cím', - enterAValue: 'Adjon meg egy értéket', - error: 'Hiba', - errors: 'Hibák', - fallbackToDefaultLocale: 'Visszatérés az alapértelmezett nyelvhez', - filter: 'Szűrő', - filterWhere: 'Szűrő {{label}} ahol', - filters: 'Szűrők', - globals: 'Globálisok', - language: 'Nyelv', - lastModified: 'Utoljára módosítva', - leaveAnyway: 'Távozás mindenképp', - leaveWithoutSaving: 'Távozás mentés nélkül', - light: 'Világos', - livePreview: 'Előnézet', - loading: 'Betöltés', - locale: 'Nyelv', - locales: 'Nyelvek', - menu: 'Menü', - moveDown: 'Mozgatás lefelé', - moveUp: 'Mozgatás felfelé', - newPassword: 'Új jelszó', - noFiltersSet: 'Nincs beállítva szűrő', - noLabel: '', - noOptions: 'Nincs lehetőség', - noResults: - 'Nem találtunk {{label}}. Vagy még nem létezik {{label}}, vagy egyik sem felel meg a fent megadott szűrőknek.', - noValue: 'Nincs érték', - none: 'Semmi', - notFound: 'Nem található', - nothingFound: 'Nincs találat', - of: 'a', - open: 'Megnyitás', - or: 'Vagy', - order: 'Sorrend', - pageNotFound: 'Az oldal nem található', - password: 'Jelszó', - payloadSettings: 'Payload beállítások', - perPage: 'Oldalanként: {{limit}}', - remove: 'Törlés', - reset: 'Visszaállítás', - row: 'Sor', - rows: 'Sorok', - save: 'Mentés', - saving: 'Mentés...', - searchBy: 'Keresés a következő szerint: {{label}}', - selectAll: 'Az összes kijelölése: {{count}} {{label}}', - selectAllRows: 'Válassza ki az összes sort', - selectValue: 'Válasszon ki egy értéket', - selectedCount: '{{count}} {{label}} kiválasztva', - showAllLabel: 'Mutasd az összes {{címke}}', - sorryNotFound: 'Sajnáljuk – nincs semmi, ami megfelelne a kérésének.', - sort: 'Rendezés', - sortByLabelDirection: 'Rendezés {{label}} {{direction}} szerint', - stayOnThisPage: 'Maradjon ezen az oldalon', - submissionSuccessful: 'Beküldés sikeres.', - submit: 'Beküldés', - successfullyCreated: '{{label}} sikeresen létrehozva.', - successfullyDuplicated: '{{label}} sikeresen duplikálódott.', - thisLanguage: 'Magyar', - titleDeleted: '{{label}} "{{title}}" sikeresen törölve.', - unauthorized: 'Jogosulatlan', - unsavedChangesDuplicate: 'Nem mentett módosításai vannak. Szeretné folytatni a duplikációt?', - untitled: 'Névtelen', - updatedAt: 'Frissítve:', - updatedCountSuccessfully: '{{count}} {{label}} sikeresen frissítve.', - updatedSuccessfully: 'Sikeresen frissítve.', - updating: 'Frissítés', - uploading: 'Feltöltés', - user: 'Felhasználó', - users: 'Felhasználók', - value: 'Érték', - welcome: 'Üdvözöljük', - }, - operators: { - contains: 'tartalmaz', - equals: 'egyenlő', - exists: 'létezik', - isGreaterThan: 'nagyobb, mint', - isGreaterThanOrEqualTo: 'nagyobb vagy egyenlő, mint', - isIn: 'benne van', - isLessThan: 'kisebb, mint', - isLessThanOrEqualTo: 'kisebb vagy egyenlő, mint', - isLike: 'olyan, mint', - isNotEqualTo: 'nem egyenlő', - isNotIn: 'nincs benne', - near: 'közel', - }, - upload: { - crop: 'Termés', - cropToolDescription: - 'Húzza a kijelölt terület sarkait, rajzoljon új területet, vagy igazítsa a lentebb található értékeket.', - dragAndDrop: 'Húzzon ide egy fájlt', - dragAndDropHere: 'vagy húzzon ide egy fájlt', - editImage: 'Kép szerkesztése', - fileName: 'Fájlnév', - fileSize: 'Fájl mérete', - focalPoint: 'Fókuszpont', - focalPointDescription: - 'Húzza az érdekes pontot közvetlenül az előnézetre, vagy állítsa be az alábbi értékeket.', - height: 'Magasság', - lessInfo: 'Kevesebb információ', - moreInfo: 'További információ', - previewSizes: 'Előnézeti méretek', - selectCollectionToBrowse: 'Válassza ki a böngészni kívánt gyűjteményt', - selectFile: 'Válasszon ki egy fájlt', - setCropArea: 'Állítsa be a vágási területet', - setFocalPoint: 'Állítsa be a fókuszpontot', - sizes: 'Méretek', - sizesFor: 'Méretek a {{címke}} számára', - width: 'Szélesség', - }, - validation: { - emailAddress: 'Kérjük, adjon meg egy érvényes e-mail címet.', - enterNumber: 'Kérjük, adjon meg egy érvényes számot.', - fieldHasNo: 'Ennek a mezőnek nincs {{label}}', - greaterThanMax: '{{value}} nagyobb, mint a megengedett maximum {{label}} érték, ami {{max}}.', - invalidInput: 'Ez a mező érvénytelen értéket tartalmaz.', - invalidSelection: 'Ez a mező érvénytelen kijelöléssel rendelkezik.', - invalidSelections: 'Ez a mező a következő érvénytelen kijelöléseket tartalmazza:', - lessThanMin: '{{value}} kisebb, mint a megengedett minimum {{label}} érték, ami {{min}}.', - limitReached: 'Elérte a korlátot, csak {{max}} elem adható hozzá.', - longerThanMin: - 'Ennek az értéknek hosszabbnak kell lennie, mint a minimális {{minLength}} karakter hosszúság.', - notValidDate: '" {{value}} " nem érvényes dátum.', - required: 'Ez a mező kötelező.', - requiresAtLeast: 'Ehhez a mezőhöz legalább {{count}} {{label}} szükséges.', - requiresNoMoreThan: 'Ehhez a mezőhöz legfeljebb {{count}} {{label}} szükséges.', - requiresTwoNumbers: 'Ehhez a mezőhöz két szám szükséges.', - shorterThanMax: - 'Ennek az értéknek rövidebbnek kell lennie, mint a maximálisan megengedett {{maxLength}} karakter.', - trueOrFalse: 'Ez a mező csak igaz vagy hamis lehet.', - validUploadID: 'Ez a mező nem érvényes feltöltési azonosító.', - }, - version: { - aboutToPublishSelection: - 'Arra készül, hogy az összes {{label}} elemet közzétegye a kijelölésben. biztos vagy ebben?', - aboutToRestore: - 'Arra készül, hogy visszaállítsa ezt a {{label}} dokumentumot arra az állapotra, amelyben {{versionDate}} napon volt.', - aboutToRestoreGlobal: - 'Arra készül, hogy visszaállítsa a {{label}} arra az állapotra, amelyben {{versionDate}} napon volt.', - aboutToRevertToPublished: - 'Arra készül, hogy visszaállítsa a dokumentum módosításait a közzétett állapotába. Biztos benne?', - aboutToUnpublish: 'A dokumentum közzétételének visszavonására készül. Biztos benne?', - aboutToUnpublishSelection: - 'Arra készül, hogy visszavonja a kijelölésben szereplő összes {{label}} közzétételét. biztos vagy ebben?', - autosave: 'Automatikus mentés', - autosavedSuccessfully: 'Automatikus mentés sikeres.', - autosavedVersion: 'Automatikusan mentett verzió', - changed: 'Megváltozott', - compareVersion: 'Hasonlítsa össze a verziót a következőkkel:', - confirmPublish: 'A közzététel megerősítése', - confirmRevertToSaved: 'Erősítse meg a mentett verzióra való visszatérést', - confirmUnpublish: 'A közzététel visszavonásának megerősítése', - confirmVersionRestoration: 'Verzió-visszaállítás megerősítése', - currentDocumentStatus: 'Jelenlegi {{docStatus}} dokumentum', - draft: 'Piszkozat', - draftSavedSuccessfully: 'A piszkozat sikeresen mentve.', - lastSavedAgo: 'Utoljára mentve {{distance}} órája', - noFurtherVersionsFound: 'További verziók nem találhatók', - noRowsFound: 'Nem található {{label}}', - preview: 'Előnézet', - problemRestoringVersion: 'Hiba történt a verzió visszaállításakor', - publish: 'Közzététel', - publishChanges: 'Módosítások közzététele', - published: 'Közzétett', - publishing: 'Közzététel', - restoreThisVersion: 'A verzió visszaállítása', - restoredSuccessfully: 'Sikeresen visszaállítva.', - restoring: 'Visszaállítás...', - revertToPublished: 'Visszatérés a közzétetthez', - reverting: 'Visszaállítás...', - saveDraft: 'Piszkozat mentése', - selectLocales: 'Megjelenítendő nyelvek kiválasztása', - selectVersionToCompare: 'Válassza ki az összehasonlítani kívánt verziót', - showLocales: 'Nyelvek megjelenítése:', - showingVersionsFor: 'Verziók megjelenítése a következőkhöz:', - status: 'Állapot', - type: 'Típus', - unpublish: 'Közzététel visszavonása', - unpublishing: 'Közzététel visszavonása...', - version: 'Verzió', - versionCount_many: '{{count}} verzió található', - versionCount_none: 'Nem található verzió', - versionCount_one: '{{count}} verzió található', - versionCount_other: '{{count}} verzió található', - versionCreatedOn: '{{version}} létrehozva:', - versionID: 'Verzióazonosító', - versions: 'Verziók', - viewingVersion: 'A(z) {{entityLabel}} {{documentTitle}} verziójának megtekintése', - viewingVersionGlobal: 'A globális {{entityLabel}} verziójának megtekintése', - viewingVersions: 'A {{entityLabel}} {{documentTitle}} verzióinak megtekintése', - viewingVersionsGlobal: 'A globális {{entityLabel}} verzióinak megtekintése', +import type { Language } from '../types.js' + +export const hu: Language = { + dateFNSKey: 'hu', + translations: { + authentication: { + account: 'Fiók', + accountOfCurrentUser: 'Az aktuális felhasználó fiókja', + alreadyActivated: 'Már aktiválva van', + alreadyLoggedIn: 'Már bejelentkezett', + apiKey: 'API-kulcs', + backToLogin: 'Vissza a bejelentkezéshez', + beginCreateFirstUser: 'Kezdésként hozza létre az első felhasználót.', + changePassword: 'Jelszó módosítása', + checkYourEmailForPasswordReset: + 'Ellenőrizze az e-mailjét, a linkért, amellyel biztonságosan visszaállíthatja jelszavát.', + confirmGeneration: 'Generálás megerősítése', + confirmPassword: 'Jelszó megerősítése', + createFirstUser: 'Első felhasználó létrehozása', + emailNotValid: 'A megadott e-mail cím érvénytelen', + emailSent: 'E-mail elküldve', + enableAPIKey: 'API-kulcs engedélyezése', + failedToUnlock: 'Nem sikerült feloldani', + forceUnlock: 'Kényszerített feloldás', + forgotPassword: 'Elfelejtett jelszó', + forgotPasswordEmailInstructions: + 'Kérjük, adja meg e-mail címét alább. Kapni fog egy e-mail üzenetet a jelszó visszaállításához szükséges utasításokkal.', + forgotPasswordQuestion: 'Elfelejtette jelszavát?', + generate: 'Generálás', + generateNewAPIKey: 'Új API-kulcs generálása', + generatingNewAPIKeyWillInvalidate: + 'Az új API-kulcs generálása <1>érvényteleníti az előző kulcsot. Biztos, hogy folytatni szeretné?', + lockUntil: 'Zárolás eddig', + logBackIn: 'Jelentkezzen be újra', + logOut: 'Kijelentkezés', + loggedIn: + 'Ha egy másik felhasználóval szeretne bejelentkezni, először <0>ki kell jelentkeznie.', + loggedInChangePassword: + 'Jelszavának megváltoztatásához lépjen be <0>fiókjába, és ott szerkessze jelszavát.', + loggedOutInactivity: 'Inaktivitás miatt kijelentkeztünk.', + loggedOutSuccessfully: 'Sikeresen kijelentkezett.', + login: 'Bejelentkezés', + loginAttempts: 'Bejelentkezési kísérletek', + loginUser: 'Bejelentkezés felhasználó', + loginWithAnotherUser: + 'Ha egy másik felhasználóval szeretne bejelentkezni, először <0>ki kell jelentkeznie.', + logout: 'Kijelentkezés', + logoutUser: 'Felhasználó kijelentkezése', + newAPIKeyGenerated: 'Új API-kulcs generálva.', + newAccountCreated: + 'Létrehoztunk egy új fiókot, amellyel hozzáférhet a következőhöz {{serverURL}} Kérjük, kattintson a következő linkre, vagy illessze be az alábbi URL-t a böngészőbe az e-mail-cím ellenőrzéséhez : {{verificationURL}}
Az e-mail-cím ellenőrzése után sikeresen be tud majd jelentkezni.', + newPassword: 'Új jelszó', + resetPassword: 'Jelszó visszaállítása', + resetPasswordExpiration: 'Jelszóvisszaállítás lejárata', + resetPasswordToken: 'Jelszóvisszaállító token', + resetYourPassword: 'Jelszó visszaállítása', + stayLoggedIn: 'Maradjon bejelentkezve', + successfullyUnlocked: 'Sikeresen feloldva', + unableToVerify: 'Sikertelen megerősítés', + verified: 'Megerősítve', + verifiedSuccessfully: 'Sikeresen megerősítve', + verify: 'Megerősítés', + verifyUser: 'Felhasználó megerősítése', + verifyYourEmail: 'Erősítse meg az e-mail címét', + youAreInactive: + 'Már egy ideje nem volt aktív, és hamarosan automatikusan kijelentkeztetjük saját biztonsága érdekében. Szeretne bejelentkezve maradni?', + youAreReceivingResetPassword: + 'Ezt azért kapja, mert Ön (vagy valaki más) kérte fiókja jelszavának visszaállítását. A folyamat befejezéséhez kattintson a következő linkre, vagy illessze be böngészőjébe:', + youDidNotRequestPassword: + 'Ha nem Ön kérte ezt, kérjük, hagyja figyelmen kívül ezt az e-mailt, és jelszava változatlan marad.', + }, + error: { + accountAlreadyActivated: 'Ez a fiók már aktiválva van.', + autosaving: 'Hiba történt a dokumentum automatikus mentése közben.', + correctInvalidFields: 'Kérjük, javítsa ki az érvénytelen mezőket.', + deletingFile: 'Hiba történt a fájl törlésekor.', + deletingTitle: + 'Hiba történt a {{title}} törlése közben. Kérjük, ellenőrizze a kapcsolatot, és próbálja meg újra.', + emailOrPasswordIncorrect: 'A megadott e-mail-cím vagy jelszó helytelen.', + followingFieldsInvalid_one: 'A következő mező érvénytelen:', + followingFieldsInvalid_other: 'A következő mezők érvénytelenek:', + incorrectCollection: 'Helytelen gyűjtemény', + invalidFileType: 'Érvénytelen fájltípus', + invalidFileTypeValue: 'Érvénytelen fájltípus: {{value}}', + loadingDocument: 'Hiba történt a {{id}} azonosítójú dokumentum betöltésekor.', + missingEmail: 'Hiányzó e-mail.', + missingIDOfDocument: 'Hiányzik a frissítendő dokumentum azonosítója.', + missingIDOfVersion: 'A verzió azonosítója hiányzik.', + missingRequiredData: 'Hiányoznak kötelező adatok.', + noFilesUploaded: 'Nem került fájl feltöltésre.', + noMatchedField: 'Nem található egyező mező a következőhöz: "{{label}}"', + noUser: 'Nincs felhasználó', + notAllowedToAccessPage: 'Ehhez az oldalhoz nem férhet hozzá.', + notAllowedToPerformAction: 'Ezt a műveletet nem hajthatja végre.', + notFound: 'A kért erőforrás nem található.', + previewing: 'Hiba történt a dokumentum előnézetének megtekintése közben.', + problemUploadingFile: 'Hiba történt a fájl feltöltése közben.', + tokenInvalidOrExpired: 'A token érvénytelen vagy lejárt.', + unPublishingDocument: 'Hiba történt a dokumentum közzétételének visszavonása közben.', + unableToDeleteCount: 'Nem sikerült törölni {{count}}/{{total}} {{label}}.', + unableToUpdateCount: 'Nem sikerült frissíteni {{count}}/{{total}} {{label}}.', + unauthorized: 'Jogosulatlan, a kéréshez be kell jelentkeznie.', + unknown: 'Ismeretlen hiba történt.', + unspecific: 'Hiba történt.', + userLocked: 'Ez a felhasználó túl sok sikertelen bejelentkezési kísérlet miatt zárolva van.', + valueMustBeUnique: 'Az értéknek egyedinek kell lennie', + verificationTokenInvalid: 'Az ellenőrző token érvénytelen.', + }, + fields: { + addLabel: '{{label}} hozzáadása', + addLink: 'Link hozzáadása', + addNew: 'Új hozzáadása', + addNewLabel: 'Új {{label}} hozzáadása', + addRelationship: 'Kapcsolat hozzáadása', + addUpload: 'Feltöltés hozzáadása', + block: 'blokk', + blockType: 'Blokk típusa', + blocks: 'blokkok', + chooseBetweenCustomTextOrDocument: + 'Válasszon egy egyéni szöveges URL-cím megadása vagy egy másik dokumentumra való hivatkozás között.', + chooseDocumentToLink: 'Válassza ki a dokumentumot, amelyre hivatkozni kíván', + chooseFromExisting: 'Válasszon a meglévők közül', + chooseLabel: 'Válassza ki a {{label}}', + collapseAll: 'Mindet összecsuk', + customURL: 'Egyéni URL', + editLabelData: '{{label}} adatok szerkesztése', + editLink: 'Link szerkesztése', + editRelationship: 'Kapcsolat hozzáadása', + enterURL: 'Adjon meg egy URL-t', + internalLink: 'Belső link', + itemsAndMore: '{{items}} és további {{count}}', + labelRelationship: '{{label}} Kapcsolat', + latitude: 'Szélesség', + linkType: 'Link típusa', + linkedTo: 'Kapcsolódik a <0>{{label}}', + longitude: 'Hosszúság', + newLabel: 'Új {{label}}', + openInNewTab: 'Megnyitás új lapon', + passwordsDoNotMatch: 'A jelszavak nem egyeznek.', + relatedDocument: 'Kapcsolódó dokumentum', + relationTo: 'Kapcsolat a következővel:', + removeRelationship: 'Kapcsolat eltávolítása', + removeUpload: 'Feltöltés eltávolítása', + saveChanges: 'Módosítások mentése', + searchForBlock: 'Blokk keresése', + selectExistingLabel: 'Meglévő {{label}} kiválasztása', + selectFieldsToEdit: 'Válassza ki a szerkeszteni kívánt mezőket', + showAll: 'Az összes megjelenítése', + swapRelationship: 'Kapcsolat csere', + swapUpload: 'Feltöltés csere', + textToDisplay: 'Megjelenítendő szöveg', + toggleBlock: 'Blokk kinyitása', + uploadNewLabel: 'Új {{label}} feltöltése', + }, + general: { + aboutToDelete: 'A {{label}} <1>{{title}} törlésére készül. Biztos benne?', + aboutToDeleteCount_many: 'Törölni készül {{count}} {{label}}', + aboutToDeleteCount_one: 'Törölni készül {{count}} {{label}}', + aboutToDeleteCount_other: 'Törölni készül {{count}} {{label}}', + addBelow: 'Hozzáadás lent', + addFilter: 'Szűrő hozzáadása', + adminTheme: 'Admin téma', + and: 'És', + applyChanges: 'Változtatások alkalmazása', + ascending: 'Növekvő', + automatic: 'Automatikus', + backToDashboard: 'Vissza az irányítópultra', + cancel: 'Mégsem', + changesNotSaved: + 'A módosítások nem lettek mentve. Ha most távozik, elveszíti a változtatásokat.', + close: 'Bezárás', + collapse: 'Összecsukás', + collections: 'Gyűjtemények', + columnToSort: 'Rendezendő oszlop', + columns: 'Oszlopok', + confirm: 'Megerősítés', + confirmDeletion: 'Törlés megerősítése', + confirmDuplication: 'Duplikáció megerősítése', + copied: 'Másolva', + copy: 'Másolás', + create: 'Létrehozás', + createNew: 'Új létrehozása', + createNewLabel: 'Új {{label}} létrehozása', + created: 'Létrehozva', + createdAt: 'Létrehozva:', + creating: 'Létrehozás', + creatingNewLabel: 'Új {{label}} létrehozása', + dark: 'Sötét', + dashboard: 'Irányítópult', + delete: 'Törlés', + deletedCountSuccessfully: '{{count}} {{label}} sikeresen törölve.', + deletedSuccessfully: 'Sikeresen törölve.', + deleting: 'Törlés...', + descending: 'Csökkenő', + deselectAllRows: 'Jelölje ki az összes sort', + duplicate: 'Duplikálás', + duplicateWithoutSaving: 'Duplikálás a módosítások mentése nélkül', + edit: 'Szerkesztés', + editLabel: '{{label}} szerkesztése', + editing: 'Szerkesztés', + editingLabel_many: '{{count}} {{label}} szerkesztése', + editingLabel_one: '{{count}} {{label}} szerkesztése', + editingLabel_other: '{{count}} {{label}} szerkesztése', + email: 'E-mail', + emailAddress: 'E-mail cím', + enterAValue: 'Adjon meg egy értéket', + error: 'Hiba', + errors: 'Hibák', + fallbackToDefaultLocale: 'Visszatérés az alapértelmezett nyelvhez', + filter: 'Szűrő', + filterWhere: 'Szűrő {{label}} ahol', + filters: 'Szűrők', + globals: 'Globálisok', + language: 'Nyelv', + lastModified: 'Utoljára módosítva', + leaveAnyway: 'Távozás mindenképp', + leaveWithoutSaving: 'Távozás mentés nélkül', + light: 'Világos', + livePreview: 'Előnézet', + loading: 'Betöltés', + locale: 'Nyelv', + locales: 'Nyelvek', + menu: 'Menü', + moveDown: 'Mozgatás lefelé', + moveUp: 'Mozgatás felfelé', + newPassword: 'Új jelszó', + noFiltersSet: 'Nincs beállítva szűrő', + noLabel: '', + noOptions: 'Nincs lehetőség', + noResults: + 'Nem találtunk {{label}}. Vagy még nem létezik {{label}}, vagy egyik sem felel meg a fent megadott szűrőknek.', + noValue: 'Nincs érték', + none: 'Semmi', + notFound: 'Nem található', + nothingFound: 'Nincs találat', + of: 'a', + open: 'Megnyitás', + or: 'Vagy', + order: 'Sorrend', + pageNotFound: 'Az oldal nem található', + password: 'Jelszó', + payloadSettings: 'Payload beállítások', + perPage: 'Oldalanként: {{limit}}', + remove: 'Törlés', + reset: 'Visszaállítás', + row: 'Sor', + rows: 'Sorok', + save: 'Mentés', + saving: 'Mentés...', + searchBy: 'Keresés a következő szerint: {{label}}', + selectAll: 'Az összes kijelölése: {{count}} {{label}}', + selectAllRows: 'Válassza ki az összes sort', + selectValue: 'Válasszon ki egy értéket', + selectedCount: '{{count}} {{label}} kiválasztva', + showAllLabel: 'Mutasd az összes {{címke}}', + sorryNotFound: 'Sajnáljuk – nincs semmi, ami megfelelne a kérésének.', + sort: 'Rendezés', + sortByLabelDirection: 'Rendezés {{label}} {{direction}} szerint', + stayOnThisPage: 'Maradjon ezen az oldalon', + submissionSuccessful: 'Beküldés sikeres.', + submit: 'Beküldés', + successfullyCreated: '{{label}} sikeresen létrehozva.', + successfullyDuplicated: '{{label}} sikeresen duplikálódott.', + thisLanguage: 'Magyar', + titleDeleted: '{{label}} "{{title}}" sikeresen törölve.', + unauthorized: 'Jogosulatlan', + unsavedChangesDuplicate: 'Nem mentett módosításai vannak. Szeretné folytatni a duplikációt?', + untitled: 'Névtelen', + updatedAt: 'Frissítve:', + updatedCountSuccessfully: '{{count}} {{label}} sikeresen frissítve.', + updatedSuccessfully: 'Sikeresen frissítve.', + updating: 'Frissítés', + uploading: 'Feltöltés', + user: 'Felhasználó', + users: 'Felhasználók', + value: 'Érték', + welcome: 'Üdvözöljük', + }, + operators: { + contains: 'tartalmaz', + equals: 'egyenlő', + exists: 'létezik', + isGreaterThan: 'nagyobb, mint', + isGreaterThanOrEqualTo: 'nagyobb vagy egyenlő, mint', + isIn: 'benne van', + isLessThan: 'kisebb, mint', + isLessThanOrEqualTo: 'kisebb vagy egyenlő, mint', + isLike: 'olyan, mint', + isNotEqualTo: 'nem egyenlő', + isNotIn: 'nincs benne', + near: 'közel', + }, + upload: { + crop: 'Termés', + cropToolDescription: + 'Húzza a kijelölt terület sarkait, rajzoljon új területet, vagy igazítsa a lentebb található értékeket.', + dragAndDrop: 'Húzzon ide egy fájlt', + dragAndDropHere: 'vagy húzzon ide egy fájlt', + editImage: 'Kép szerkesztése', + fileName: 'Fájlnév', + fileSize: 'Fájl mérete', + focalPoint: 'Fókuszpont', + focalPointDescription: + 'Húzza az érdekes pontot közvetlenül az előnézetre, vagy állítsa be az alábbi értékeket.', + height: 'Magasság', + lessInfo: 'Kevesebb információ', + moreInfo: 'További információ', + previewSizes: 'Előnézeti méretek', + selectCollectionToBrowse: 'Válassza ki a böngészni kívánt gyűjteményt', + selectFile: 'Válasszon ki egy fájlt', + setCropArea: 'Állítsa be a vágási területet', + setFocalPoint: 'Állítsa be a fókuszpontot', + sizes: 'Méretek', + sizesFor: 'Méretek a {{címke}} számára', + width: 'Szélesség', + }, + validation: { + emailAddress: 'Kérjük, adjon meg egy érvényes e-mail címet.', + enterNumber: 'Kérjük, adjon meg egy érvényes számot.', + fieldHasNo: 'Ennek a mezőnek nincs {{label}}', + greaterThanMax: '{{value}} nagyobb, mint a megengedett maximum {{label}} érték, ami {{max}}.', + invalidInput: 'Ez a mező érvénytelen értéket tartalmaz.', + invalidSelection: 'Ez a mező érvénytelen kijelöléssel rendelkezik.', + invalidSelections: 'Ez a mező a következő érvénytelen kijelöléseket tartalmazza:', + lessThanMin: '{{value}} kisebb, mint a megengedett minimum {{label}} érték, ami {{min}}.', + limitReached: 'Elérte a korlátot, csak {{max}} elem adható hozzá.', + longerThanMin: + 'Ennek az értéknek hosszabbnak kell lennie, mint a minimális {{minLength}} karakter hosszúság.', + notValidDate: '" {{value}} " nem érvényes dátum.', + required: 'Ez a mező kötelező.', + requiresAtLeast: 'Ehhez a mezőhöz legalább {{count}} {{label}} szükséges.', + requiresNoMoreThan: 'Ehhez a mezőhöz legfeljebb {{count}} {{label}} szükséges.', + requiresTwoNumbers: 'Ehhez a mezőhöz két szám szükséges.', + shorterThanMax: + 'Ennek az értéknek rövidebbnek kell lennie, mint a maximálisan megengedett {{maxLength}} karakter.', + trueOrFalse: 'Ez a mező csak igaz vagy hamis lehet.', + validUploadID: 'Ez a mező nem érvényes feltöltési azonosító.', + }, + version: { + type: 'Típus', + aboutToPublishSelection: + 'Arra készül, hogy az összes {{label}} elemet közzétegye a kijelölésben. biztos vagy ebben?', + aboutToRestore: + 'Arra készül, hogy visszaállítsa ezt a {{label}} dokumentumot arra az állapotra, amelyben {{versionDate}} napon volt.', + aboutToRestoreGlobal: + 'Arra készül, hogy visszaállítsa a {{label}} arra az állapotra, amelyben {{versionDate}} napon volt.', + aboutToRevertToPublished: + 'Arra készül, hogy visszaállítsa a dokumentum módosításait a közzétett állapotába. Biztos benne?', + aboutToUnpublish: 'A dokumentum közzétételének visszavonására készül. Biztos benne?', + aboutToUnpublishSelection: + 'Arra készül, hogy visszavonja a kijelölésben szereplő összes {{label}} közzétételét. biztos vagy ebben?', + autosave: 'Automatikus mentés', + autosavedSuccessfully: 'Automatikus mentés sikeres.', + autosavedVersion: 'Automatikusan mentett verzió', + changed: 'Megváltozott', + compareVersion: 'Hasonlítsa össze a verziót a következőkkel:', + confirmPublish: 'A közzététel megerősítése', + confirmRevertToSaved: 'Erősítse meg a mentett verzióra való visszatérést', + confirmUnpublish: 'A közzététel visszavonásának megerősítése', + confirmVersionRestoration: 'Verzió-visszaállítás megerősítése', + currentDocumentStatus: 'Jelenlegi {{docStatus}} dokumentum', + draft: 'Piszkozat', + draftSavedSuccessfully: 'A piszkozat sikeresen mentve.', + lastSavedAgo: 'Utoljára mentve {{distance}} órája', + noFurtherVersionsFound: 'További verziók nem találhatók', + noRowsFound: 'Nem található {{label}}', + preview: 'Előnézet', + problemRestoringVersion: 'Hiba történt a verzió visszaállításakor', + publish: 'Közzététel', + publishChanges: 'Módosítások közzététele', + published: 'Közzétett', + publishing: 'Közzététel', + restoreThisVersion: 'A verzió visszaállítása', + restoredSuccessfully: 'Sikeresen visszaállítva.', + restoring: 'Visszaállítás...', + revertToPublished: 'Visszatérés a közzétetthez', + reverting: 'Visszaállítás...', + saveDraft: 'Piszkozat mentése', + selectLocales: 'Megjelenítendő nyelvek kiválasztása', + selectVersionToCompare: 'Válassza ki az összehasonlítani kívánt verziót', + showLocales: 'Nyelvek megjelenítése:', + showingVersionsFor: 'Verziók megjelenítése a következőkhöz:', + status: 'Állapot', + unpublish: 'Közzététel visszavonása', + unpublishing: 'Közzététel visszavonása...', + version: 'Verzió', + versionCount_many: '{{count}} verzió található', + versionCount_none: 'Nem található verzió', + versionCount_one: '{{count}} verzió található', + versionCount_other: '{{count}} verzió található', + versionCreatedOn: '{{version}} létrehozva:', + versionID: 'Verzióazonosító', + versions: 'Verziók', + viewingVersion: 'A(z) {{entityLabel}} {{documentTitle}} verziójának megtekintése', + viewingVersionGlobal: 'A globális {{entityLabel}} verziójának megtekintése', + viewingVersions: 'A {{entityLabel}} {{documentTitle}} verzióinak megtekintése', + viewingVersionsGlobal: 'A globális {{entityLabel}} verzióinak megtekintése', + }, }, } diff --git a/packages/translations/src/languages/it.ts b/packages/translations/src/languages/it.ts index 8fd883809c..b45b648faa 100644 --- a/packages/translations/src/languages/it.ts +++ b/packages/translations/src/languages/it.ts @@ -1,395 +1,402 @@ -export default { - authentication: { - account: 'Account', - accountOfCurrentUser: "Account dell'utente corrente", - alreadyActivated: 'Già Attivato', - alreadyLoggedIn: 'Sei già loggato', - apiKey: 'Chiave API', - backToLogin: 'Torna al login', - beginCreateFirstUser: 'Per iniziare, crea il tuo primo utente.', - changePassword: 'Cambia Password', - checkYourEmailForPasswordReset: - 'Controlla la tua email e clicca sul link che ti permetterà di cambiare in sicurezza la tua password.', - confirmGeneration: 'Conferma Generazione', - confirmPassword: 'Conferma Password', - createFirstUser: 'Crea il primo utente', - emailNotValid: "L'email fornita non è valida", - emailSent: 'Email Inviata', - enableAPIKey: 'Abilita la Chiave API', - failedToUnlock: 'Lo sblocco è fallito', - forceUnlock: 'Forza Sblocco', - forgotPassword: 'Cambia Password', - forgotPasswordEmailInstructions: - 'Inserisci la tua mail qui sotto. Riceverai un messaggio email con le istruzioni su come cambiare la tua password.', - forgotPasswordQuestion: 'Password dimenticata?', - generate: 'Genera', - generateNewAPIKey: 'Genera una nuova Chiave API', - generatingNewAPIKeyWillInvalidate: - 'Generando una nuova chiave API si <1>invaliderà la chiave precedente. Sei sicuro di voler continuare?', - lockUntil: 'Sblocca Fino', - logBackIn: 'Vai al Log in', - logOut: 'Log out', - loggedIn: 'Per accedere con un altro utente, devi prima <0>uscire.', - loggedInChangePassword: - 'Per cambiare la tua password, vai al tuo <0>account e modifica la tua password lì.', - loggedOutInactivity: 'Sei stato disconnesso automaticamente per inattività.', - loggedOutSuccessfully: 'Sei stato disconnesso con successo.', - login: 'Login', - loginAttempts: 'Tentativi di Login', - loginUser: 'Utente Login', - loginWithAnotherUser: 'Per accedere con un altro utente, devi prima <0>uscire.', - logout: 'Logout', - logoutUser: 'Logout utente', - newAPIKeyGenerated: 'Nuova Chiave API Generata.', - newAccountCreated: - 'Un nuovo account è appena stato creato per te per accedere a {{serverURL}} Clicca sul seguente link o incolla l\'URL qui sotto nel browser per verificare la tua email: {{verificationURL}}
Dopo aver verificato la tua email, sarai in grado di effettuare il log in con successo.', - newPassword: 'Nuova Password', - resetPassword: 'Modifica Password', - resetPasswordExpiration: 'Reimposta Scadenza Password', - resetPasswordToken: 'Reimposta il Password Token', - resetYourPassword: 'Modifica la tua Password', - stayLoggedIn: 'Rimani connesso', - successfullyUnlocked: 'Sbloccato con successo', - unableToVerify: 'Impossibile verificare', - verified: 'Verificato', - verifiedSuccessfully: 'Verificato con successo', - verify: 'Verifica', - verifyUser: 'Verifica Utente', - verifyYourEmail: 'Verifica la tua email', - youAreInactive: - "Non sei attivo da un po' di tempo e a breve verrai disconnesso automaticamente per la tua sicurezza. Vuoi rimanere connesso?", - youAreReceivingResetPassword: - 'Ricevi questo messaggio perché tu (o qualcun altro) hai richiesto la modifica della password per il tuo account. Clicca sul seguente link o incollalo nel browser per completare il processo:', - youDidNotRequestPassword: - "Se non l'hai richiesto, ignora questa email e la tua password rimarrà invariata.", - }, - error: { - accountAlreadyActivated: 'Questo account è già stato attivato.', - autosaving: - 'Si è verificato un problema durante il salvataggio automatico di questo documento.', - correctInvalidFields: 'Per favore correggi i campi non validi.', - deletingFile: "Si è verificato un errore durante l'eleminazione del file.", - deletingTitle: - "Si è verificato un errore durante l'eliminazione di {{title}}. Per favore controlla la tua connessione e riprova.", - emailOrPasswordIncorrect: "L'email o la password fornita non è corretta.", - followingFieldsInvalid_one: 'Il seguente campo non è valido:', - followingFieldsInvalid_other: 'I seguenti campi non sono validi:', - incorrectCollection: 'Collezione non corretta', - invalidFileType: 'Tipo di file non valido', - invalidFileTypeValue: 'Tipo di file non valido: {{value}}', - loadingDocument: - 'Si è verificato un problema durante il caricamento del documento con ID {{id}}.', - missingEmail: 'Email mancante.', - missingIDOfDocument: 'ID del documento da aggiornare mancante.', - missingIDOfVersion: 'ID della versione mancante.', - missingRequiredData: 'Data mancante.', - noFilesUploaded: 'Nessun file è stato caricato.', - noMatchedField: 'Nessun campo corrispondente trovato per "{{label}}"', - noUser: 'Nessun Utente', - notAllowedToAccessPage: 'Non sei autorizzato ad accedere a questa pagina.', - notAllowedToPerformAction: 'Non sei autorizzato a eseguire questa azione.', - notFound: 'La risorsa richiesta non è stata trovata.', - previewing: "Si è verificato un problema durante l'anteprima di questo documento.", - problemUploadingFile: 'Si è verificato un problema durante il caricamento del file.', - tokenInvalidOrExpired: 'Il token non è valido o è scaduto.', - unPublishingDocument: - "Si è verificato un problema durante l'annullamento della pubblicazione di questo documento.", - unableToDeleteCount: 'Impossibile eliminare {{count}} su {{total}} {{label}}.', - unableToUpdateCount: 'Impossibile aggiornare {{count}} su {{total}} {{label}}.', - unauthorized: 'Non autorizzato, devi essere loggato per effettuare questa richiesta.', - unknown: 'Si è verificato un errore sconosciuto.', - unspecific: 'Si è verificato un errore.', - userLocked: 'Questo utente è bloccato a causa di troppi tentativi di accesso non riusciti.', - valueMustBeUnique: 'Il valore deve essere univoco', - verificationTokenInvalid: 'Il token di verifica non è valido.', - }, - fields: { - addLabel: 'Aggiungi {{label}}', - addLink: 'Aggiungi Collegamento', - addNew: 'Aggiungi nuovo', - addNewLabel: 'Aggiungi nuovo {{label}}', - addRelationship: 'Aggiungi Relazione', - addUpload: 'aggiungi Carica', - block: 'blocco', - blockType: 'Tipo di Blocco', - blocks: 'blocchi', - chooseBetweenCustomTextOrDocument: - "Scegli tra l'inserimento di un URL di testo personalizzato o il collegamento a un altro documento.", - chooseDocumentToLink: 'Scegli un documento a cui collegarti', - chooseFromExisting: 'Scegli tra esistente', - chooseLabel: 'Scegli {{label}}', - collapseAll: 'Comprimi tutto', - customURL: 'URL personalizzato', - editLabelData: 'Modifica i dati di {{label}}', - editLink: 'Modifica Collegamento', - editRelationship: 'Modifica Relazione', - enterURL: 'Inserisci un URL', - internalLink: 'Collegamento interno', - itemsAndMore: '{{items}} e altri {{count}}', - labelRelationship: 'Relazione {{label}}', - latitude: 'Latitudine', - linkType: 'Tipo di collegamento', - linkedTo: 'Collegato a <0>{{label}}', - longitude: 'Longitudine', - newLabel: 'Nuovo {{label}}', - openInNewTab: 'Apri in una nuova scheda', - passwordsDoNotMatch: 'Le password non corrispondono.', - relatedDocument: 'Documento Correlato', - relationTo: 'Correla a', - removeRelationship: 'Rimuovi Relazione', - removeUpload: 'Rimuovi Upload', - saveChanges: 'Salva modifiche', - searchForBlock: 'Cerca un blocco', - selectExistingLabel: 'Seleziona {{label}} esistente', - selectFieldsToEdit: 'Seleziona i campi da modificare', - showAll: 'Mostra tutto', - swapRelationship: 'Cambia Relationship', - swapUpload: 'Cambia Upload', - textToDisplay: 'Testo da visualizzare', - toggleBlock: 'Apri/chiudi blocco', - uploadNewLabel: 'Carica nuovo {{label}}', - }, - general: { - aboutToDelete: 'Stai per eliminare {{label}} <1>{{title}}. Sei sicuro?', - aboutToDeleteCount_many: 'Stai per eliminare {{count}} {{label}}', - aboutToDeleteCount_one: 'Stai per eliminare {{count}} {{label}}', - aboutToDeleteCount_other: 'Stai per eliminare {{count}} {{label}}', - addBelow: 'Aggiungi sotto', - addFilter: 'Aggiungi Filtro', - adminTheme: 'Tema Admin', - and: 'E', - applyChanges: 'Applica modifiche', - ascending: 'Ascendente', - automatic: 'Automatico', - backToDashboard: 'Torna alla Dashboard', - cancel: 'Cancella', - changesNotSaved: 'Le tue modifiche non sono state salvate. Se esci ora, verranno perse.', - close: 'Chiudere', - collapse: 'Comprimi', - collections: 'Collezioni', - columnToSort: 'Colonna da Ordinare', - columns: 'Colonne', - confirm: 'Conferma', - confirmDeletion: "Conferma l'eliminazione", - confirmDuplication: 'Conferma la duplicazione', - copied: 'Copiato', - copy: 'Copia', - create: 'Crea', - createNew: 'Crea Nuovo', - createNewLabel: 'Crea nuovo {{label}}', - created: 'Data di creazione', - createdAt: 'Creato il', - creating: 'Crea nuovo', - creatingNewLabel: 'Creazione di un nuovo {{label}}', - dark: 'Scuro', - dashboard: 'Dashboard', - delete: 'Elimina', - deletedCountSuccessfully: '{{count}} {{label}} eliminato con successo.', - deletedSuccessfully: 'Eliminato con successo.', - deleting: 'Sto eliminando...', - descending: 'Decrescente', - deselectAllRows: 'Deseleziona tutte le righe', - duplicate: 'Duplica', - duplicateWithoutSaving: 'Duplica senza salvare le modifiche', - edit: 'Modificare', - editLabel: 'Modifica {{label}}', - editing: 'Modifica', - editingLabel_many: 'Modificare {{count}} {{label}}', - editingLabel_one: 'Modifica {{count}} {{label}}', - editingLabel_other: 'Modificare {{count}} {{label}}', - email: 'Email', - emailAddress: 'Indirizzo Email', - enterAValue: 'Inserisci un valore', - error: 'Errore', - errors: 'Errori', - fallbackToDefaultLocale: 'Fallback al locale predefinito', - filter: 'Filtro', - filterWhere: 'Filtra {{label}} se', - filters: 'Filtri', - globals: 'Globali', - language: 'Lingua', - lastModified: 'Ultima modifica', - leaveAnyway: 'Esci comunque', - leaveWithoutSaving: 'Esci senza salvare', - light: 'Chiaro', - livePreview: 'Anteprima dal vivo', - loading: 'Caricamento', - locale: 'Locale', - locales: 'Localizzazioni', - menu: 'Menù', - moveDown: 'Sposta sotto', - moveUp: 'Sposta sopra', - newPassword: 'Nuova Password', - noFiltersSet: 'Nessun filtro impostato', - noLabel: '', - noOptions: 'Nessuna opzione', - noResults: - 'Nessun {{label}} trovato. Non esiste ancora nessun {{label}} oppure nessuno corrisponde ai filtri che hai specificato sopra.', - noValue: 'Nessun valore', - none: 'Nessuno', - notFound: 'Non Trovato', - nothingFound: 'Non è stato trovato nulla', - of: 'di', - open: 'Apri', - or: 'Oppure', - order: 'Ordine', - pageNotFound: 'Pagina non trovata', - password: 'Password', - payloadSettings: 'Impostazioni di Payload', - perPage: 'Per Pagina: {{limit}}', - preview: 'Anteprima', - remove: 'Rimuovi', - reset: 'Ripristina', - row: 'Riga', - rows: 'Righe', - save: 'Salva', - saving: 'Salvo...', - searchBy: 'Cerca per {{label}}', - selectAll: 'Seleziona tutto {{count}} {{label}}', - selectAllRows: 'Seleziona tutte le righe', - selectValue: 'Seleziona un valore', - selectedCount: '{{count}} {{label}} selezionato', - showAllLabel: 'Mostra tutti {{label}}', - sorryNotFound: "Siamo spiacenti, non c'è nulla che corrisponda alla tua richiesta.", - sort: 'Ordina', - sortByLabelDirection: 'Ordina per {{label}} {{direction}}', - stayOnThisPage: 'Rimani su questa pagina', - submissionSuccessful: 'Invio riuscito.', - submit: 'Invia', - successfullyCreated: '{{label}} creato con successo.', - successfullyDuplicated: '{{label}} duplicato con successo.', - thisLanguage: 'Italiano', - titleDeleted: '{{label}} {{title}} eliminato con successo.', - unauthorized: 'Non autorizzato', - unsavedChangesDuplicate: 'Sono presenti modifiche non salvate. Vuoi continuare a duplicare?', - untitled: 'Senza titolo', - updatedAt: 'Aggiornato il', - updatedCountSuccessfully: '{{count}} {{label}} aggiornato con successo.', - updatedSuccessfully: 'Aggiornato con successo.', - updating: 'Aggiornamento', - uploading: 'Caricamento', - user: 'Utente', - users: 'Utenti', - value: 'Valore', - welcome: 'Benvenuto', - }, - operators: { - contains: 'contiene', - equals: 'uguale', - exists: 'esiste', - isGreaterThan: 'è maggiore di', - isGreaterThanOrEqualTo: 'è maggiore o uguale a', - isIn: 'è in', - isLessThan: 'è minore di', - isLessThanOrEqualTo: 'è minore o uguale a', - isLike: 'è come', - isNotEqualTo: 'non è uguale a', - isNotIn: 'non è in', - near: 'vicino', - }, - upload: { - crop: 'Raccolto', - cropToolDescription: - "Trascina gli angoli dell'area selezionata, disegna una nuova area o regola i valori qui sotto.", - dragAndDrop: 'Trascina e rilascia un file', - dragAndDropHere: 'oppure trascina e rilascia un file qui', - editImage: 'Modifica immagine', - fileName: 'Nome File', - fileSize: 'Dimensione File', - focalPoint: 'Punto Focale', - focalPointDescription: - "Trascina il punto focale direttamente sull'anteprima o regola i valori sottostanti.", - height: 'Altezza', - lessInfo: 'Meno info', - moreInfo: 'Più info', - previewSizes: 'Anteprime Dimensioni', - selectCollectionToBrowse: 'Seleziona una Collezione da Sfogliare', - selectFile: 'Seleziona un file', - setCropArea: 'Imposta area di ritaglio', - setFocalPoint: 'Imposta punto focale', - sizes: 'Formati', - sizesFor: 'Dimensioni per {{label}}', - width: 'Larghezza', - }, - validation: { - emailAddress: 'Si prega di inserire un indirizzo email valido.', - enterNumber: 'Si prega di inserire un numero valido.', - fieldHasNo: 'Questo campo non ha {{label}}', - greaterThanMax: '{{value}} è superiore al massimo consentito {{label}} di {{max}}.', - invalidInput: 'Questo campo ha un input non valido.', - invalidSelection: 'Questo campo ha una selezione non valida.', - invalidSelections: "'In questo campo sono presenti le seguenti selezioni non valide:'", - lessThanMin: '{{value}} è inferiore al minimo consentito {{label}} di {{min}}.', - limitReached: 'Raggiunto il limite, possono essere aggiunti solo {{max}} elementi.', - longerThanMin: - 'Questo valore deve essere più lungo della lunghezza minima di {{minLength}} caratteri.', - notValidDate: '"{{value}}" non è una data valida.', - required: 'Questo campo è obbligatorio.', - requiresAtLeast: 'Questo campo richiede almeno {{count}} {{label}}.', - requiresNoMoreThan: 'Questo campo richiede non più di {{count}} {{label}}.', - requiresTwoNumbers: 'Questo campo richiede due numeri.', - shorterThanMax: - 'Questo valore deve essere inferiore alla lunghezza massima di {{maxLength}} caratteri.', - trueOrFalse: "Questo campo può essere solo uguale a 'true' o 'false'.", - validUploadID: "'Questo campo non è un ID di Upload valido.'", - }, - version: { - aboutToPublishSelection: 'Stai per pubblicare tutte le {{label}} nella selezione. Sei sicuro?', - aboutToRestore: - 'Stai per ripristinare questo documento {{label}} allo stato in cui si trovava il {{versionDate}}.', - aboutToRestoreGlobal: - 'Stai per ripristinare {{label}} allo stato in cui si trovava il {{versionDate}}.', - aboutToRevertToPublished: - 'Stai per ripristinare le modifiche di questo documento al suo stato pubblicato. Sei sicuro?', - aboutToUnpublish: 'Stai per annullare la pubblicazione di questo documento. Sei sicuro?', - aboutToUnpublishSelection: - 'Stai per annullare la pubblicazione di tutte le {{label}} nella selezione. Sei sicuro?', - autosave: 'Salvataggio automatico', - autosavedSuccessfully: 'Salvataggio automatico riuscito.', - autosavedVersion: 'Versione salvata automaticamente', - changed: 'Modificato', - compareVersion: 'Confronta versione con:', - confirmPublish: 'Conferma la pubblicazione', - confirmRevertToSaved: 'Conferma il ripristino dei salvataggi', - confirmUnpublish: 'Conferma annullamento della pubblicazione', - confirmVersionRestoration: 'Conferma il ripristino della versione', - currentDocumentStatus: 'Documento {{docStatus}} corrente', - draft: 'Bozza', - draftSavedSuccessfully: 'Bozza salvata con successo.', - lastSavedAgo: 'Ultimo salvataggio {{distance}} fa', - noFurtherVersionsFound: 'Non sono state trovate ulteriori versioni', - noRowsFound: 'Nessun {{label}} trovato', - preview: 'Anteprima', - problemRestoringVersion: 'Si è verificato un problema durante il ripristino di questa versione', - publish: 'Pubblicare', - publishChanges: 'Pubblica modifiche', - published: 'Pubblicato', - publishing: 'Pubblicazione', - restoreThisVersion: 'Ripristina questa versione', - restoredSuccessfully: 'Ripristinato con successo.', - restoring: 'Ripristino...', - revertToPublished: 'Ritorna alla versione pubblicata', - reverting: 'Ritorno...', - saveDraft: 'Salva Bozza', - selectLocales: 'Seleziona le lingue da visualizzare', - selectVersionToCompare: 'Seleziona una versione da confrontare', - showLocales: 'Mostra localizzazioni:', - showingVersionsFor: 'Mostra le versioni per:', - status: 'Stato', - type: 'Tipo', - unpublish: 'Annulla pubblicazione', - unpublishing: 'Annullamento pubblicazione...', - version: 'Versione', - versionCount_many: '{{count}} versioni trovate', - versionCount_none: 'Nessuna versione trovata', - versionCount_one: '{{count}} versione trovata', - versionCount_other: '{{count}} versioni trovate', - versionCreatedOn: '{{version}} creata il:', - versionID: 'ID Versione', - versions: 'Versioni', - viewingVersion: 'Visualizzazione della versione per {{entityLabel}} {{documentTitle}}', - viewingVersionGlobal: '`Visualizzazione della versione per {{entityLabel}}', - viewingVersions: 'Visualizzazione delle versioni per {{entityLabel}} {{documentTitle}}', - viewingVersionsGlobal: '`Visualizzazione delle versioni per {{entityLabel}}', +import type { Language } from '../types.js' + +export const it: Language = { + dateFNSKey: 'it', + translations: { + authentication: { + account: 'Account', + accountOfCurrentUser: "Account dell'utente corrente", + alreadyActivated: 'Già Attivato', + alreadyLoggedIn: 'Sei già loggato', + apiKey: 'Chiave API', + backToLogin: 'Torna al login', + beginCreateFirstUser: 'Per iniziare, crea il tuo primo utente.', + changePassword: 'Cambia Password', + checkYourEmailForPasswordReset: + 'Controlla la tua email e clicca sul link che ti permetterà di cambiare in sicurezza la tua password.', + confirmGeneration: 'Conferma Generazione', + confirmPassword: 'Conferma Password', + createFirstUser: 'Crea il primo utente', + emailNotValid: "L'email fornita non è valida", + emailSent: 'Email Inviata', + enableAPIKey: 'Abilita la Chiave API', + failedToUnlock: 'Lo sblocco è fallito', + forceUnlock: 'Forza Sblocco', + forgotPassword: 'Cambia Password', + forgotPasswordEmailInstructions: + 'Inserisci la tua mail qui sotto. Riceverai un messaggio email con le istruzioni su come cambiare la tua password.', + forgotPasswordQuestion: 'Password dimenticata?', + generate: 'Genera', + generateNewAPIKey: 'Genera una nuova Chiave API', + generatingNewAPIKeyWillInvalidate: + 'Generando una nuova chiave API si <1>invaliderà la chiave precedente. Sei sicuro di voler continuare?', + lockUntil: 'Sblocca Fino', + logBackIn: 'Vai al Log in', + logOut: 'Log out', + loggedIn: 'Per accedere con un altro utente, devi prima <0>uscire.', + loggedInChangePassword: + 'Per cambiare la tua password, vai al tuo <0>account e modifica la tua password lì.', + loggedOutInactivity: 'Sei stato disconnesso automaticamente per inattività.', + loggedOutSuccessfully: 'Sei stato disconnesso con successo.', + login: 'Login', + loginAttempts: 'Tentativi di Login', + loginUser: 'Utente Login', + loginWithAnotherUser: 'Per accedere con un altro utente, devi prima <0>uscire.', + logout: 'Logout', + logoutUser: 'Logout utente', + newAPIKeyGenerated: 'Nuova Chiave API Generata.', + newAccountCreated: + 'Un nuovo account è appena stato creato per te per accedere a {{serverURL}} Clicca sul seguente link o incolla l\'URL qui sotto nel browser per verificare la tua email: {{verificationURL}}
Dopo aver verificato la tua email, sarai in grado di effettuare il log in con successo.', + newPassword: 'Nuova Password', + resetPassword: 'Modifica Password', + resetPasswordExpiration: 'Reimposta Scadenza Password', + resetPasswordToken: 'Reimposta il Password Token', + resetYourPassword: 'Modifica la tua Password', + stayLoggedIn: 'Rimani connesso', + successfullyUnlocked: 'Sbloccato con successo', + unableToVerify: 'Impossibile verificare', + verified: 'Verificato', + verifiedSuccessfully: 'Verificato con successo', + verify: 'Verifica', + verifyUser: 'Verifica Utente', + verifyYourEmail: 'Verifica la tua email', + youAreInactive: + "Non sei attivo da un po' di tempo e a breve verrai disconnesso automaticamente per la tua sicurezza. Vuoi rimanere connesso?", + youAreReceivingResetPassword: + 'Ricevi questo messaggio perché tu (o qualcun altro) hai richiesto la modifica della password per il tuo account. Clicca sul seguente link o incollalo nel browser per completare il processo:', + youDidNotRequestPassword: + "Se non l'hai richiesto, ignora questa email e la tua password rimarrà invariata.", + }, + error: { + accountAlreadyActivated: 'Questo account è già stato attivato.', + autosaving: + 'Si è verificato un problema durante il salvataggio automatico di questo documento.', + correctInvalidFields: 'Per favore correggi i campi non validi.', + deletingFile: "Si è verificato un errore durante l'eleminazione del file.", + deletingTitle: + "Si è verificato un errore durante l'eliminazione di {{title}}. Per favore controlla la tua connessione e riprova.", + emailOrPasswordIncorrect: "L'email o la password fornita non è corretta.", + followingFieldsInvalid_one: 'Il seguente campo non è valido:', + followingFieldsInvalid_other: 'I seguenti campi non sono validi:', + incorrectCollection: 'Collezione non corretta', + invalidFileType: 'Tipo di file non valido', + invalidFileTypeValue: 'Tipo di file non valido: {{value}}', + loadingDocument: + 'Si è verificato un problema durante il caricamento del documento con ID {{id}}.', + missingEmail: 'Email mancante.', + missingIDOfDocument: 'ID del documento da aggiornare mancante.', + missingIDOfVersion: 'ID della versione mancante.', + missingRequiredData: 'Data mancante.', + noFilesUploaded: 'Nessun file è stato caricato.', + noMatchedField: 'Nessun campo corrispondente trovato per "{{label}}"', + noUser: 'Nessun Utente', + notAllowedToAccessPage: 'Non sei autorizzato ad accedere a questa pagina.', + notAllowedToPerformAction: 'Non sei autorizzato a eseguire questa azione.', + notFound: 'La risorsa richiesta non è stata trovata.', + previewing: "Si è verificato un problema durante l'anteprima di questo documento.", + problemUploadingFile: 'Si è verificato un problema durante il caricamento del file.', + tokenInvalidOrExpired: 'Il token non è valido o è scaduto.', + unPublishingDocument: + "Si è verificato un problema durante l'annullamento della pubblicazione di questo documento.", + unableToDeleteCount: 'Impossibile eliminare {{count}} su {{total}} {{label}}.', + unableToUpdateCount: 'Impossibile aggiornare {{count}} su {{total}} {{label}}.', + unauthorized: 'Non autorizzato, devi essere loggato per effettuare questa richiesta.', + unknown: 'Si è verificato un errore sconosciuto.', + unspecific: 'Si è verificato un errore.', + userLocked: 'Questo utente è bloccato a causa di troppi tentativi di accesso non riusciti.', + valueMustBeUnique: 'Il valore deve essere univoco', + verificationTokenInvalid: 'Il token di verifica non è valido.', + }, + fields: { + addLabel: 'Aggiungi {{label}}', + addLink: 'Aggiungi Collegamento', + addNew: 'Aggiungi nuovo', + addNewLabel: 'Aggiungi nuovo {{label}}', + addRelationship: 'Aggiungi Relazione', + addUpload: 'aggiungi Carica', + block: 'blocco', + blockType: 'Tipo di Blocco', + blocks: 'blocchi', + chooseBetweenCustomTextOrDocument: + "Scegli tra l'inserimento di un URL di testo personalizzato o il collegamento a un altro documento.", + chooseDocumentToLink: 'Scegli un documento a cui collegarti', + chooseFromExisting: 'Scegli tra esistente', + chooseLabel: 'Scegli {{label}}', + collapseAll: 'Comprimi tutto', + customURL: 'URL personalizzato', + editLabelData: 'Modifica i dati di {{label}}', + editLink: 'Modifica Collegamento', + editRelationship: 'Modifica Relazione', + enterURL: 'Inserisci un URL', + internalLink: 'Collegamento interno', + itemsAndMore: '{{items}} e altri {{count}}', + labelRelationship: 'Relazione {{label}}', + latitude: 'Latitudine', + linkType: 'Tipo di collegamento', + linkedTo: 'Collegato a <0>{{label}}', + longitude: 'Longitudine', + newLabel: 'Nuovo {{label}}', + openInNewTab: 'Apri in una nuova scheda', + passwordsDoNotMatch: 'Le password non corrispondono.', + relatedDocument: 'Documento Correlato', + relationTo: 'Correla a', + removeRelationship: 'Rimuovi Relazione', + removeUpload: 'Rimuovi Upload', + saveChanges: 'Salva modifiche', + searchForBlock: 'Cerca un blocco', + selectExistingLabel: 'Seleziona {{label}} esistente', + selectFieldsToEdit: 'Seleziona i campi da modificare', + showAll: 'Mostra tutto', + swapRelationship: 'Cambia Relationship', + swapUpload: 'Cambia Upload', + textToDisplay: 'Testo da visualizzare', + toggleBlock: 'Apri/chiudi blocco', + uploadNewLabel: 'Carica nuovo {{label}}', + }, + general: { + aboutToDelete: 'Stai per eliminare {{label}} <1>{{title}}. Sei sicuro?', + aboutToDeleteCount_many: 'Stai per eliminare {{count}} {{label}}', + aboutToDeleteCount_one: 'Stai per eliminare {{count}} {{label}}', + aboutToDeleteCount_other: 'Stai per eliminare {{count}} {{label}}', + addBelow: 'Aggiungi sotto', + addFilter: 'Aggiungi Filtro', + adminTheme: 'Tema Admin', + and: 'E', + applyChanges: 'Applica modifiche', + ascending: 'Ascendente', + automatic: 'Automatico', + backToDashboard: 'Torna alla Dashboard', + cancel: 'Cancella', + changesNotSaved: 'Le tue modifiche non sono state salvate. Se esci ora, verranno perse.', + close: 'Chiudere', + collapse: 'Comprimi', + collections: 'Collezioni', + columnToSort: 'Colonna da Ordinare', + columns: 'Colonne', + confirm: 'Conferma', + confirmDeletion: "Conferma l'eliminazione", + confirmDuplication: 'Conferma la duplicazione', + copied: 'Copiato', + copy: 'Copia', + create: 'Crea', + createNew: 'Crea Nuovo', + createNewLabel: 'Crea nuovo {{label}}', + created: 'Data di creazione', + createdAt: 'Creato il', + creating: 'Crea nuovo', + creatingNewLabel: 'Creazione di un nuovo {{label}}', + dark: 'Scuro', + dashboard: 'Dashboard', + delete: 'Elimina', + deletedCountSuccessfully: '{{count}} {{label}} eliminato con successo.', + deletedSuccessfully: 'Eliminato con successo.', + deleting: 'Sto eliminando...', + descending: 'Decrescente', + deselectAllRows: 'Deseleziona tutte le righe', + duplicate: 'Duplica', + duplicateWithoutSaving: 'Duplica senza salvare le modifiche', + edit: 'Modificare', + editLabel: 'Modifica {{label}}', + editing: 'Modifica', + editingLabel_many: 'Modificare {{count}} {{label}}', + editingLabel_one: 'Modifica {{count}} {{label}}', + editingLabel_other: 'Modificare {{count}} {{label}}', + email: 'Email', + emailAddress: 'Indirizzo Email', + enterAValue: 'Inserisci un valore', + error: 'Errore', + errors: 'Errori', + fallbackToDefaultLocale: 'Fallback al locale predefinito', + filter: 'Filtro', + filterWhere: 'Filtra {{label}} se', + filters: 'Filtri', + globals: 'Globali', + language: 'Lingua', + lastModified: 'Ultima modifica', + leaveAnyway: 'Esci comunque', + leaveWithoutSaving: 'Esci senza salvare', + light: 'Chiaro', + livePreview: 'Anteprima dal vivo', + loading: 'Caricamento', + locale: 'Locale', + locales: 'Localizzazioni', + menu: 'Menù', + moveDown: 'Sposta sotto', + moveUp: 'Sposta sopra', + newPassword: 'Nuova Password', + noFiltersSet: 'Nessun filtro impostato', + noLabel: '', + noOptions: 'Nessuna opzione', + noResults: + 'Nessun {{label}} trovato. Non esiste ancora nessun {{label}} oppure nessuno corrisponde ai filtri che hai specificato sopra.', + noValue: 'Nessun valore', + none: 'Nessuno', + notFound: 'Non Trovato', + nothingFound: 'Non è stato trovato nulla', + of: 'di', + open: 'Apri', + or: 'Oppure', + order: 'Ordine', + pageNotFound: 'Pagina non trovata', + password: 'Password', + payloadSettings: 'Impostazioni di Payload', + perPage: 'Per Pagina: {{limit}}', + preview: 'Anteprima', + remove: 'Rimuovi', + reset: 'Ripristina', + row: 'Riga', + rows: 'Righe', + save: 'Salva', + saving: 'Salvo...', + searchBy: 'Cerca per {{label}}', + selectAll: 'Seleziona tutto {{count}} {{label}}', + selectAllRows: 'Seleziona tutte le righe', + selectValue: 'Seleziona un valore', + selectedCount: '{{count}} {{label}} selezionato', + showAllLabel: 'Mostra tutti {{label}}', + sorryNotFound: "Siamo spiacenti, non c'è nulla che corrisponda alla tua richiesta.", + sort: 'Ordina', + sortByLabelDirection: 'Ordina per {{label}} {{direction}}', + stayOnThisPage: 'Rimani su questa pagina', + submissionSuccessful: 'Invio riuscito.', + submit: 'Invia', + successfullyCreated: '{{label}} creato con successo.', + successfullyDuplicated: '{{label}} duplicato con successo.', + thisLanguage: 'Italiano', + titleDeleted: '{{label}} {{title}} eliminato con successo.', + unauthorized: 'Non autorizzato', + unsavedChangesDuplicate: 'Sono presenti modifiche non salvate. Vuoi continuare a duplicare?', + untitled: 'Senza titolo', + updatedAt: 'Aggiornato il', + updatedCountSuccessfully: '{{count}} {{label}} aggiornato con successo.', + updatedSuccessfully: 'Aggiornato con successo.', + updating: 'Aggiornamento', + uploading: 'Caricamento', + user: 'Utente', + users: 'Utenti', + value: 'Valore', + welcome: 'Benvenuto', + }, + operators: { + contains: 'contiene', + equals: 'uguale', + exists: 'esiste', + isGreaterThan: 'è maggiore di', + isGreaterThanOrEqualTo: 'è maggiore o uguale a', + isIn: 'è in', + isLessThan: 'è minore di', + isLessThanOrEqualTo: 'è minore o uguale a', + isLike: 'è come', + isNotEqualTo: 'non è uguale a', + isNotIn: 'non è in', + near: 'vicino', + }, + upload: { + crop: 'Raccolto', + cropToolDescription: + "Trascina gli angoli dell'area selezionata, disegna una nuova area o regola i valori qui sotto.", + dragAndDrop: 'Trascina e rilascia un file', + dragAndDropHere: 'oppure trascina e rilascia un file qui', + editImage: 'Modifica immagine', + fileName: 'Nome File', + fileSize: 'Dimensione File', + focalPoint: 'Punto Focale', + focalPointDescription: + "Trascina il punto focale direttamente sull'anteprima o regola i valori sottostanti.", + height: 'Altezza', + lessInfo: 'Meno info', + moreInfo: 'Più info', + previewSizes: 'Anteprime Dimensioni', + selectCollectionToBrowse: 'Seleziona una Collezione da Sfogliare', + selectFile: 'Seleziona un file', + setCropArea: 'Imposta area di ritaglio', + setFocalPoint: 'Imposta punto focale', + sizes: 'Formati', + sizesFor: 'Dimensioni per {{label}}', + width: 'Larghezza', + }, + validation: { + emailAddress: 'Si prega di inserire un indirizzo email valido.', + enterNumber: 'Si prega di inserire un numero valido.', + fieldHasNo: 'Questo campo non ha {{label}}', + greaterThanMax: '{{value}} è superiore al massimo consentito {{label}} di {{max}}.', + invalidInput: 'Questo campo ha un input non valido.', + invalidSelection: 'Questo campo ha una selezione non valida.', + invalidSelections: "'In questo campo sono presenti le seguenti selezioni non valide:'", + lessThanMin: '{{value}} è inferiore al minimo consentito {{label}} di {{min}}.', + limitReached: 'Raggiunto il limite, possono essere aggiunti solo {{max}} elementi.', + longerThanMin: + 'Questo valore deve essere più lungo della lunghezza minima di {{minLength}} caratteri.', + notValidDate: '"{{value}}" non è una data valida.', + required: 'Questo campo è obbligatorio.', + requiresAtLeast: 'Questo campo richiede almeno {{count}} {{label}}.', + requiresNoMoreThan: 'Questo campo richiede non più di {{count}} {{label}}.', + requiresTwoNumbers: 'Questo campo richiede due numeri.', + shorterThanMax: + 'Questo valore deve essere inferiore alla lunghezza massima di {{maxLength}} caratteri.', + trueOrFalse: "Questo campo può essere solo uguale a 'true' o 'false'.", + validUploadID: "'Questo campo non è un ID di Upload valido.'", + }, + version: { + type: 'Tipo', + aboutToPublishSelection: + 'Stai per pubblicare tutte le {{label}} nella selezione. Sei sicuro?', + aboutToRestore: + 'Stai per ripristinare questo documento {{label}} allo stato in cui si trovava il {{versionDate}}.', + aboutToRestoreGlobal: + 'Stai per ripristinare {{label}} allo stato in cui si trovava il {{versionDate}}.', + aboutToRevertToPublished: + 'Stai per ripristinare le modifiche di questo documento al suo stato pubblicato. Sei sicuro?', + aboutToUnpublish: 'Stai per annullare la pubblicazione di questo documento. Sei sicuro?', + aboutToUnpublishSelection: + 'Stai per annullare la pubblicazione di tutte le {{label}} nella selezione. Sei sicuro?', + autosave: 'Salvataggio automatico', + autosavedSuccessfully: 'Salvataggio automatico riuscito.', + autosavedVersion: 'Versione salvata automaticamente', + changed: 'Modificato', + compareVersion: 'Confronta versione con:', + confirmPublish: 'Conferma la pubblicazione', + confirmRevertToSaved: 'Conferma il ripristino dei salvataggi', + confirmUnpublish: 'Conferma annullamento della pubblicazione', + confirmVersionRestoration: 'Conferma il ripristino della versione', + currentDocumentStatus: 'Documento {{docStatus}} corrente', + draft: 'Bozza', + draftSavedSuccessfully: 'Bozza salvata con successo.', + lastSavedAgo: 'Ultimo salvataggio {{distance}} fa', + noFurtherVersionsFound: 'Non sono state trovate ulteriori versioni', + noRowsFound: 'Nessun {{label}} trovato', + preview: 'Anteprima', + problemRestoringVersion: + 'Si è verificato un problema durante il ripristino di questa versione', + publish: 'Pubblicare', + publishChanges: 'Pubblica modifiche', + published: 'Pubblicato', + publishing: 'Pubblicazione', + restoreThisVersion: 'Ripristina questa versione', + restoredSuccessfully: 'Ripristinato con successo.', + restoring: 'Ripristino...', + revertToPublished: 'Ritorna alla versione pubblicata', + reverting: 'Ritorno...', + saveDraft: 'Salva Bozza', + selectLocales: 'Seleziona le lingue da visualizzare', + selectVersionToCompare: 'Seleziona una versione da confrontare', + showLocales: 'Mostra localizzazioni:', + showingVersionsFor: 'Mostra le versioni per:', + status: 'Stato', + unpublish: 'Annulla pubblicazione', + unpublishing: 'Annullamento pubblicazione...', + version: 'Versione', + versionCount_many: '{{count}} versioni trovate', + versionCount_none: 'Nessuna versione trovata', + versionCount_one: '{{count}} versione trovata', + versionCount_other: '{{count}} versioni trovate', + versionCreatedOn: '{{version}} creata il:', + versionID: 'ID Versione', + versions: 'Versioni', + viewingVersion: 'Visualizzazione della versione per {{entityLabel}} {{documentTitle}}', + viewingVersionGlobal: '`Visualizzazione della versione per {{entityLabel}}', + viewingVersions: 'Visualizzazione delle versioni per {{entityLabel}} {{documentTitle}}', + viewingVersionsGlobal: '`Visualizzazione delle versioni per {{entityLabel}}', + }, }, } diff --git a/packages/translations/src/languages/ja.ts b/packages/translations/src/languages/ja.ts index 864e6a3cd7..c3738a2fd1 100644 --- a/packages/translations/src/languages/ja.ts +++ b/packages/translations/src/languages/ja.ts @@ -1,389 +1,395 @@ -export default { - authentication: { - account: 'アカウント', - accountOfCurrentUser: '現在のユーザーアカウント', - alreadyActivated: 'すでに有効です', - alreadyLoggedIn: 'すでにログインしています', - apiKey: 'API Key', - backToLogin: 'ログイン画面へ戻る', - beginCreateFirstUser: 'まずは、最初のユーザーを作成します。', - changePassword: 'パスワードを変更', - checkYourEmailForPasswordReset: - 'パスワードを安全に再設定するためのリンクがメールで送られてくるので、確認してください。', - confirmGeneration: '生成の確認', - confirmPassword: 'パスワードの確認', - createFirstUser: '最初のユーザーを作成', - emailNotValid: '入力されたメールアドレスは無効です。', - emailSent: 'Emailが送信されました。', - enableAPIKey: 'API Keyを許可', - failedToUnlock: 'ロックの解除に失敗しました。', - forceUnlock: '強制的にロックを解除', - forgotPassword: 'パスワード再設定', - forgotPasswordEmailInstructions: - 'アカウントのメールアドレスを以下に入力してください。パスワードの再設定方法が記載されたメールが届きます。', - forgotPasswordQuestion: 'パスワードをお忘れですか?', - generate: '生成', - generateNewAPIKey: '新しいAPI Keyを生成', - generatingNewAPIKeyWillInvalidate: - '新しいAPI Keyを生成すると、以前のAPI Keyは<1>無効になります。よろしいですか?', - lockUntil: 'ロック期限', - logBackIn: '改めてログイン', - logOut: 'ログアウト', - loggedIn: '他のユーザーでログインするには、まず<0>ログアウトする必要があります。', - loggedInChangePassword: - 'パスワードを変更するには、<0>アカウントにアクセスしてパスワードを編集してください。', - loggedOutInactivity: 'しばらく操作を行わなかったため、管理画面からログアウトしました。', - loggedOutSuccessfully: '管理画面からログアウトしました。', - login: 'ログイン', - loginAttempts: 'ログイン試行回数', - loginUser: 'ログインユーザー', - loginWithAnotherUser: - '他のユーザーでログインするには、まず<0>ログアウトする必要があります。', - logout: 'ログアウト', - logoutUser: 'ログアウトユーザー', - newAPIKeyGenerated: '新しいAPI Keyを生成しました。', - newAccountCreated: - '{{serverURL}}にアクセスするための新しいアカウントが作成されました。以下のリンクをクリックするか、ブラウザに以下のURLを貼り付けて、メールアドレスの確認を行ってください。{{verificationURL}}
メールアドレスの確認後に、正常にログインできるようになります。', - newPassword: '新しいパスワード', - resetPassword: 'パスワード再発行', - resetPasswordExpiration: 'パスワードの有効期限をリセット', - resetPasswordToken: 'パスワードのトークンをリセット', - resetYourPassword: 'パスワードの再設定', - stayLoggedIn: 'ログイン状態を維持', - successfullyUnlocked: 'ロックの解除に成功しました。', - unableToVerify: '検証ができません', - verified: '検証済み', - verifiedSuccessfully: '検証が成功しました', - verify: '検証', - verifyUser: 'ユーザーの確認', - verifyYourEmail: 'メールアドレスの確認', - youAreInactive: - 'しばらく操作を行わなかったため、セキュリティのために自動的にログアウトします。ログイン状態を維持しますか?', - youAreReceivingResetPassword: - 'アカウントのパスワードリセットがリクエストされました。次のリンクをクリックする、または、ブラウザにリンクを貼り付けて、手続きを行ってください:', - youDidNotRequestPassword: - 'もし望まない場合は、このメールを無視してください。パスワードは変更されません。', - }, - error: { - accountAlreadyActivated: 'このアカウントはすでに有効です。', - autosaving: 'このデータを自動保存する際に問題が発生しました。', - correctInvalidFields: '無効なフィールドを修正してください。', - deletingFile: 'ファイルの削除中にエラーが発生しました。', - deletingTitle: - '{{title}} を削除する際にエラーが発生しました。接続を確認してからもう一度お試しください。', - emailOrPasswordIncorrect: 'メールアドレス、または、パスワードが正しくありません。', - followingFieldsInvalid_one: '次のフィールドは無効です:', - followingFieldsInvalid_other: '次のフィールドは無効です:', - incorrectCollection: '不正なコレクション', - invalidFileType: '無効なファイル形式', - invalidFileTypeValue: '無効なファイル形式: {{value}}', - loadingDocument: 'IDが {{id}} のデータを読み込む際に問題が発生しました。', - missingEmail: 'メールアドレスが不足しています。', - missingIDOfDocument: '更新するデータのIDが不足しています。', - missingIDOfVersion: 'バージョンIDが不足しています。', - missingRequiredData: '必須データが不足しています。', - noFilesUploaded: 'ファイルがアップロードされていません。', - noMatchedField: '"{{label}}" に該当するフィールドがありません。', - noUser: 'ユーザーなし', - notAllowedToAccessPage: 'この画面へのアクセスは許可されていません。', - notAllowedToPerformAction: 'このアクションは許可されていません。', - notFound: 'リクエストされたリソースは見つかりませんでした。', - previewing: 'このデータをプレビューする際に問題が発生しました。', - problemUploadingFile: 'ファイルのアップロード中に問題が発生しました。', - tokenInvalidOrExpired: 'トークンが無効、または、有効期限が切れています。', - unPublishingDocument: 'このデータを非公開する際に問題が発生しました。', - unableToDeleteCount: '{{total}} {{label}} から {{count}} を削除できません。', - unableToUpdateCount: '{{total}} {{label}} のうち {{count}} 個を更新できません。', - unauthorized: '認証されていません。このリクエストを行うにはログインが必要です。', - unknown: '不明なエラーが発生しました。', - unspecific: 'エラーが発生しました。', - userLocked: 'このユーザーは、ログイン試行回数が多すぎるため、ロックされています。', - valueMustBeUnique: 'ユニークな値である必要があります。', - verificationTokenInvalid: '認証トークンが無効です。', - }, - fields: { - addLabel: '{{label}} を追加', - addLink: 'リンクを追加', - addNew: '新規追加', - addNewLabel: '{{label}} を新規追加', - addRelationship: 'リレーションシップを追加', - addUpload: 'アップロードを追加', - block: 'ブロック', - blockType: 'ブロックタイプ', - blocks: 'ブロック', - chooseBetweenCustomTextOrDocument: - 'カスタムテキストのURLを入力するか、他のドキュメントにリンクするかを選択してください。', - chooseDocumentToLink: 'リンクするドキュメントを選択してください。', - chooseFromExisting: '既存から選択', - chooseLabel: '{{label}} を選択', - collapseAll: 'すべて閉じる', - customURL: 'カスタムURL', - editLabelData: '{{label}} データを編集', - editLink: 'リンクを編集', - editRelationship: 'リレーションシップを編集', - enterURL: 'URL を入力してください', - internalLink: '内部リンク', - itemsAndMore: '{{items}} 他{{count}}件', - labelRelationship: '{{label}} リレーションシップ', - latitude: '緯度', - linkType: 'リンクタイプ', - linkedTo: '<0>{{label}} にリンク', - longitude: '経度', - newLabel: '新規 {{label}}', - openInNewTab: '新しいタブで開く', - passwordsDoNotMatch: 'パスワードが一致しません', - relatedDocument: 'リレーションデータ', - relationTo: 'リレーション', - removeRelationship: '関係を削除', - removeUpload: '削除', - saveChanges: '変更を保存', - searchForBlock: 'ブロックを検索', - selectExistingLabel: '既存 {{label}} を選択', - selectFieldsToEdit: '編集するフィールドを選択', - showAll: 'すべて開く', - swapRelationship: 'スワップ関係', - swapUpload: '差し替え', - textToDisplay: '表示するテキスト', - toggleBlock: 'ブロックを切り替え', - uploadNewLabel: '新規 {{label}} アップロード', - }, - general: { - aboutToDelete: '{{label}} <1>{{title}} を削除します。よろしいですか?', - aboutToDeleteCount_many: '{{label}}を{{count}}つ削除しようとしています', - aboutToDeleteCount_one: '{{label}}を{{count}}つ削除しようとしています', - aboutToDeleteCount_other: '{{label}}を{{count}}つ削除しようとしています', - addBelow: '下に追加', - addFilter: '絞り込みを追加', - adminTheme: '管理画面のテーマ', - and: 'かつ', - applyChanges: '変更を適用する', - ascending: '昇順', - automatic: '自動設定', - backToDashboard: 'ダッシュボードに戻る', - cancel: 'キャンセル', - changesNotSaved: '未保存の変更があります。このまま画面を離れると内容が失われます。', - close: '閉じる', - collapse: '閉じる', - collections: 'コレクション', - columnToSort: '並び替え対象の行', - columns: '行の表示', - confirm: '実行', - confirmDeletion: '削除の確認', - confirmDuplication: '複製の確認', - copied: 'コピーしました', - copy: 'コピー', - create: '作成', - createNew: '新規作成', - createNewLabel: '{{label}} を新規作成', - created: '作成', - createdAt: '作成日', - creating: '作成中', - creatingNewLabel: '{{label}} を新規作成しています', - dark: 'ダークモード', - dashboard: 'ダッシュボード', - delete: '削除', - deletedCountSuccessfully: '{{count}}つの{{label}}を正常に削除しました。', - deletedSuccessfully: '正常に削除されました。', - deleting: '削除しています...', - descending: '降順', - deselectAllRows: 'すべての行の選択を解除します', - duplicate: '複製', - duplicateWithoutSaving: '変更を保存せずに複製', - edit: '編集', - editLabel: '{{label}} を編集', - editing: '編集', - editingLabel_many: '{{count}}つの{{label}}を編集しています', - editingLabel_one: '{{count}}つの{{label}}を編集しています', - editingLabel_other: '{{count}}つの{{label}}を編集しています', - email: 'メールアドレス', - emailAddress: 'メールアドレス', - enterAValue: '値を入力', - error: 'エラー', - errors: 'エラー', - fallbackToDefaultLocale: 'デフォルトロケールへのフォールバック', - filter: '絞り込み', - filterWhere: '{{label}} の絞り込み', - filters: '絞り込み', - globals: 'グローバル', - language: '言語', - lastModified: '最終更新', - leaveAnyway: 'すぐに画面を離れる', - leaveWithoutSaving: '内容が保存されていません', - light: 'ライトモード', - livePreview: 'プレビュー', - loading: 'ローディング中', - locale: 'ロケール', - locales: 'ロケール', - menu: 'メニュー', - moveDown: '下へ移動', - moveUp: '上へ移動', - newPassword: '新しいパスワード', - noFiltersSet: '絞り込みが未設定です。', - noLabel: '', - noOptions: '選択肢なし', - noResults: - '{{label}} データが見つかりませんでした。データが存在しない、または、絞り込みに一致するものがありません。', - noValue: '未設定', - none: 'なし', - notFound: 'Not Found', - nothingFound: 'Nothing found', - of: '/', - open: '開く', - or: 'または', - order: '表示順', - pageNotFound: 'ページが見つかりません', - password: 'パスワード', - payloadSettings: 'Payload 設定', - perPage: '表示件数: {{limit}}', - remove: '削除', - reset: 'リセット', - row: '列', - rows: '列', - save: '保存', - saving: '保存しています...', - searchBy: '{{label}} で検索', - selectAll: 'すべての{{count}}つの{{label}}を選択', - selectAllRows: 'すべての行を選択します', - selectValue: '値を選択', - selectedCount: '{{count}}つの{{label}}を選択中', - showAllLabel: 'すべての{{label}}を表示する', - sorryNotFound: '申し訳ありません。リクエストに対応する内容が見つかりませんでした。', - sort: '並び替え', - sortByLabelDirection: '{{label}}により並べ替え {{direction}}', - stayOnThisPage: 'この画面にとどまる', - submissionSuccessful: '送信が成功しました。', - submit: '送信', - successfullyCreated: '{{label}} が作成されました。', - successfullyDuplicated: '{{label}} が複製されました。', - thisLanguage: 'Japanese', - titleDeleted: '{{label}} "{{title}}" が削除されました。', - unauthorized: '未認証', - unsavedChangesDuplicate: '未保存の変更があります。複製を続けますか?', - untitled: 'Untitled', - updatedAt: '更新日', - updatedCountSuccessfully: '{{count}}つの{{label}}を正常に更新しました。', - updatedSuccessfully: '更新成功。', - updating: '更新中', - uploading: 'アップロード中', - user: 'ユーザー', - users: 'ユーザー', - value: '値', - welcome: 'ようこそ', - }, - operators: { - contains: '含む', - equals: '等しい', - exists: '存在す', - isGreaterThan: 'より大きい', - isGreaterThanOrEqualTo: '以上', - isIn: 'あります', - isLessThan: 'より小さい', - isLessThanOrEqualTo: '以下', - isLike: 'のような', - isNotEqualTo: '等しくない', - isNotIn: '入っていません', - near: '近く', - }, - upload: { - crop: 'クロップ', - cropToolDescription: - '選択したエリアのコーナーをドラッグしたり、新たなエリアを描画したり、下記の値を調整してください。', - dragAndDrop: 'ファイルをドラッグ アンド ドロップする', - dragAndDropHere: 'または、このエリアにファイルをドラッグ & ドロップ', - editImage: '画像を編集する', - fileName: 'ファイル名', - fileSize: 'ファイル容量', - focalPoint: '焦点', - focalPointDescription: 'プレビュー上で焦点を直接ドラッグするか、下の値を調整してください。', - height: '高さ', - lessInfo: '詳細を隠す', - moreInfo: '詳細を表示', - previewSizes: 'プレビューサイズ', - selectCollectionToBrowse: '閲覧するコレクションを選択', - selectFile: 'ファイルを選択', - setCropArea: 'クロップエリアを設定する', - setFocalPoint: '焦点を設定する', - sizes: '容量', - sizesFor: '{{label}}のサイズ', - width: '横幅', - }, - validation: { - emailAddress: '有効なメールアドレスを入力してください。', - enterNumber: '有効な数値を入力してください。', - fieldHasNo: '{{label}} が必要です。', - greaterThanMax: '{{value}}は許容最大{{label}}の{{max}}を超えています。', - invalidInput: '無効な入力値です。', - invalidSelection: '無効な選択です。', - invalidSelections: '次の無効な選択があります: ', - lessThanMin: '{{value}}は許容最小{{label}}の{{min}}未満です。', - limitReached: '制限に達しました、{{max}}個以上のアイテムを追加することはできません。', - longerThanMin: '{{minLength}} 文字以上にする必要があります。', - notValidDate: '"{{value}}" は有効な日付ではありません。', - required: '必須フィールドです。', - requiresAtLeast: '少なくとも {{count}} {{label}} 以上が必要です。', - requiresNoMoreThan: '最大で {{count}} {{label}} 以下にする必要があります。', - requiresTwoNumbers: '2つの数値が必要です。', - shorterThanMax: '{{maxLength}} 文字以下にする必要があります。', - trueOrFalse: '"true" または "false" の値にする必要があります。', - validUploadID: '有効なアップロードIDではありません。', - }, - version: { - aboutToPublishSelection: '選択中のすべての{{label}}を公開しようとしています。よろしいですか?', - aboutToRestore: - 'この {{label}} データを {{versionDate}} 時点のバージョンに復元しようとしています。', - aboutToRestoreGlobal: - 'グローバルな {{label}} データを {{versionDate}} 時点のバージョンに復元しようとしています。', - aboutToRevertToPublished: - 'このデータの変更を公開時の状態に戻そうとしています。よろしいですか?', - aboutToUnpublish: 'このデータを非公開にしようとしています。よろしいですか?', - aboutToUnpublishSelection: - '選択したすべての{{label}}の公開を取り消そうとしています。よろしいですか?', - autosave: '自動保存', - autosavedSuccessfully: '自動保存に成功しました。', - autosavedVersion: '自動保存されたバージョン', - changed: '変更済み', - compareVersion: 'バージョンを比較:', - confirmPublish: '公開を確認する', - confirmRevertToSaved: '保存された状態に戻す確認', - confirmUnpublish: '非公開の確認', - confirmVersionRestoration: 'バージョン復元の確認', - currentDocumentStatus: '現在の {{docStatus}} データ', - draft: 'ドラフト', - draftSavedSuccessfully: '下書きは正常に保存されました。', - lastSavedAgo: '{{distance}}前に最後に保存されました', - noFurtherVersionsFound: 'その他のバージョンは見つかりませんでした。', - noRowsFound: '{{label}} は未設定です', - preview: 'プレビュー', - problemRestoringVersion: 'このバージョンの復元に問題がありました。', - publish: '公開する', - publishChanges: '変更内容を公開', - published: '公開済み', - publishing: '公開', - restoreThisVersion: 'このバージョンを復元', - restoredSuccessfully: '正常に復元されました。', - restoring: '復元しています...', - revertToPublished: '公開時の内容に戻す', - reverting: '内容を戻しています...', - saveDraft: 'ドラフトを保存', - selectLocales: '表示するロケールを選択', - selectVersionToCompare: '比較するバージョンを選択', - showLocales: 'ロケールを表示:', - showingVersionsFor: '次のバージョンを表示します:', - status: 'ステータス', - type: 'タイプ', - unpublish: '非公開', - unpublishing: '非公開中...', - version: 'バージョン', - versionCount_many: '{{count}} バージョンがあります', - versionCount_none: 'バージョンがありません', - versionCount_one: '{{count}} バージョンがあります', - versionCount_other: '{{count}}バージョンが見つかりました', - versionCreatedOn: '{{version}} 作成日時:', - versionID: 'バージョンID', - versions: 'バージョン', - viewingVersion: '表示バージョン: {{entityLabel}} {{documentTitle}}', - viewingVersionGlobal: '表示バージョン: グローバルな {{entityLabel}}', - viewingVersions: '表示バージョン: {{entityLabel}} {{documentTitle}}', - viewingVersionsGlobal: '表示バージョン: グローバルな {{entityLabel}}', +import type { Language } from '../types.js' + +export const ja: Language = { + dateFNSKey: 'ja', + translations: { + authentication: { + account: 'アカウント', + accountOfCurrentUser: '現在のユーザーアカウント', + alreadyActivated: 'すでに有効です', + alreadyLoggedIn: 'すでにログインしています', + apiKey: 'API Key', + backToLogin: 'ログイン画面へ戻る', + beginCreateFirstUser: 'まずは、最初のユーザーを作成します。', + changePassword: 'パスワードを変更', + checkYourEmailForPasswordReset: + 'パスワードを安全に再設定するためのリンクがメールで送られてくるので、確認してください。', + confirmGeneration: '生成の確認', + confirmPassword: 'パスワードの確認', + createFirstUser: '最初のユーザーを作成', + emailNotValid: '入力されたメールアドレスは無効です。', + emailSent: 'Emailが送信されました。', + enableAPIKey: 'API Keyを許可', + failedToUnlock: 'ロックの解除に失敗しました。', + forceUnlock: '強制的にロックを解除', + forgotPassword: 'パスワード再設定', + forgotPasswordEmailInstructions: + 'アカウントのメールアドレスを以下に入力してください。パスワードの再設定方法が記載されたメールが届きます。', + forgotPasswordQuestion: 'パスワードをお忘れですか?', + generate: '生成', + generateNewAPIKey: '新しいAPI Keyを生成', + generatingNewAPIKeyWillInvalidate: + '新しいAPI Keyを生成すると、以前のAPI Keyは<1>無効になります。よろしいですか?', + lockUntil: 'ロック期限', + logBackIn: '改めてログイン', + logOut: 'ログアウト', + loggedIn: '他のユーザーでログインするには、まず<0>ログアウトする必要があります。', + loggedInChangePassword: + 'パスワードを変更するには、<0>アカウントにアクセスしてパスワードを編集してください。', + loggedOutInactivity: 'しばらく操作を行わなかったため、管理画面からログアウトしました。', + loggedOutSuccessfully: '管理画面からログアウトしました。', + login: 'ログイン', + loginAttempts: 'ログイン試行回数', + loginUser: 'ログインユーザー', + loginWithAnotherUser: + '他のユーザーでログインするには、まず<0>ログアウトする必要があります。', + logout: 'ログアウト', + logoutUser: 'ログアウトユーザー', + newAPIKeyGenerated: '新しいAPI Keyを生成しました。', + newAccountCreated: + '{{serverURL}}にアクセスするための新しいアカウントが作成されました。以下のリンクをクリックするか、ブラウザに以下のURLを貼り付けて、メールアドレスの確認を行ってください。{{verificationURL}}
メールアドレスの確認後に、正常にログインできるようになります。', + newPassword: '新しいパスワード', + resetPassword: 'パスワード再発行', + resetPasswordExpiration: 'パスワードの有効期限をリセット', + resetPasswordToken: 'パスワードのトークンをリセット', + resetYourPassword: 'パスワードの再設定', + stayLoggedIn: 'ログイン状態を維持', + successfullyUnlocked: 'ロックの解除に成功しました。', + unableToVerify: '検証ができません', + verified: '検証済み', + verifiedSuccessfully: '検証が成功しました', + verify: '検証', + verifyUser: 'ユーザーの確認', + verifyYourEmail: 'メールアドレスの確認', + youAreInactive: + 'しばらく操作を行わなかったため、セキュリティのために自動的にログアウトします。ログイン状態を維持しますか?', + youAreReceivingResetPassword: + 'アカウントのパスワードリセットがリクエストされました。次のリンクをクリックする、または、ブラウザにリンクを貼り付けて、手続きを行ってください:', + youDidNotRequestPassword: + 'もし望まない場合は、このメールを無視してください。パスワードは変更されません。', + }, + error: { + accountAlreadyActivated: 'このアカウントはすでに有効です。', + autosaving: 'このデータを自動保存する際に問題が発生しました。', + correctInvalidFields: '無効なフィールドを修正してください。', + deletingFile: 'ファイルの削除中にエラーが発生しました。', + deletingTitle: + '{{title}} を削除する際にエラーが発生しました。接続を確認してからもう一度お試しください。', + emailOrPasswordIncorrect: 'メールアドレス、または、パスワードが正しくありません。', + followingFieldsInvalid_one: '次のフィールドは無効です:', + followingFieldsInvalid_other: '次のフィールドは無効です:', + incorrectCollection: '不正なコレクション', + invalidFileType: '無効なファイル形式', + invalidFileTypeValue: '無効なファイル形式: {{value}}', + loadingDocument: 'IDが {{id}} のデータを読み込む際に問題が発生しました。', + missingEmail: 'メールアドレスが不足しています。', + missingIDOfDocument: '更新するデータのIDが不足しています。', + missingIDOfVersion: 'バージョンIDが不足しています。', + missingRequiredData: '必須データが不足しています。', + noFilesUploaded: 'ファイルがアップロードされていません。', + noMatchedField: '"{{label}}" に該当するフィールドがありません。', + noUser: 'ユーザーなし', + notAllowedToAccessPage: 'この画面へのアクセスは許可されていません。', + notAllowedToPerformAction: 'このアクションは許可されていません。', + notFound: 'リクエストされたリソースは見つかりませんでした。', + previewing: 'このデータをプレビューする際に問題が発生しました。', + problemUploadingFile: 'ファイルのアップロード中に問題が発生しました。', + tokenInvalidOrExpired: 'トークンが無効、または、有効期限が切れています。', + unPublishingDocument: 'このデータを非公開する際に問題が発生しました。', + unableToDeleteCount: '{{total}} {{label}} から {{count}} を削除できません。', + unableToUpdateCount: '{{total}} {{label}} のうち {{count}} 個を更新できません。', + unauthorized: '認証されていません。このリクエストを行うにはログインが必要です。', + unknown: '不明なエラーが発生しました。', + unspecific: 'エラーが発生しました。', + userLocked: 'このユーザーは、ログイン試行回数が多すぎるため、ロックされています。', + valueMustBeUnique: 'ユニークな値である必要があります。', + verificationTokenInvalid: '認証トークンが無効です。', + }, + fields: { + addLabel: '{{label}} を追加', + addLink: 'リンクを追加', + addNew: '新規追加', + addNewLabel: '{{label}} を新規追加', + addRelationship: 'リレーションシップを追加', + addUpload: 'アップロードを追加', + block: 'ブロック', + blockType: 'ブロックタイプ', + blocks: 'ブロック', + chooseBetweenCustomTextOrDocument: + 'カスタムテキストのURLを入力するか、他のドキュメントにリンクするかを選択してください。', + chooseDocumentToLink: 'リンクするドキュメントを選択してください。', + chooseFromExisting: '既存から選択', + chooseLabel: '{{label}} を選択', + collapseAll: 'すべて閉じる', + customURL: 'カスタムURL', + editLabelData: '{{label}} データを編集', + editLink: 'リンクを編集', + editRelationship: 'リレーションシップを編集', + enterURL: 'URL を入力してください', + internalLink: '内部リンク', + itemsAndMore: '{{items}} 他{{count}}件', + labelRelationship: '{{label}} リレーションシップ', + latitude: '緯度', + linkType: 'リンクタイプ', + linkedTo: '<0>{{label}} にリンク', + longitude: '経度', + newLabel: '新規 {{label}}', + openInNewTab: '新しいタブで開く', + passwordsDoNotMatch: 'パスワードが一致しません', + relatedDocument: 'リレーションデータ', + relationTo: 'リレーション', + removeRelationship: '関係を削除', + removeUpload: '削除', + saveChanges: '変更を保存', + searchForBlock: 'ブロックを検索', + selectExistingLabel: '既存 {{label}} を選択', + selectFieldsToEdit: '編集するフィールドを選択', + showAll: 'すべて開く', + swapRelationship: 'スワップ関係', + swapUpload: '差し替え', + textToDisplay: '表示するテキスト', + toggleBlock: 'ブロックを切り替え', + uploadNewLabel: '新規 {{label}} アップロード', + }, + general: { + aboutToDelete: '{{label}} <1>{{title}} を削除します。よろしいですか?', + aboutToDeleteCount_many: '{{label}}を{{count}}つ削除しようとしています', + aboutToDeleteCount_one: '{{label}}を{{count}}つ削除しようとしています', + aboutToDeleteCount_other: '{{label}}を{{count}}つ削除しようとしています', + addBelow: '下に追加', + addFilter: '絞り込みを追加', + adminTheme: '管理画面のテーマ', + and: 'かつ', + applyChanges: '変更を適用する', + ascending: '昇順', + automatic: '自動設定', + backToDashboard: 'ダッシュボードに戻る', + cancel: 'キャンセル', + changesNotSaved: '未保存の変更があります。このまま画面を離れると内容が失われます。', + close: '閉じる', + collapse: '閉じる', + collections: 'コレクション', + columnToSort: '並び替え対象の行', + columns: '行の表示', + confirm: '実行', + confirmDeletion: '削除の確認', + confirmDuplication: '複製の確認', + copied: 'コピーしました', + copy: 'コピー', + create: '作成', + createNew: '新規作成', + createNewLabel: '{{label}} を新規作成', + created: '作成', + createdAt: '作成日', + creating: '作成中', + creatingNewLabel: '{{label}} を新規作成しています', + dark: 'ダークモード', + dashboard: 'ダッシュボード', + delete: '削除', + deletedCountSuccessfully: '{{count}}つの{{label}}を正常に削除しました。', + deletedSuccessfully: '正常に削除されました。', + deleting: '削除しています...', + descending: '降順', + deselectAllRows: 'すべての行の選択を解除します', + duplicate: '複製', + duplicateWithoutSaving: '変更を保存せずに複製', + edit: '編集', + editLabel: '{{label}} を編集', + editing: '編集', + editingLabel_many: '{{count}}つの{{label}}を編集しています', + editingLabel_one: '{{count}}つの{{label}}を編集しています', + editingLabel_other: '{{count}}つの{{label}}を編集しています', + email: 'メールアドレス', + emailAddress: 'メールアドレス', + enterAValue: '値を入力', + error: 'エラー', + errors: 'エラー', + fallbackToDefaultLocale: 'デフォルトロケールへのフォールバック', + filter: '絞り込み', + filterWhere: '{{label}} の絞り込み', + filters: '絞り込み', + globals: 'グローバル', + language: '言語', + lastModified: '最終更新', + leaveAnyway: 'すぐに画面を離れる', + leaveWithoutSaving: '内容が保存されていません', + light: 'ライトモード', + livePreview: 'プレビュー', + loading: 'ローディング中', + locale: 'ロケール', + locales: 'ロケール', + menu: 'メニュー', + moveDown: '下へ移動', + moveUp: '上へ移動', + newPassword: '新しいパスワード', + noFiltersSet: '絞り込みが未設定です。', + noLabel: '', + noOptions: '選択肢なし', + noResults: + '{{label}} データが見つかりませんでした。データが存在しない、または、絞り込みに一致するものがありません。', + noValue: '未設定', + none: 'なし', + notFound: 'Not Found', + nothingFound: 'Nothing found', + of: '/', + open: '開く', + or: 'または', + order: '表示順', + pageNotFound: 'ページが見つかりません', + password: 'パスワード', + payloadSettings: 'Payload 設定', + perPage: '表示件数: {{limit}}', + remove: '削除', + reset: 'リセット', + row: '列', + rows: '列', + save: '保存', + saving: '保存しています...', + searchBy: '{{label}} で検索', + selectAll: 'すべての{{count}}つの{{label}}を選択', + selectAllRows: 'すべての行を選択します', + selectValue: '値を選択', + selectedCount: '{{count}}つの{{label}}を選択中', + showAllLabel: 'すべての{{label}}を表示する', + sorryNotFound: '申し訳ありません。リクエストに対応する内容が見つかりませんでした。', + sort: '並び替え', + sortByLabelDirection: '{{label}}により並べ替え {{direction}}', + stayOnThisPage: 'この画面にとどまる', + submissionSuccessful: '送信が成功しました。', + submit: '送信', + successfullyCreated: '{{label}} が作成されました。', + successfullyDuplicated: '{{label}} が複製されました。', + thisLanguage: 'Japanese', + titleDeleted: '{{label}} "{{title}}" が削除されました。', + unauthorized: '未認証', + unsavedChangesDuplicate: '未保存の変更があります。複製を続けますか?', + untitled: 'Untitled', + updatedAt: '更新日', + updatedCountSuccessfully: '{{count}}つの{{label}}を正常に更新しました。', + updatedSuccessfully: '更新成功。', + updating: '更新中', + uploading: 'アップロード中', + user: 'ユーザー', + users: 'ユーザー', + value: '値', + welcome: 'ようこそ', + }, + operators: { + contains: '含む', + equals: '等しい', + exists: '存在す', + isGreaterThan: 'より大きい', + isGreaterThanOrEqualTo: '以上', + isIn: 'あります', + isLessThan: 'より小さい', + isLessThanOrEqualTo: '以下', + isLike: 'のような', + isNotEqualTo: '等しくない', + isNotIn: '入っていません', + near: '近く', + }, + upload: { + crop: 'クロップ', + cropToolDescription: + '選択したエリアのコーナーをドラッグしたり、新たなエリアを描画したり、下記の値を調整してください。', + dragAndDrop: 'ファイルをドラッグ アンド ドロップする', + dragAndDropHere: 'または、このエリアにファイルをドラッグ & ドロップ', + editImage: '画像を編集する', + fileName: 'ファイル名', + fileSize: 'ファイル容量', + focalPoint: '焦点', + focalPointDescription: 'プレビュー上で焦点を直接ドラッグするか、下の値を調整してください。', + height: '高さ', + lessInfo: '詳細を隠す', + moreInfo: '詳細を表示', + previewSizes: 'プレビューサイズ', + selectCollectionToBrowse: '閲覧するコレクションを選択', + selectFile: 'ファイルを選択', + setCropArea: 'クロップエリアを設定する', + setFocalPoint: '焦点を設定する', + sizes: '容量', + sizesFor: '{{label}}のサイズ', + width: '横幅', + }, + validation: { + emailAddress: '有効なメールアドレスを入力してください。', + enterNumber: '有効な数値を入力してください。', + fieldHasNo: '{{label}} が必要です。', + greaterThanMax: '{{value}}は許容最大{{label}}の{{max}}を超えています。', + invalidInput: '無効な入力値です。', + invalidSelection: '無効な選択です。', + invalidSelections: '次の無効な選択があります: ', + lessThanMin: '{{value}}は許容最小{{label}}の{{min}}未満です。', + limitReached: '制限に達しました、{{max}}個以上のアイテムを追加することはできません。', + longerThanMin: '{{minLength}} 文字以上にする必要があります。', + notValidDate: '"{{value}}" は有効な日付ではありません。', + required: '必須フィールドです。', + requiresAtLeast: '少なくとも {{count}} {{label}} 以上が必要です。', + requiresNoMoreThan: '最大で {{count}} {{label}} 以下にする必要があります。', + requiresTwoNumbers: '2つの数値が必要です。', + shorterThanMax: '{{maxLength}} 文字以下にする必要があります。', + trueOrFalse: '"true" または "false" の値にする必要があります。', + validUploadID: '有効なアップロードIDではありません。', + }, + version: { + type: 'タイプ', + aboutToPublishSelection: + '選択中のすべての{{label}}を公開しようとしています。よろしいですか?', + aboutToRestore: + 'この {{label}} データを {{versionDate}} 時点のバージョンに復元しようとしています。', + aboutToRestoreGlobal: + 'グローバルな {{label}} データを {{versionDate}} 時点のバージョンに復元しようとしています。', + aboutToRevertToPublished: + 'このデータの変更を公開時の状態に戻そうとしています。よろしいですか?', + aboutToUnpublish: 'このデータを非公開にしようとしています。よろしいですか?', + aboutToUnpublishSelection: + '選択したすべての{{label}}の公開を取り消そうとしています。よろしいですか?', + autosave: '自動保存', + autosavedSuccessfully: '自動保存に成功しました。', + autosavedVersion: '自動保存されたバージョン', + changed: '変更済み', + compareVersion: 'バージョンを比較:', + confirmPublish: '公開を確認する', + confirmRevertToSaved: '保存された状態に戻す確認', + confirmUnpublish: '非公開の確認', + confirmVersionRestoration: 'バージョン復元の確認', + currentDocumentStatus: '現在の {{docStatus}} データ', + draft: 'ドラフト', + draftSavedSuccessfully: '下書きは正常に保存されました。', + lastSavedAgo: '{{distance}}前に最後に保存されました', + noFurtherVersionsFound: 'その他のバージョンは見つかりませんでした。', + noRowsFound: '{{label}} は未設定です', + preview: 'プレビュー', + problemRestoringVersion: 'このバージョンの復元に問題がありました。', + publish: '公開する', + publishChanges: '変更内容を公開', + published: '公開済み', + publishing: '公開', + restoreThisVersion: 'このバージョンを復元', + restoredSuccessfully: '正常に復元されました。', + restoring: '復元しています...', + revertToPublished: '公開時の内容に戻す', + reverting: '内容を戻しています...', + saveDraft: 'ドラフトを保存', + selectLocales: '表示するロケールを選択', + selectVersionToCompare: '比較するバージョンを選択', + showLocales: 'ロケールを表示:', + showingVersionsFor: '次のバージョンを表示します:', + status: 'ステータス', + unpublish: '非公開', + unpublishing: '非公開中...', + version: 'バージョン', + versionCount_many: '{{count}} バージョンがあります', + versionCount_none: 'バージョンがありません', + versionCount_one: '{{count}} バージョンがあります', + versionCount_other: '{{count}}バージョンが見つかりました', + versionCreatedOn: '{{version}} 作成日時:', + versionID: 'バージョンID', + versions: 'バージョン', + viewingVersion: '表示バージョン: {{entityLabel}} {{documentTitle}}', + viewingVersionGlobal: '表示バージョン: グローバルな {{entityLabel}}', + viewingVersions: '表示バージョン: {{entityLabel}} {{documentTitle}}', + viewingVersionsGlobal: '表示バージョン: グローバルな {{entityLabel}}', + }, }, } diff --git a/packages/translations/src/languages/ko.ts b/packages/translations/src/languages/ko.ts index 34da8c55ea..6076f7f57e 100644 --- a/packages/translations/src/languages/ko.ts +++ b/packages/translations/src/languages/ko.ts @@ -1,385 +1,392 @@ -export default { - authentication: { - account: '계정', - accountOfCurrentUser: '현재 사용자의 계정', - alreadyActivated: '이미 활성화됨', - alreadyLoggedIn: '이미 로그인됨', - apiKey: 'API 키', - backToLogin: '로그인 화면으로 돌아가기', - beginCreateFirstUser: '시작하려면 첫 번째 사용자를 생성하세요.', - changePassword: '비밀번호 변경', - checkYourEmailForPasswordReset: - '비밀번호 재설정을 안전하게 수행할 수 있는 링크가 포함된 이메일을 확인하세요.', - confirmGeneration: '생성 확인', - confirmPassword: '비밀번호 확인', - createFirstUser: '첫 번째 사용자 생성', - emailNotValid: '입력한 이메일은 유효하지 않습니다.', - emailSent: '이메일 전송됨', - enableAPIKey: 'API 키 활성화', - failedToUnlock: '잠금 해제 실패', - forceUnlock: '강제 잠금 해제', - forgotPassword: '비밀번호를 잊으셨나요?', - forgotPasswordEmailInstructions: - '아래에 이메일을 입력하세요. 비밀번호를 재설정하는 방법에 대한 안내가 포함된 이메일 메시지를 받게 될 것입니다.', - forgotPasswordQuestion: '비밀번호를 잊으셨나요?', - generate: '생성', - generateNewAPIKey: '새로운 API 키 생성', - generatingNewAPIKeyWillInvalidate: - '새로운 API 키를 생성하면 이전 키가 무효화됩니다. 계속하시겠습니까?', - lockUntil: '잠금 시간', - logBackIn: '다시 로그인', - logOut: '로그아웃', - loggedIn: '다른 사용자로 로그인하려면 먼저 <0>로그아웃해야 합니다.', - loggedInChangePassword: - '비밀번호를 변경하려면 <0>계정 화면으로 이동하여 비밀번호를 편집하세요.', - loggedOutInactivity: '보안을 위해 일정 시간 동안 활동하지 않아 로그아웃되었습니다.', - loggedOutSuccessfully: '로그아웃되었습니다.', - login: '로그인', - loginAttempts: '로그인 시도', - loginUser: '현재 사용자 로그인', - loginWithAnotherUser: '다른 사용자로 로그인하려면 먼저 <0>로그아웃해야 합니다.', - logout: '로그아웃', - logoutUser: '현재 사용자 로그아웃', - newAPIKeyGenerated: '새로운 API 키가 생성되었습니다.', - newAccountCreated: - '{{serverURL}}에 접근할 수 있는 새로운 계정이 생성되었습니다. 다음 링크를 클릭하거나 브라우저에 URL을 붙여넣으세요: {{verificationURL}}
이메일을 확인한 후에 로그인할 수 있습니다.', - newPassword: '새로운 비밀번호', - resetPassword: '비밀번호 재설정', - resetPasswordExpiration: '비밀번호 재설정 만료', - resetPasswordToken: '비밀번호 재설정 토큰', - resetYourPassword: '비밀번호 재설정', - stayLoggedIn: '로그인 상태 유지', - successfullyUnlocked: '잠금 해제 성공', - unableToVerify: '확인할 수 없음', - verified: '확인됨', - verifiedSuccessfully: '성공적으로 확인됨', - verify: '확인', - verifyUser: '현재 사용자 확인', - verifyYourEmail: '이메일을 확인해주세요', - youAreInactive: - '잠시 활동하지 않았으며 보안을 위해 곧 자동 로그아웃됩니다. 로그인 상태를 유지하시겠습니까?', - youAreReceivingResetPassword: - '당신(혹은 다른 사람)이 계정의 비밀번호 초기화를 요청했기 때문에 이 이메일을 받았습니다. 다음 링크를 클릭하거나 브라우저에 붙여넣어 비밀번호를 초기화하세요:', - youDidNotRequestPassword: - '비밀번호 초기화를 요청하지 않았다면 이 이메일을 무시하시고 비밀번호를 변경하지 마세요.', - }, - error: { - accountAlreadyActivated: '이 계정은 이미 활성화되었습니다.', - autosaving: '이 문서를 자동 저장하는 중에 문제가 발생했습니다.', - correctInvalidFields: '입력하신 내용을 확인해주세요.', - deletingFile: '파일을 삭제하는 중에 오류가 발생했습니다.', - deletingTitle: - '{{title}} 삭제하는 중에 오류가 발생했습니다. 인터넷 연결을 확인하고 다시 시도하세요.', - emailOrPasswordIncorrect: '입력한 이메일 또는 비밀번호가 올바르지 않습니다.', - followingFieldsInvalid_one: '다음 입력란이 유효하지 않습니다:', - followingFieldsInvalid_other: '다음 입력란이 유효하지 않습니다:', - incorrectCollection: '잘못된 컬렉션', - invalidFileType: '잘못된 파일 형식', - invalidFileTypeValue: '잘못된 파일 형식: {{value}}', - loadingDocument: 'ID가 {{id}}인 문서를 불러오는 중에 문제가 발생했습니다.', - missingEmail: '이메일이 누락되었습니다.', - missingIDOfDocument: '업데이트할 문서의 ID가 누락되었습니다.', - missingIDOfVersion: '버전의 ID가 누락되었습니다.', - missingRequiredData: '필수 데이터가 누락되었습니다.', - noFilesUploaded: '파일이 업로드되지 않았습니다.', - noMatchedField: '"{{label}}"에 대한 일치하는 입력란이 없습니다.', - noUser: '사용자가 없습니다.', - notAllowedToAccessPage: '이 페이지에 접근할 권한이 없습니다.', - notAllowedToPerformAction: '이 작업을 수행할 권한이 없습니다.', - notFound: '요청한 리소스를 찾을 수 없습니다.', - previewing: '이 문서를 미리보는 중에 문제가 발생했습니다.', - problemUploadingFile: '파일 업로드 중에 문제가 발생했습니다.', - tokenInvalidOrExpired: '토큰이 유효하지 않거나 만료되었습니다.', - unPublishingDocument: '이 문서의 게시 취소 중에 문제가 발생했습니다.', - unableToDeleteCount: '총 {{total}}개 중 {{count}}개의 {{label}}을(를) 삭제할 수 없습니다.', - unableToUpdateCount: '총 {{total}}개 중 {{count}}개의 {{label}}을(를) 업데이트할 수 없습니다.', - unauthorized: '권한 없음, 이 요청을 수행하려면 로그인해야 합니다.', - unknown: '알 수 없는 오류가 발생했습니다.', - unspecific: '오류가 발생했습니다.', - userLocked: '이 사용자는 로그인 실패 횟수가 너무 많아 잠겼습니다.', - valueMustBeUnique: '값은 고유해야 합니다.', - verificationTokenInvalid: '확인 토큰이 유효하지 않습니다.', - }, - fields: { - addLabel: '{{label}} 추가', - addLink: '링크 추가', - addNew: '새로 추가', - addNewLabel: '새로운 {{label}} 추가', - addRelationship: '관계 추가', - addUpload: '업로드 추가', - block: '블록', - blockType: '블록 유형', - blocks: '블록', - chooseBetweenCustomTextOrDocument: - '사용자 지정 텍스트 URL 또는 다른 문서에 링크 중 선택하세요.', - chooseDocumentToLink: '연결할 문서 선택', - chooseFromExisting: '기존 항목 중 선택', - chooseLabel: '{{label}} 선택', - collapseAll: '모두 접기', - customURL: '사용자 지정 URL', - editLabelData: '{{label}} 데이터 수정', - editLink: '링크 수정', - editRelationship: '관계 수정', - enterURL: 'URL 입력', - internalLink: '내부 링크', - itemsAndMore: '{{items}} 및 {{count}}개 더', - labelRelationship: '{{label}} 관계', - latitude: '위도', - linkType: '링크 유형', - linkedTo: '<0>{{label}}에 연결됨', - longitude: '경도', - newLabel: '새로운 {{label}}', - openInNewTab: '새 탭에서 열기', - passwordsDoNotMatch: '비밀번호가 일치하지 않습니다.', - relatedDocument: '관련 문서', - relationTo: '관계', - removeRelationship: '관계 제거', - removeUpload: '제거', - saveChanges: '변경 사항 저장', - searchForBlock: '블록 검색', - selectExistingLabel: '기존 {{label}} 선택', - selectFieldsToEdit: '수정할 입력란 선택', - showAll: '모두 표시', - swapRelationship: '관계 교체', - swapUpload: '업로드 교체', - textToDisplay: '표시할 텍스트', - toggleBlock: '블록 토글', - uploadNewLabel: '새로운 {{label}} 업로드', - }, - general: { - aboutToDelete: '{{label}} <1>{{title}}를 삭제하려고 합니다. 계속하시겠습니까?', - aboutToDeleteCount_many: '{{label}}를 {{count}}개 삭제하려고 합니다.', - aboutToDeleteCount_one: '{{label}}를 {{count}}개 삭제하려고 합니다.', - aboutToDeleteCount_other: '{{label}}를 {{count}}개 삭제하려고 합니다.', - addBelow: '아래에 추가', - addFilter: '필터 추가', - adminTheme: '관리자 테마', - and: '및', - applyChanges: '변경 사항 적용', - ascending: '오름차순', - automatic: '자동 설정', - backToDashboard: '대시보드로 돌아가기', - cancel: '취소', - changesNotSaved: '변경 사항이 저장되지 않았습니다. 지금 떠나면 변경 사항을 잃게 됩니다.', - close: '닫기', - collapse: '접기', - collections: '컬렉션', - columnToSort: '정렬할 열', - columns: '열', - confirm: '확인', - confirmDeletion: '삭제하시겠습니까?', - confirmDuplication: '복제하시겠습니까?', - copied: '복사됨', - copy: '복사', - create: '생성', - createNew: '새로 생성', - createNewLabel: '새로운 {{label}} 생성', - creatingNewLabel: '{{label}} 생성 중', - created: '생성됨', - createdAt: '생성 일시', - creating: '생성 중', - dark: '다크', - dashboard: '대시보드', - delete: '삭제', - deletedCountSuccessfully: '{{count}}개의 {{label}}를 삭제했습니다.', - deletedSuccessfully: '삭제되었습니다.', - deleting: '삭제 중...', - descending: '내림차순', - deselectAllRows: '모든 행 선택 해제', - duplicate: '복제', - duplicateWithoutSaving: '변경 사항 저장 없이 복제', - edit: '수정', - editLabel: '{{label}} 수정', - editing: '수정 중', - editingLabel_many: '{{count}}개의 {{label}} 수정 중', - editingLabel_one: '{{count}}개의 {{label}} 수정 중', - editingLabel_other: '{{count}}개의 {{label}} 수정 중', - email: '이메일', - emailAddress: '이메일 주소', - enterAValue: '값을 입력하세요', - error: '오류', - errors: '오류', - fallbackToDefaultLocale: '기본 locale로 대체', - filter: '필터', - filterWhere: '{{label}} 필터링 조건', - filters: '필터', - globals: '글로벌', - language: '언어', - lastModified: '마지막 수정 일시', - leaveAnyway: '그래도 나가시겠습니까?', - leaveWithoutSaving: '저장하지 않고 나가기', - light: '라이트', - livePreview: '실시간 미리보기', - loading: '불러오는 중', - locale: 'locale', - locales: 'locale', - menu: '메뉴', - moveDown: '아래로 이동', - moveUp: '위로 이동', - newPassword: '새 비밀번호', - noFiltersSet: '설정된 필터 없음', - noLabel: '<{{label}} 없음>', - noOptions: '옵션 없음', - noResults: - '{{label}}를 찾을 수 없습니다. 아직 {{label}}이 없거나 설정한 필터와 일치하는 것이 없습니다.', - noValue: '값 없음', - none: '없음', - notFound: '찾을 수 없음', - nothingFound: '찾을 수 없습니다', - of: '의', - or: '또는', - open: '열기', - order: '순서', - pageNotFound: '페이지를 찾을 수 없음', - password: '비밀번호', - payloadSettings: 'Payload 설정', - perPage: '페이지당 개수: {{limit}}', - remove: '제거', - reset: '초기화', - row: '행', - rows: '행', - save: '저장', - saving: '저장 중...', - searchBy: '{{label}}로 검색', - selectAll: '{{count}}개 {{label}} 모두 선택', - selectAllRows: '모든 행 선택', - selectValue: '값 선택', - selectedCount: '{{count}}개의 {{label}} 선택됨', - showAllLabel: '{{label}} 모두 표시', - sorryNotFound: '죄송합니다. 요청과 일치하는 항목이 없습니다.', - sort: '정렬', - sortByLabelDirection: '{{label}} {{direction}}으로 정렬', - stayOnThisPage: '이 페이지에 머무르기', - submissionSuccessful: '제출이 완료되었습니다.', - submit: '제출', - successfullyCreated: '{{label}}이(가) 생성되었습니다.', - successfullyDuplicated: '{{label}}이(가) 복제되었습니다.', - thisLanguage: '한국어', - titleDeleted: '{{label}} "{{title}}"을(를) 삭제했습니다.', - unauthorized: '권한 없음', - unsavedChangesDuplicate: '저장되지 않은 변경 사항이 있습니다. 복제를 계속하시겠습니까?', - untitled: '제목 없음', - updatedAt: '업데이트 일시', - updatedCountSuccessfully: '{{count}}개의 {{label}}을(를) 업데이트했습니다.', - updatedSuccessfully: '성공적으로 업데이트되었습니다.', - updating: '업데이트 중', - uploading: '업로드 중', - user: '사용자', - users: '사용자', - value: '값', - welcome: '환영합니다', - }, - operators: { - contains: '포함', - equals: '같음', - exists: '존재', - isGreaterThan: '보다 큼', - isGreaterThanOrEqualTo: '보다 크거나 같음', - isIn: '포함됨', - isLessThan: '보다 작음', - isLessThanOrEqualTo: '보다 작거나 같음', - isLike: '유사', - isNotEqualTo: '같지 않음', - isNotIn: '포함되지 않음', - near: '근처', - }, - upload: { - crop: '자르기', - cropToolDescription: - '선택한 영역의 모퉁이를 드래그하거나 새로운 영역을 그리거나 아래의 값을 조정하세요.', - dragAndDrop: '파일을 끌어다 놓으세요', - dragAndDropHere: '또는 여기로 파일을 끌어다 놓으세요', - editImage: '이미지 수정', - focalPoint: '초점', - focalPointDescription: '미리보기에서 초점을 직접 드래그하거나 아래의 값을 조정하세요.', - fileName: '파일 이름', - fileSize: '파일 크기', - height: '높이', - lessInfo: '정보 숨기기', - moreInfo: '정보 더보기', - previewSizes: '미리보기 크기', - selectCollectionToBrowse: '찾을 컬렉션 선택', - selectFile: '파일 선택', - setCropArea: '자르기 영역 설정', - setFocalPoint: '초점 설정', - sizes: '크기', - sizesFor: '{{label}} 크기', - width: '너비', - }, - validation: { - emailAddress: '유효한 이메일 주소를 입력하세요.', - enterNumber: '유효한 숫자를 입력하세요.', - fieldHasNo: '이 입력란에는 {{label}}이(가) 없습니다.', - greaterThanMax: '{{value}}은(는) 최대 허용된 {{label}}인 {{max}}개보다 큽니다.', - invalidInput: '이 입력란에는 유효하지 않은 입력이 있습니다.', - invalidSelection: '이 입력란에는 유효하지 않은 선택이 있습니다.', - invalidSelections: '이 입력란에는 다음과 같은 유효하지 않은 선택 사항이 있습니다:', - lessThanMin: '{{value}}은(는) 최소 허용된 {{label}}인 {{min}}개보다 작습니다.', - limitReached: '제한에 도달했습니다. {{max}}개 항목만 추가할 수 있습니다.', - longerThanMin: '이 값은 최소 길이인 {{minLength}}자보다 길어야 합니다.', - notValidDate: '"{{value}}"은(는) 유효한 날짜가 아닙니다.', - required: '이 입력란은 필수입니다.', - requiresAtLeast: '이 입력란운 최소한 {{count}} {{label}}이 필요합니다.', - requiresNoMoreThan: '이 입력란은 최대 {{count}} {{label}} 이하이어야 합니다.', - requiresTwoNumbers: '이 입력란은 두 개의 숫자가 필요합니다.', - shorterThanMax: '이 값은 최대 길이인 {{maxLength}}자보다 짧아야 합니다.', - trueOrFalse: '이 입력란은 true 또는 false만 가능합니다.', - validUploadID: '이 입력란은 유효한 업로드 ID가 아닙니다.', - }, - version: { - aboutToPublishSelection: '선택한 {{label}}을(를) 게시하려고 합니다. 계속하시겠습니까?', - aboutToRestore: '이 {{label}} 문서를 {{versionDate}}기준 버전으로 복원하려고 합니다.', - aboutToRestoreGlobal: '글로벌 {{label}}을(를) {{versionDate}}기준 버전으로 복원하려고 합니다.', - aboutToRevertToPublished: - '이 문서의 변경 사항을 게시된 상태로 되돌리려고 합니다. 계속하시겠습니까?', - aboutToUnpublish: '이 문서를 게시 해제하려고 합니다. 계속하시겠습니까?', - aboutToUnpublishSelection: '선택한 {{label}}을(를) 게시 해제하려고 합니다. 계속하시겠습니까?', - autosave: '자동 저장', - autosavedSuccessfully: '자동 저장이 완료되었습니다.', - autosavedVersion: '자동 저장된 버전', - changed: '변경됨', - compareVersion: '비교할 버전 선택:', - confirmPublish: '게시하기', - confirmRevertToSaved: '저장된 상태로 되돌리기', - confirmUnpublish: '게시 해제하기', - confirmVersionRestoration: '버전 복원하기', - currentDocumentStatus: '현재 {{docStatus}} 문서', - draft: '초안', - draftSavedSuccessfully: '초안이 저장되었습니다.', - lastSavedAgo: '마지막으로 저장한지 {{distance}} 전', - noFurtherVersionsFound: '더 이상의 버전을 찾을 수 없습니다.', - noRowsFound: '{{label}}을(를) 찾을 수 없음', - preview: '미리보기', - problemRestoringVersion: '이 버전을 복원하는 중 문제가 발생했습니다.', - publish: '게시', - publishChanges: '변경 사항 게시', - published: '게시됨', - publishing: '게시', - restoreThisVersion: '이 버전 복원', - restoredSuccessfully: '복원이 완료되었습니다.', - restoring: '복원 중...', - revertToPublished: '게시된 상태로 되돌리기', - reverting: '되돌리는 중...', - saveDraft: '초안 저장', - selectLocales: '표시할 locale 선택', - selectVersionToCompare: '비교할 버전 선택', - showLocales: 'locale 표시:', - showingVersionsFor: '다음 버전 표시 중:', - status: '상태', - type: '유형', - unpublish: '게시 해제', - unpublishing: '게시 해제 중...', - version: '버전', - versionCount_many: '{{count}}개의 버전을 찾았습니다', - versionCount_none: '버전을 찾을 수 없습니다', - versionCount_one: '{{count}}개의 버전을 찾았습니다', - versionCount_other: '{{count}}개의 버전을 찾았습니다', - versionCreatedOn: '{{version}} 생성 날짜:', - versionID: '버전 ID', - versions: '버전', - viewingVersion: '{{entityLabel}} {{documentTitle}}의 버전 보기', - viewingVersionGlobal: '글로벌 {{entityLabel}}의 버전 보기', - viewingVersions: '{{entityLabel}} {{documentTitle}}에 대한 버전 보기', - viewingVersionsGlobal: '글로벌 {{entityLabel}}에 대한 버전 보기', +import type { Language } from '../types.js' + +export const ko: Language = { + dateFNSKey: 'ko', + translations: { + authentication: { + account: '계정', + accountOfCurrentUser: '현재 사용자의 계정', + alreadyActivated: '이미 활성화됨', + alreadyLoggedIn: '이미 로그인됨', + apiKey: 'API 키', + backToLogin: '로그인 화면으로 돌아가기', + beginCreateFirstUser: '시작하려면 첫 번째 사용자를 생성하세요.', + changePassword: '비밀번호 변경', + checkYourEmailForPasswordReset: + '비밀번호 재설정을 안전하게 수행할 수 있는 링크가 포함된 이메일을 확인하세요.', + confirmGeneration: '생성 확인', + confirmPassword: '비밀번호 확인', + createFirstUser: '첫 번째 사용자 생성', + emailNotValid: '입력한 이메일은 유효하지 않습니다.', + emailSent: '이메일 전송됨', + enableAPIKey: 'API 키 활성화', + failedToUnlock: '잠금 해제 실패', + forceUnlock: '강제 잠금 해제', + forgotPassword: '비밀번호를 잊으셨나요?', + forgotPasswordEmailInstructions: + '아래에 이메일을 입력하세요. 비밀번호를 재설정하는 방법에 대한 안내가 포함된 이메일 메시지를 받게 될 것입니다.', + forgotPasswordQuestion: '비밀번호를 잊으셨나요?', + generate: '생성', + generateNewAPIKey: '새로운 API 키 생성', + generatingNewAPIKeyWillInvalidate: + '새로운 API 키를 생성하면 이전 키가 무효화됩니다. 계속하시겠습니까?', + lockUntil: '잠금 시간', + logBackIn: '다시 로그인', + logOut: '로그아웃', + loggedIn: '다른 사용자로 로그인하려면 먼저 <0>로그아웃해야 합니다.', + loggedInChangePassword: + '비밀번호를 변경하려면 <0>계정 화면으로 이동하여 비밀번호를 편집하세요.', + loggedOutInactivity: '보안을 위해 일정 시간 동안 활동하지 않아 로그아웃되었습니다.', + loggedOutSuccessfully: '로그아웃되었습니다.', + login: '로그인', + loginAttempts: '로그인 시도', + loginUser: '현재 사용자 로그인', + loginWithAnotherUser: '다른 사용자로 로그인하려면 먼저 <0>로그아웃해야 합니다.', + logout: '로그아웃', + logoutUser: '현재 사용자 로그아웃', + newAPIKeyGenerated: '새로운 API 키가 생성되었습니다.', + newAccountCreated: + '{{serverURL}}에 접근할 수 있는 새로운 계정이 생성되었습니다. 다음 링크를 클릭하거나 브라우저에 URL을 붙여넣으세요: {{verificationURL}}
이메일을 확인한 후에 로그인할 수 있습니다.', + newPassword: '새로운 비밀번호', + resetPassword: '비밀번호 재설정', + resetPasswordExpiration: '비밀번호 재설정 만료', + resetPasswordToken: '비밀번호 재설정 토큰', + resetYourPassword: '비밀번호 재설정', + stayLoggedIn: '로그인 상태 유지', + successfullyUnlocked: '잠금 해제 성공', + unableToVerify: '확인할 수 없음', + verified: '확인됨', + verifiedSuccessfully: '성공적으로 확인됨', + verify: '확인', + verifyUser: '현재 사용자 확인', + verifyYourEmail: '이메일을 확인해주세요', + youAreInactive: + '잠시 활동하지 않았으며 보안을 위해 곧 자동 로그아웃됩니다. 로그인 상태를 유지하시겠습니까?', + youAreReceivingResetPassword: + '당신(혹은 다른 사람)이 계정의 비밀번호 초기화를 요청했기 때문에 이 이메일을 받았습니다. 다음 링크를 클릭하거나 브라우저에 붙여넣어 비밀번호를 초기화하세요:', + youDidNotRequestPassword: + '비밀번호 초기화를 요청하지 않았다면 이 이메일을 무시하시고 비밀번호를 변경하지 마세요.', + }, + error: { + accountAlreadyActivated: '이 계정은 이미 활성화되었습니다.', + autosaving: '이 문서를 자동 저장하는 중에 문제가 발생했습니다.', + correctInvalidFields: '입력하신 내용을 확인해주세요.', + deletingFile: '파일을 삭제하는 중에 오류가 발생했습니다.', + deletingTitle: + '{{title}} 삭제하는 중에 오류가 발생했습니다. 인터넷 연결을 확인하고 다시 시도하세요.', + emailOrPasswordIncorrect: '입력한 이메일 또는 비밀번호가 올바르지 않습니다.', + followingFieldsInvalid_one: '다음 입력란이 유효하지 않습니다:', + followingFieldsInvalid_other: '다음 입력란이 유효하지 않습니다:', + incorrectCollection: '잘못된 컬렉션', + invalidFileType: '잘못된 파일 형식', + invalidFileTypeValue: '잘못된 파일 형식: {{value}}', + loadingDocument: 'ID가 {{id}}인 문서를 불러오는 중에 문제가 발생했습니다.', + missingEmail: '이메일이 누락되었습니다.', + missingIDOfDocument: '업데이트할 문서의 ID가 누락되었습니다.', + missingIDOfVersion: '버전의 ID가 누락되었습니다.', + missingRequiredData: '필수 데이터가 누락되었습니다.', + noFilesUploaded: '파일이 업로드되지 않았습니다.', + noMatchedField: '"{{label}}"에 대한 일치하는 입력란이 없습니다.', + noUser: '사용자가 없습니다.', + notAllowedToAccessPage: '이 페이지에 접근할 권한이 없습니다.', + notAllowedToPerformAction: '이 작업을 수행할 권한이 없습니다.', + notFound: '요청한 리소스를 찾을 수 없습니다.', + previewing: '이 문서를 미리보는 중에 문제가 발생했습니다.', + problemUploadingFile: '파일 업로드 중에 문제가 발생했습니다.', + tokenInvalidOrExpired: '토큰이 유효하지 않거나 만료되었습니다.', + unPublishingDocument: '이 문서의 게시 취소 중에 문제가 발생했습니다.', + unableToDeleteCount: '총 {{total}}개 중 {{count}}개의 {{label}}을(를) 삭제할 수 없습니다.', + unableToUpdateCount: + '총 {{total}}개 중 {{count}}개의 {{label}}을(를) 업데이트할 수 없습니다.', + unauthorized: '권한 없음, 이 요청을 수행하려면 로그인해야 합니다.', + unknown: '알 수 없는 오류가 발생했습니다.', + unspecific: '오류가 발생했습니다.', + userLocked: '이 사용자는 로그인 실패 횟수가 너무 많아 잠겼습니다.', + valueMustBeUnique: '값은 고유해야 합니다.', + verificationTokenInvalid: '확인 토큰이 유효하지 않습니다.', + }, + fields: { + addLabel: '{{label}} 추가', + addLink: '링크 추가', + addNew: '새로 추가', + addNewLabel: '새로운 {{label}} 추가', + addRelationship: '관계 추가', + addUpload: '업로드 추가', + block: '블록', + blockType: '블록 유형', + blocks: '블록', + chooseBetweenCustomTextOrDocument: + '사용자 지정 텍스트 URL 또는 다른 문서에 링크 중 선택하세요.', + chooseDocumentToLink: '연결할 문서 선택', + chooseFromExisting: '기존 항목 중 선택', + chooseLabel: '{{label}} 선택', + collapseAll: '모두 접기', + customURL: '사용자 지정 URL', + editLabelData: '{{label}} 데이터 수정', + editLink: '링크 수정', + editRelationship: '관계 수정', + enterURL: 'URL 입력', + internalLink: '내부 링크', + itemsAndMore: '{{items}} 및 {{count}}개 더', + labelRelationship: '{{label}} 관계', + latitude: '위도', + linkType: '링크 유형', + linkedTo: '<0>{{label}}에 연결됨', + longitude: '경도', + newLabel: '새로운 {{label}}', + openInNewTab: '새 탭에서 열기', + passwordsDoNotMatch: '비밀번호가 일치하지 않습니다.', + relatedDocument: '관련 문서', + relationTo: '관계', + removeRelationship: '관계 제거', + removeUpload: '제거', + saveChanges: '변경 사항 저장', + searchForBlock: '블록 검색', + selectExistingLabel: '기존 {{label}} 선택', + selectFieldsToEdit: '수정할 입력란 선택', + showAll: '모두 표시', + swapRelationship: '관계 교체', + swapUpload: '업로드 교체', + textToDisplay: '표시할 텍스트', + toggleBlock: '블록 토글', + uploadNewLabel: '새로운 {{label}} 업로드', + }, + general: { + aboutToDelete: '{{label}} <1>{{title}}를 삭제하려고 합니다. 계속하시겠습니까?', + aboutToDeleteCount_many: '{{label}}를 {{count}}개 삭제하려고 합니다.', + aboutToDeleteCount_one: '{{label}}를 {{count}}개 삭제하려고 합니다.', + aboutToDeleteCount_other: '{{label}}를 {{count}}개 삭제하려고 합니다.', + addBelow: '아래에 추가', + addFilter: '필터 추가', + adminTheme: '관리자 테마', + and: '및', + applyChanges: '변경 사항 적용', + ascending: '오름차순', + automatic: '자동 설정', + backToDashboard: '대시보드로 돌아가기', + cancel: '취소', + changesNotSaved: '변경 사항이 저장되지 않았습니다. 지금 떠나면 변경 사항을 잃게 됩니다.', + close: '닫기', + collapse: '접기', + collections: '컬렉션', + columnToSort: '정렬할 열', + columns: '열', + confirm: '확인', + confirmDeletion: '삭제하시겠습니까?', + confirmDuplication: '복제하시겠습니까?', + copied: '복사됨', + copy: '복사', + create: '생성', + createNew: '새로 생성', + createNewLabel: '새로운 {{label}} 생성', + created: '생성됨', + createdAt: '생성 일시', + creating: '생성 중', + creatingNewLabel: '{{label}} 생성 중', + dark: '다크', + dashboard: '대시보드', + delete: '삭제', + deletedCountSuccessfully: '{{count}}개의 {{label}}를 삭제했습니다.', + deletedSuccessfully: '삭제되었습니다.', + deleting: '삭제 중...', + descending: '내림차순', + deselectAllRows: '모든 행 선택 해제', + duplicate: '복제', + duplicateWithoutSaving: '변경 사항 저장 없이 복제', + edit: '수정', + editLabel: '{{label}} 수정', + editing: '수정 중', + editingLabel_many: '{{count}}개의 {{label}} 수정 중', + editingLabel_one: '{{count}}개의 {{label}} 수정 중', + editingLabel_other: '{{count}}개의 {{label}} 수정 중', + email: '이메일', + emailAddress: '이메일 주소', + enterAValue: '값을 입력하세요', + error: '오류', + errors: '오류', + fallbackToDefaultLocale: '기본 locale로 대체', + filter: '필터', + filterWhere: '{{label}} 필터링 조건', + filters: '필터', + globals: '글로벌', + language: '언어', + lastModified: '마지막 수정 일시', + leaveAnyway: '그래도 나가시겠습니까?', + leaveWithoutSaving: '저장하지 않고 나가기', + light: '라이트', + livePreview: '실시간 미리보기', + loading: '불러오는 중', + locale: 'locale', + locales: 'locale', + menu: '메뉴', + moveDown: '아래로 이동', + moveUp: '위로 이동', + newPassword: '새 비밀번호', + noFiltersSet: '설정된 필터 없음', + noLabel: '<{{label}} 없음>', + noOptions: '옵션 없음', + noResults: + '{{label}}를 찾을 수 없습니다. 아직 {{label}}이 없거나 설정한 필터와 일치하는 것이 없습니다.', + noValue: '값 없음', + none: '없음', + notFound: '찾을 수 없음', + nothingFound: '찾을 수 없습니다', + of: '의', + open: '열기', + or: '또는', + order: '순서', + pageNotFound: '페이지를 찾을 수 없음', + password: '비밀번호', + payloadSettings: 'Payload 설정', + perPage: '페이지당 개수: {{limit}}', + remove: '제거', + reset: '초기화', + row: '행', + rows: '행', + save: '저장', + saving: '저장 중...', + searchBy: '{{label}}로 검색', + selectAll: '{{count}}개 {{label}} 모두 선택', + selectAllRows: '모든 행 선택', + selectValue: '값 선택', + selectedCount: '{{count}}개의 {{label}} 선택됨', + showAllLabel: '{{label}} 모두 표시', + sorryNotFound: '죄송합니다. 요청과 일치하는 항목이 없습니다.', + sort: '정렬', + sortByLabelDirection: '{{label}} {{direction}}으로 정렬', + stayOnThisPage: '이 페이지에 머무르기', + submissionSuccessful: '제출이 완료되었습니다.', + submit: '제출', + successfullyCreated: '{{label}}이(가) 생성되었습니다.', + successfullyDuplicated: '{{label}}이(가) 복제되었습니다.', + thisLanguage: '한국어', + titleDeleted: '{{label}} "{{title}}"을(를) 삭제했습니다.', + unauthorized: '권한 없음', + unsavedChangesDuplicate: '저장되지 않은 변경 사항이 있습니다. 복제를 계속하시겠습니까?', + untitled: '제목 없음', + updatedAt: '업데이트 일시', + updatedCountSuccessfully: '{{count}}개의 {{label}}을(를) 업데이트했습니다.', + updatedSuccessfully: '성공적으로 업데이트되었습니다.', + updating: '업데이트 중', + uploading: '업로드 중', + user: '사용자', + users: '사용자', + value: '값', + welcome: '환영합니다', + }, + operators: { + contains: '포함', + equals: '같음', + exists: '존재', + isGreaterThan: '보다 큼', + isGreaterThanOrEqualTo: '보다 크거나 같음', + isIn: '포함됨', + isLessThan: '보다 작음', + isLessThanOrEqualTo: '보다 작거나 같음', + isLike: '유사', + isNotEqualTo: '같지 않음', + isNotIn: '포함되지 않음', + near: '근처', + }, + upload: { + crop: '자르기', + cropToolDescription: + '선택한 영역의 모퉁이를 드래그하거나 새로운 영역을 그리거나 아래의 값을 조정하세요.', + dragAndDrop: '파일을 끌어다 놓으세요', + dragAndDropHere: '또는 여기로 파일을 끌어다 놓으세요', + editImage: '이미지 수정', + fileName: '파일 이름', + fileSize: '파일 크기', + focalPoint: '초점', + focalPointDescription: '미리보기에서 초점을 직접 드래그하거나 아래의 값을 조정하세요.', + height: '높이', + lessInfo: '정보 숨기기', + moreInfo: '정보 더보기', + previewSizes: '미리보기 크기', + selectCollectionToBrowse: '찾을 컬렉션 선택', + selectFile: '파일 선택', + setCropArea: '자르기 영역 설정', + setFocalPoint: '초점 설정', + sizes: '크기', + sizesFor: '{{label}} 크기', + width: '너비', + }, + validation: { + emailAddress: '유효한 이메일 주소를 입력하세요.', + enterNumber: '유효한 숫자를 입력하세요.', + fieldHasNo: '이 입력란에는 {{label}}이(가) 없습니다.', + greaterThanMax: '{{value}}은(는) 최대 허용된 {{label}}인 {{max}}개보다 큽니다.', + invalidInput: '이 입력란에는 유효하지 않은 입력이 있습니다.', + invalidSelection: '이 입력란에는 유효하지 않은 선택이 있습니다.', + invalidSelections: '이 입력란에는 다음과 같은 유효하지 않은 선택 사항이 있습니다:', + lessThanMin: '{{value}}은(는) 최소 허용된 {{label}}인 {{min}}개보다 작습니다.', + limitReached: '제한에 도달했습니다. {{max}}개 항목만 추가할 수 있습니다.', + longerThanMin: '이 값은 최소 길이인 {{minLength}}자보다 길어야 합니다.', + notValidDate: '"{{value}}"은(는) 유효한 날짜가 아닙니다.', + required: '이 입력란은 필수입니다.', + requiresAtLeast: '이 입력란운 최소한 {{count}} {{label}}이 필요합니다.', + requiresNoMoreThan: '이 입력란은 최대 {{count}} {{label}} 이하이어야 합니다.', + requiresTwoNumbers: '이 입력란은 두 개의 숫자가 필요합니다.', + shorterThanMax: '이 값은 최대 길이인 {{maxLength}}자보다 짧아야 합니다.', + trueOrFalse: '이 입력란은 true 또는 false만 가능합니다.', + validUploadID: '이 입력란은 유효한 업로드 ID가 아닙니다.', + }, + version: { + type: '유형', + aboutToPublishSelection: '선택한 {{label}}을(를) 게시하려고 합니다. 계속하시겠습니까?', + aboutToRestore: '이 {{label}} 문서를 {{versionDate}}기준 버전으로 복원하려고 합니다.', + aboutToRestoreGlobal: + '글로벌 {{label}}을(를) {{versionDate}}기준 버전으로 복원하려고 합니다.', + aboutToRevertToPublished: + '이 문서의 변경 사항을 게시된 상태로 되돌리려고 합니다. 계속하시겠습니까?', + aboutToUnpublish: '이 문서를 게시 해제하려고 합니다. 계속하시겠습니까?', + aboutToUnpublishSelection: '선택한 {{label}}을(를) 게시 해제하려고 합니다. 계속하시겠습니까?', + autosave: '자동 저장', + autosavedSuccessfully: '자동 저장이 완료되었습니다.', + autosavedVersion: '자동 저장된 버전', + changed: '변경됨', + compareVersion: '비교할 버전 선택:', + confirmPublish: '게시하기', + confirmRevertToSaved: '저장된 상태로 되돌리기', + confirmUnpublish: '게시 해제하기', + confirmVersionRestoration: '버전 복원하기', + currentDocumentStatus: '현재 {{docStatus}} 문서', + draft: '초안', + draftSavedSuccessfully: '초안이 저장되었습니다.', + lastSavedAgo: '마지막으로 저장한지 {{distance}} 전', + noFurtherVersionsFound: '더 이상의 버전을 찾을 수 없습니다.', + noRowsFound: '{{label}}을(를) 찾을 수 없음', + preview: '미리보기', + problemRestoringVersion: '이 버전을 복원하는 중 문제가 발생했습니다.', + publish: '게시', + publishChanges: '변경 사항 게시', + published: '게시됨', + publishing: '게시', + restoreThisVersion: '이 버전 복원', + restoredSuccessfully: '복원이 완료되었습니다.', + restoring: '복원 중...', + revertToPublished: '게시된 상태로 되돌리기', + reverting: '되돌리는 중...', + saveDraft: '초안 저장', + selectLocales: '표시할 locale 선택', + selectVersionToCompare: '비교할 버전 선택', + showLocales: 'locale 표시:', + showingVersionsFor: '다음 버전 표시 중:', + status: '상태', + unpublish: '게시 해제', + unpublishing: '게시 해제 중...', + version: '버전', + versionCount_many: '{{count}}개의 버전을 찾았습니다', + versionCount_none: '버전을 찾을 수 없습니다', + versionCount_one: '{{count}}개의 버전을 찾았습니다', + versionCount_other: '{{count}}개의 버전을 찾았습니다', + versionCreatedOn: '{{version}} 생성 날짜:', + versionID: '버전 ID', + versions: '버전', + viewingVersion: '{{entityLabel}} {{documentTitle}}의 버전 보기', + viewingVersionGlobal: '글로벌 {{entityLabel}}의 버전 보기', + viewingVersions: '{{entityLabel}} {{documentTitle}}에 대한 버전 보기', + viewingVersionsGlobal: '글로벌 {{entityLabel}}에 대한 버전 보기', + }, }, } diff --git a/packages/translations/src/languages/my.ts b/packages/translations/src/languages/my.ts index fdfda978d2..fa054496c4 100644 --- a/packages/translations/src/languages/my.ts +++ b/packages/translations/src/languages/my.ts @@ -1,397 +1,402 @@ -export default { - authentication: { - account: 'အကောင့်', - accountOfCurrentUser: 'သင့် အကောင့်', - alreadyActivated: 'အတည်ပြုပြီး', - alreadyLoggedIn: 'ဝင်ရောက်ပြီးသား', - apiKey: 'API Key', - backToLogin: 'အကောင့်ထဲ ပြန်ဝင်မည်။', - beginCreateFirstUser: 'စတင်နိုင်ရန် ပထမဦးစွာ အသုံးပြုသူအား ဖန်တီးပါ။', - changePassword: 'စကားဝှက် ပြောင်းလဲမည်။', - checkYourEmailForPasswordReset: - 'သင့်စကားဝှက်ကို ပြန်လည်သတ်မှတ်နိုင်ရန်အတွက် မေးလ်ပို့ထားပါသည်။', - confirmGeneration: 'Generation အတည်ပြု', - confirmPassword: 'စကားဝှက်အား ထပ်မံ ရိုက်ထည့်ပါ။', - createFirstUser: 'ပထမဆုံး အသုံးပြုသူကို ဖန်တီးပါ။', - emailNotValid: 'ထည့်သွင်းထားသော အီးမေလ်မှာ မှားယွင်းနေပါသည်။', - emailSent: 'မေးလ် ပို့ထားပါသည်။', - enableAPIKey: 'API Key ကိုဖွင့်ရန်', - failedToUnlock: 'လော့ခ်ဖွင့်၍မရပါ။', - forceUnlock: 'လော့ခ်ဖွင့်ရန်', - forgotPassword: 'စကားဝှက် မေ့နေပါသလား။', - forgotPasswordEmailInstructions: - 'ကျေးဇူးပြု၍ သင့်အီးမေးလ်ကို ထည့်သွင်းပါ။ သင့်စကားဝှက်ကို ပြန်လည်သတ်မှတ်နိုင်ရန် အီးမေးလ်စာတစ်စောင်ကို သင်လက်ခံရရှိမည်ဖြစ်သည်။', - forgotPasswordQuestion: 'စကားဝှက် မေ့နေပါသလား။', - generate: 'Generate', - generateNewAPIKey: 'API key အသစ်ဖန်တီးရန်', - generatingNewAPIKeyWillInvalidate: - 'API ကီးအသစ်တစ်ခုကို ဖန်တီးခြင်းသည် ယခင်ကီးကို <1>တရားဝင်ခြင်းမရှိစေဘဲ ဖြစ်လိမ့်မည်။ ဆက်လုပ်မှာတာ သေချာပါသလား။', - lockUntil: 'Lock Until', - logBackIn: 'အကောင့်ထဲ ပြန်ဝင်မည်။', - logOut: 'အကောင့်ထဲက ထွက်မည်။', - loggedIn: 'အခြားအကောင့်နှင့် လော့ဂ်အင်ဝင်လိုပါက <0>လော့ဂ်အောက် ပြုလုပ်ပါ။', - loggedInChangePassword: - 'စကားဝှက် ပြောင်းလဲရန်အတွက် သင့် <0>အကောင့် သို့ဝင်ရောက်ပြီး ပြင်ဆင် သတ်မှတ်ပါ။', - loggedOutInactivity: 'လုပ်ဆောင်ချက်မရှိခြင်းကြောင့် သင်သည် ထွက်လိုက်ပါသည်။', - loggedOutSuccessfully: 'သင်သည် အောင်မြင်စွာ ထွက်ပြီးပါပြီ။', - login: 'အကောင့်ထဲ ဝင်မည်။', - loginAttempts: 'လော့ဂ်အင် လုပ်ဆောင်ချက်များ', - loginUser: 'လော့ဂ်အင် အသုံးပြုသူ', - loginWithAnotherUser: 'အခြားအကောင့်နှင့် လော့ဂ်အင်ဝင်လိုပါက <0>လော့ဂ်အောက် ပြုလုပ်ပါ။', - logout: 'အကောင့်မှ ထွက်မည်၊', - logoutUser: 'လော့ဂ်အောက် အသုံးပြုသူ', - newAPIKeyGenerated: 'New API Key Generated.', - newAccountCreated: - '{{serverURL}} သို့ဝင်ရောက်ရန် သင့်အီးမေးလ်ကို အတည်ပြုရန်အတွက် အကောင့်အသစ်တစ်ခုကို ယခုလေးတင် ဖန်တီးပြီးပါပြီ။ ကျေးဇူးပြု၍ အောက်ပါလင့်ခ်ကို နှိပ်ပါ သို့မဟုတ် သင့်အီးမေးလ်ကို အတည်ပြုရန် ဖော်ပြပါ လင့်ခ်ကို သင့်ဘရောက်ဆာထဲသို့ ကူးထည့်ပါ- {{verificationURL}}
သင့်အီးမေးလ်ကို အတည်ပြုပြီးနောက်၊ သင်သည် အောင်မြင်စွာ လော့ဂ်အင်ဝင်နိုင်ပါမည်။', - newPassword: 'စကားဝှက် အသစ်', - resetPassword: 'စကားဝှက် ပြန်လည်သတ်မှတ်', - resetPasswordExpiration: 'စကားဝှက် ပြန်လည်သတ်မှတ်ရန် သတ်တမ်း', - resetPasswordToken: 'စကားဝှက် တိုကင်အား ပြန်လည်သတ်မှတ်', - resetYourPassword: 'သင့်စကားဝှက်ကို ပြန်လည်သတ်မှတ်ပါ။', - stayLoggedIn: 'အကောင့်ထဲ ဝင်ထားသည်။', - successfullyUnlocked: 'အောင်မြင်စွာသော့ဖွင့်ခဲ့သည်။', - unableToVerify: 'စိစစ်၍မရပါ။', - verified: 'စိစစ်ပြီး', - verifiedSuccessfully: 'အတည်ပြုပြီးပါပြီ။', - verify: 'စိစစ်ခြင်း', - verifyUser: 'အသုံးပြုသူ စီစစ်ခြင်း', - verifyYourEmail: 'သင့်အီးမေးလ်ကို အတည်ပြုပါ။', - youAreInactive: - 'သင်သည် အချိန်အနည်းငယ်အတွင်း active မဖြစ်ပါက သင့်အကောင့် လုံခြုံရေးအတွက် မကြာမီ အလိုအလျောက် လော့ဂ်အောက်ဖြစ်ပါမည်။ အကောင့်ထဲ ဆက်နေလိုပါသလား။', - youAreReceivingResetPassword: - 'သင့်အကောင့်အတွက် စကားဝှက်ကို ပြန်လည်သတ်မှတ်ရန် သင် (သို့မဟုတ် အခြားသူတစ်ဦးဦး) က တောင်းဆိုထားသောကြောင့်လက်ခံရရှိခြင်းဖြစ်သည်။ ကျေးဇူးပြု၍ အောက်ပါလင့်ခ်ကို နှိပ်ပါ (သို့မဟုတ်) ၎င်းကို သင့်ဘရောက်ဆာထဲသို့ ကူးထည့်ပါ။', - youDidNotRequestPassword: - 'ယခု လုပ်ဆောင်ချက်ကို သင်မတောင်းဆိုထားပါက ဤအီးမေးလ်ကို လျစ်လျူရှုထားခြင်းဖြင့် သင့်စကားဝှက်သည် ပြောင်းလဲမည်မဟုတ်ပါ။', - }, - error: { - accountAlreadyActivated: 'ဤအကောင့်ကို အသက်သွင်းပြီးဖြစ်သည်။', - autosaving: 'ဖိုင်ကို အလိုအလျောက်သိမ်းဆည်းရာတွင် ပြဿနာတစ်ခုရှိနေသည်။', - correctInvalidFields: 'ကျေးဇူးပြု၍ အချက်အလက်များကို ပြန်လည် စစ်ဆေးပါ။', - deletingFile: 'ဖိုင်ကိုဖျက်ရာတွင် အမှားအယွင်းရှိနေသည်။', - deletingTitle: - '{{title}} ကို ဖျက်ရာတွင် အမှားအယွင်းရှိခဲ့သည်။ သင့် အင်တာနက်လိုင်းအား စစ်ဆေးပြီး ထပ်မံကြို့စားကြည့်ပါ။', - emailOrPasswordIncorrect: 'ထည့်သွင်းထားသော အီးမေးလ် သို့မဟုတ် စကားဝှက်သည် မမှန်ပါ။', - followingFieldsInvalid_one: 'ထည့်သွင်းထားသော အချက်အလက်သည် မမှန်ကန်ပါ။', - followingFieldsInvalid_other: 'ထည့်သွင်းထားသော အချက်အလက်များသည် မမှန်ကန်ပါ။', - incorrectCollection: 'မှားယွင်းသော စုစည်းမှု', - invalidFileType: 'မမှန်ကန်သော ဖိုင်အမျိုးအစား', - invalidFileTypeValue: 'မမှန်ကန်သော ဖိုင်အမျိုးအစား: {{value}}', - loadingDocument: '{{id}} ID ဖြင့် ဖိုင်ကို ဖွင့်ရာတွင် ပြဿနာရှိနေသည်။', - missingEmail: 'အီးမေးလ်ပျောက်ဆုံး', - missingIDOfDocument: 'ပြင်ဆင်ရန် ဖိုင် ID ပျောက်နေပါသည်။', - missingIDOfVersion: 'ပျောက်ဆုံး ဗားရှင်း ID', - missingRequiredData: 'လိုအပ်သောဒေတာ ပျောက်ဆုံးနေပါသည်။', - noFilesUploaded: 'ဖိုင်များကို အပ်လုဒ်လုပ်ထားခြင်းမရှိပါ။', - noMatchedField: '"{{label}}" အတွက် ကိုက်ညီသောအပိုင်းကို ရှာမတွေ့ပါ။', - noUser: 'အသုံးပြုသူ မရှိပါ။', - notAllowedToAccessPage: 'ဤစာမျက်နှာကို ဝင်ရောက်ခွင့်မပြုပါ။', - notAllowedToPerformAction: 'ဤလုပ်ဆောင်ချက်ကို လုပ်ဆောင်ရန် ခွင့်မပြုပါ။', - notFound: 'တောင်းဆိုထားသော အရင်းအမြစ်ကို ရှာမတွေ့ပါ။', - previewing: 'ဖိုင်ကို အစမ်းကြည့်ရန် ပြဿနာရှိနေသည်။', - problemUploadingFile: 'ဖိုင်ကို အပ်လုဒ်တင်ရာတွင် ပြဿနာရှိနေသည်။', - tokenInvalidOrExpired: 'တိုကင်သည် မမှန်ကန်ပါ သို့မဟုတ် သက်တမ်းကုန်သွားပါပြီ။', - unPublishingDocument: 'ဖိုင်ကို ပြန်လည့် သိမ်းဆည်းခြင်းမှာ ပြဿနာရှိနေသည်။', - unableToDeleteCount: '{{total}} {{label}} မှ {{count}} ကို ဖျက်၍မရပါ။', - unableToUpdateCount: '{{total}} {{label}} မှ {{count}} ကို အပ်ဒိတ်လုပ်၍မရပါ။', - unauthorized: 'အခွင့်မရှိပါ။ ဤတောင်းဆိုချက်ကို လုပ်ဆောင်နိုင်ရန် သင်သည် လော့ဂ်အင်ဝင်ရပါမည်။', - unknown: 'ဘာမှန်းမသိသော error တက်သွားပါသည်။', - unspecific: 'Error တက်နေပါသည်။', - userLocked: - 'အကောင့်ထဲကို ဝင်ရန် အရမ်းအရမ်းကို ကြိုးပမ်းနေသောကြောင့် အကောင့်အား လော့ခ်ချလိုက်ပါသည်။', - valueMustBeUnique: 'value သည် အဓိပ္ပာယ်ရှိရပါမည်။', - verificationTokenInvalid: 'အတည်ပြုခြင်းတိုကင်သည် မမှန်ကန်ပါ။', - }, - fields: { - addLabel: '{{label}} ထည့်သွင်းမည်။', - addLink: 'လင့်ခ်ထည့်ပါ။', - addNew: 'အသစ် ထည့်သွင်းမည်။', - addNewLabel: '{{label}} အားအသစ် ထည့်သွင်းမည်။', - addRelationship: 'Relationship အသစ်ထည့်သွင်းမည်။', - addUpload: 'Upload ထည့်ပါ။', - block: 'ဘလောက်', - blockType: 'ဘလောက် အမျိုးအစား', - blocks: 'ဘလောက်များ', - chooseBetweenCustomTextOrDocument: - 'စိတ်ကြိုက်စာသား URL ကိုထည့်ခြင်း သို့မဟုတ် အခြားစာရွက်စာတမ်းတစ်ခုသို့ လင့်ခ်ချိတ်ခြင်းအကြား ရွေးချယ်ပါ။', - chooseDocumentToLink: 'ချိတ်ဆက်ရန် စာရွက်စာတမ်းကို ရွေးပါ။', - chooseFromExisting: 'ရှိပြီးသားထဲကပဲ ရွေးချယ်ပါ။', - chooseLabel: '{{label}} အားရွေးချယ်ပါ။', - collapseAll: 'အားလုံးကို ခေါက်သိမ်းပါ။', - customURL: 'စိတ်ကြိုက် URL', - editLabelData: 'ဒေတာ {{label}} ကို တည်းဖြတ်ပါ။', - editLink: 'လင့်ခ်ကို တည်းဖြတ်ပါ။', - editRelationship: 'ဆက်ဆံရေးကို တည်းဖြတ်ပါ။', - enterURL: 'URL တစ်ခုထည့်ပါ။', - internalLink: 'Internal Link', - itemsAndMore: '{{items}} နှင့် နောက်ထပ် {{count}} ခု', - labelRelationship: '{{label}} Relationship', - latitude: 'vĩ độ', - linkType: 'လင့်အမျိုးအစား', - linkedTo: '<0>{{label}} ချိတ်ဆက်ထားသည်။', - longitude: 'လောင်ဂျီကျု', - newLabel: '{{label}} အသစ်', - openInNewTab: 'တက်ဘ်အသစ်တွင် ဖွင့်ပါ။', - passwordsDoNotMatch: 'စကားဝှက်များနှင့် မကိုက်ညီပါ။', - relatedDocument: 'ဆက်စပ် ဖိုင်', - relationTo: 'ဆက်စပ်မှု', - removeRelationship: 'ဆက်ဆံရေးကို ဖယ်ရှားပါ။', - removeUpload: 'အပ်လုဒ်ကို ဖယ်ရှားပါ။', - saveChanges: 'သိမ်းဆည်းမည်။', - searchForBlock: 'ဘလောက်တစ်ခုရှာမည်။', - selectExistingLabel: 'ရှိပြီးသား {{label}} ကို ရွေးပါ', - selectFieldsToEdit: 'တည်းဖြတ်ရန် အကွက်များကို ရွေးပါ။', - showAll: 'အကုန် ကြည့်မည်။', - swapRelationship: 'လဲလှယ်ဆက်ဆံရေး', - swapUpload: 'အပ်လုဒ်ဖလှယ်ပါ။', - textToDisplay: 'ပြသရန် စာသား', - toggleBlock: 'ဘလောက်ကို ပြောင်းပါ။', - uploadNewLabel: '{{label}} အသစ်တင်မည်။', - }, - general: { - aboutToDelete: - '{{label}} <1>{{title}} ကို ဖျက်ပါတော့မည်။ သေချာပြီလား။ ဖျက်ပြီးရင် ပြန်မရဘူးနော်။', - aboutToDeleteCount_many: 'သင်သည် {{count}} {{label}} ကို ဖျက်ပါတော့မည်။', - aboutToDeleteCount_one: 'သင်သည် {{count}} {{label}} ကို ဖျက်ပါတော့မည်။', - aboutToDeleteCount_other: 'သင်သည် {{count}} {{label}} ကို ဖျက်ပါတော့မည်။', - addBelow: 'အောက်တွင်ထည့်ပါ။', - addFilter: 'ဇကာထည့်ပါ။', - adminTheme: 'အက်ပ်ဒိုင်များစပ်စွာ', - and: 'နှင့်', - applyChanges: 'ပြောင်းလဲမှုများ အသုံးပြုပါ', - ascending: 'တက်နေသည်', - automatic: 'အော်တို', - backToDashboard: 'ပင်မစာမျက်နှာသို့ ပြန်သွားမည်။', - cancel: 'မလုပ်တော့ပါ။', - changesNotSaved: - 'သင်၏ပြောင်းလဲမှုများကို မသိမ်းဆည်းရသေးပါ။ ယခု စာမျက်နှာက ထွက်လိုက်ပါက သင်၏ပြောင်းလဲမှုများ အကုန် ဆုံးရှုံးသွားပါမည်။ အကုန်နော်။', - close: 'ပိတ်', - collapse: 'ခေါက်သိမ်းပါ။', - collections: 'စုစည်းမှူများ', - columnToSort: 'ကော်လံ စီရန်', - columns: 'ကော်လံများ', - confirm: 'သေချာပါပြီ။', - confirmDeletion: 'ဖျက်တော့မယ်နော်။', - confirmDuplication: 'ပုံတူပွားခြင်းကို အတည်ပြုပါ။', - copied: 'ကူးယူပြီးပြီ။', - copy: 'ကူးယူမည်။', - create: 'ဖန်တီးမည်။', - createNew: 'အသစ် ဖန်တီးမည်။', - createNewLabel: '{{label}} အသစ် ဖန်တီးမည်။', - created: 'ဖန်တီးခဲ့သည်။', - createdAt: 'ဖန်တီးခဲ့သည့်အချိန်', - creating: 'ဖန်တီးနေသည်။', - creatingNewLabel: '{{label}} အသစ် ဖန်တီးနေသည်။', - dark: 'အမှောင်', - dashboard: 'ပင်မစာမျက်နှာ', - delete: 'ဖျက်မည်။', - deletedCountSuccessfully: '{{count}} {{label}} ကို အောင်မြင်စွာ ဖျက်လိုက်ပါပြီ။', - deletedSuccessfully: 'အောင်မြင်စွာ ဖျက်လိုက်ပါပြီ။', - deleting: 'ဖျက်နေဆဲ ...', - descending: 'ဆင်းသက်လာသည်။', - deselectAllRows: 'အားလုံးကို မရွေးနိုင်ပါ', - duplicate: 'ပုံတူပွားမည်။', - duplicateWithoutSaving: 'သေချာပါပြီ။', - edit: 'တည်းဖြတ်ပါ။', - editLabel: '{{label}} ပြင်ဆင်မည်။', - editing: 'ပြင်ဆင်နေသည်။', - editingLabel_many: 'တည်းဖြတ်ခြင်း {{count}} {{label}}', - editingLabel_one: 'တည်းဖြတ်ခြင်း {{count}} {{label}}', - editingLabel_other: 'တည်းဖြတ်ခြင်း {{count}} {{label}}', - email: 'အီးမေးလ်', - emailAddress: 'အီးမေးလ် လိပ်စာ', - enterAValue: 'တန်ဖိုးတစ်ခုထည့်ပါ။', - error: 'အမှား', - errors: 'အမှားများ', - fallbackToDefaultLocale: 'မူရင်းဒေသသို့ ပြန်ပြောင်းပါ။', - filter: 'ဇကာ', - filterWhere: 'နေရာတွင် စစ်ထုတ်ပါ။', - filters: 'စစ်ထုတ်မှုများ', - globals: 'Globals', - language: 'ဘာသာစကား', - lastModified: 'နောက်ဆုံးပြင်ဆင်ထားသည်။', - leaveAnyway: 'ဘာဖြစ်ဖြစ် ထွက်မည်။', - leaveWithoutSaving: 'မသိမ်းဘဲ ထွက်မည်။', - light: 'အလင်း', - livePreview: 'အစမ်းကြည့်ရန်', - loading: 'ဖွင့်နေသည်', - locale: 'ဒေသ', - locales: 'Locales', - menu: 'မီနူး', - moveDown: 'Move Down', - moveUp: 'Move Up', - newPassword: 'စကားဝှက် အသစ်', - noFiltersSet: 'စစ်ထုတ်မှုများ မသတ်မှတ်ထားပါ။', - noLabel: '<မရှိ {{label}}>', - noOptions: 'ရွေးချယ်မှုမရှိပါ', - noResults: - '{{label}} မတွေ့ပါ။ {{label}} မရှိသေးသည်ဖြစ်စေ အထက်တွင်ဖော်ပြထားသော စစ်ထုတ်မှုများနှင့် ကိုက်ညီမှုမရှိပါ။', - noValue: 'တန်ဖိုး မရှိပါ။', - none: 'တစ်ခုမှ', - notFound: 'ဘာမှ မရှိတော့ဘူး။', - nothingFound: 'ဘာမှလည်း မတွေ့ဘူး။', - of: '၏', - open: 'ဖွင့်မည်။', - or: 'သို့မဟုတ်', - order: 'အစဉ်လိုက်', - pageNotFound: 'ရောက်ရှိနေသော စာမျက်နှာသည် မရှိပါ။', - password: 'စကားဝှက်', - payloadSettings: 'ရွေးချယ်စရာများ', - perPage: 'စာမျက်နှာ အလိုက်: {{limit}}', - remove: 'ဖယ်ရှားမည်။', - reset: 'Tetapkan semula', - row: 'အတန်း', - rows: 'Rows', - save: 'သိမ်းဆည်းမည်။', - saving: 'သိမ်းနေဆဲ ...', - searchBy: 'ရှာဖွေပါ။', - selectAll: '{{count}} {{label}} အားလုံးကို ရွေးပါ', - selectAllRows: 'အားလုံးကိုရွေးချယ်ပါ', - selectValue: 'တစ်ခုခုကို ရွေးချယ်ပါ။', - selectedCount: '{{count}} {{label}} ကို ရွေးထားသည်။', - showAllLabel: 'Tunjukkan semua {{label}}', - sorryNotFound: 'ဝမ်းနည်းပါသည်။ သင်ရှာနေတဲ့ဟာ ဒီမှာမရှိပါ။', - sort: 'အစဉ်လိုက်', - sortByLabelDirection: 'အစဉ်အလိုက် စီမံခန့်ခွဲထားသည် {{label}} {{direction}}', - stayOnThisPage: 'ဒီမှာပဲ ဆက်နေမည်။', - submissionSuccessful: 'သိမ်းဆည်းမှု အောင်မြင်ပါသည်။', - submit: 'သိမ်းဆည်းမည်။', - successfullyCreated: '{{label}} အောင်မြင်စွာဖန်တီးခဲ့သည်။', - successfullyDuplicated: '{{label}} အောင်မြင်စွာ ပုံတူပွားခဲ့သည်။', - thisLanguage: 'မြန်မာစာ', - titleDeleted: '{{label}} {{title}} အောင်မြင်စွာ ဖျက်သိမ်းခဲ့သည်။', - unauthorized: 'အခွင့်မရှိပါ။', - unsavedChangesDuplicate: - 'သင့်တွင် မသိမ်းဆည်းရသေးသော ပြောင်းလဲမှုများ ရှိနေပါသည်။ ပုံတူပွားမှာ သေချာပြီလား။', - untitled: 'ခေါင်းစဥ်မဲ့', - updatedAt: 'ပြင်ဆင်ခဲ့သည့်အချိန်', - updatedCountSuccessfully: '{{count}} {{label}} ကို အောင်မြင်စွာ အပ်ဒိတ်လုပ်ခဲ့သည်။', - updatedSuccessfully: 'အပ်ဒိတ်လုပ်ပြီးပါပြီ။', - updating: 'ပြင်ဆင်ရန်', - uploading: 'တင်ပေးနေသည်', - user: 'အသုံးပြုသူ', - users: 'အသုံးပြုသူများ', - value: 'တန်ဖိုး', - welcome: 'ကြိုဆိုပါတယ်။', - }, - operators: { - contains: 'ပါဝင်သည်', - equals: 'ညီမျှ', - exists: 'တည်ရှိသည်', - isGreaterThan: 'ထက်ကြီးသည်', - isGreaterThanOrEqualTo: 'ထက်ကြီးသည် သို့မဟုတ် ညီမျှသည်', - isIn: 'ရှိ', - isLessThan: 'ထက်နည်းသည်', - isLessThanOrEqualTo: 'ထက်နည်းသည် သို့မဟုတ် ညီမျှသည်', - isLike: 'တူသည်', - isNotEqualTo: 'ညီမျှသည်', - isNotIn: 'မဝင်ပါ', - near: 'နီး', - }, - upload: { - crop: 'သုန်း', - cropToolDescription: - 'ရွေးထားသည့်ဧရိယာတွင်မွေးလျှက်မှုများကိုဆွဲပြီး, အသစ်တည်ပြီးသို့မဟုတ်အောက်ပါတ', - dragAndDrop: 'ဖိုင်တစ်ဖိုင်ကို ဆွဲချလိုက်ပါ။', - dragAndDropHere: 'သို့မဟုတ် ဖိုင်တစ်ခုကို ဤနေရာတွင် ဆွဲချပါ။', - editImage: 'ပုံပြင်ပြောင်းရန်', - fileName: 'ဖိုင် နာမည်', - fileSize: 'ဖိုင် အရွယ်အစား', - focalPoint: 'အကန့်အသတ်ချုပ်', - focalPointDescription: - 'ပြသနားရထားသည့်ပုံအားထိန်းသိမ်းရန် ဖိုကယ်ပိုင်းကို တိုက်ရိုက်ပွဲ့နိုင်သည် သို', - height: 'Height', - lessInfo: 'အချက်အလက်နည်းတယ်။', - moreInfo: 'အချက်အလက်', - previewSizes: 'Saiz Pratonton', - selectCollectionToBrowse: 'စုစည်းမှု တစ်ခုခုကို ရွေးချယ်ပါ။', - selectFile: 'ဖိုင်ရွေးပါ။', - setCropArea: 'စပြန်းနယ်မြေထားပါ', - setFocalPoint: 'အစေခံဖောက်ရေစနစ်ကိုသတ်မှတ်ပါ', - sizes: 'အရွယ်အစားများ', - sizesFor: '{{label}} အတွက် အရွယ်အစားများ', - width: 'အကျယ်', - }, - validation: { - emailAddress: 'မှန်ကန်သော အီးမေးလ်လိပ်စာကို ထည့်သွင်းပါ။', - enterNumber: 'မှန်ကန်သောနံပါတ်တစ်ခုထည့်ပါ။', - fieldHasNo: 'ဤအကွက်တွင် {{label}} မရှိပါ။', - greaterThanMax: - '{{value}} သည် {{max}} ထက် ပိုမိုကြီးသည်။ ဤသည်ဖြင့် {{label}} အများဆုံးခွင့်ပြုထားသော တန်ဖိုးထက် ကြီးသည်။', - invalidInput: 'ဤအကွက်တွင် မမှန်ကန်သော ထည့်သွင်းမှုတစ်ခုရှိသည်။', - invalidSelection: 'ဤအကွက်တွင် မမှန်ကန်သော ရွေးချယ်မှုတစ်ခုရှိသည်။', - invalidSelections: 'ဤအကွက်တွင် အောက်ပါ မမှန်ကန်သော ရွေးချယ်မှုများ ရှိသည်', - lessThanMin: - '{{value}} သည် {{min}} ထက် ပိုမိုနိမ့်သည်။ ဤသည်ဖြင့် {{label}} အနည်းဆုံးခွင့်ပြုထားသော တန်ဖိုးထက် နိမ့်သည်။', - limitReached: - 'Had yang dibenarkan telah dicapai, hanya {{max}} item sahaja yang boleh ditambah.', - longerThanMin: 'ဤတန်ဖိုးသည် အနိမ့်ဆုံးအရှည် {{minLength}} စာလုံးထက် ပိုရှည်ရမည်။', - notValidDate: '"{{value}}" သည် တရားဝင်ရက်စွဲမဟုတ်ပါ။', - required: 'ဤအကွက်ကို လိုအပ်သည်။', - requiresAtLeast: 'ဤအကွက်သည် အနည်းဆုံး {{count}} {{label}} လိုအပ်သည်', - requiresNoMoreThan: 'ဤအကွက်တွင် {{count}} {{label}} ထက် မပိုရပါ။', - requiresTwoNumbers: 'ဤအကွက်သည် နံပါတ်နှစ်ခု လိုအပ်ပါသည်။', - shorterThanMax: 'ဤတန်ဖိုးသည် စာလုံး {{maxLength}} လုံး၏ အမြင့်ဆုံးအရှည်ထက် ပိုတိုရပါမည်။', - trueOrFalse: 'ဤအကွက်သည် တစ်ခုခုဖြစ်ရပါမည်။', - validUploadID: "'ဤအကွက်သည် မှန်ကန်သော အပ်လုဒ် ID မဟုတ်ပါ။'", - }, - version: { - aboutToPublishSelection: - 'သင်သည် ရွေးချယ်မှုတွင် {{label}} အားလုံးကို ထုတ်ဝေပါတော့မည်။ သေချာလား?', - aboutToRestore: - 'သင်သည် ဤ {{label}} စာရွက်စာတမ်းကို {{versionDate}} တွင် ပါရှိသည့် အခြေအနေသို့ ပြန်ယူတော့မည်။', - aboutToRestoreGlobal: - 'သင်သည် ဂလိုဘယ် {{label}} ကို {{versionDate}} တွင် ပါရှိသည့် အခြေအနေသို့ ပြန်လည်ရောက်ရှိတော့မည်ဖြစ်သည်။', - aboutToRevertToPublished: - 'သင်သည် အပြောင်းအလဲများကို အများဆိုင် အခြေအနေသို့ ပြန်ပြောင်းပါတော့မည်။ သေချာလား?', - aboutToUnpublish: 'အများဆိုင်မှ ပြန်ဖြုတ်တော့မည်။ သေချာလား', - aboutToUnpublishSelection: - 'သင်သည် ရွေးချယ်မှုတွင် {{label}} အားလုံးကို ထုတ်ဝေတော့မည် ဖြစ်သည်။ သေချာလား?', - autosave: 'အလိုအလျောက်သိမ်းဆည်းပါ။', - autosavedSuccessfully: 'အလိုအလျောက် သိမ်းဆည်းပြီးပါပြီ။', - autosavedVersion: 'အော်တို ဗားရှင်း', - changed: 'ပြောင်းခဲ့သည်။', - compareVersion: 'ဗားရှင်းနှင့် နှိုင်းယှဉ်ချက်:', - confirmPublish: 'ထုတ်ဝေအတည်ပြုပါ။', - confirmRevertToSaved: 'သိမ်းဆည်းပြီးကြောင်း အတည်ပြုပါ။', - confirmUnpublish: 'အများဆိုင်ကို ဖျက်ရန် အတည်ပြုပါ။', - confirmVersionRestoration: 'ဗားရှင်းပြန်လည် အသုံးပြုခြင်းကို အတည်ပြုပါ။', - currentDocumentStatus: 'လက်ရှိ {{docStatus}} ဖိုင်', - draft: 'မူကြမ်း', - draftSavedSuccessfully: 'မူကြမ်းကို အောင်မြင်စွာ သိမ်းဆည်းပြီးပါပြီ။', - lastSavedAgo: 'နောက်ဆုံး သိမ်းချက် {{distance}} ကြာပြီး', - noFurtherVersionsFound: 'နောက်ထပ်ဗားရှင်းများ မတွေ့ပါ။', - noRowsFound: '{{label}} အားမတွေ့ပါ။', - preview: 'နမူနာပြရန်', - problemRestoringVersion: 'ဤဗားရှင်းကို ပြန်လည်ရယူရာတွင် ပြဿနာရှိနေသည်။', - publish: 'ထုတ်ဝေသည်။', - publishChanges: 'အပြောင်းအလဲများကို တင်ခဲ့သည်။', - published: 'တင်ပြီးပြီ။', - publishing: 'ထုတ်ဝေခြင်း', - restoreThisVersion: 'ဤဗားရှင်းကိုကို ပြန်ယူမည်။', - restoredSuccessfully: 'အောင်မြင်စွာ ပြန်လည်ရယူခဲ့သည်။', - restoring: 'ပြန်ယူနေဆဲ...', - revertToPublished: 'အများဆိုင်သို့ ပြန်ပြောင်းပါ။', - reverting: 'ပြန်ပြောင်းနေဆဲ...', - saveDraft: 'မှုကြမ်းကို သိမ်းဆည်းမည်။', - selectLocales: 'ပြသရန် ဒေသန္တရများကို ရွေးပါ။', - selectVersionToCompare: 'နှိုင်းယှဉ်ရန် ဗားရှင်းကို ရွေးပါ။', - showLocales: 'ဒေသန္တရများကိုပြပါ။:', - showingVersionsFor: 'အတွက် ဗားရှင်းများကို ပြသနေသည်-', - status: 'အခြေအနေ', - type: 'အမျိုးအစား', - unpublish: 'ပြန်ဖြုတ်မည်။', - unpublishing: 'ပြန်ဖြုတ်နေဆဲ ...', - version: 'ဗားရှင်း', - versionCount_many: '{{count}} ဗားရှင်းများကို တွေ့ပါသည်။', - versionCount_none: 'ဗားရှင်းရှာဖွေ့ပါ။', - versionCount_one: '{{count}} ဗားရှင်အား တွေ့ပါသည်။', - versionCount_other: 'ဗားရှင်း {{count}} ခု တွေ့ရှိပါသည်။', - versionCreatedOn: '{{version}} အား ဖန်တီးခဲ့သည်။', - versionID: 'ဗားရှင်း ID', - versions: 'ဗားရှင်းများ', - viewingVersion: '{{entityLabel}} {{documentTitle}} အတွက် ဗားရှင်းကို ကြည့်ရှုနေသည်', - viewingVersionGlobal: '`ဂလိုဘယ်ဆိုင်ရာ {entityLabel}} အတွက် ဗားရှင်းကို ကြည့်ရှုနေသည်', - viewingVersions: '{{entityLabel}} {{documentTitle}} အတွက် ဗားရှင်းများကို ကြည့်ရှုခြင်း', - viewingVersionsGlobal: '`ဂလိုဘယ်ဆိုင်ရာ {{entityLabel}} အတွက် ဗားရှင်းများကို ကြည့်ရှုနေသည်', +import type { Language } from '../types.js' + +export const my: Language = { + dateFNSKey: 'my', + translations: { + authentication: { + account: 'အကောင့်', + accountOfCurrentUser: 'သင့် အကောင့်', + alreadyActivated: 'အတည်ပြုပြီး', + alreadyLoggedIn: 'ဝင်ရောက်ပြီးသား', + apiKey: 'API Key', + backToLogin: 'အကောင့်ထဲ ပြန်ဝင်မည်။', + beginCreateFirstUser: 'စတင်နိုင်ရန် ပထမဦးစွာ အသုံးပြုသူအား ဖန်တီးပါ။', + changePassword: 'စကားဝှက် ပြောင်းလဲမည်။', + checkYourEmailForPasswordReset: + 'သင့်စကားဝှက်ကို ပြန်လည်သတ်မှတ်နိုင်ရန်အတွက် မေးလ်ပို့ထားပါသည်။', + confirmGeneration: 'Generation အတည်ပြု', + confirmPassword: 'စကားဝှက်အား ထပ်မံ ရိုက်ထည့်ပါ။', + createFirstUser: 'ပထမဆုံး အသုံးပြုသူကို ဖန်တီးပါ။', + emailNotValid: 'ထည့်သွင်းထားသော အီးမေလ်မှာ မှားယွင်းနေပါသည်။', + emailSent: 'မေးလ် ပို့ထားပါသည်။', + enableAPIKey: 'API Key ကိုဖွင့်ရန်', + failedToUnlock: 'လော့ခ်ဖွင့်၍မရပါ။', + forceUnlock: 'လော့ခ်ဖွင့်ရန်', + forgotPassword: 'စကားဝှက် မေ့နေပါသလား။', + forgotPasswordEmailInstructions: + 'ကျေးဇူးပြု၍ သင့်အီးမေးလ်ကို ထည့်သွင်းပါ။ သင့်စကားဝှက်ကို ပြန်လည်သတ်မှတ်နိုင်ရန် အီးမေးလ်စာတစ်စောင်ကို သင်လက်ခံရရှိမည်ဖြစ်သည်။', + forgotPasswordQuestion: 'စကားဝှက် မေ့နေပါသလား။', + generate: 'Generate', + generateNewAPIKey: 'API key အသစ်ဖန်တီးရန်', + generatingNewAPIKeyWillInvalidate: + 'API ကီးအသစ်တစ်ခုကို ဖန်တီးခြင်းသည် ယခင်ကီးကို <1>တရားဝင်ခြင်းမရှိစေဘဲ ဖြစ်လိမ့်မည်။ ဆက်လုပ်မှာတာ သေချာပါသလား။', + lockUntil: 'Lock Until', + logBackIn: 'အကောင့်ထဲ ပြန်ဝင်မည်။', + logOut: 'အကောင့်ထဲက ထွက်မည်။', + loggedIn: 'အခြားအကောင့်နှင့် လော့ဂ်အင်ဝင်လိုပါက <0>လော့ဂ်အောက် ပြုလုပ်ပါ။', + loggedInChangePassword: + 'စကားဝှက် ပြောင်းလဲရန်အတွက် သင့် <0>အကောင့် သို့ဝင်ရောက်ပြီး ပြင်ဆင် သတ်မှတ်ပါ။', + loggedOutInactivity: 'လုပ်ဆောင်ချက်မရှိခြင်းကြောင့် သင်သည် ထွက်လိုက်ပါသည်။', + loggedOutSuccessfully: 'သင်သည် အောင်မြင်စွာ ထွက်ပြီးပါပြီ။', + login: 'အကောင့်ထဲ ဝင်မည်။', + loginAttempts: 'လော့ဂ်အင် လုပ်ဆောင်ချက်များ', + loginUser: 'လော့ဂ်အင် အသုံးပြုသူ', + loginWithAnotherUser: 'အခြားအကောင့်နှင့် လော့ဂ်အင်ဝင်လိုပါက <0>လော့ဂ်အောက် ပြုလုပ်ပါ။', + logout: 'အကောင့်မှ ထွက်မည်၊', + logoutUser: 'လော့ဂ်အောက် အသုံးပြုသူ', + newAPIKeyGenerated: 'New API Key Generated.', + newAccountCreated: + '{{serverURL}} သို့ဝင်ရောက်ရန် သင့်အီးမေးလ်ကို အတည်ပြုရန်အတွက် အကောင့်အသစ်တစ်ခုကို ယခုလေးတင် ဖန်တီးပြီးပါပြီ။ ကျေးဇူးပြု၍ အောက်ပါလင့်ခ်ကို နှိပ်ပါ သို့မဟုတ် သင့်အီးမေးလ်ကို အတည်ပြုရန် ဖော်ပြပါ လင့်ခ်ကို သင့်ဘရောက်ဆာထဲသို့ ကူးထည့်ပါ- {{verificationURL}}
သင့်အီးမေးလ်ကို အတည်ပြုပြီးနောက်၊ သင်သည် အောင်မြင်စွာ လော့ဂ်အင်ဝင်နိုင်ပါမည်။', + newPassword: 'စကားဝှက် အသစ်', + resetPassword: 'စကားဝှက် ပြန်လည်သတ်မှတ်', + resetPasswordExpiration: 'စကားဝှက် ပြန်လည်သတ်မှတ်ရန် သတ်တမ်း', + resetPasswordToken: 'စကားဝှက် တိုကင်အား ပြန်လည်သတ်မှတ်', + resetYourPassword: 'သင့်စကားဝှက်ကို ပြန်လည်သတ်မှတ်ပါ။', + stayLoggedIn: 'အကောင့်ထဲ ဝင်ထားသည်။', + successfullyUnlocked: 'အောင်မြင်စွာသော့ဖွင့်ခဲ့သည်။', + unableToVerify: 'စိစစ်၍မရပါ။', + verified: 'စိစစ်ပြီး', + verifiedSuccessfully: 'အတည်ပြုပြီးပါပြီ။', + verify: 'စိစစ်ခြင်း', + verifyUser: 'အသုံးပြုသူ စီစစ်ခြင်း', + verifyYourEmail: 'သင့်အီးမေးလ်ကို အတည်ပြုပါ။', + youAreInactive: + 'သင်သည် အချိန်အနည်းငယ်အတွင်း active မဖြစ်ပါက သင့်အကောင့် လုံခြုံရေးအတွက် မကြာမီ အလိုအလျောက် လော့ဂ်အောက်ဖြစ်ပါမည်။ အကောင့်ထဲ ဆက်နေလိုပါသလား။', + youAreReceivingResetPassword: + 'သင့်အကောင့်အတွက် စကားဝှက်ကို ပြန်လည်သတ်မှတ်ရန် သင် (သို့မဟုတ် အခြားသူတစ်ဦးဦး) က တောင်းဆိုထားသောကြောင့်လက်ခံရရှိခြင်းဖြစ်သည်။ ကျေးဇူးပြု၍ အောက်ပါလင့်ခ်ကို နှိပ်ပါ (သို့မဟုတ်) ၎င်းကို သင့်ဘရောက်ဆာထဲသို့ ကူးထည့်ပါ။', + youDidNotRequestPassword: + 'ယခု လုပ်ဆောင်ချက်ကို သင်မတောင်းဆိုထားပါက ဤအီးမေးလ်ကို လျစ်လျူရှုထားခြင်းဖြင့် သင့်စကားဝှက်သည် ပြောင်းလဲမည်မဟုတ်ပါ။', + }, + error: { + accountAlreadyActivated: 'ဤအကောင့်ကို အသက်သွင်းပြီးဖြစ်သည်။', + autosaving: 'ဖိုင်ကို အလိုအလျောက်သိမ်းဆည်းရာတွင် ပြဿနာတစ်ခုရှိနေသည်။', + correctInvalidFields: 'ကျေးဇူးပြု၍ အချက်အလက်များကို ပြန်လည် စစ်ဆေးပါ။', + deletingFile: 'ဖိုင်ကိုဖျက်ရာတွင် အမှားအယွင်းရှိနေသည်။', + deletingTitle: + '{{title}} ကို ဖျက်ရာတွင် အမှားအယွင်းရှိခဲ့သည်။ သင့် အင်တာနက်လိုင်းအား စစ်ဆေးပြီး ထပ်မံကြို့စားကြည့်ပါ။', + emailOrPasswordIncorrect: 'ထည့်သွင်းထားသော အီးမေးလ် သို့မဟုတ် စကားဝှက်သည် မမှန်ပါ။', + followingFieldsInvalid_one: 'ထည့်သွင်းထားသော အချက်အလက်သည် မမှန်ကန်ပါ။', + followingFieldsInvalid_other: 'ထည့်သွင်းထားသော အချက်အလက်များသည် မမှန်ကန်ပါ။', + incorrectCollection: 'မှားယွင်းသော စုစည်းမှု', + invalidFileType: 'မမှန်ကန်သော ဖိုင်အမျိုးအစား', + invalidFileTypeValue: 'မမှန်ကန်သော ဖိုင်အမျိုးအစား: {{value}}', + loadingDocument: '{{id}} ID ဖြင့် ဖိုင်ကို ဖွင့်ရာတွင် ပြဿနာရှိနေသည်။', + missingEmail: 'အီးမေးလ်ပျောက်ဆုံး', + missingIDOfDocument: 'ပြင်ဆင်ရန် ဖိုင် ID ပျောက်နေပါသည်။', + missingIDOfVersion: 'ပျောက်ဆုံး ဗားရှင်း ID', + missingRequiredData: 'လိုအပ်သောဒေတာ ပျောက်ဆုံးနေပါသည်။', + noFilesUploaded: 'ဖိုင်များကို အပ်လုဒ်လုပ်ထားခြင်းမရှိပါ။', + noMatchedField: '"{{label}}" အတွက် ကိုက်ညီသောအပိုင်းကို ရှာမတွေ့ပါ။', + noUser: 'အသုံးပြုသူ မရှိပါ။', + notAllowedToAccessPage: 'ဤစာမျက်နှာကို ဝင်ရောက်ခွင့်မပြုပါ။', + notAllowedToPerformAction: 'ဤလုပ်ဆောင်ချက်ကို လုပ်ဆောင်ရန် ခွင့်မပြုပါ။', + notFound: 'တောင်းဆိုထားသော အရင်းအမြစ်ကို ရှာမတွေ့ပါ။', + previewing: 'ဖိုင်ကို အစမ်းကြည့်ရန် ပြဿနာရှိနေသည်။', + problemUploadingFile: 'ဖိုင်ကို အပ်လုဒ်တင်ရာတွင် ပြဿနာရှိနေသည်။', + tokenInvalidOrExpired: 'တိုကင်သည် မမှန်ကန်ပါ သို့မဟုတ် သက်တမ်းကုန်သွားပါပြီ။', + unPublishingDocument: 'ဖိုင်ကို ပြန်လည့် သိမ်းဆည်းခြင်းမှာ ပြဿနာရှိနေသည်။', + unableToDeleteCount: '{{total}} {{label}} မှ {{count}} ကို ဖျက်၍မရပါ။', + unableToUpdateCount: '{{total}} {{label}} မှ {{count}} ကို အပ်ဒိတ်လုပ်၍မရပါ။', + unauthorized: 'အခွင့်မရှိပါ။ ဤတောင်းဆိုချက်ကို လုပ်ဆောင်နိုင်ရန် သင်သည် လော့ဂ်အင်ဝင်ရပါမည်။', + unknown: 'ဘာမှန်းမသိသော error တက်သွားပါသည်။', + unspecific: 'Error တက်နေပါသည်။', + userLocked: + 'အကောင့်ထဲကို ဝင်ရန် အရမ်းအရမ်းကို ကြိုးပမ်းနေသောကြောင့် အကောင့်အား လော့ခ်ချလိုက်ပါသည်။', + valueMustBeUnique: 'value သည် အဓိပ္ပာယ်ရှိရပါမည်။', + verificationTokenInvalid: 'အတည်ပြုခြင်းတိုကင်သည် မမှန်ကန်ပါ။', + }, + fields: { + addLabel: '{{label}} ထည့်သွင်းမည်။', + addLink: 'လင့်ခ်ထည့်ပါ။', + addNew: 'အသစ် ထည့်သွင်းမည်။', + addNewLabel: '{{label}} အားအသစ် ထည့်သွင်းမည်။', + addRelationship: 'Relationship အသစ်ထည့်သွင်းမည်။', + addUpload: 'Upload ထည့်ပါ။', + block: 'ဘလောက်', + blockType: 'ဘလောက် အမျိုးအစား', + blocks: 'ဘလောက်များ', + chooseBetweenCustomTextOrDocument: + 'စိတ်ကြိုက်စာသား URL ကိုထည့်ခြင်း သို့မဟုတ် အခြားစာရွက်စာတမ်းတစ်ခုသို့ လင့်ခ်ချိတ်ခြင်းအကြား ရွေးချယ်ပါ။', + chooseDocumentToLink: 'ချိတ်ဆက်ရန် စာရွက်စာတမ်းကို ရွေးပါ။', + chooseFromExisting: 'ရှိပြီးသားထဲကပဲ ရွေးချယ်ပါ။', + chooseLabel: '{{label}} အားရွေးချယ်ပါ။', + collapseAll: 'အားလုံးကို ခေါက်သိမ်းပါ။', + customURL: 'စိတ်ကြိုက် URL', + editLabelData: 'ဒေတာ {{label}} ကို တည်းဖြတ်ပါ။', + editLink: 'လင့်ခ်ကို တည်းဖြတ်ပါ။', + editRelationship: 'ဆက်ဆံရေးကို တည်းဖြတ်ပါ။', + enterURL: 'URL တစ်ခုထည့်ပါ။', + internalLink: 'Internal Link', + itemsAndMore: '{{items}} နှင့် နောက်ထပ် {{count}} ခု', + labelRelationship: '{{label}} Relationship', + latitude: 'vĩ độ', + linkType: 'လင့်အမျိုးအစား', + linkedTo: '<0>{{label}} ချိတ်ဆက်ထားသည်။', + longitude: 'လောင်ဂျီကျု', + newLabel: '{{label}} အသစ်', + openInNewTab: 'တက်ဘ်အသစ်တွင် ဖွင့်ပါ။', + passwordsDoNotMatch: 'စကားဝှက်များနှင့် မကိုက်ညီပါ။', + relatedDocument: 'ဆက်စပ် ဖိုင်', + relationTo: 'ဆက်စပ်မှု', + removeRelationship: 'ဆက်ဆံရေးကို ဖယ်ရှားပါ။', + removeUpload: 'အပ်လုဒ်ကို ဖယ်ရှားပါ။', + saveChanges: 'သိမ်းဆည်းမည်။', + searchForBlock: 'ဘလောက်တစ်ခုရှာမည်။', + selectExistingLabel: 'ရှိပြီးသား {{label}} ကို ရွေးပါ', + selectFieldsToEdit: 'တည်းဖြတ်ရန် အကွက်များကို ရွေးပါ။', + showAll: 'အကုန် ကြည့်မည်။', + swapRelationship: 'လဲလှယ်ဆက်ဆံရေး', + swapUpload: 'အပ်လုဒ်ဖလှယ်ပါ။', + textToDisplay: 'ပြသရန် စာသား', + toggleBlock: 'ဘလောက်ကို ပြောင်းပါ။', + uploadNewLabel: '{{label}} အသစ်တင်မည်။', + }, + general: { + aboutToDelete: + '{{label}} <1>{{title}} ကို ဖျက်ပါတော့မည်။ သေချာပြီလား။ ဖျက်ပြီးရင် ပြန်မရဘူးနော်။', + aboutToDeleteCount_many: 'သင်သည် {{count}} {{label}} ကို ဖျက်ပါတော့မည်။', + aboutToDeleteCount_one: 'သင်သည် {{count}} {{label}} ကို ဖျက်ပါတော့မည်။', + aboutToDeleteCount_other: 'သင်သည် {{count}} {{label}} ကို ဖျက်ပါတော့မည်။', + addBelow: 'အောက်တွင်ထည့်ပါ။', + addFilter: 'ဇကာထည့်ပါ။', + adminTheme: 'အက်ပ်ဒိုင်များစပ်စွာ', + and: 'နှင့်', + applyChanges: 'ပြောင်းလဲမှုများ အသုံးပြုပါ', + ascending: 'တက်နေသည်', + automatic: 'အော်တို', + backToDashboard: 'ပင်မစာမျက်နှာသို့ ပြန်သွားမည်။', + cancel: 'မလုပ်တော့ပါ။', + changesNotSaved: + 'သင်၏ပြောင်းလဲမှုများကို မသိမ်းဆည်းရသေးပါ။ ယခု စာမျက်နှာက ထွက်လိုက်ပါက သင်၏ပြောင်းလဲမှုများ အကုန် ဆုံးရှုံးသွားပါမည်။ အကုန်နော်။', + close: 'ပိတ်', + collapse: 'ခေါက်သိမ်းပါ။', + collections: 'စုစည်းမှူများ', + columnToSort: 'ကော်လံ စီရန်', + columns: 'ကော်လံများ', + confirm: 'သေချာပါပြီ။', + confirmDeletion: 'ဖျက်တော့မယ်နော်။', + confirmDuplication: 'ပုံတူပွားခြင်းကို အတည်ပြုပါ။', + copied: 'ကူးယူပြီးပြီ။', + copy: 'ကူးယူမည်။', + create: 'ဖန်တီးမည်။', + createNew: 'အသစ် ဖန်တီးမည်။', + createNewLabel: '{{label}} အသစ် ဖန်တီးမည်။', + created: 'ဖန်တီးခဲ့သည်။', + createdAt: 'ဖန်တီးခဲ့သည့်အချိန်', + creating: 'ဖန်တီးနေသည်။', + creatingNewLabel: '{{label}} အသစ် ဖန်တီးနေသည်။', + dark: 'အမှောင်', + dashboard: 'ပင်မစာမျက်နှာ', + delete: 'ဖျက်မည်။', + deletedCountSuccessfully: '{{count}} {{label}} ကို အောင်မြင်စွာ ဖျက်လိုက်ပါပြီ။', + deletedSuccessfully: 'အောင်မြင်စွာ ဖျက်လိုက်ပါပြီ။', + deleting: 'ဖျက်နေဆဲ ...', + descending: 'ဆင်းသက်လာသည်။', + deselectAllRows: 'အားလုံးကို မရွေးနိုင်ပါ', + duplicate: 'ပုံတူပွားမည်။', + duplicateWithoutSaving: 'သေချာပါပြီ။', + edit: 'တည်းဖြတ်ပါ။', + editLabel: '{{label}} ပြင်ဆင်မည်။', + editing: 'ပြင်ဆင်နေသည်။', + editingLabel_many: 'တည်းဖြတ်ခြင်း {{count}} {{label}}', + editingLabel_one: 'တည်းဖြတ်ခြင်း {{count}} {{label}}', + editingLabel_other: 'တည်းဖြတ်ခြင်း {{count}} {{label}}', + email: 'အီးမေးလ်', + emailAddress: 'အီးမေးလ် လိပ်စာ', + enterAValue: 'တန်ဖိုးတစ်ခုထည့်ပါ။', + error: 'အမှား', + errors: 'အမှားများ', + fallbackToDefaultLocale: 'မူရင်းဒေသသို့ ပြန်ပြောင်းပါ။', + filter: 'ဇကာ', + filterWhere: 'နေရာတွင် စစ်ထုတ်ပါ။', + filters: 'စစ်ထုတ်မှုများ', + globals: 'Globals', + language: 'ဘာသာစကား', + lastModified: 'နောက်ဆုံးပြင်ဆင်ထားသည်။', + leaveAnyway: 'ဘာဖြစ်ဖြစ် ထွက်မည်။', + leaveWithoutSaving: 'မသိမ်းဘဲ ထွက်မည်။', + light: 'အလင်း', + livePreview: 'အစမ်းကြည့်ရန်', + loading: 'ဖွင့်နေသည်', + locale: 'ဒေသ', + locales: 'Locales', + menu: 'မီနူး', + moveDown: 'Move Down', + moveUp: 'Move Up', + newPassword: 'စကားဝှက် အသစ်', + noFiltersSet: 'စစ်ထုတ်မှုများ မသတ်မှတ်ထားပါ။', + noLabel: '<မရှိ {{label}}>', + noOptions: 'ရွေးချယ်မှုမရှိပါ', + noResults: + '{{label}} မတွေ့ပါ။ {{label}} မရှိသေးသည်ဖြစ်စေ အထက်တွင်ဖော်ပြထားသော စစ်ထုတ်မှုများနှင့် ကိုက်ညီမှုမရှိပါ။', + noValue: 'တန်ဖိုး မရှိပါ။', + none: 'တစ်ခုမှ', + notFound: 'ဘာမှ မရှိတော့ဘူး။', + nothingFound: 'ဘာမှလည်း မတွေ့ဘူး။', + of: '၏', + open: 'ဖွင့်မည်။', + or: 'သို့မဟုတ်', + order: 'အစဉ်လိုက်', + pageNotFound: 'ရောက်ရှိနေသော စာမျက်နှာသည် မရှိပါ။', + password: 'စကားဝှက်', + payloadSettings: 'ရွေးချယ်စရာများ', + perPage: 'စာမျက်နှာ အလိုက်: {{limit}}', + remove: 'ဖယ်ရှားမည်။', + reset: 'Tetapkan semula', + row: 'အတန်း', + rows: 'Rows', + save: 'သိမ်းဆည်းမည်။', + saving: 'သိမ်းနေဆဲ ...', + searchBy: 'ရှာဖွေပါ။', + selectAll: '{{count}} {{label}} အားလုံးကို ရွေးပါ', + selectAllRows: 'အားလုံးကိုရွေးချယ်ပါ', + selectValue: 'တစ်ခုခုကို ရွေးချယ်ပါ။', + selectedCount: '{{count}} {{label}} ကို ရွေးထားသည်။', + showAllLabel: 'Tunjukkan semua {{label}}', + sorryNotFound: 'ဝမ်းနည်းပါသည်။ သင်ရှာနေတဲ့ဟာ ဒီမှာမရှိပါ။', + sort: 'အစဉ်လိုက်', + sortByLabelDirection: 'အစဉ်အလိုက် စီမံခန့်ခွဲထားသည် {{label}} {{direction}}', + stayOnThisPage: 'ဒီမှာပဲ ဆက်နေမည်။', + submissionSuccessful: 'သိမ်းဆည်းမှု အောင်မြင်ပါသည်။', + submit: 'သိမ်းဆည်းမည်။', + successfullyCreated: '{{label}} အောင်မြင်စွာဖန်တီးခဲ့သည်။', + successfullyDuplicated: '{{label}} အောင်မြင်စွာ ပုံတူပွားခဲ့သည်။', + thisLanguage: 'မြန်မာစာ', + titleDeleted: '{{label}} {{title}} အောင်မြင်စွာ ဖျက်သိမ်းခဲ့သည်။', + unauthorized: 'အခွင့်မရှိပါ။', + unsavedChangesDuplicate: + 'သင့်တွင် မသိမ်းဆည်းရသေးသော ပြောင်းလဲမှုများ ရှိနေပါသည်။ ပုံတူပွားမှာ သေချာပြီလား။', + untitled: 'ခေါင်းစဥ်မဲ့', + updatedAt: 'ပြင်ဆင်ခဲ့သည့်အချိန်', + updatedCountSuccessfully: '{{count}} {{label}} ကို အောင်မြင်စွာ အပ်ဒိတ်လုပ်ခဲ့သည်။', + updatedSuccessfully: 'အပ်ဒိတ်လုပ်ပြီးပါပြီ။', + updating: 'ပြင်ဆင်ရန်', + uploading: 'တင်ပေးနေသည်', + user: 'အသုံးပြုသူ', + users: 'အသုံးပြုသူများ', + value: 'တန်ဖိုး', + welcome: 'ကြိုဆိုပါတယ်။', + }, + operators: { + contains: 'ပါဝင်သည်', + equals: 'ညီမျှ', + exists: 'တည်ရှိသည်', + isGreaterThan: 'ထက်ကြီးသည်', + isGreaterThanOrEqualTo: 'ထက်ကြီးသည် သို့မဟုတ် ညီမျှသည်', + isIn: 'ရှိ', + isLessThan: 'ထက်နည်းသည်', + isLessThanOrEqualTo: 'ထက်နည်းသည် သို့မဟုတ် ညီမျှသည်', + isLike: 'တူသည်', + isNotEqualTo: 'ညီမျှသည်', + isNotIn: 'မဝင်ပါ', + near: 'နီး', + }, + upload: { + crop: 'သုန်း', + cropToolDescription: + 'ရွေးထားသည့်ဧရိယာတွင်မွေးလျှက်မှုများကိုဆွဲပြီး, အသစ်တည်ပြီးသို့မဟုတ်အောက်ပါတ', + dragAndDrop: 'ဖိုင်တစ်ဖိုင်ကို ဆွဲချလိုက်ပါ။', + dragAndDropHere: 'သို့မဟုတ် ဖိုင်တစ်ခုကို ဤနေရာတွင် ဆွဲချပါ။', + editImage: 'ပုံပြင်ပြောင်းရန်', + fileName: 'ဖိုင် နာမည်', + fileSize: 'ဖိုင် အရွယ်အစား', + focalPoint: 'အကန့်အသတ်ချုပ်', + focalPointDescription: + 'ပြသနားရထားသည့်ပုံအားထိန်းသိမ်းရန် ဖိုကယ်ပိုင်းကို တိုက်ရိုက်ပွဲ့နိုင်သည် သို', + height: 'Height', + lessInfo: 'အချက်အလက်နည်းတယ်။', + moreInfo: 'အချက်အလက်', + previewSizes: 'Saiz Pratonton', + selectCollectionToBrowse: 'စုစည်းမှု တစ်ခုခုကို ရွေးချယ်ပါ။', + selectFile: 'ဖိုင်ရွေးပါ။', + setCropArea: 'စပြန်းနယ်မြေထားပါ', + setFocalPoint: 'အစေခံဖောက်ရေစနစ်ကိုသတ်မှတ်ပါ', + sizes: 'အရွယ်အစားများ', + sizesFor: '{{label}} အတွက် အရွယ်အစားများ', + width: 'အကျယ်', + }, + validation: { + emailAddress: 'မှန်ကန်သော အီးမေးလ်လိပ်စာကို ထည့်သွင်းပါ။', + enterNumber: 'မှန်ကန်သောနံပါတ်တစ်ခုထည့်ပါ။', + fieldHasNo: 'ဤအကွက်တွင် {{label}} မရှိပါ။', + greaterThanMax: + '{{value}} သည် {{max}} ထက် ပိုမိုကြီးသည်။ ဤသည်ဖြင့် {{label}} အများဆုံးခွင့်ပြုထားသော တန်ဖိုးထက် ကြီးသည်။', + invalidInput: 'ဤအကွက်တွင် မမှန်ကန်သော ထည့်သွင်းမှုတစ်ခုရှိသည်။', + invalidSelection: 'ဤအကွက်တွင် မမှန်ကန်သော ရွေးချယ်မှုတစ်ခုရှိသည်။', + invalidSelections: 'ဤအကွက်တွင် အောက်ပါ မမှန်ကန်သော ရွေးချယ်မှုများ ရှိသည်', + lessThanMin: + '{{value}} သည် {{min}} ထက် ပိုမိုနိမ့်သည်။ ဤသည်ဖြင့် {{label}} အနည်းဆုံးခွင့်ပြုထားသော တန်ဖိုးထက် နိမ့်သည်။', + limitReached: + 'Had yang dibenarkan telah dicapai, hanya {{max}} item sahaja yang boleh ditambah.', + longerThanMin: 'ဤတန်ဖိုးသည် အနိမ့်ဆုံးအရှည် {{minLength}} စာလုံးထက် ပိုရှည်ရမည်။', + notValidDate: '"{{value}}" သည် တရားဝင်ရက်စွဲမဟုတ်ပါ။', + required: 'ဤအကွက်ကို လိုအပ်သည်။', + requiresAtLeast: 'ဤအကွက်သည် အနည်းဆုံး {{count}} {{label}} လိုအပ်သည်', + requiresNoMoreThan: 'ဤအကွက်တွင် {{count}} {{label}} ထက် မပိုရပါ။', + requiresTwoNumbers: 'ဤအကွက်သည် နံပါတ်နှစ်ခု လိုအပ်ပါသည်။', + shorterThanMax: 'ဤတန်ဖိုးသည် စာလုံး {{maxLength}} လုံး၏ အမြင့်ဆုံးအရှည်ထက် ပိုတိုရပါမည်။', + trueOrFalse: 'ဤအကွက်သည် တစ်ခုခုဖြစ်ရပါမည်။', + validUploadID: "'ဤအကွက်သည် မှန်ကန်သော အပ်လုဒ် ID မဟုတ်ပါ။'", + }, + version: { + type: 'အမျိုးအစား', + aboutToPublishSelection: + 'သင်သည် ရွေးချယ်မှုတွင် {{label}} အားလုံးကို ထုတ်ဝေပါတော့မည်။ သေချာလား?', + aboutToRestore: + 'သင်သည် ဤ {{label}} စာရွက်စာတမ်းကို {{versionDate}} တွင် ပါရှိသည့် အခြေအနေသို့ ပြန်ယူတော့မည်။', + aboutToRestoreGlobal: + 'သင်သည် ဂလိုဘယ် {{label}} ကို {{versionDate}} တွင် ပါရှိသည့် အခြေအနေသို့ ပြန်လည်ရောက်ရှိတော့မည်ဖြစ်သည်။', + aboutToRevertToPublished: + 'သင်သည် အပြောင်းအလဲများကို အများဆိုင် အခြေအနေသို့ ပြန်ပြောင်းပါတော့မည်။ သေချာလား?', + aboutToUnpublish: 'အများဆိုင်မှ ပြန်ဖြုတ်တော့မည်။ သေချာလား', + aboutToUnpublishSelection: + 'သင်သည် ရွေးချယ်မှုတွင် {{label}} အားလုံးကို ထုတ်ဝေတော့မည် ဖြစ်သည်။ သေချာလား?', + autosave: 'အလိုအလျောက်သိမ်းဆည်းပါ။', + autosavedSuccessfully: 'အလိုအလျောက် သိမ်းဆည်းပြီးပါပြီ။', + autosavedVersion: 'အော်တို ဗားရှင်း', + changed: 'ပြောင်းခဲ့သည်။', + compareVersion: 'ဗားရှင်းနှင့် နှိုင်းယှဉ်ချက်:', + confirmPublish: 'ထုတ်ဝေအတည်ပြုပါ။', + confirmRevertToSaved: 'သိမ်းဆည်းပြီးကြောင်း အတည်ပြုပါ။', + confirmUnpublish: 'အများဆိုင်ကို ဖျက်ရန် အတည်ပြုပါ။', + confirmVersionRestoration: 'ဗားရှင်းပြန်လည် အသုံးပြုခြင်းကို အတည်ပြုပါ။', + currentDocumentStatus: 'လက်ရှိ {{docStatus}} ဖိုင်', + draft: 'မူကြမ်း', + draftSavedSuccessfully: 'မူကြမ်းကို အောင်မြင်စွာ သိမ်းဆည်းပြီးပါပြီ။', + lastSavedAgo: 'နောက်ဆုံး သိမ်းချက် {{distance}} ကြာပြီး', + noFurtherVersionsFound: 'နောက်ထပ်ဗားရှင်းများ မတွေ့ပါ။', + noRowsFound: '{{label}} အားမတွေ့ပါ။', + preview: 'နမူနာပြရန်', + problemRestoringVersion: 'ဤဗားရှင်းကို ပြန်လည်ရယူရာတွင် ပြဿနာရှိနေသည်။', + publish: 'ထုတ်ဝေသည်။', + publishChanges: 'အပြောင်းအလဲများကို တင်ခဲ့သည်။', + published: 'တင်ပြီးပြီ။', + publishing: 'ထုတ်ဝေခြင်း', + restoreThisVersion: 'ဤဗားရှင်းကိုကို ပြန်ယူမည်။', + restoredSuccessfully: 'အောင်မြင်စွာ ပြန်လည်ရယူခဲ့သည်။', + restoring: 'ပြန်ယူနေဆဲ...', + revertToPublished: 'အများဆိုင်သို့ ပြန်ပြောင်းပါ။', + reverting: 'ပြန်ပြောင်းနေဆဲ...', + saveDraft: 'မှုကြမ်းကို သိမ်းဆည်းမည်။', + selectLocales: 'ပြသရန် ဒေသန္တရများကို ရွေးပါ။', + selectVersionToCompare: 'နှိုင်းယှဉ်ရန် ဗားရှင်းကို ရွေးပါ။', + showLocales: 'ဒေသန္တရများကိုပြပါ။:', + showingVersionsFor: 'အတွက် ဗားရှင်းများကို ပြသနေသည်-', + status: 'အခြေအနေ', + unpublish: 'ပြန်ဖြုတ်မည်။', + unpublishing: 'ပြန်ဖြုတ်နေဆဲ ...', + version: 'ဗားရှင်း', + versionCount_many: '{{count}} ဗားရှင်းများကို တွေ့ပါသည်။', + versionCount_none: 'ဗားရှင်းရှာဖွေ့ပါ။', + versionCount_one: '{{count}} ဗားရှင်အား တွေ့ပါသည်။', + versionCount_other: 'ဗားရှင်း {{count}} ခု တွေ့ရှိပါသည်။', + versionCreatedOn: '{{version}} အား ဖန်တီးခဲ့သည်။', + versionID: 'ဗားရှင်း ID', + versions: 'ဗားရှင်းများ', + viewingVersion: '{{entityLabel}} {{documentTitle}} အတွက် ဗားရှင်းကို ကြည့်ရှုနေသည်', + viewingVersionGlobal: '`ဂလိုဘယ်ဆိုင်ရာ {entityLabel}} အတွက် ဗားရှင်းကို ကြည့်ရှုနေသည်', + viewingVersions: '{{entityLabel}} {{documentTitle}} အတွက် ဗားရှင်းများကို ကြည့်ရှုခြင်း', + viewingVersionsGlobal: '`ဂလိုဘယ်ဆိုင်ရာ {{entityLabel}} အတွက် ဗားရှင်းများကို ကြည့်ရှုနေသည်', + }, }, } diff --git a/packages/translations/src/languages/nb.ts b/packages/translations/src/languages/nb.ts index 25a88bcd21..d7599c7ed5 100644 --- a/packages/translations/src/languages/nb.ts +++ b/packages/translations/src/languages/nb.ts @@ -1,391 +1,396 @@ -export default { - authentication: { - account: 'Konto', - accountOfCurrentUser: 'Konto til nåværende bruker', - alreadyActivated: 'Allerede aktivert', - alreadyLoggedIn: 'Allerede logget inn', - apiKey: 'API-nøkkel', - backToLogin: 'Tilbake til innlogging', - beginCreateFirstUser: 'Opprett din første bruker for å fortsette.', - changePassword: 'Endre passord', - checkYourEmailForPasswordReset: - 'Sjekk e-posten din for en lenke som lar deg tilbakestille passordet ditt.', - confirmGeneration: 'Bekreft generering', - confirmPassword: 'Bekreft passord', - createFirstUser: 'Opprett første bruker', - emailNotValid: 'E-posten er ikke gyldig', - emailSent: 'E-post sendt', - enableAPIKey: 'Aktiver API-nøkkel', - failedToUnlock: 'Kunne ikke låse opp', - forceUnlock: 'Tving opplåsing', - forgotPassword: 'Glemt passord', - forgotPasswordEmailInstructions: - 'Skriv inn e-postadressen din nedenfor, og vi vil sende deg en e-post med instruksjoner om hvordan du tilbakestiller passordet ditt.', - forgotPasswordQuestion: 'Glemt passord?', - generate: 'Generer', - generateNewAPIKey: 'Generer ny API-nøkkel', - generatingNewAPIKeyWillInvalidate: - 'Å generere en ny API-nøkkel vil <1>ugyldiggjøre den forrige nøkkelen. Er du sikker på at du vil fortsette?', - lockUntil: 'Lås til', - logBackIn: 'Logg inn igjen', - logOut: 'Logg ut', - loggedIn: 'For å logge inn med en annen bruker, må du <0>logge ut først.', - loggedInChangePassword: - 'For å endre passordet ditt, gå til <0>kontoen din og endre passordet der.', - loggedOutInactivity: 'Du har blitt logget ut på grunn av inaktivitet.', - loggedOutSuccessfully: 'Du har blitt logget ut.', - login: 'Logg inn', - loginAttempts: 'Innloggingsforsøk', - loginUser: 'Logg inn bruker', - loginWithAnotherUser: 'For å logge inn med en annen bruker, må du <0>logge ut først.', - logout: 'Logg ut', - logoutUser: 'Logg ut bruker', - newAPIKeyGenerated: 'Ny API-nøkkel generert.', - newAccountCreated: - 'En ny konto har blitt opprettet for deg på {{serverURL}} Klikk på lenken nedenfor eller lim inn URLen i nettleseren din for å bekrefte e-postadressen din: {{verificationURL}}
Etter at du har bekreftet e-postadressen din, kan du logge inn.', - newPassword: 'Nytt passord', - resetPassword: 'Tilbakestill passord', - resetPasswordExpiration: 'Tilbakestill passordets utløpsdato', - resetPasswordToken: 'Tilbakestill passordet-token', - resetYourPassword: 'Tilbakestill passordet ditt', - stayLoggedIn: 'Forbli logget inn', - successfullyUnlocked: 'Låst opp', - unableToVerify: 'Kunne ikke bekrefte', - verified: 'Bekreftet', - verifiedSuccessfully: 'Bekreftet', - verify: 'Bekreft', - verifyUser: 'Bekreft bruker', - verifyYourEmail: 'Bekreft e-postadressen din', - youAreInactive: - 'Du har ikke vært aktiv i en stund, og vil snart bli logget ut automatisk for din egen sikkerhet. Vil du forbli innlogget?', - youAreReceivingResetPassword: - 'Du mottar denne e-posten fordi du (eller noen andre) har bedt om tilbakestilling av passordet til kontoen din. Klikk på lenken nedenfor, eller lim den inn i nettleseren din for å fullføre prosessen:', - youDidNotRequestPassword: - 'Hvis du ikke har bedt om dette, kan du ignorere denne e-posten, og passordet ditt vil forbli uendret.', - }, - error: { - accountAlreadyActivated: 'Denne kontoen er allerede aktivert.', - autosaving: 'Det oppstod et problem under automatisk lagring av dokumentet.', - correctInvalidFields: 'Korriger ugyldige felt.', - deletingFile: 'Det oppstod en feil under sletting av filen.', - deletingTitle: - 'Det oppstod en feil under sletting av {{title}}. Sjekk tilkoblingen og prøv igjen.', - emailOrPasswordIncorrect: 'E-postadressen eller passordet er feil.', - followingFieldsInvalid_one: 'Følgende felt er ugyldig:', - followingFieldsInvalid_other: 'Følgende felter er ugyldige:', - incorrectCollection: 'Ugyldig samling', - invalidFileType: 'Ugyldig filtype', - invalidFileTypeValue: 'Ugyldig filtype: {{value}}', - loadingDocument: 'Det oppstod et problem under lasting av dokumentet med ID {{id}}.', - missingEmail: 'Mangler e-postadresse.', - missingIDOfDocument: 'Mangler ID for dokumentet som skal oppdateres.', - missingIDOfVersion: 'Mangler ID for versjonen.', - missingRequiredData: 'Mangler påkrevd data.', - noFilesUploaded: 'Ingen filer ble lastet opp.', - noMatchedField: 'Ingen matchende felt funnet for "{{label}}"', - noUser: 'Ingen bruker', - notAllowedToAccessPage: 'Du har ikke tilgang til denne siden.', - notAllowedToPerformAction: 'Du har ikke tillatelse til å utføre denne handlingen.', - notFound: 'Den forespurte ressursen ble ikke funnet.', - previewing: 'Det oppstod et problem under forhåndsvisning av dokumentet.', - problemUploadingFile: 'Det oppstod et problem under opplasting av filen.', - tokenInvalidOrExpired: 'Token er enten ugyldig eller har utløpt.', - unPublishingDocument: 'Det oppstod et problem under avpublisering av dokumentet.', - unableToDeleteCount: 'Kan ikke slette {{count}} av {{total}} {{label}}.', - unableToUpdateCount: 'Kan ikke oppdatere {{count}} av {{total}} {{label}}.', - unauthorized: 'Uautorisert, du må være innlogget for å gjøre denne forespørselen.', - unknown: 'En ukjent feil har oppstått.', - unspecific: 'En feil har oppstått.', - userLocked: 'Denne brukeren er låst på grunn av for mange mislykkede innloggingsforsøk.', - valueMustBeUnique: 'Verdien må være unik', - verificationTokenInvalid: 'Verifiseringskoden er ugyldig.', - }, - fields: { - addLabel: 'Legg til {{label}}', - addLink: 'Legg til Lenke', - addNew: 'Legg til ny', - addNewLabel: 'Legg til ny {{label}}', - addRelationship: 'Legg til Relasjon', - addUpload: 'Legg til Opplasting', - block: 'blokk', - blockType: 'Blokktype', - blocks: 'blokker', - chooseBetweenCustomTextOrDocument: - 'Velg mellom å skrive inn en egen tekst-URL eller å lenke til et annet dokument.', - chooseDocumentToLink: 'Velg et dokument å lenke til', - chooseFromExisting: 'Velg fra eksisterende', - chooseLabel: 'Velg {{label}}', - collapseAll: 'Skjul alle', - customURL: 'Egendefinert URL', - editLabelData: 'Rediger {{label}}-data', - editLink: 'Rediger lenke', - editRelationship: 'Rediger relasjon', - enterURL: 'Skriv inn en URL', - internalLink: 'Intern lenke', - itemsAndMore: '{{items}} og {{count}} flere', - labelRelationship: '{{label}}-relasjon', - latitude: 'Breddegrad', - linkType: 'Lenketype', - linkedTo: 'Lenket til <0>{{label}}', - longitude: 'Lengdegrad', - newLabel: 'Ny {{label}}', - openInNewTab: 'Åpne i ny fane', - passwordsDoNotMatch: 'Passordene er ikke like.', - relatedDocument: 'Relatert dokument', - relationTo: 'Relasjon til', - removeRelationship: 'Fjern Forhold', - removeUpload: 'Fjern Opplasting', - saveChanges: 'Lagre endringer', - searchForBlock: 'Søk etter en blokk', - selectExistingLabel: 'Velg eksisterende {{label}}', - selectFieldsToEdit: 'Velg felt som skal redigeres', - showAll: 'Vis alle', - swapRelationship: 'Bytte Forhold', - swapUpload: 'Bytt Opplasting', - textToDisplay: 'Tekst som skal vises', - toggleBlock: 'Veksle blokk', - uploadNewLabel: 'Last opp ny {{label}}', - }, - general: { - aboutToDelete: 'Du er i ferd med å slette {{label}} <1>{{title}}. Er du sikker?', - aboutToDeleteCount_many: 'Du er i ferd med å slette {{count}} {{label}}', - aboutToDeleteCount_one: 'Du er i ferd med å slette {{count}} {{label}}', - aboutToDeleteCount_other: 'Du er i ferd med å slette {{count}} {{label}}', - addBelow: 'Legg til under', - addFilter: 'Legg til filter', - adminTheme: 'Admin-tema', - and: 'Og', - applyChanges: 'Bruk endringer', - ascending: 'Stigende', - automatic: 'Automatisk', - backToDashboard: 'Tilbake til kontrollpanel', - cancel: 'Avbryt', - changesNotSaved: - 'Endringene dine er ikke lagret. Hvis du forlater nå, vil du miste endringene dine.', - close: 'Lukk', - collapse: 'Skjul', - collections: 'Samlinger', - columnToSort: 'Kolonne å sortere', - columns: 'Kolonner', - confirm: 'Bekreft', - confirmDeletion: 'Bekreft sletting', - confirmDuplication: 'Bekreft duplisering', - copied: 'Kopiert', - copy: 'Kopiér', - create: 'Opprett', - createNew: 'Opprett ny', - createNewLabel: 'Opprett ny {{label}}', - created: 'Opprettet', - createdAt: 'Opprettet', - creating: 'Oppretter', - creatingNewLabel: 'Oppretter ny {{label}}', - dark: 'Mørk', - dashboard: 'Kontrollpanel', - delete: 'Slett', - deletedCountSuccessfully: 'Slettet {{count}} {{label}}.', - deletedSuccessfully: 'Slettet.', - deleting: 'Sletter...', - descending: 'Synkende', - deselectAllRows: 'Fjern markeringen fra alle rader', - duplicate: 'Dupliser', - duplicateWithoutSaving: 'Dupliser uten å lagre endringer', - edit: 'Redigere', - editLabel: 'Rediger {{label}}', - editing: 'Redigerer', - editingLabel_many: 'Redigerer {{count}} {{label}}', - editingLabel_one: 'Redigerer {{count}} {{label}}', - editingLabel_other: 'Redigerer {{count}} {{label}}', - email: 'E-post', - emailAddress: 'E-postadresse', - enterAValue: 'Skriv inn en verdi', - error: 'Feil', - errors: 'Feil', - fallbackToDefaultLocale: 'Tilbakestilling til standard lokalitet', - filter: 'Filtrer', - filterWhere: 'Filtrer {{label}} der', - filters: 'Filter', - globals: 'Globale variabler', - language: 'Språk', - lastModified: 'Sist endret', - leaveAnyway: 'Forlat likevel', - leaveWithoutSaving: 'Forlat uten å lagre', - light: 'Lys', - livePreview: 'Forhåndsvisning', - loading: 'Laster', - locale: 'Lokalitet', - locales: 'Språk', - menu: 'Meny', - moveDown: 'Flytt ned', - moveUp: 'Flytt opp', - newPassword: 'Nytt passord', - noFiltersSet: 'Ingen filtre satt', - noLabel: '', - noOptions: 'Ingen alternativer', - noResults: - 'Ingen {{label}} funnet. Enten finnes det ingen {{label}} enda eller ingen matcher filterne du har spesifisert ovenfor.', - noValue: 'Ingen verdi', - none: 'Ingen', - notFound: 'Ikke funnet', - nothingFound: 'Ingenting funnet', - of: 'av', - open: 'Åpne', - or: 'Eller', - order: 'Rekkefølge', - pageNotFound: 'Siden ble ikke funnet', - password: 'Passord', - payloadSettings: 'Payload-innstillinger', - perPage: 'Per side: {{limit}}', - remove: 'Fjern', - reset: 'Tilbakestill', - row: 'Rad', - rows: 'Rader', - save: 'Lagre', - saving: 'Lagrer...', - searchBy: 'Søk etter {{label}}', - selectAll: 'Velg alle {{count}} {{label}}', - selectAllRows: 'Velg alle rader', - selectValue: 'Velg en verdi', - selectedCount: '{{count}} {{label}} valgt', - showAllLabel: 'Vis alle {{label}}', - sorryNotFound: 'Beklager, det er ingenting som samsvarer med forespørselen din.', - sort: 'Sortér', - sortByLabelDirection: 'Sorter etter {{label}} {{direction}}', - stayOnThisPage: 'Bli på denne siden', - submissionSuccessful: 'Innsending vellykket.', - submit: 'Send inn', - successfullyCreated: '{{label}} ble opprettet.', - successfullyDuplicated: '{{label}} ble duplisert.', - thisLanguage: 'Norsk', - titleDeleted: '{{label}} "{{title}}" ble slettet.', - unauthorized: 'Ikke autorisert', - unsavedChangesDuplicate: 'Du har ulagrede endringer. Vil du fortsette å duplisere?', - untitled: 'Uten tittel', - updatedAt: 'Oppdatert', - updatedCountSuccessfully: 'Oppdaterte {{count}} {{label}} vellykket.', - updatedSuccessfully: 'Oppdatert.', - updating: 'Oppdatering', - uploading: 'Opplasting', - user: 'Bruker', - users: 'Brukere', - value: 'Verdi', - welcome: 'Velkommen', - }, - operators: { - contains: 'contains', - equals: 'lik', - exists: 'eksisterer', - isGreaterThan: 'er større enn', - isGreaterThanOrEqualTo: 'er større enn eller lik', - isIn: 'er i', - isLessThan: 'er mindre enn', - isLessThanOrEqualTo: 'er mindre enn eller lik', - isLike: 'er som', - isNotEqualTo: 'er ikke lik', - isNotIn: 'er ikke med', - near: 'nær', - }, - upload: { - crop: 'Beskjær', - cropToolDescription: - 'Dra hjørnene av det valgte området, tegn et nytt område eller juster verdiene nedenfor.', - dragAndDrop: 'Dra og slipp en fil', - dragAndDropHere: 'eller dra og slipp en fil her', - editImage: 'Rediger bilde', - fileName: 'Filnavn', - fileSize: 'Filstørrelse', - focalPoint: 'Fokuspunkt', - focalPointDescription: - 'Dra fokuspunktet direkte på forhåndsvisningen eller juster verdiene nedenfor.', - height: 'Høyde', - lessInfo: 'Mindre info', - moreInfo: 'Mer info', - previewSizes: 'Forhåndsvisningsstørrelser', - selectCollectionToBrowse: 'Velg en samling å bla i', - selectFile: 'Velg en fil', - setCropArea: 'Angi beskjæringsområde', - setFocalPoint: 'Angi fokuspunkt', - sizes: 'Størrelser', - sizesFor: 'Størrelser for {{label}}', - width: 'Bredde', - }, - validation: { - emailAddress: 'Vennligst skriv inn en gyldig e-postadresse.', - enterNumber: 'Vennligst skriv inn et gyldig tall.', - fieldHasNo: 'Dette feltet har ingen {{label}}', - greaterThanMax: '{{value}} er større enn den tillatte maksimale {{label}} på {{max}}.', - invalidInput: 'Dette feltet har en ugyldig inndata.', - invalidSelection: 'Dette feltet har en ugyldig utvalg.', - invalidSelections: 'Dette feltet har følgende ugyldige utvalg:', - lessThanMin: '{{value}} er mindre enn den tillatte minimale {{label}} på {{min}}.', - limitReached: 'Begrensning nådd, bare {{max}} elementer kan legges til.', - longerThanMin: 'Denne verdien må være lengre enn minimumslengden på {{minLength}} tegn.', - notValidDate: '"{{value}}" er ikke en gyldig dato.', - required: 'Dette feltet er påkrevd.', - requiresAtLeast: 'Dette feltet krever minst {{count}} {{label}}.', - requiresNoMoreThan: 'Dette feltet krever maksimalt {{count}} {{label}}.', - requiresTwoNumbers: 'Dette feltet krever to tall.', - shorterThanMax: 'Denne verdien må være kortere enn maksimal lengde på {{maxLength}} tegn.', - trueOrFalse: 'Dette feltet kan bare være likt true eller false.', - validUploadID: 'Dette feltet er ikke en gyldig opplastings-ID.', - }, - version: { - aboutToPublishSelection: - 'Du er i ferd med å publisere alle {{label}} i utvalget. Er du sikker?', - aboutToRestore: - 'Du er i ferd med å gjenopprette denne {{label}} dokumentet til tilstanden det var i på {{versionDate}}.', - aboutToRestoreGlobal: - 'Du er i ferd med å gjenopprette den globale variabelen {{label}} til tilstanden det var i på {{versionDate}}.', - aboutToRevertToPublished: - 'Du er i ferd med å tilbakestille endringene i dette dokumentet til den publiserte tilstanden. Er du sikker?', - aboutToUnpublish: 'Du er i ferd med å avpublisere dette dokumentet. Er du sikker?', - aboutToUnpublishSelection: - 'Du er i ferd med å oppheve publiseringen av alle {{label}} i utvalget. Er du sikker?', - autosave: 'Lagre automatisk', - autosavedSuccessfully: 'Lagret automatisk.', - autosavedVersion: 'Automatisk lagret versjon', - changed: 'Endret', - compareVersion: 'Sammenlign versjon mot:', - confirmPublish: 'Bekreft publisering', - confirmRevertToSaved: 'Bekreft tilbakestilling til lagret', - confirmUnpublish: 'Bekreft avpublisering', - confirmVersionRestoration: 'Bekreft versjon-gjenoppretting', - currentDocumentStatus: 'Nåværende {{docStatus}} dokument', - draft: 'Utkast', - draftSavedSuccessfully: 'Utkast lagret.', - lastSavedAgo: 'Sist lagret {{distance}} siden', - noFurtherVersionsFound: 'Ingen flere versjoner funnet', - noRowsFound: 'Ingen {{label}} funnet', - preview: 'Forhåndsvisning', - problemRestoringVersion: 'Det oppstod et problem med gjenoppretting av denne versjonen', - publish: 'Publisere', - publishChanges: 'Publiser endringer', - published: 'Publisert', - publishing: 'Publisering', - restoreThisVersion: 'Gjenopprett denne versjonen', - restoredSuccessfully: 'Gjenopprettet.', - restoring: 'Gjenoppretter...', - revertToPublished: 'Tilbakestill til publisert', - reverting: 'Tilbakestiller...', - saveDraft: 'Lagre utkast', - selectLocales: 'Velg språk å vise', - selectVersionToCompare: 'Velg en versjon å sammenligne', - showLocales: 'Vis språk:', - showingVersionsFor: 'Viser versjoner for:', - status: 'Status', - type: 'Type', - unpublish: 'Avpubliser', - unpublishing: 'Avpubliserer...', - version: 'Versjon', - versionCount_many: '{{count}} versjoner funnet', - versionCount_none: 'Ingen versjoner funnet', - versionCount_one: '{{count}} versjon funnet', - versionCount_other: '{{count}} versjoner funnet', - versionCreatedOn: '{{version}} opprettet:', - versionID: 'Versjons-ID', - versions: 'Versjoner', - viewingVersion: 'Viser versjon for {{entityLabel}} {{documentTitle}}', - viewingVersionGlobal: 'Viser versjon for den globale variabelen {{entityLabel}}', - viewingVersions: 'Viser versjoner for {{entityLabel}} {{documentTitle}}', - viewingVersionsGlobal: 'Viser versjoner for den globale variabelen {{entityLabel}}', +import type { Language } from '../types.js' + +export const nb: Language = { + dateFNSKey: 'nb', + translations: { + authentication: { + account: 'Konto', + accountOfCurrentUser: 'Konto til nåværende bruker', + alreadyActivated: 'Allerede aktivert', + alreadyLoggedIn: 'Allerede logget inn', + apiKey: 'API-nøkkel', + backToLogin: 'Tilbake til innlogging', + beginCreateFirstUser: 'Opprett din første bruker for å fortsette.', + changePassword: 'Endre passord', + checkYourEmailForPasswordReset: + 'Sjekk e-posten din for en lenke som lar deg tilbakestille passordet ditt.', + confirmGeneration: 'Bekreft generering', + confirmPassword: 'Bekreft passord', + createFirstUser: 'Opprett første bruker', + emailNotValid: 'E-posten er ikke gyldig', + emailSent: 'E-post sendt', + enableAPIKey: 'Aktiver API-nøkkel', + failedToUnlock: 'Kunne ikke låse opp', + forceUnlock: 'Tving opplåsing', + forgotPassword: 'Glemt passord', + forgotPasswordEmailInstructions: + 'Skriv inn e-postadressen din nedenfor, og vi vil sende deg en e-post med instruksjoner om hvordan du tilbakestiller passordet ditt.', + forgotPasswordQuestion: 'Glemt passord?', + generate: 'Generer', + generateNewAPIKey: 'Generer ny API-nøkkel', + generatingNewAPIKeyWillInvalidate: + 'Å generere en ny API-nøkkel vil <1>ugyldiggjøre den forrige nøkkelen. Er du sikker på at du vil fortsette?', + lockUntil: 'Lås til', + logBackIn: 'Logg inn igjen', + logOut: 'Logg ut', + loggedIn: 'For å logge inn med en annen bruker, må du <0>logge ut først.', + loggedInChangePassword: + 'For å endre passordet ditt, gå til <0>kontoen din og endre passordet der.', + loggedOutInactivity: 'Du har blitt logget ut på grunn av inaktivitet.', + loggedOutSuccessfully: 'Du har blitt logget ut.', + login: 'Logg inn', + loginAttempts: 'Innloggingsforsøk', + loginUser: 'Logg inn bruker', + loginWithAnotherUser: 'For å logge inn med en annen bruker, må du <0>logge ut først.', + logout: 'Logg ut', + logoutUser: 'Logg ut bruker', + newAPIKeyGenerated: 'Ny API-nøkkel generert.', + newAccountCreated: + 'En ny konto har blitt opprettet for deg på {{serverURL}} Klikk på lenken nedenfor eller lim inn URLen i nettleseren din for å bekrefte e-postadressen din: {{verificationURL}}
Etter at du har bekreftet e-postadressen din, kan du logge inn.', + newPassword: 'Nytt passord', + resetPassword: 'Tilbakestill passord', + resetPasswordExpiration: 'Tilbakestill passordets utløpsdato', + resetPasswordToken: 'Tilbakestill passordet-token', + resetYourPassword: 'Tilbakestill passordet ditt', + stayLoggedIn: 'Forbli logget inn', + successfullyUnlocked: 'Låst opp', + unableToVerify: 'Kunne ikke bekrefte', + verified: 'Bekreftet', + verifiedSuccessfully: 'Bekreftet', + verify: 'Bekreft', + verifyUser: 'Bekreft bruker', + verifyYourEmail: 'Bekreft e-postadressen din', + youAreInactive: + 'Du har ikke vært aktiv i en stund, og vil snart bli logget ut automatisk for din egen sikkerhet. Vil du forbli innlogget?', + youAreReceivingResetPassword: + 'Du mottar denne e-posten fordi du (eller noen andre) har bedt om tilbakestilling av passordet til kontoen din. Klikk på lenken nedenfor, eller lim den inn i nettleseren din for å fullføre prosessen:', + youDidNotRequestPassword: + 'Hvis du ikke har bedt om dette, kan du ignorere denne e-posten, og passordet ditt vil forbli uendret.', + }, + error: { + accountAlreadyActivated: 'Denne kontoen er allerede aktivert.', + autosaving: 'Det oppstod et problem under automatisk lagring av dokumentet.', + correctInvalidFields: 'Korriger ugyldige felt.', + deletingFile: 'Det oppstod en feil under sletting av filen.', + deletingTitle: + 'Det oppstod en feil under sletting av {{title}}. Sjekk tilkoblingen og prøv igjen.', + emailOrPasswordIncorrect: 'E-postadressen eller passordet er feil.', + followingFieldsInvalid_one: 'Følgende felt er ugyldig:', + followingFieldsInvalid_other: 'Følgende felter er ugyldige:', + incorrectCollection: 'Ugyldig samling', + invalidFileType: 'Ugyldig filtype', + invalidFileTypeValue: 'Ugyldig filtype: {{value}}', + loadingDocument: 'Det oppstod et problem under lasting av dokumentet med ID {{id}}.', + missingEmail: 'Mangler e-postadresse.', + missingIDOfDocument: 'Mangler ID for dokumentet som skal oppdateres.', + missingIDOfVersion: 'Mangler ID for versjonen.', + missingRequiredData: 'Mangler påkrevd data.', + noFilesUploaded: 'Ingen filer ble lastet opp.', + noMatchedField: 'Ingen matchende felt funnet for "{{label}}"', + noUser: 'Ingen bruker', + notAllowedToAccessPage: 'Du har ikke tilgang til denne siden.', + notAllowedToPerformAction: 'Du har ikke tillatelse til å utføre denne handlingen.', + notFound: 'Den forespurte ressursen ble ikke funnet.', + previewing: 'Det oppstod et problem under forhåndsvisning av dokumentet.', + problemUploadingFile: 'Det oppstod et problem under opplasting av filen.', + tokenInvalidOrExpired: 'Token er enten ugyldig eller har utløpt.', + unPublishingDocument: 'Det oppstod et problem under avpublisering av dokumentet.', + unableToDeleteCount: 'Kan ikke slette {{count}} av {{total}} {{label}}.', + unableToUpdateCount: 'Kan ikke oppdatere {{count}} av {{total}} {{label}}.', + unauthorized: 'Uautorisert, du må være innlogget for å gjøre denne forespørselen.', + unknown: 'En ukjent feil har oppstått.', + unspecific: 'En feil har oppstått.', + userLocked: 'Denne brukeren er låst på grunn av for mange mislykkede innloggingsforsøk.', + valueMustBeUnique: 'Verdien må være unik', + verificationTokenInvalid: 'Verifiseringskoden er ugyldig.', + }, + fields: { + addLabel: 'Legg til {{label}}', + addLink: 'Legg til Lenke', + addNew: 'Legg til ny', + addNewLabel: 'Legg til ny {{label}}', + addRelationship: 'Legg til Relasjon', + addUpload: 'Legg til Opplasting', + block: 'blokk', + blockType: 'Blokktype', + blocks: 'blokker', + chooseBetweenCustomTextOrDocument: + 'Velg mellom å skrive inn en egen tekst-URL eller å lenke til et annet dokument.', + chooseDocumentToLink: 'Velg et dokument å lenke til', + chooseFromExisting: 'Velg fra eksisterende', + chooseLabel: 'Velg {{label}}', + collapseAll: 'Skjul alle', + customURL: 'Egendefinert URL', + editLabelData: 'Rediger {{label}}-data', + editLink: 'Rediger lenke', + editRelationship: 'Rediger relasjon', + enterURL: 'Skriv inn en URL', + internalLink: 'Intern lenke', + itemsAndMore: '{{items}} og {{count}} flere', + labelRelationship: '{{label}}-relasjon', + latitude: 'Breddegrad', + linkType: 'Lenketype', + linkedTo: 'Lenket til <0>{{label}}', + longitude: 'Lengdegrad', + newLabel: 'Ny {{label}}', + openInNewTab: 'Åpne i ny fane', + passwordsDoNotMatch: 'Passordene er ikke like.', + relatedDocument: 'Relatert dokument', + relationTo: 'Relasjon til', + removeRelationship: 'Fjern Forhold', + removeUpload: 'Fjern Opplasting', + saveChanges: 'Lagre endringer', + searchForBlock: 'Søk etter en blokk', + selectExistingLabel: 'Velg eksisterende {{label}}', + selectFieldsToEdit: 'Velg felt som skal redigeres', + showAll: 'Vis alle', + swapRelationship: 'Bytte Forhold', + swapUpload: 'Bytt Opplasting', + textToDisplay: 'Tekst som skal vises', + toggleBlock: 'Veksle blokk', + uploadNewLabel: 'Last opp ny {{label}}', + }, + general: { + aboutToDelete: 'Du er i ferd med å slette {{label}} <1>{{title}}. Er du sikker?', + aboutToDeleteCount_many: 'Du er i ferd med å slette {{count}} {{label}}', + aboutToDeleteCount_one: 'Du er i ferd med å slette {{count}} {{label}}', + aboutToDeleteCount_other: 'Du er i ferd med å slette {{count}} {{label}}', + addBelow: 'Legg til under', + addFilter: 'Legg til filter', + adminTheme: 'Admin-tema', + and: 'Og', + applyChanges: 'Bruk endringer', + ascending: 'Stigende', + automatic: 'Automatisk', + backToDashboard: 'Tilbake til kontrollpanel', + cancel: 'Avbryt', + changesNotSaved: + 'Endringene dine er ikke lagret. Hvis du forlater nå, vil du miste endringene dine.', + close: 'Lukk', + collapse: 'Skjul', + collections: 'Samlinger', + columnToSort: 'Kolonne å sortere', + columns: 'Kolonner', + confirm: 'Bekreft', + confirmDeletion: 'Bekreft sletting', + confirmDuplication: 'Bekreft duplisering', + copied: 'Kopiert', + copy: 'Kopiér', + create: 'Opprett', + createNew: 'Opprett ny', + createNewLabel: 'Opprett ny {{label}}', + created: 'Opprettet', + createdAt: 'Opprettet', + creating: 'Oppretter', + creatingNewLabel: 'Oppretter ny {{label}}', + dark: 'Mørk', + dashboard: 'Kontrollpanel', + delete: 'Slett', + deletedCountSuccessfully: 'Slettet {{count}} {{label}}.', + deletedSuccessfully: 'Slettet.', + deleting: 'Sletter...', + descending: 'Synkende', + deselectAllRows: 'Fjern markeringen fra alle rader', + duplicate: 'Dupliser', + duplicateWithoutSaving: 'Dupliser uten å lagre endringer', + edit: 'Redigere', + editLabel: 'Rediger {{label}}', + editing: 'Redigerer', + editingLabel_many: 'Redigerer {{count}} {{label}}', + editingLabel_one: 'Redigerer {{count}} {{label}}', + editingLabel_other: 'Redigerer {{count}} {{label}}', + email: 'E-post', + emailAddress: 'E-postadresse', + enterAValue: 'Skriv inn en verdi', + error: 'Feil', + errors: 'Feil', + fallbackToDefaultLocale: 'Tilbakestilling til standard lokalitet', + filter: 'Filtrer', + filterWhere: 'Filtrer {{label}} der', + filters: 'Filter', + globals: 'Globale variabler', + language: 'Språk', + lastModified: 'Sist endret', + leaveAnyway: 'Forlat likevel', + leaveWithoutSaving: 'Forlat uten å lagre', + light: 'Lys', + livePreview: 'Forhåndsvisning', + loading: 'Laster', + locale: 'Lokalitet', + locales: 'Språk', + menu: 'Meny', + moveDown: 'Flytt ned', + moveUp: 'Flytt opp', + newPassword: 'Nytt passord', + noFiltersSet: 'Ingen filtre satt', + noLabel: '', + noOptions: 'Ingen alternativer', + noResults: + 'Ingen {{label}} funnet. Enten finnes det ingen {{label}} enda eller ingen matcher filterne du har spesifisert ovenfor.', + noValue: 'Ingen verdi', + none: 'Ingen', + notFound: 'Ikke funnet', + nothingFound: 'Ingenting funnet', + of: 'av', + open: 'Åpne', + or: 'Eller', + order: 'Rekkefølge', + pageNotFound: 'Siden ble ikke funnet', + password: 'Passord', + payloadSettings: 'Payload-innstillinger', + perPage: 'Per side: {{limit}}', + remove: 'Fjern', + reset: 'Tilbakestill', + row: 'Rad', + rows: 'Rader', + save: 'Lagre', + saving: 'Lagrer...', + searchBy: 'Søk etter {{label}}', + selectAll: 'Velg alle {{count}} {{label}}', + selectAllRows: 'Velg alle rader', + selectValue: 'Velg en verdi', + selectedCount: '{{count}} {{label}} valgt', + showAllLabel: 'Vis alle {{label}}', + sorryNotFound: 'Beklager, det er ingenting som samsvarer med forespørselen din.', + sort: 'Sortér', + sortByLabelDirection: 'Sorter etter {{label}} {{direction}}', + stayOnThisPage: 'Bli på denne siden', + submissionSuccessful: 'Innsending vellykket.', + submit: 'Send inn', + successfullyCreated: '{{label}} ble opprettet.', + successfullyDuplicated: '{{label}} ble duplisert.', + thisLanguage: 'Norsk', + titleDeleted: '{{label}} "{{title}}" ble slettet.', + unauthorized: 'Ikke autorisert', + unsavedChangesDuplicate: 'Du har ulagrede endringer. Vil du fortsette å duplisere?', + untitled: 'Uten tittel', + updatedAt: 'Oppdatert', + updatedCountSuccessfully: 'Oppdaterte {{count}} {{label}} vellykket.', + updatedSuccessfully: 'Oppdatert.', + updating: 'Oppdatering', + uploading: 'Opplasting', + user: 'Bruker', + users: 'Brukere', + value: 'Verdi', + welcome: 'Velkommen', + }, + operators: { + contains: 'contains', + equals: 'lik', + exists: 'eksisterer', + isGreaterThan: 'er større enn', + isGreaterThanOrEqualTo: 'er større enn eller lik', + isIn: 'er i', + isLessThan: 'er mindre enn', + isLessThanOrEqualTo: 'er mindre enn eller lik', + isLike: 'er som', + isNotEqualTo: 'er ikke lik', + isNotIn: 'er ikke med', + near: 'nær', + }, + upload: { + crop: 'Beskjær', + cropToolDescription: + 'Dra hjørnene av det valgte området, tegn et nytt område eller juster verdiene nedenfor.', + dragAndDrop: 'Dra og slipp en fil', + dragAndDropHere: 'eller dra og slipp en fil her', + editImage: 'Rediger bilde', + fileName: 'Filnavn', + fileSize: 'Filstørrelse', + focalPoint: 'Fokuspunkt', + focalPointDescription: + 'Dra fokuspunktet direkte på forhåndsvisningen eller juster verdiene nedenfor.', + height: 'Høyde', + lessInfo: 'Mindre info', + moreInfo: 'Mer info', + previewSizes: 'Forhåndsvisningsstørrelser', + selectCollectionToBrowse: 'Velg en samling å bla i', + selectFile: 'Velg en fil', + setCropArea: 'Angi beskjæringsområde', + setFocalPoint: 'Angi fokuspunkt', + sizes: 'Størrelser', + sizesFor: 'Størrelser for {{label}}', + width: 'Bredde', + }, + validation: { + emailAddress: 'Vennligst skriv inn en gyldig e-postadresse.', + enterNumber: 'Vennligst skriv inn et gyldig tall.', + fieldHasNo: 'Dette feltet har ingen {{label}}', + greaterThanMax: '{{value}} er større enn den tillatte maksimale {{label}} på {{max}}.', + invalidInput: 'Dette feltet har en ugyldig inndata.', + invalidSelection: 'Dette feltet har en ugyldig utvalg.', + invalidSelections: 'Dette feltet har følgende ugyldige utvalg:', + lessThanMin: '{{value}} er mindre enn den tillatte minimale {{label}} på {{min}}.', + limitReached: 'Begrensning nådd, bare {{max}} elementer kan legges til.', + longerThanMin: 'Denne verdien må være lengre enn minimumslengden på {{minLength}} tegn.', + notValidDate: '"{{value}}" er ikke en gyldig dato.', + required: 'Dette feltet er påkrevd.', + requiresAtLeast: 'Dette feltet krever minst {{count}} {{label}}.', + requiresNoMoreThan: 'Dette feltet krever maksimalt {{count}} {{label}}.', + requiresTwoNumbers: 'Dette feltet krever to tall.', + shorterThanMax: 'Denne verdien må være kortere enn maksimal lengde på {{maxLength}} tegn.', + trueOrFalse: 'Dette feltet kan bare være likt true eller false.', + validUploadID: 'Dette feltet er ikke en gyldig opplastings-ID.', + }, + version: { + type: 'Type', + aboutToPublishSelection: + 'Du er i ferd med å publisere alle {{label}} i utvalget. Er du sikker?', + aboutToRestore: + 'Du er i ferd med å gjenopprette denne {{label}} dokumentet til tilstanden det var i på {{versionDate}}.', + aboutToRestoreGlobal: + 'Du er i ferd med å gjenopprette den globale variabelen {{label}} til tilstanden det var i på {{versionDate}}.', + aboutToRevertToPublished: + 'Du er i ferd med å tilbakestille endringene i dette dokumentet til den publiserte tilstanden. Er du sikker?', + aboutToUnpublish: 'Du er i ferd med å avpublisere dette dokumentet. Er du sikker?', + aboutToUnpublishSelection: + 'Du er i ferd med å oppheve publiseringen av alle {{label}} i utvalget. Er du sikker?', + autosave: 'Lagre automatisk', + autosavedSuccessfully: 'Lagret automatisk.', + autosavedVersion: 'Automatisk lagret versjon', + changed: 'Endret', + compareVersion: 'Sammenlign versjon mot:', + confirmPublish: 'Bekreft publisering', + confirmRevertToSaved: 'Bekreft tilbakestilling til lagret', + confirmUnpublish: 'Bekreft avpublisering', + confirmVersionRestoration: 'Bekreft versjon-gjenoppretting', + currentDocumentStatus: 'Nåværende {{docStatus}} dokument', + draft: 'Utkast', + draftSavedSuccessfully: 'Utkast lagret.', + lastSavedAgo: 'Sist lagret {{distance}} siden', + noFurtherVersionsFound: 'Ingen flere versjoner funnet', + noRowsFound: 'Ingen {{label}} funnet', + preview: 'Forhåndsvisning', + problemRestoringVersion: 'Det oppstod et problem med gjenoppretting av denne versjonen', + publish: 'Publisere', + publishChanges: 'Publiser endringer', + published: 'Publisert', + publishing: 'Publisering', + restoreThisVersion: 'Gjenopprett denne versjonen', + restoredSuccessfully: 'Gjenopprettet.', + restoring: 'Gjenoppretter...', + revertToPublished: 'Tilbakestill til publisert', + reverting: 'Tilbakestiller...', + saveDraft: 'Lagre utkast', + selectLocales: 'Velg språk å vise', + selectVersionToCompare: 'Velg en versjon å sammenligne', + showLocales: 'Vis språk:', + showingVersionsFor: 'Viser versjoner for:', + status: 'Status', + unpublish: 'Avpubliser', + unpublishing: 'Avpubliserer...', + version: 'Versjon', + versionCount_many: '{{count}} versjoner funnet', + versionCount_none: 'Ingen versjoner funnet', + versionCount_one: '{{count}} versjon funnet', + versionCount_other: '{{count}} versjoner funnet', + versionCreatedOn: '{{version}} opprettet:', + versionID: 'Versjons-ID', + versions: 'Versjoner', + viewingVersion: 'Viser versjon for {{entityLabel}} {{documentTitle}}', + viewingVersionGlobal: 'Viser versjon for den globale variabelen {{entityLabel}}', + viewingVersions: 'Viser versjoner for {{entityLabel}} {{documentTitle}}', + viewingVersionsGlobal: 'Viser versjoner for den globale variabelen {{entityLabel}}', + }, }, } diff --git a/packages/translations/src/languages/nl.ts b/packages/translations/src/languages/nl.ts index 1fda37d7a9..3df7fe42c1 100644 --- a/packages/translations/src/languages/nl.ts +++ b/packages/translations/src/languages/nl.ts @@ -1,394 +1,400 @@ -export default { - authentication: { - account: 'Account', - accountOfCurrentUser: 'Account van huidige gebruiker', - alreadyActivated: 'Al geactiveerd', - alreadyLoggedIn: 'Al ingelogd', - apiKey: 'API-sleutel', - backToLogin: 'Terug naar inloggen', - beginCreateFirstUser: 'Om te beginnen maakt u uw eerste gebruiker aan.', - changePassword: 'Wachtwoord wijzigen', - checkYourEmailForPasswordReset: - 'Controleer uw e-mail voor een link waarmee u uw wachtwoord veilig opnieuw kunt instellen.', - confirmGeneration: 'Bevestigen', - confirmPassword: 'Wachtwoord bevestigen', - createFirstUser: 'Eerste gebruiker aanmaken', - emailNotValid: 'Het ingevoerde e-mailadres is niet geldig', - emailSent: 'E-mail verzonden', - enableAPIKey: 'Activeer API-sleutel', - failedToUnlock: 'Ontgrendeling mislukt', - forceUnlock: 'Forceer ontgrendeling', - forgotPassword: 'Wachtwoord vergeten', - forgotPasswordEmailInstructions: - 'Vul hieronder uw e-mailadres in. U ontvangt een e-mailbericht met instructies om uw wachtwoord opnieuw in te stellen.', - forgotPasswordQuestion: 'Wachtwoord vergeten?', - generate: 'Genereren', - generateNewAPIKey: 'Genereer nieuwe API-sleutel', - generatingNewAPIKeyWillInvalidate: - 'Het genereren van een nieuwe API-sleutel maakt de vorige sleutel <1>ongeldig. Weet u zeker dat u wilt doorgaan?', - lockUntil: 'Vergrendel tot', - logBackIn: 'Opnieuw inloggen', - logOut: 'Uitloggen', - loggedIn: 'Om in te loggen met een andere gebruiker, moet u zich eerst <0>uitloggen.', - loggedInChangePassword: - 'Om uw wachtwoord te wijzigen, gaat u naar <0>account en wijzigt u daar uw wachtwoord.', - loggedOutInactivity: 'U bent uitgelogd wegens inactiviteit.', - loggedOutSuccessfully: 'U bent succesvol uitgelogd.', - login: 'Inloggen', - loginAttempts: 'Inlogpogingen', - loginUser: 'Gebruiker inloggen', - loginWithAnotherUser: - 'Om in te loggen met een andere gebruiker, moet u zich eerst <0>uitoggen.', - logout: 'Uitloggen', - logoutUser: 'Gebruiker uitloggen', - newAPIKeyGenerated: 'Nieuwe API-sleutel is gegenereerd.', - newAccountCreated: - 'Er is zojuist een nieuw account voor u aangemaakt waarmee u toegang krijgt tot {{serverURL}}. Klik op de volgende link, of plak onderstaande URL in uw browser om uw e-mailadres te verifiëren: {{verificationURL}}
Na de verificatie van uw e-mail kunt u succesvol inloggen.', - newPassword: 'Nieuw wachtwoord', - resetPassword: 'Wachtwoord herstellen', - resetPasswordExpiration: 'Vervaltijd van wachtwoord herstellen', - resetPasswordToken: 'Token van wachtwoordreset', - resetYourPassword: 'Reset uw wachtwoord', - stayLoggedIn: 'Ingelogd blijven', - successfullyUnlocked: 'Succesvol ontgrendeld', - unableToVerify: 'Verificatie niet mogelijk', - verified: 'Geverifieerd', - verifiedSuccessfully: 'Succesvol geverifieerd', - verify: 'Verifiëren', - verifyUser: 'Gebruiker verifiëren', - verifyYourEmail: 'Verifieer uw e-mailadres', - youAreInactive: - 'U bent al een tijdje niet meer actief geweest en wordt binnenkort voor uw eigen veiligheid automatisch uitgelogd. Wilt u ingelogd blijven?', - youAreReceivingResetPassword: - 'U ontvangt dit omdat u (of iemand anders) het wachtwoord voor uw account opnieuw heeft aangevraagd. Klik op de volgende link, of plak deze in uw browser om het proces te voltooien:', - youDidNotRequestPassword: - 'Als u dit niet heeft aangevraagd, negeer dan deze e-mail en uw wachtwoord zal ongewijzigd blijven.', - }, - error: { - accountAlreadyActivated: 'Dit account is al geactiveerd.', - autosaving: 'Er is een probleem opgetreden bij het automatisch bewaren van dit document.', - correctInvalidFields: 'Gelieve de ongeldige velden te corrigeren.', - deletingFile: 'Er is een fout opgetreden bij het verwijderen van dit bestand.', - deletingTitle: - 'Er is een fout opgetreden tijdens het verwijderen van {{title}}. Controleer uw verbinding en probeer het opnieuw.', - emailOrPasswordIncorrect: 'Het opgegeven e-mailadres of wachtwoord is onjuist.', - followingFieldsInvalid_one: 'Het volgende veld is ongeldig:', - followingFieldsInvalid_other: 'De volgende velden zijn ongeldig:', - incorrectCollection: 'Ongeldige collectie', - invalidFileType: 'Ongeldig bestandstype', - invalidFileTypeValue: 'Ongeldig bestandstype: {{value}}', - loadingDocument: 'Er was een probleem met het laden van het document met ID {{id}}.', - missingEmail: 'E-mailadres ontbreekt.', - missingIDOfDocument: 'ID ontbreekt van het aan te passen document.', - missingIDOfVersion: 'ID van versie ontbreekt.', - missingRequiredData: 'Ontbrekende vereiste gegevens.', - noFilesUploaded: 'Er zijn geen bestanden geüpload.', - noMatchedField: 'Geen overeenkomend veld gevonden voor "{{label}}"', - noUser: 'Geen gebruiker', - notAllowedToAccessPage: 'U hebt geen toegang tot deze pagina.', - notAllowedToPerformAction: 'U mag deze actie niet uitvoeren.', - notFound: 'De gevraagde resource werd niet gevonden.', - previewing: 'Er was een probleem met het voorvertonen van dit document.', - problemUploadingFile: 'Er was een probleem bij het uploaden van het bestand.', - tokenInvalidOrExpired: 'Token is ongeldig of verlopen.', - unPublishingDocument: 'Er was een probleem met het depubliceren van dit document.', - unableToDeleteCount: 'Kan {{count}} van {{total}} {{label}} niet verwijderen.', - unableToUpdateCount: 'Kan {{count}} van {{total}} {{label}} niet updaten.', - unauthorized: 'Ongeautoriseerd, u moet ingelogd zijn om dit verzoek te doen.', - unknown: 'Er is een onbekende fout opgetreden.', - unspecific: 'Er is een fout opgetreden.', - userLocked: 'Deze gebruiker is vergrendeld wegens te veel mislukte inlogpogingen.', - valueMustBeUnique: 'De waarde moet uniek zijn', - verificationTokenInvalid: 'Verificatietoken is ongeldig.', - }, - fields: { - addLabel: 'Voeg {{label}} toe', - addLink: 'Voeg een link toe', - addNew: 'Nieuw(e)', - addNewLabel: 'Nieuw(e) {{label}} toevoegen', - addRelationship: 'Nieuwe Relatie', - addUpload: 'Upload Toevoegen', - block: 'blok', - blockType: 'Bloktype', - blocks: 'blokken', - chooseBetweenCustomTextOrDocument: - 'Kies tussen het invoeren van een aangepaste tekst-URL of een koppeling naar een ander document.', - chooseDocumentToLink: 'Kies een document om naar te linken', - chooseFromExisting: 'Kies uit bestaande', - chooseLabel: 'Kies {{label}}', - collapseAll: 'Alles samenvouwen', - customURL: 'Eigen URL', - editLabelData: 'Bewerk gegevens van {{label}}', - editLink: 'Link bewerken', - editRelationship: 'Relatie Relatie', - enterURL: 'Voer een URL in', - internalLink: 'Interne koppeling', - itemsAndMore: '{{items}} en {{count}} meer', - labelRelationship: '{{label}} relatie', - latitude: 'Breedtegraad', - linkType: 'Koppelingstype', - linkedTo: 'Gekoppeld aan aan <0>{{label}}', - longitude: 'Lengtegraad', - newLabel: 'Nieuw(e) {{label}}', - openInNewTab: 'Openen in nieuw tabblad', - passwordsDoNotMatch: 'Wachtwoorden komen niet overeen.', - relatedDocument: 'Gerelateerd document', - relationTo: 'Relatie tot', - removeRelationship: 'Relatie Verwijderen', - removeUpload: 'Verwijder Upload', - saveChanges: 'Bewaar aanpassingen', - searchForBlock: 'Zoeken naar een blok', - selectExistingLabel: 'Selecteer bestaand(e) {{label}}', - selectFieldsToEdit: 'Selecteer velden om te bewerken', - showAll: 'Alles tonen', - swapRelationship: 'Relatie Wisselen', - swapUpload: 'Upload Verwisselen', - textToDisplay: 'Tekst om weer te geven', - toggleBlock: 'Blok togglen', - uploadNewLabel: 'Upload nieuw(e) {{label}}', - }, - general: { - aboutToDelete: - 'U staat op het punt om {{label}} <1>{{title}} te verwijderen. Weet u het zeker?', - aboutToDeleteCount_many: 'Je staat op het punt {{count}} {{label}} te verwijderen', - aboutToDeleteCount_one: 'Je staat op het punt {{count}} {{label}} te verwijderen', - aboutToDeleteCount_other: 'Je staat op het punt {{count}} {{label}} te verwijderen', - addBelow: 'Onderaan toevoegen', - addFilter: 'Filter toevoegen', - adminTheme: 'Adminthema', - and: 'En', - applyChanges: 'Breng wijzigingen aan', - ascending: 'Oplopend', - automatic: 'Automatisch', - backToDashboard: 'Terug naar dashboard', - cancel: 'Annuleren', - changesNotSaved: - 'Uw wijzigingen zijn niet bewaard. Als u weggaat zullen de wijzigingen verloren gaan.', - close: 'Dichtbij', - collapse: 'Samenvouwen', - collections: 'Collecties', - columnToSort: 'Kolom om te sorteren', - columns: 'Kolommen', - confirm: 'Bevestigen', - confirmDeletion: 'Bevestig verwijdering', - confirmDuplication: 'Bevestig duplicatie', - copied: 'Gekopieerd', - copy: 'Kopiëren', - create: 'Aanmaken', - createNew: 'Nieuw aanmaken', - createNewLabel: 'Nieuw(e) {{label}} aanmaken', - created: 'Aangemaakt', - createdAt: 'Aangemaakt op', - creating: 'Aanmaken', - creatingNewLabel: 'Nieuw(e) {{label}} aanmaken', - dark: 'Donker', - dashboard: 'Dashboard', - delete: 'Verwijderen', - deletedCountSuccessfully: '{{count}} {{label}} succesvol verwijderd.', - deletedSuccessfully: 'Succesvol verwijderd.', - deleting: 'Verwijderen...', - descending: 'Aflopend', - deselectAllRows: 'Deselecteer alle rijen', - duplicate: 'Dupliceren', - duplicateWithoutSaving: 'Dupliceren zonder wijzigingen te bewaren', - edit: 'Bewerk', - editLabel: 'Bewerk {{label}}', - editing: 'Bewerken', - editingLabel_many: 'Bewerken {{count}} {{label}}', - editingLabel_one: 'Bewerken {{count}} {{label}}', - editingLabel_other: 'Bewerken {{count}} {{label}}', - email: 'E-mail', - emailAddress: 'E-maildres', - enterAValue: 'Waarde invoeren', - error: 'Fout', - errors: 'Fouten', - fallbackToDefaultLocale: 'Terugval naar standaardtaal', - filter: 'Filter', - filterWhere: 'Filter {{label}} waar', - filters: 'Filters', - globals: 'Globalen', - language: 'Taal', - lastModified: 'Laatst gewijzigd', - leaveAnyway: 'Toch weggaan', - leaveWithoutSaving: 'Verlaten zonder op te slaan', - light: 'Licht', - livePreview: 'Voorbeeld', - loading: 'Laden', - locale: 'Taal', - locales: 'Landinstellingen', - menu: 'Menu', - moveDown: 'Verplaats naar beneden', - moveUp: 'Verplaats naar boven', - newPassword: 'Nieuw wachtwoord', - noFiltersSet: 'Geen filters ingesteld', - noLabel: 'Geen "{{label}}"', - noOptions: 'Geen opties', - noResults: - 'Geen {{label}} gevonden. Of er bestaat nog geen {{label}}, of niets komt overeen met de hierboven gespecifieerde filters.', - noValue: 'Geen waarde', - none: 'Niets', - notFound: 'Niet gevonden', - nothingFound: 'Niets gevonden', - of: 'van', - open: 'Open', - or: 'Of', - order: 'Volgorde', - pageNotFound: 'Pagina niet gevonden', - password: 'Wachtwoord', - payloadSettings: 'Payload Instellingen', - perPage: 'Per pagina: {{limit}}', - remove: 'Verwijderen', - reset: 'Resetten', - row: 'Rij', - rows: 'Rijen', - save: 'Bewaar', - saving: 'Bewaren...', - searchBy: 'Zoeken op {{label}}', - selectAll: 'Alles selecteren {{count}} {{label}}', - selectAllRows: 'Selecteer alle rijen', - selectValue: 'Selecteer een waarde', - selectedCount: '{{count}} {{label}} geselecteerd', - showAllLabel: 'Toon alle {{label}}', - sorryNotFound: 'Sorry, er is niets dat overeen komt met uw verzoek.', - sort: 'Sorteer', - sortByLabelDirection: 'Sorteer op {{label}} {{direction}}', - stayOnThisPage: 'Blijf op deze pagina', - submissionSuccessful: 'Indiening succesvol.', - submit: 'Indienen', - successfullyCreated: '{{label}} succesvol aangemaakt.', - successfullyDuplicated: '{{label}} succesvol gedupliceerd.', - thisLanguage: 'Nederlands', - titleDeleted: '{{label}} "{{title}}" succesvol verwijderd.', - unauthorized: 'Onbevoegd', - unsavedChangesDuplicate: 'U heeft onbewaarde wijzigingen. Wilt u doorgaan met dupliceren?', - untitled: 'Zonder titel', - updatedAt: 'Aangepast op', - updatedCountSuccessfully: '{{count}} {{label}} succesvol bijgewerkt.', - updatedSuccessfully: 'Succesvol aangepast.', - updating: 'Bijwerken', - uploading: 'Uploaden', - user: 'Gebruiker', - users: 'Gebruikers', - value: 'Waarde', - welcome: 'Welkom', - }, - operators: { - contains: 'bevat', - equals: 'is gelijk aan', - exists: 'bestaat', - isGreaterThan: 'is groter dan', - isGreaterThanOrEqualTo: 'is groter dan of gelijk aan', - isIn: 'is binnen', - isLessThan: 'is kleiner dan', - isLessThanOrEqualTo: 'is kleiner dan of gelijk aan', - isLike: 'is als', - isNotEqualTo: 'is niet gelijk aan', - isNotIn: 'zit er niet in', - near: 'nabij', - }, - upload: { - crop: 'Bijsnijden', - cropToolDescription: - 'Sleep de hoeken van het geselecteerde gebied, teken een nieuw gebied of pas de waarden hieronder aan.', - dragAndDrop: 'Sleep een bestand', - dragAndDropHere: 'of sleep een bestand naar hier', - editImage: 'Afbeelding bewerken', - fileName: 'Bestandsnaam', - fileSize: 'Bestandsgrootte', - focalPoint: 'Focuspunt', - focalPointDescription: - 'Sleep het focuspunt rechtstreeks op de voorvertoning of pas de waarden hieronder aan.', - height: 'Hoogte', - lessInfo: 'Minder info', - moreInfo: 'Meer info', - previewSizes: 'Voorbeeldgroottes', - selectCollectionToBrowse: 'Selecteer een collectie om door te bladeren', - selectFile: 'Selecteer een bestand', - setCropArea: 'Stel bijsnijdgebied in', - setFocalPoint: 'Stel het brandpunt in', - sizes: 'Groottes', - sizesFor: 'Maten voor {{label}}', - width: 'Breedte', - }, - validation: { - emailAddress: 'Voer een geldig e-mailadres in.', - enterNumber: 'Voer een geldig nummer in.', - fieldHasNo: 'Dit veld heeft geen {{label}}', - greaterThanMax: '{{value}} is groter dan de maximaal toegestane {{label}} van {{max}}.', - invalidInput: 'Dit veld heeft een ongeldige invoer.', - invalidSelection: 'Dit veld heeft een ongeldige selectie.', - invalidSelections: 'Dit veld heeft de volgende ongeldige selecties:', - lessThanMin: '{{value}} is kleiner dan de minimaal toegestane {{label}} van {{min}}.', - limitReached: 'Limiet bereikt, er kunnen slechts {{max}} items worden toegevoegd.', - longerThanMin: 'Deze waarde moet langer zijn dan de minimale lengte van {{minLength}} tekens.', - notValidDate: '"{{value}}" is geen geldige datum.', - required: 'Dit veld is verplicht.', - requiresAtLeast: 'Dit veld vereist minstens {{count}} {{label}}.', - requiresNoMoreThan: 'Dit veld vereist niet meer dan {{count}} {{label}}.', - requiresTwoNumbers: 'Dit veld vereist twee nummers.', - shorterThanMax: 'Dit veld moet korter zijn dan de maximale lengte van {{maxLength}} tekens.', - trueOrFalse: 'Dit veld kan alleen waar of onwaar zijn.', - validUploadID: 'Dit veld is geen geldige upload-ID.', - }, - version: { - aboutToPublishSelection: - 'Je staat op het punt om alle {{label}} in de selectie te publiceren. Weet je het zeker?', - aboutToRestore: - 'U staat op het punt dit {{label}} document te herstellen in de staat waarin het zich bevond op {{versionDate}}.', - aboutToRestoreGlobal: - 'U staat op het punt om de global {{label}} te herstellen in de staat waarin het zich bevond op {{versionDate}}.', - aboutToRevertToPublished: - 'U staat op het punt om de wijzigingen van dit document terug te draaien naar de gepubliceerde staat. Weet u het zeker?', - aboutToUnpublish: - 'U staat op het punt om de publicatie van dit document ongedaan te maken. Weet u het zeker?', - aboutToUnpublishSelection: - 'You are about to unpublish all {{label}} in the selection. Are you sure?', - autosave: 'Automatisch bewaren', - autosavedSuccessfully: 'Succesvol automatisch bewaard.', - autosavedVersion: 'Automatisch bewaarde versie', - changed: 'Gewijzigd', - compareVersion: 'Vergelijk versie met:', - confirmPublish: 'Bevestig publiceren', - confirmRevertToSaved: 'Bevestig terugdraaien naar bewaarde versie', - confirmUnpublish: 'Bevestig depubliceren', - confirmVersionRestoration: 'Bevestig te herstellen versie', - currentDocumentStatus: 'Huidig {{docStatus}} document', - draft: 'Concept', - draftSavedSuccessfully: 'Concept succesvol bewaard.', - lastSavedAgo: 'Laatst opgeslagen {{distance}} geleden', - noFurtherVersionsFound: 'Geen verdere versies gevonden', - noRowsFound: 'Geen {{label}} gevonden', - preview: 'Voorbeeld', - problemRestoringVersion: 'Er was een probleem bij het herstellen van deze versie', - publish: 'Publiceren', - publishChanges: 'Publiceer wijzigingen', - published: 'Gepubliceerd', - publishing: 'Publicatie', - restoreThisVersion: 'Herstel deze versie', - restoredSuccessfully: 'Herstelling succesvol.', - restoring: 'Herstellen...', - revertToPublished: 'Terugdraaien naar gepubliceerde versie', - reverting: 'Terugdraaien...', - saveDraft: 'Bewaar concept', - selectLocales: 'Selecteer locales om weer te geven', - selectVersionToCompare: 'Selecteer een versie om te vergelijken', - showLocales: 'Toon locales:', - showingVersionsFor: 'Versies tonen voor:', - status: 'Status', - type: 'Type', - unpublish: 'Publicatie ongedaan maken', - unpublishing: 'Publicatie ongedaan maken...', - version: 'Versie', - versionCount_many: '{{count}} versies gevonden', - versionCount_none: 'Geen versies gevonden', - versionCount_one: '{{count}} versie gevonden', - versionCount_other: '{{count}} versies gevonden', - versionCreatedOn: '{{version}} aangemaakt op:', - versionID: 'Versie-ID', - versions: 'Versies', - viewingVersion: 'Bekijk versie voor {{entityLabel}} {{documentTitle}}', - viewingVersionGlobal: 'Bekijk versie voor global {{entityLabel}}', - viewingVersions: 'Bekijk versies voor {{entityLabel}} {{documentTitle}}', - viewingVersionsGlobal: '`Bekijk versies voor global {{entityLabel}}', +import type { Language } from '../types.js' + +export const nl: Language = { + dateFNSKey: 'nl', + translations: { + authentication: { + account: 'Account', + accountOfCurrentUser: 'Account van huidige gebruiker', + alreadyActivated: 'Al geactiveerd', + alreadyLoggedIn: 'Al ingelogd', + apiKey: 'API-sleutel', + backToLogin: 'Terug naar inloggen', + beginCreateFirstUser: 'Om te beginnen maakt u uw eerste gebruiker aan.', + changePassword: 'Wachtwoord wijzigen', + checkYourEmailForPasswordReset: + 'Controleer uw e-mail voor een link waarmee u uw wachtwoord veilig opnieuw kunt instellen.', + confirmGeneration: 'Bevestigen', + confirmPassword: 'Wachtwoord bevestigen', + createFirstUser: 'Eerste gebruiker aanmaken', + emailNotValid: 'Het ingevoerde e-mailadres is niet geldig', + emailSent: 'E-mail verzonden', + enableAPIKey: 'Activeer API-sleutel', + failedToUnlock: 'Ontgrendeling mislukt', + forceUnlock: 'Forceer ontgrendeling', + forgotPassword: 'Wachtwoord vergeten', + forgotPasswordEmailInstructions: + 'Vul hieronder uw e-mailadres in. U ontvangt een e-mailbericht met instructies om uw wachtwoord opnieuw in te stellen.', + forgotPasswordQuestion: 'Wachtwoord vergeten?', + generate: 'Genereren', + generateNewAPIKey: 'Genereer nieuwe API-sleutel', + generatingNewAPIKeyWillInvalidate: + 'Het genereren van een nieuwe API-sleutel maakt de vorige sleutel <1>ongeldig. Weet u zeker dat u wilt doorgaan?', + lockUntil: 'Vergrendel tot', + logBackIn: 'Opnieuw inloggen', + logOut: 'Uitloggen', + loggedIn: 'Om in te loggen met een andere gebruiker, moet u zich eerst <0>uitloggen.', + loggedInChangePassword: + 'Om uw wachtwoord te wijzigen, gaat u naar <0>account en wijzigt u daar uw wachtwoord.', + loggedOutInactivity: 'U bent uitgelogd wegens inactiviteit.', + loggedOutSuccessfully: 'U bent succesvol uitgelogd.', + login: 'Inloggen', + loginAttempts: 'Inlogpogingen', + loginUser: 'Gebruiker inloggen', + loginWithAnotherUser: + 'Om in te loggen met een andere gebruiker, moet u zich eerst <0>uitoggen.', + logout: 'Uitloggen', + logoutUser: 'Gebruiker uitloggen', + newAPIKeyGenerated: 'Nieuwe API-sleutel is gegenereerd.', + newAccountCreated: + 'Er is zojuist een nieuw account voor u aangemaakt waarmee u toegang krijgt tot {{serverURL}}. Klik op de volgende link, of plak onderstaande URL in uw browser om uw e-mailadres te verifiëren: {{verificationURL}}
Na de verificatie van uw e-mail kunt u succesvol inloggen.', + newPassword: 'Nieuw wachtwoord', + resetPassword: 'Wachtwoord herstellen', + resetPasswordExpiration: 'Vervaltijd van wachtwoord herstellen', + resetPasswordToken: 'Token van wachtwoordreset', + resetYourPassword: 'Reset uw wachtwoord', + stayLoggedIn: 'Ingelogd blijven', + successfullyUnlocked: 'Succesvol ontgrendeld', + unableToVerify: 'Verificatie niet mogelijk', + verified: 'Geverifieerd', + verifiedSuccessfully: 'Succesvol geverifieerd', + verify: 'Verifiëren', + verifyUser: 'Gebruiker verifiëren', + verifyYourEmail: 'Verifieer uw e-mailadres', + youAreInactive: + 'U bent al een tijdje niet meer actief geweest en wordt binnenkort voor uw eigen veiligheid automatisch uitgelogd. Wilt u ingelogd blijven?', + youAreReceivingResetPassword: + 'U ontvangt dit omdat u (of iemand anders) het wachtwoord voor uw account opnieuw heeft aangevraagd. Klik op de volgende link, of plak deze in uw browser om het proces te voltooien:', + youDidNotRequestPassword: + 'Als u dit niet heeft aangevraagd, negeer dan deze e-mail en uw wachtwoord zal ongewijzigd blijven.', + }, + error: { + accountAlreadyActivated: 'Dit account is al geactiveerd.', + autosaving: 'Er is een probleem opgetreden bij het automatisch bewaren van dit document.', + correctInvalidFields: 'Gelieve de ongeldige velden te corrigeren.', + deletingFile: 'Er is een fout opgetreden bij het verwijderen van dit bestand.', + deletingTitle: + 'Er is een fout opgetreden tijdens het verwijderen van {{title}}. Controleer uw verbinding en probeer het opnieuw.', + emailOrPasswordIncorrect: 'Het opgegeven e-mailadres of wachtwoord is onjuist.', + followingFieldsInvalid_one: 'Het volgende veld is ongeldig:', + followingFieldsInvalid_other: 'De volgende velden zijn ongeldig:', + incorrectCollection: 'Ongeldige collectie', + invalidFileType: 'Ongeldig bestandstype', + invalidFileTypeValue: 'Ongeldig bestandstype: {{value}}', + loadingDocument: 'Er was een probleem met het laden van het document met ID {{id}}.', + missingEmail: 'E-mailadres ontbreekt.', + missingIDOfDocument: 'ID ontbreekt van het aan te passen document.', + missingIDOfVersion: 'ID van versie ontbreekt.', + missingRequiredData: 'Ontbrekende vereiste gegevens.', + noFilesUploaded: 'Er zijn geen bestanden geüpload.', + noMatchedField: 'Geen overeenkomend veld gevonden voor "{{label}}"', + noUser: 'Geen gebruiker', + notAllowedToAccessPage: 'U hebt geen toegang tot deze pagina.', + notAllowedToPerformAction: 'U mag deze actie niet uitvoeren.', + notFound: 'De gevraagde resource werd niet gevonden.', + previewing: 'Er was een probleem met het voorvertonen van dit document.', + problemUploadingFile: 'Er was een probleem bij het uploaden van het bestand.', + tokenInvalidOrExpired: 'Token is ongeldig of verlopen.', + unPublishingDocument: 'Er was een probleem met het depubliceren van dit document.', + unableToDeleteCount: 'Kan {{count}} van {{total}} {{label}} niet verwijderen.', + unableToUpdateCount: 'Kan {{count}} van {{total}} {{label}} niet updaten.', + unauthorized: 'Ongeautoriseerd, u moet ingelogd zijn om dit verzoek te doen.', + unknown: 'Er is een onbekende fout opgetreden.', + unspecific: 'Er is een fout opgetreden.', + userLocked: 'Deze gebruiker is vergrendeld wegens te veel mislukte inlogpogingen.', + valueMustBeUnique: 'De waarde moet uniek zijn', + verificationTokenInvalid: 'Verificatietoken is ongeldig.', + }, + fields: { + addLabel: 'Voeg {{label}} toe', + addLink: 'Voeg een link toe', + addNew: 'Nieuw(e)', + addNewLabel: 'Nieuw(e) {{label}} toevoegen', + addRelationship: 'Nieuwe Relatie', + addUpload: 'Upload Toevoegen', + block: 'blok', + blockType: 'Bloktype', + blocks: 'blokken', + chooseBetweenCustomTextOrDocument: + 'Kies tussen het invoeren van een aangepaste tekst-URL of een koppeling naar een ander document.', + chooseDocumentToLink: 'Kies een document om naar te linken', + chooseFromExisting: 'Kies uit bestaande', + chooseLabel: 'Kies {{label}}', + collapseAll: 'Alles samenvouwen', + customURL: 'Eigen URL', + editLabelData: 'Bewerk gegevens van {{label}}', + editLink: 'Link bewerken', + editRelationship: 'Relatie Relatie', + enterURL: 'Voer een URL in', + internalLink: 'Interne koppeling', + itemsAndMore: '{{items}} en {{count}} meer', + labelRelationship: '{{label}} relatie', + latitude: 'Breedtegraad', + linkType: 'Koppelingstype', + linkedTo: 'Gekoppeld aan aan <0>{{label}}', + longitude: 'Lengtegraad', + newLabel: 'Nieuw(e) {{label}}', + openInNewTab: 'Openen in nieuw tabblad', + passwordsDoNotMatch: 'Wachtwoorden komen niet overeen.', + relatedDocument: 'Gerelateerd document', + relationTo: 'Relatie tot', + removeRelationship: 'Relatie Verwijderen', + removeUpload: 'Verwijder Upload', + saveChanges: 'Bewaar aanpassingen', + searchForBlock: 'Zoeken naar een blok', + selectExistingLabel: 'Selecteer bestaand(e) {{label}}', + selectFieldsToEdit: 'Selecteer velden om te bewerken', + showAll: 'Alles tonen', + swapRelationship: 'Relatie Wisselen', + swapUpload: 'Upload Verwisselen', + textToDisplay: 'Tekst om weer te geven', + toggleBlock: 'Blok togglen', + uploadNewLabel: 'Upload nieuw(e) {{label}}', + }, + general: { + aboutToDelete: + 'U staat op het punt om {{label}} <1>{{title}} te verwijderen. Weet u het zeker?', + aboutToDeleteCount_many: 'Je staat op het punt {{count}} {{label}} te verwijderen', + aboutToDeleteCount_one: 'Je staat op het punt {{count}} {{label}} te verwijderen', + aboutToDeleteCount_other: 'Je staat op het punt {{count}} {{label}} te verwijderen', + addBelow: 'Onderaan toevoegen', + addFilter: 'Filter toevoegen', + adminTheme: 'Adminthema', + and: 'En', + applyChanges: 'Breng wijzigingen aan', + ascending: 'Oplopend', + automatic: 'Automatisch', + backToDashboard: 'Terug naar dashboard', + cancel: 'Annuleren', + changesNotSaved: + 'Uw wijzigingen zijn niet bewaard. Als u weggaat zullen de wijzigingen verloren gaan.', + close: 'Dichtbij', + collapse: 'Samenvouwen', + collections: 'Collecties', + columnToSort: 'Kolom om te sorteren', + columns: 'Kolommen', + confirm: 'Bevestigen', + confirmDeletion: 'Bevestig verwijdering', + confirmDuplication: 'Bevestig duplicatie', + copied: 'Gekopieerd', + copy: 'Kopiëren', + create: 'Aanmaken', + createNew: 'Nieuw aanmaken', + createNewLabel: 'Nieuw(e) {{label}} aanmaken', + created: 'Aangemaakt', + createdAt: 'Aangemaakt op', + creating: 'Aanmaken', + creatingNewLabel: 'Nieuw(e) {{label}} aanmaken', + dark: 'Donker', + dashboard: 'Dashboard', + delete: 'Verwijderen', + deletedCountSuccessfully: '{{count}} {{label}} succesvol verwijderd.', + deletedSuccessfully: 'Succesvol verwijderd.', + deleting: 'Verwijderen...', + descending: 'Aflopend', + deselectAllRows: 'Deselecteer alle rijen', + duplicate: 'Dupliceren', + duplicateWithoutSaving: 'Dupliceren zonder wijzigingen te bewaren', + edit: 'Bewerk', + editLabel: 'Bewerk {{label}}', + editing: 'Bewerken', + editingLabel_many: 'Bewerken {{count}} {{label}}', + editingLabel_one: 'Bewerken {{count}} {{label}}', + editingLabel_other: 'Bewerken {{count}} {{label}}', + email: 'E-mail', + emailAddress: 'E-maildres', + enterAValue: 'Waarde invoeren', + error: 'Fout', + errors: 'Fouten', + fallbackToDefaultLocale: 'Terugval naar standaardtaal', + filter: 'Filter', + filterWhere: 'Filter {{label}} waar', + filters: 'Filters', + globals: 'Globalen', + language: 'Taal', + lastModified: 'Laatst gewijzigd', + leaveAnyway: 'Toch weggaan', + leaveWithoutSaving: 'Verlaten zonder op te slaan', + light: 'Licht', + livePreview: 'Voorbeeld', + loading: 'Laden', + locale: 'Taal', + locales: 'Landinstellingen', + menu: 'Menu', + moveDown: 'Verplaats naar beneden', + moveUp: 'Verplaats naar boven', + newPassword: 'Nieuw wachtwoord', + noFiltersSet: 'Geen filters ingesteld', + noLabel: 'Geen "{{label}}"', + noOptions: 'Geen opties', + noResults: + 'Geen {{label}} gevonden. Of er bestaat nog geen {{label}}, of niets komt overeen met de hierboven gespecifieerde filters.', + noValue: 'Geen waarde', + none: 'Niets', + notFound: 'Niet gevonden', + nothingFound: 'Niets gevonden', + of: 'van', + open: 'Open', + or: 'Of', + order: 'Volgorde', + pageNotFound: 'Pagina niet gevonden', + password: 'Wachtwoord', + payloadSettings: 'Payload Instellingen', + perPage: 'Per pagina: {{limit}}', + remove: 'Verwijderen', + reset: 'Resetten', + row: 'Rij', + rows: 'Rijen', + save: 'Bewaar', + saving: 'Bewaren...', + searchBy: 'Zoeken op {{label}}', + selectAll: 'Alles selecteren {{count}} {{label}}', + selectAllRows: 'Selecteer alle rijen', + selectValue: 'Selecteer een waarde', + selectedCount: '{{count}} {{label}} geselecteerd', + showAllLabel: 'Toon alle {{label}}', + sorryNotFound: 'Sorry, er is niets dat overeen komt met uw verzoek.', + sort: 'Sorteer', + sortByLabelDirection: 'Sorteer op {{label}} {{direction}}', + stayOnThisPage: 'Blijf op deze pagina', + submissionSuccessful: 'Indiening succesvol.', + submit: 'Indienen', + successfullyCreated: '{{label}} succesvol aangemaakt.', + successfullyDuplicated: '{{label}} succesvol gedupliceerd.', + thisLanguage: 'Nederlands', + titleDeleted: '{{label}} "{{title}}" succesvol verwijderd.', + unauthorized: 'Onbevoegd', + unsavedChangesDuplicate: 'U heeft onbewaarde wijzigingen. Wilt u doorgaan met dupliceren?', + untitled: 'Zonder titel', + updatedAt: 'Aangepast op', + updatedCountSuccessfully: '{{count}} {{label}} succesvol bijgewerkt.', + updatedSuccessfully: 'Succesvol aangepast.', + updating: 'Bijwerken', + uploading: 'Uploaden', + user: 'Gebruiker', + users: 'Gebruikers', + value: 'Waarde', + welcome: 'Welkom', + }, + operators: { + contains: 'bevat', + equals: 'is gelijk aan', + exists: 'bestaat', + isGreaterThan: 'is groter dan', + isGreaterThanOrEqualTo: 'is groter dan of gelijk aan', + isIn: 'is binnen', + isLessThan: 'is kleiner dan', + isLessThanOrEqualTo: 'is kleiner dan of gelijk aan', + isLike: 'is als', + isNotEqualTo: 'is niet gelijk aan', + isNotIn: 'zit er niet in', + near: 'nabij', + }, + upload: { + crop: 'Bijsnijden', + cropToolDescription: + 'Sleep de hoeken van het geselecteerde gebied, teken een nieuw gebied of pas de waarden hieronder aan.', + dragAndDrop: 'Sleep een bestand', + dragAndDropHere: 'of sleep een bestand naar hier', + editImage: 'Afbeelding bewerken', + fileName: 'Bestandsnaam', + fileSize: 'Bestandsgrootte', + focalPoint: 'Focuspunt', + focalPointDescription: + 'Sleep het focuspunt rechtstreeks op de voorvertoning of pas de waarden hieronder aan.', + height: 'Hoogte', + lessInfo: 'Minder info', + moreInfo: 'Meer info', + previewSizes: 'Voorbeeldgroottes', + selectCollectionToBrowse: 'Selecteer een collectie om door te bladeren', + selectFile: 'Selecteer een bestand', + setCropArea: 'Stel bijsnijdgebied in', + setFocalPoint: 'Stel het brandpunt in', + sizes: 'Groottes', + sizesFor: 'Maten voor {{label}}', + width: 'Breedte', + }, + validation: { + emailAddress: 'Voer een geldig e-mailadres in.', + enterNumber: 'Voer een geldig nummer in.', + fieldHasNo: 'Dit veld heeft geen {{label}}', + greaterThanMax: '{{value}} is groter dan de maximaal toegestane {{label}} van {{max}}.', + invalidInput: 'Dit veld heeft een ongeldige invoer.', + invalidSelection: 'Dit veld heeft een ongeldige selectie.', + invalidSelections: 'Dit veld heeft de volgende ongeldige selecties:', + lessThanMin: '{{value}} is kleiner dan de minimaal toegestane {{label}} van {{min}}.', + limitReached: 'Limiet bereikt, er kunnen slechts {{max}} items worden toegevoegd.', + longerThanMin: + 'Deze waarde moet langer zijn dan de minimale lengte van {{minLength}} tekens.', + notValidDate: '"{{value}}" is geen geldige datum.', + required: 'Dit veld is verplicht.', + requiresAtLeast: 'Dit veld vereist minstens {{count}} {{label}}.', + requiresNoMoreThan: 'Dit veld vereist niet meer dan {{count}} {{label}}.', + requiresTwoNumbers: 'Dit veld vereist twee nummers.', + shorterThanMax: 'Dit veld moet korter zijn dan de maximale lengte van {{maxLength}} tekens.', + trueOrFalse: 'Dit veld kan alleen waar of onwaar zijn.', + validUploadID: 'Dit veld is geen geldige upload-ID.', + }, + version: { + type: 'Type', + aboutToPublishSelection: + 'Je staat op het punt om alle {{label}} in de selectie te publiceren. Weet je het zeker?', + aboutToRestore: + 'U staat op het punt dit {{label}} document te herstellen in de staat waarin het zich bevond op {{versionDate}}.', + aboutToRestoreGlobal: + 'U staat op het punt om de global {{label}} te herstellen in de staat waarin het zich bevond op {{versionDate}}.', + aboutToRevertToPublished: + 'U staat op het punt om de wijzigingen van dit document terug te draaien naar de gepubliceerde staat. Weet u het zeker?', + aboutToUnpublish: + 'U staat op het punt om de publicatie van dit document ongedaan te maken. Weet u het zeker?', + aboutToUnpublishSelection: + 'You are about to unpublish all {{label}} in the selection. Are you sure?', + autosave: 'Automatisch bewaren', + autosavedSuccessfully: 'Succesvol automatisch bewaard.', + autosavedVersion: 'Automatisch bewaarde versie', + changed: 'Gewijzigd', + compareVersion: 'Vergelijk versie met:', + confirmPublish: 'Bevestig publiceren', + confirmRevertToSaved: 'Bevestig terugdraaien naar bewaarde versie', + confirmUnpublish: 'Bevestig depubliceren', + confirmVersionRestoration: 'Bevestig te herstellen versie', + currentDocumentStatus: 'Huidig {{docStatus}} document', + draft: 'Concept', + draftSavedSuccessfully: 'Concept succesvol bewaard.', + lastSavedAgo: 'Laatst opgeslagen {{distance}} geleden', + noFurtherVersionsFound: 'Geen verdere versies gevonden', + noRowsFound: 'Geen {{label}} gevonden', + preview: 'Voorbeeld', + problemRestoringVersion: 'Er was een probleem bij het herstellen van deze versie', + publish: 'Publiceren', + publishChanges: 'Publiceer wijzigingen', + published: 'Gepubliceerd', + publishing: 'Publicatie', + restoreThisVersion: 'Herstel deze versie', + restoredSuccessfully: 'Herstelling succesvol.', + restoring: 'Herstellen...', + revertToPublished: 'Terugdraaien naar gepubliceerde versie', + reverting: 'Terugdraaien...', + saveDraft: 'Bewaar concept', + selectLocales: 'Selecteer locales om weer te geven', + selectVersionToCompare: 'Selecteer een versie om te vergelijken', + showLocales: 'Toon locales:', + showingVersionsFor: 'Versies tonen voor:', + status: 'Status', + unpublish: 'Publicatie ongedaan maken', + unpublishing: 'Publicatie ongedaan maken...', + version: 'Versie', + versionCount_many: '{{count}} versies gevonden', + versionCount_none: 'Geen versies gevonden', + versionCount_one: '{{count}} versie gevonden', + versionCount_other: '{{count}} versies gevonden', + versionCreatedOn: '{{version}} aangemaakt op:', + versionID: 'Versie-ID', + versions: 'Versies', + viewingVersion: 'Bekijk versie voor {{entityLabel}} {{documentTitle}}', + viewingVersionGlobal: 'Bekijk versie voor global {{entityLabel}}', + viewingVersions: 'Bekijk versies voor {{entityLabel}} {{documentTitle}}', + viewingVersionsGlobal: '`Bekijk versies voor global {{entityLabel}}', + }, }, } diff --git a/packages/translations/src/languages/pl.ts b/packages/translations/src/languages/pl.ts index 8dd2ef1fd0..31339337ab 100644 --- a/packages/translations/src/languages/pl.ts +++ b/packages/translations/src/languages/pl.ts @@ -1,392 +1,399 @@ -export default { - authentication: { - account: 'Konto', - accountOfCurrentUser: 'Konto bieżącego użytkownika', - alreadyActivated: 'Już aktywowano', - alreadyLoggedIn: 'Już zalogowano', - apiKey: 'Klucz API', - backToLogin: 'Powrót do logowania', - beginCreateFirstUser: 'Aby rozpocząć, utwórz pierwszego użytkownika', - changePassword: 'Zmień hasło', - checkYourEmailForPasswordReset: - 'Sprawdź email, na który wysłano link, który pozwoli Ci bezpiecznie zresetować hasło.', - confirmGeneration: 'Potwierdź wygenerowanie', - confirmPassword: 'Potwierdź hasło', - createFirstUser: 'Utwórz pierwszego użytkownika', - emailNotValid: 'Podany email jest nieprawidłowy', - emailSent: 'Wysłano email', - enableAPIKey: 'Aktywuj klucz API', - failedToUnlock: 'Nie udało się odblokować', - forceUnlock: 'Wymuś odblokowanie', - forgotPassword: 'Zresetuj hasło', - forgotPasswordEmailInstructions: - 'Proszę podaj swój email. Otrzymasz wiadomość z instrukcjami, jak zresetować hasło.', - forgotPasswordQuestion: 'Nie pamiętasz hasła?', - generate: 'Wygeneruj', - generateNewAPIKey: 'Wygeneruj nowy klucz API', - generatingNewAPIKeyWillInvalidate: - 'Wygenerowanie nowego klucza API <1>unieważni poprzedni klucz. Czy na pewno chcesz kontynuować?', - lockUntil: 'Zablokuj do', - logBackIn: 'Zaloguj się ponownie', - logOut: 'Wyloguj', - loggedIn: 'Aby zalogować się na inne konto, najpierw się <0>wyloguj.', - loggedInChangePassword: - 'Aby zmienić hasło, przejdź do swojego <0>konta i tam edytuj swoje hasło.', - loggedOutInactivity: 'Zostałeś wylogowany z powodu braku aktywności.', - loggedOutSuccessfully: 'Zostałeś pomyślnie wylogowany.', - login: 'Zaloguj', - loginAttempts: 'Próby logowania', - loginUser: 'Zaloguj użytkownika', - loginWithAnotherUser: 'Aby zalogować się na inne konto, najpierw się <0>wyloguj.', - logout: 'Wyloguj', - logoutUser: 'Wyloguj użytkownika', - newAPIKeyGenerated: 'Wygenerowano nowy klucz API.', - newAccountCreated: - 'Właśnie utworzono nowe konto, w celu uzyskania dostępu do {{serverURL}}. Kliknij poniższy link lub wklej go do przeglądarki, aby zweryfikować swój adres email: {{verificationURL}}.
Po zweryfikowaniu adresu email będziesz mógł się pomyślnie zalogować.', - newPassword: 'Nowe hasło', - resetPassword: 'Zresetuj hasło', - resetPasswordExpiration: 'Zresetuj czas wygaśnięcia hasła', - resetPasswordToken: 'Zresetuj token hasła', - resetYourPassword: 'Zresetuj swoje hasło', - stayLoggedIn: 'Pozostań zalogowany', - successfullyUnlocked: 'Pomyślnie odblokowano', - unableToVerify: 'Nie można zweryfikować', - verified: 'Zweryfikowano', - verifiedSuccessfully: 'Pomyślnie zweryfikowany', - verify: 'Zweryfikuj', - verifyUser: 'Zweryfikuj użytkownika', - verifyYourEmail: 'Zweryfikuj swój email', - youAreInactive: - 'Nie byłeś aktywny od dłuższego czasu i wkrótce zostaniesz automatycznie wylogowany dla własnego bezpieczeństwa. Czy chcesz pozostać zalogowany?', - youAreReceivingResetPassword: - 'Otrzymałeś tę wiadomość, ponieważ Ty (lub ktoś inny) poprosiłeś o zresetowanie hasła do Twojego konta. Kliknij poniższy link lub wklej go w przeglądarce, aby zakończyć proces:', - youDidNotRequestPassword: - 'Jeśli nie prosiłeś o zmianę hasła, zignoruj tę wiadomość, a Twoje hasło pozostanie niezmienione.', - }, - error: { - accountAlreadyActivated: 'To konto zostało już aktywowane.', - autosaving: 'Wystąpił problem podczas automatycznego zapisywania tego dokumentu.', - correctInvalidFields: 'Popraw nieprawidłowe pola.', - deletingFile: '', - deletingTitle: - 'Wystąpił błąd podczas usuwania {{title}}. Proszę, sprawdź swoje połączenie i spróbuj ponownie.', - emailOrPasswordIncorrect: 'Podany adres e-mail lub hasło jest nieprawidłowe.', - followingFieldsInvalid_one: 'To pole jest nieprawidłowe:', - followingFieldsInvalid_other: 'Następujące pola są nieprawidłowe:', - incorrectCollection: 'Nieprawidłowa kolekcja', - invalidFileType: 'Nieprawidłowy typ pliku', - invalidFileTypeValue: 'Nieprawidłowy typ pliku: {{value}}', - loadingDocument: 'Wystapił problem podczas ładowania dokumentu o ID {{id}}.', - missingEmail: 'Brak adresu email.', - missingIDOfDocument: 'Brak ID dokumentu do aktualizacji.', - missingIDOfVersion: 'Brak ID wersji', - missingRequiredData: 'Brak wymaganych danych.', - noFilesUploaded: 'Nie przesłano żadnych plików.', - noMatchedField: 'Nie znaleziono pasującego pola dla "{{label}}"', - noUser: 'Brak użytkownika', - notAllowedToAccessPage: 'Nie masz dostępu do tej strony.', - notAllowedToPerformAction: 'Nie możesz wykonać tej akcji.', - notFound: 'Żądany zasób nie został znaleziony.', - previewing: 'Wystąpił problem podczas podglądu tego dokumentu.', - problemUploadingFile: 'Wystąpił problem podczas przesyłania pliku.', - tokenInvalidOrExpired: 'Token jest nieprawidłowy lub wygasł.', - unPublishingDocument: 'Wystąpił problem podczas cofania publikacji tego dokumentu.', - unableToDeleteCount: 'Nie można usunąć {{count}} z {{total}} {{label}}.', - unableToUpdateCount: 'Nie można zaktualizować {{count}} z {{total}} {{label}}.', - unauthorized: 'Brak dostępu, musisz być zalogowany.', - unknown: 'Wystąpił nieznany błąd.', - unspecific: 'Wystąpił błąd', - userLocked: 'Ten użytkownik został zablokowany z powodu zbyt wielu nieudanych prób logowania.', - valueMustBeUnique: 'Wartość musi być unikalna', - verificationTokenInvalid: 'Token weryfikacyjny jest nieprawidłowy.', - }, - fields: { - addLabel: 'Dodaj {{label}}', - addLink: 'Dodaj Link', - addNew: 'Dodaj nowy', - addNewLabel: 'Dodaj nowy {{label}}', - addRelationship: 'Dodaj Relację', - addUpload: 'Dodaj ładowanie', - block: 'Blok', - blockType: 'Typ Bloku', - blocks: 'Bloki', - chooseBetweenCustomTextOrDocument: - 'Wybierz między wprowadzeniem niestandardowego tekstowego adresu URL a linkiem do innego dokumentu.', - chooseDocumentToLink: 'Wybierz dokument, do którego chcesz utworzyć łącze', - chooseFromExisting: 'Wybierz z istniejących', - chooseLabel: 'Wybierz {{label}}', - collapseAll: 'Zwiń wszystko', - customURL: 'Niestandardowy adres URL', - editLabelData: 'Edytuj dane {{label}}', - editLink: 'Edytuj Link', - editRelationship: 'Edytuj Relację', - enterURL: 'Wpisz adres URL', - internalLink: 'Link wewnętrzny', - itemsAndMore: '{{items}} i {{count}} więcej', - labelRelationship: 'Relacja {{label}}', - latitude: 'Szerokość', - linkType: 'Typ łącza', - linkedTo: 'Połączony z <0>{{label}}', - longitude: 'Długość geograficzna', - newLabel: 'Nowy {{label}}', - openInNewTab: 'Otwórz w nowej karcie', - passwordsDoNotMatch: 'Hasła nie pasują', - relatedDocument: 'Powiązany dokument', - relationTo: 'Powiązany z', - removeRelationship: 'Usuń Relację', - removeUpload: 'Usuń Wrzucone', - saveChanges: 'Zapisz zmiany', - searchForBlock: 'Szukaj bloku', - selectExistingLabel: 'Wybierz istniejący {{label}}', - selectFieldsToEdit: 'Wybierz pola do edycji', - showAll: 'Pokaż wszystkie', - swapRelationship: 'Zamiana Relacji', - swapUpload: 'Zamień Wrzucone', - textToDisplay: 'Tekst do wyświetlenia', - toggleBlock: 'Przełącz blok', - uploadNewLabel: 'Wrzuć nowy {{label}}', - }, - general: { - aboutToDelete: 'Zamierzasz usunąć {{label}} <1>{{title}}. Jesteś pewien?', - aboutToDeleteCount_many: 'Zamierzasz usunąć {{count}} {{label}}', - aboutToDeleteCount_one: 'Zamierzasz usunąć {{count}} {{label}}', - aboutToDeleteCount_other: 'Zamierzasz usunąć {{count}} {{label}}', - addBelow: 'Dodaj poniżej', - addFilter: 'Dodaj filtr', - adminTheme: 'Motyw administratora', - and: 'i', - applyChanges: 'Zastosuj zmiany', - ascending: 'Rosnąco', - automatic: 'Automatyczny', - backToDashboard: 'Powrót do panelu', - cancel: 'Anuluj', - changesNotSaved: - 'Twoje zmiany nie zostały zapisane. Jeśli teraz wyjdziesz, stracisz swoje zmiany.', - close: 'Zamknij', - collapse: 'Zwiń', - collection: 'Kolekcja', - collections: 'Kolekcje', - columnToSort: 'Kolumna sortowania', - columns: 'Kolumny', - confirm: 'Potwierdź', - confirmDeletion: 'Potwierdź usunięcie', - confirmDuplication: 'Potwierdź duplikację', - copied: 'Skopiowano', - copy: 'Skopiuj', - create: 'Stwórz', - createNew: 'Stwórz nowy', - createNewLabel: 'Stwórz nowy {{label}}', - created: 'Utworzono', - createdAt: 'Data utworzenia', - creating: 'Tworzenie', - creatingNewLabel: 'Tworzenie nowego {{label}}', - dark: 'Ciemny', - dashboard: 'Panel', - delete: 'Usuń', - deletedCountSuccessfully: 'Pomyślnie usunięto {{count}} {{label}}.', - deletedSuccessfully: 'Pomyślnie usunięto.', - deleting: 'Usuwanie...', - descending: 'Malejąco', - deselectAllRows: 'Odznacz wszystkie wiersze', - duplicate: 'Zduplikuj', - duplicateWithoutSaving: 'Zduplikuj bez zapisywania zmian', - edit: 'Edytuj', - editLabel: 'Edytuj {{label}}', - editing: 'Edycja', - editingLabel_many: 'Edytowanie {{count}} {{label}}', - editingLabel_one: 'Edytowanie {{count}} {{label}}', - editingLabel_other: 'Edytowanie {{count}} {{label}}', - email: 'Email', - emailAddress: 'Adres email', - enterAValue: 'Wpisz wartość', - error: 'Błąd', - errors: 'Błędy', - fallbackToDefaultLocale: 'Powrót do domyślnych ustawień regionalnych', - filter: 'Filtr', - filterWhere: 'Filtruj gdzie', - filters: 'Filtry', - globals: 'Globalne', - language: 'Język', - lastModified: 'Ostatnio zmodyfikowany', - leaveAnyway: 'Wyjdź mimo to', - leaveWithoutSaving: 'Wyjdź bez zapisywania', - light: 'Jasny', - livePreview: 'Podgląd', - loading: 'Ładowanie', - locale: 'Ustawienia regionalne', - locales: 'Ustawienia regionalne', - menu: 'Menu', - moveDown: 'Przesuń niżej', - moveUp: 'Przesuń wyżej', - newPassword: 'Nowe hasło', - noFiltersSet: 'Brak ustawionych filtrów', - noLabel: '', - noOptions: 'Brak opcji', - noResults: - 'Nie znaleziono {{label}}. Być może {{label}} jeszcze nie istnieje, albo żaden nie pasuje do filtrów określonych powyżej.', - noValue: 'Brak wartości', - none: 'Nic', - notFound: 'Nie znaleziono', - nothingFound: 'Nic nie znaleziono', - of: 'z', - open: 'Otwórz', - or: 'lub', - order: 'Kolejność', - pageNotFound: 'Strona nie znaleziona', - password: 'Hasło', - payloadSettings: 'Ustawienia Payload', - perPage: 'Na stronę: {{limit}}', - remove: 'Usuń', - reset: 'Zresetuj', - row: 'Wiersz', - rows: 'Wiersze', - save: 'Zapisz', - saving: 'Zapisywanie...', - searchBy: 'Szukaj według', - selectAll: 'Wybierz wszystkie {{count}} {{label}}', - selectAllRows: 'Wybierz wszystkie wiersze', - selectValue: 'Wybierz wartość', - selectedCount: 'Wybrano {{count}} {{label}}', - showAllLabel: 'Pokaż wszystkie {{label}}', - sorryNotFound: 'Przepraszamy — nie ma nic, co odpowiadałoby twojemu zapytaniu.', - sort: 'Sortuj', - sortByLabelDirection: 'Sortuj według {{label}} {{direction}}', - stayOnThisPage: 'Pozostań na stronie', - submissionSuccessful: 'Zgłoszenie zakończone powodzeniem.', - submit: 'Zatwierdź', - successfullyCreated: 'Pomyślnie utworzono {{label}}.', - successfullyDuplicated: 'Pomyślnie zduplikowano {{label}}', - thisLanguage: 'Polski', - titleDeleted: 'Pomyślnie usunięto {{label}} {{title}}', - unauthorized: 'Brak autoryzacji', - unsavedChangesDuplicate: 'Masz niezapisane zmiany. Czy chcesz kontynuować duplikowanie?', - untitled: 'Bez nazwy', - updatedAt: 'Data edycji', - updatedCountSuccessfully: 'Pomyślnie zaktualizowano {{count}} {{label}}.', - updatedSuccessfully: 'Aktualizacja zakończona sukcesem.', - updating: 'Aktualizacja', - uploading: 'Przesyłanie', - user: 'użytkownik', - users: 'użytkownicy', - value: 'Wartość', - welcome: 'Witaj', - }, - operators: { - contains: 'zawiera', - equals: 'równe', - exists: 'istnieje', - isGreaterThan: 'jest większy niż', - isGreaterThanOrEqualTo: 'jest większe lub równe', - isIn: 'jest w', - isLessThan: 'jest mniejsze niż', - isLessThanOrEqualTo: 'jest mniejsze lub równe', - isLike: 'jest jak', - isNotEqualTo: 'nie jest równe', - isNotIn: 'nie ma go w', - near: 'blisko', - }, - upload: { - crop: 'Przytnij', - cropToolDescription: - 'Przeciągnij narożniki wybranego obszaru, narysuj nowy obszar lub dostosuj poniższe wartości.', - dragAndDrop: 'Przeciągnij i upuść plik', - dragAndDropHere: 'lub złap i upuść plik tutaj', - editImage: 'Edytuj obraz', - fileName: 'Nazwa pliku', - fileSize: 'Rozmiar pliku', - focalPoint: 'Punkt centralny', - focalPointDescription: - 'Przeciągnij punkt centralny bezpośrednio na podglądzie lub dostosuj wartości poniżej.', - height: 'Wysokość', - lessInfo: 'Mniej informacji', - moreInfo: 'Więcej informacji', - previewSizes: 'Rozmiary podglądu', - selectCollectionToBrowse: 'Wybierz kolekcję aby przejrzeć', - selectFile: 'Wybierz plik', - setCropArea: 'Ustaw obszar kadrowania', - setFocalPoint: 'Ustawić punkt ogniskowy', - sizes: 'Rozmiary', - sizesFor: 'Rozmiary dla {{label}}', - width: 'Szerokość', - }, - validation: { - emailAddress: 'Wprowadź poprawny adres email.', - enterNumber: 'Wprowadź poprawny numer telefonu.', - fieldHasNo: 'To pole nie posiada {{label}}', - greaterThanMax: '{{value}} jest większe niż maksymalnie dozwolony {{label}} wynoszący {{max}}.', - invalidInput: 'To pole zawiera nieprawidłowe dane.', - invalidSelection: 'To pole ma nieprawidłowy wybór.', - invalidSelections: 'To pole zawiera następujące, nieprawidłowe wybory:', - lessThanMin: '{{value}} jest mniejsze niż minimalnie dozwolony {{label}} wynoszący {{min}}.', - limitReached: 'Osiągnięto limit, można dodać tylko {{max}} elementów.', - longerThanMin: 'Ta wartość musi być dłuższa niż minimalna długość znaków: {{minLength}}.', - notValidDate: '"{{value}}" nie jest prawidłową datą.', - required: 'To pole jest wymagane.', - requiresAtLeast: 'To pole wymaga co najmniej {{count}} {{label}}.', - requiresNoMoreThan: 'To pole może posiadać co najmniej {{count}} {{label}}.', - requiresTwoNumbers: 'To pole wymaga dwóch liczb.', - shorterThanMax: 'Ta wartość musi być krótsza niż maksymalna długość znaków: {{maxLength}}.', - trueOrFalse: "To pole może mieć wartość tylko 'true' lub 'false'.", - validUploadID: 'To pole nie jest prawidłowym identyfikatorem przesyłania.', - }, - version: { - aboutToPublishSelection: - 'Za chwilę opublikujesz wszystkie {{label}} w zaznaczeniu. Jesteś pewny?', - aboutToRestore: - 'Zamierzasz przywrócić dokument {{label}} do stanu, w jakim znajdował się w dniu {{versionDate}}.', - aboutToRestoreGlobal: - 'Zamierzasz przywrócić globalny rekord {{label}} do stanu, w którym znajdował się w dniu {{versionDate}}.', - aboutToRevertToPublished: - 'Zamierzasz przywrócić zmiany w tym dokumencie do stanu opublikowanego. Jesteś pewien?', - aboutToUnpublish: 'Zamierzasz cofnąć publikację tego dokumentu. Jesteś pewien?', - aboutToUnpublishSelection: - 'Zamierzasz cofnąć publikację wszystkich {{label}} w zaznaczeniu. Jesteś pewny?', - autosave: 'Autozapis', - autosavedSuccessfully: 'Pomyślnie zapisano automatycznie.', - autosavedVersion: 'Wersja zapisana automatycznie', - changed: 'Zmieniono', - compareVersion: 'Porównaj wersję z:', - confirmPublish: 'Potwierdź publikację', - confirmRevertToSaved: 'Potwierdź powrót do zapisanego', - confirmUnpublish: 'Potwierdź cofnięcie publikacji', - confirmVersionRestoration: 'Potwierdź przywrócenie wersji', - currentDocumentStatus: 'Bieżący status {{docStatus}} dokumentu', - draft: 'Szkic', - draftSavedSuccessfully: 'Wersja robocza została pomyślnie zapisana.', - lastSavedAgo: 'Ostatnio zapisane {{distance}} temu', - noFurtherVersionsFound: 'Nie znaleziono dalszych wersji', - noRowsFound: 'Nie znaleziono {{label}}', - preview: 'Podgląd', - problemRestoringVersion: 'Wystąpił problem podczas przywracania tej wersji', - publish: 'Publikuj', - publishChanges: 'Opublikuj zmiany', - published: 'Opublikowano', - publising: 'Publikacja', - restoreThisVersion: 'Przywróć tę wersję', - restoredSuccessfully: 'Przywrócono pomyślnie.', - restoring: 'Przywracanie...', - revertToPublished: 'Przywróć do opublikowanego', - reverting: 'Cofanie...', - saveDraft: 'Zapisz szkic', - selectLocales: 'Wybierz ustawienia regionalne do wyświetlenia', - selectVersionToCompare: 'Wybierz wersję do porównania', - showLocales: 'Pokaż ustawienia regionalne:', - showingVersionsFor: 'Wyświetlanie wersji dla:', - status: 'Status', - type: 'Typ', - unpublish: 'Cofnij publikację', - unpublishing: 'Cofanie publikacji...', - version: 'Wersja', - versionCount_many: 'Znalezionych wersji: {{count}}', - versionCount_none: 'Nie znaleziono wersji', - versionCount_one: 'Znaleziono {{count}} wersję', - versionCount_other: 'Znaleziono {{count}} wersji', - versionCreatedOn: 'Wersja {{version}} utworzona:', - versionID: 'ID wersji', - versions: 'Wersje', - viewingVersion: 'Przeglądanie wersji dla {{entityLabel}} {{documentTitle}}', - viewingVersionGlobal: 'Przeglądanie wersji dla globalnej kolekcji {{entityLabel}}', - viewingVersions: 'Przeglądanie wersji {{entityLabel}} {{documentTitle}}', - viewingVersionsGlobal: 'Przeglądanie wersji dla globalnej kolekcji {{entityLabel}}', +import type { Language } from '../types.js' + +export const pl: Language = { + dateFNSKey: 'pl', + translations: { + authentication: { + account: 'Konto', + accountOfCurrentUser: 'Konto bieżącego użytkownika', + alreadyActivated: 'Już aktywowano', + alreadyLoggedIn: 'Już zalogowano', + apiKey: 'Klucz API', + backToLogin: 'Powrót do logowania', + beginCreateFirstUser: 'Aby rozpocząć, utwórz pierwszego użytkownika', + changePassword: 'Zmień hasło', + checkYourEmailForPasswordReset: + 'Sprawdź email, na który wysłano link, który pozwoli Ci bezpiecznie zresetować hasło.', + confirmGeneration: 'Potwierdź wygenerowanie', + confirmPassword: 'Potwierdź hasło', + createFirstUser: 'Utwórz pierwszego użytkownika', + emailNotValid: 'Podany email jest nieprawidłowy', + emailSent: 'Wysłano email', + enableAPIKey: 'Aktywuj klucz API', + failedToUnlock: 'Nie udało się odblokować', + forceUnlock: 'Wymuś odblokowanie', + forgotPassword: 'Zresetuj hasło', + forgotPasswordEmailInstructions: + 'Proszę podaj swój email. Otrzymasz wiadomość z instrukcjami, jak zresetować hasło.', + forgotPasswordQuestion: 'Nie pamiętasz hasła?', + generate: 'Wygeneruj', + generateNewAPIKey: 'Wygeneruj nowy klucz API', + generatingNewAPIKeyWillInvalidate: + 'Wygenerowanie nowego klucza API <1>unieważni poprzedni klucz. Czy na pewno chcesz kontynuować?', + lockUntil: 'Zablokuj do', + logBackIn: 'Zaloguj się ponownie', + logOut: 'Wyloguj', + loggedIn: 'Aby zalogować się na inne konto, najpierw się <0>wyloguj.', + loggedInChangePassword: + 'Aby zmienić hasło, przejdź do swojego <0>konta i tam edytuj swoje hasło.', + loggedOutInactivity: 'Zostałeś wylogowany z powodu braku aktywności.', + loggedOutSuccessfully: 'Zostałeś pomyślnie wylogowany.', + login: 'Zaloguj', + loginAttempts: 'Próby logowania', + loginUser: 'Zaloguj użytkownika', + loginWithAnotherUser: 'Aby zalogować się na inne konto, najpierw się <0>wyloguj.', + logout: 'Wyloguj', + logoutUser: 'Wyloguj użytkownika', + newAPIKeyGenerated: 'Wygenerowano nowy klucz API.', + newAccountCreated: + 'Właśnie utworzono nowe konto, w celu uzyskania dostępu do {{serverURL}}. Kliknij poniższy link lub wklej go do przeglądarki, aby zweryfikować swój adres email: {{verificationURL}}.
Po zweryfikowaniu adresu email będziesz mógł się pomyślnie zalogować.', + newPassword: 'Nowe hasło', + resetPassword: 'Zresetuj hasło', + resetPasswordExpiration: 'Zresetuj czas wygaśnięcia hasła', + resetPasswordToken: 'Zresetuj token hasła', + resetYourPassword: 'Zresetuj swoje hasło', + stayLoggedIn: 'Pozostań zalogowany', + successfullyUnlocked: 'Pomyślnie odblokowano', + unableToVerify: 'Nie można zweryfikować', + verified: 'Zweryfikowano', + verifiedSuccessfully: 'Pomyślnie zweryfikowany', + verify: 'Zweryfikuj', + verifyUser: 'Zweryfikuj użytkownika', + verifyYourEmail: 'Zweryfikuj swój email', + youAreInactive: + 'Nie byłeś aktywny od dłuższego czasu i wkrótce zostaniesz automatycznie wylogowany dla własnego bezpieczeństwa. Czy chcesz pozostać zalogowany?', + youAreReceivingResetPassword: + 'Otrzymałeś tę wiadomość, ponieważ Ty (lub ktoś inny) poprosiłeś o zresetowanie hasła do Twojego konta. Kliknij poniższy link lub wklej go w przeglądarce, aby zakończyć proces:', + youDidNotRequestPassword: + 'Jeśli nie prosiłeś o zmianę hasła, zignoruj tę wiadomość, a Twoje hasło pozostanie niezmienione.', + }, + error: { + accountAlreadyActivated: 'To konto zostało już aktywowane.', + autosaving: 'Wystąpił problem podczas automatycznego zapisywania tego dokumentu.', + correctInvalidFields: 'Popraw nieprawidłowe pola.', + deletingFile: '', + deletingTitle: + 'Wystąpił błąd podczas usuwania {{title}}. Proszę, sprawdź swoje połączenie i spróbuj ponownie.', + emailOrPasswordIncorrect: 'Podany adres e-mail lub hasło jest nieprawidłowe.', + followingFieldsInvalid_one: 'To pole jest nieprawidłowe:', + followingFieldsInvalid_other: 'Następujące pola są nieprawidłowe:', + incorrectCollection: 'Nieprawidłowa kolekcja', + invalidFileType: 'Nieprawidłowy typ pliku', + invalidFileTypeValue: 'Nieprawidłowy typ pliku: {{value}}', + loadingDocument: 'Wystapił problem podczas ładowania dokumentu o ID {{id}}.', + missingEmail: 'Brak adresu email.', + missingIDOfDocument: 'Brak ID dokumentu do aktualizacji.', + missingIDOfVersion: 'Brak ID wersji', + missingRequiredData: 'Brak wymaganych danych.', + noFilesUploaded: 'Nie przesłano żadnych plików.', + noMatchedField: 'Nie znaleziono pasującego pola dla "{{label}}"', + noUser: 'Brak użytkownika', + notAllowedToAccessPage: 'Nie masz dostępu do tej strony.', + notAllowedToPerformAction: 'Nie możesz wykonać tej akcji.', + notFound: 'Żądany zasób nie został znaleziony.', + previewing: 'Wystąpił problem podczas podglądu tego dokumentu.', + problemUploadingFile: 'Wystąpił problem podczas przesyłania pliku.', + tokenInvalidOrExpired: 'Token jest nieprawidłowy lub wygasł.', + unPublishingDocument: 'Wystąpił problem podczas cofania publikacji tego dokumentu.', + unableToDeleteCount: 'Nie można usunąć {{count}} z {{total}} {{label}}.', + unableToUpdateCount: 'Nie można zaktualizować {{count}} z {{total}} {{label}}.', + unauthorized: 'Brak dostępu, musisz być zalogowany.', + unknown: 'Wystąpił nieznany błąd.', + unspecific: 'Wystąpił błąd', + userLocked: + 'Ten użytkownik został zablokowany z powodu zbyt wielu nieudanych prób logowania.', + valueMustBeUnique: 'Wartość musi być unikalna', + verificationTokenInvalid: 'Token weryfikacyjny jest nieprawidłowy.', + }, + fields: { + addLabel: 'Dodaj {{label}}', + addLink: 'Dodaj Link', + addNew: 'Dodaj nowy', + addNewLabel: 'Dodaj nowy {{label}}', + addRelationship: 'Dodaj Relację', + addUpload: 'Dodaj ładowanie', + block: 'Blok', + blockType: 'Typ Bloku', + blocks: 'Bloki', + chooseBetweenCustomTextOrDocument: + 'Wybierz między wprowadzeniem niestandardowego tekstowego adresu URL a linkiem do innego dokumentu.', + chooseDocumentToLink: 'Wybierz dokument, do którego chcesz utworzyć łącze', + chooseFromExisting: 'Wybierz z istniejących', + chooseLabel: 'Wybierz {{label}}', + collapseAll: 'Zwiń wszystko', + customURL: 'Niestandardowy adres URL', + editLabelData: 'Edytuj dane {{label}}', + editLink: 'Edytuj Link', + editRelationship: 'Edytuj Relację', + enterURL: 'Wpisz adres URL', + internalLink: 'Link wewnętrzny', + itemsAndMore: '{{items}} i {{count}} więcej', + labelRelationship: 'Relacja {{label}}', + latitude: 'Szerokość', + linkType: 'Typ łącza', + linkedTo: 'Połączony z <0>{{label}}', + longitude: 'Długość geograficzna', + newLabel: 'Nowy {{label}}', + openInNewTab: 'Otwórz w nowej karcie', + passwordsDoNotMatch: 'Hasła nie pasują', + relatedDocument: 'Powiązany dokument', + relationTo: 'Powiązany z', + removeRelationship: 'Usuń Relację', + removeUpload: 'Usuń Wrzucone', + saveChanges: 'Zapisz zmiany', + searchForBlock: 'Szukaj bloku', + selectExistingLabel: 'Wybierz istniejący {{label}}', + selectFieldsToEdit: 'Wybierz pola do edycji', + showAll: 'Pokaż wszystkie', + swapRelationship: 'Zamiana Relacji', + swapUpload: 'Zamień Wrzucone', + textToDisplay: 'Tekst do wyświetlenia', + toggleBlock: 'Przełącz blok', + uploadNewLabel: 'Wrzuć nowy {{label}}', + }, + general: { + aboutToDelete: 'Zamierzasz usunąć {{label}} <1>{{title}}. Jesteś pewien?', + aboutToDeleteCount_many: 'Zamierzasz usunąć {{count}} {{label}}', + aboutToDeleteCount_one: 'Zamierzasz usunąć {{count}} {{label}}', + aboutToDeleteCount_other: 'Zamierzasz usunąć {{count}} {{label}}', + addBelow: 'Dodaj poniżej', + addFilter: 'Dodaj filtr', + adminTheme: 'Motyw administratora', + and: 'i', + applyChanges: 'Zastosuj zmiany', + ascending: 'Rosnąco', + automatic: 'Automatyczny', + backToDashboard: 'Powrót do panelu', + cancel: 'Anuluj', + changesNotSaved: + 'Twoje zmiany nie zostały zapisane. Jeśli teraz wyjdziesz, stracisz swoje zmiany.', + close: 'Zamknij', + collapse: 'Zwiń', + collection: 'Kolekcja', + collections: 'Kolekcje', + columnToSort: 'Kolumna sortowania', + columns: 'Kolumny', + confirm: 'Potwierdź', + confirmDeletion: 'Potwierdź usunięcie', + confirmDuplication: 'Potwierdź duplikację', + copied: 'Skopiowano', + copy: 'Skopiuj', + create: 'Stwórz', + createNew: 'Stwórz nowy', + createNewLabel: 'Stwórz nowy {{label}}', + created: 'Utworzono', + createdAt: 'Data utworzenia', + creating: 'Tworzenie', + creatingNewLabel: 'Tworzenie nowego {{label}}', + dark: 'Ciemny', + dashboard: 'Panel', + delete: 'Usuń', + deletedCountSuccessfully: 'Pomyślnie usunięto {{count}} {{label}}.', + deletedSuccessfully: 'Pomyślnie usunięto.', + deleting: 'Usuwanie...', + descending: 'Malejąco', + deselectAllRows: 'Odznacz wszystkie wiersze', + duplicate: 'Zduplikuj', + duplicateWithoutSaving: 'Zduplikuj bez zapisywania zmian', + edit: 'Edytuj', + editLabel: 'Edytuj {{label}}', + editing: 'Edycja', + editingLabel_many: 'Edytowanie {{count}} {{label}}', + editingLabel_one: 'Edytowanie {{count}} {{label}}', + editingLabel_other: 'Edytowanie {{count}} {{label}}', + email: 'Email', + emailAddress: 'Adres email', + enterAValue: 'Wpisz wartość', + error: 'Błąd', + errors: 'Błędy', + fallbackToDefaultLocale: 'Powrót do domyślnych ustawień regionalnych', + filter: 'Filtr', + filterWhere: 'Filtruj gdzie', + filters: 'Filtry', + globals: 'Globalne', + language: 'Język', + lastModified: 'Ostatnio zmodyfikowany', + leaveAnyway: 'Wyjdź mimo to', + leaveWithoutSaving: 'Wyjdź bez zapisywania', + light: 'Jasny', + livePreview: 'Podgląd', + loading: 'Ładowanie', + locale: 'Ustawienia regionalne', + locales: 'Ustawienia regionalne', + menu: 'Menu', + moveDown: 'Przesuń niżej', + moveUp: 'Przesuń wyżej', + newPassword: 'Nowe hasło', + noFiltersSet: 'Brak ustawionych filtrów', + noLabel: '', + noOptions: 'Brak opcji', + noResults: + 'Nie znaleziono {{label}}. Być może {{label}} jeszcze nie istnieje, albo żaden nie pasuje do filtrów określonych powyżej.', + noValue: 'Brak wartości', + none: 'Nic', + notFound: 'Nie znaleziono', + nothingFound: 'Nic nie znaleziono', + of: 'z', + open: 'Otwórz', + or: 'lub', + order: 'Kolejność', + pageNotFound: 'Strona nie znaleziona', + password: 'Hasło', + payloadSettings: 'Ustawienia Payload', + perPage: 'Na stronę: {{limit}}', + remove: 'Usuń', + reset: 'Zresetuj', + row: 'Wiersz', + rows: 'Wiersze', + save: 'Zapisz', + saving: 'Zapisywanie...', + searchBy: 'Szukaj według', + selectAll: 'Wybierz wszystkie {{count}} {{label}}', + selectAllRows: 'Wybierz wszystkie wiersze', + selectValue: 'Wybierz wartość', + selectedCount: 'Wybrano {{count}} {{label}}', + showAllLabel: 'Pokaż wszystkie {{label}}', + sorryNotFound: 'Przepraszamy — nie ma nic, co odpowiadałoby twojemu zapytaniu.', + sort: 'Sortuj', + sortByLabelDirection: 'Sortuj według {{label}} {{direction}}', + stayOnThisPage: 'Pozostań na stronie', + submissionSuccessful: 'Zgłoszenie zakończone powodzeniem.', + submit: 'Zatwierdź', + successfullyCreated: 'Pomyślnie utworzono {{label}}.', + successfullyDuplicated: 'Pomyślnie zduplikowano {{label}}', + thisLanguage: 'Polski', + titleDeleted: 'Pomyślnie usunięto {{label}} {{title}}', + unauthorized: 'Brak autoryzacji', + unsavedChangesDuplicate: 'Masz niezapisane zmiany. Czy chcesz kontynuować duplikowanie?', + untitled: 'Bez nazwy', + updatedAt: 'Data edycji', + updatedCountSuccessfully: 'Pomyślnie zaktualizowano {{count}} {{label}}.', + updatedSuccessfully: 'Aktualizacja zakończona sukcesem.', + updating: 'Aktualizacja', + uploading: 'Przesyłanie', + user: 'użytkownik', + users: 'użytkownicy', + value: 'Wartość', + welcome: 'Witaj', + }, + operators: { + contains: 'zawiera', + equals: 'równe', + exists: 'istnieje', + isGreaterThan: 'jest większy niż', + isGreaterThanOrEqualTo: 'jest większe lub równe', + isIn: 'jest w', + isLessThan: 'jest mniejsze niż', + isLessThanOrEqualTo: 'jest mniejsze lub równe', + isLike: 'jest jak', + isNotEqualTo: 'nie jest równe', + isNotIn: 'nie ma go w', + near: 'blisko', + }, + upload: { + crop: 'Przytnij', + cropToolDescription: + 'Przeciągnij narożniki wybranego obszaru, narysuj nowy obszar lub dostosuj poniższe wartości.', + dragAndDrop: 'Przeciągnij i upuść plik', + dragAndDropHere: 'lub złap i upuść plik tutaj', + editImage: 'Edytuj obraz', + fileName: 'Nazwa pliku', + fileSize: 'Rozmiar pliku', + focalPoint: 'Punkt centralny', + focalPointDescription: + 'Przeciągnij punkt centralny bezpośrednio na podglądzie lub dostosuj wartości poniżej.', + height: 'Wysokość', + lessInfo: 'Mniej informacji', + moreInfo: 'Więcej informacji', + previewSizes: 'Rozmiary podglądu', + selectCollectionToBrowse: 'Wybierz kolekcję aby przejrzeć', + selectFile: 'Wybierz plik', + setCropArea: 'Ustaw obszar kadrowania', + setFocalPoint: 'Ustawić punkt ogniskowy', + sizes: 'Rozmiary', + sizesFor: 'Rozmiary dla {{label}}', + width: 'Szerokość', + }, + validation: { + emailAddress: 'Wprowadź poprawny adres email.', + enterNumber: 'Wprowadź poprawny numer telefonu.', + fieldHasNo: 'To pole nie posiada {{label}}', + greaterThanMax: + '{{value}} jest większe niż maksymalnie dozwolony {{label}} wynoszący {{max}}.', + invalidInput: 'To pole zawiera nieprawidłowe dane.', + invalidSelection: 'To pole ma nieprawidłowy wybór.', + invalidSelections: 'To pole zawiera następujące, nieprawidłowe wybory:', + lessThanMin: '{{value}} jest mniejsze niż minimalnie dozwolony {{label}} wynoszący {{min}}.', + limitReached: 'Osiągnięto limit, można dodać tylko {{max}} elementów.', + longerThanMin: 'Ta wartość musi być dłuższa niż minimalna długość znaków: {{minLength}}.', + notValidDate: '"{{value}}" nie jest prawidłową datą.', + required: 'To pole jest wymagane.', + requiresAtLeast: 'To pole wymaga co najmniej {{count}} {{label}}.', + requiresNoMoreThan: 'To pole może posiadać co najmniej {{count}} {{label}}.', + requiresTwoNumbers: 'To pole wymaga dwóch liczb.', + shorterThanMax: 'Ta wartość musi być krótsza niż maksymalna długość znaków: {{maxLength}}.', + trueOrFalse: "To pole może mieć wartość tylko 'true' lub 'false'.", + validUploadID: 'To pole nie jest prawidłowym identyfikatorem przesyłania.', + }, + version: { + type: 'Typ', + aboutToPublishSelection: + 'Za chwilę opublikujesz wszystkie {{label}} w zaznaczeniu. Jesteś pewny?', + aboutToRestore: + 'Zamierzasz przywrócić dokument {{label}} do stanu, w jakim znajdował się w dniu {{versionDate}}.', + aboutToRestoreGlobal: + 'Zamierzasz przywrócić globalny rekord {{label}} do stanu, w którym znajdował się w dniu {{versionDate}}.', + aboutToRevertToPublished: + 'Zamierzasz przywrócić zmiany w tym dokumencie do stanu opublikowanego. Jesteś pewien?', + aboutToUnpublish: 'Zamierzasz cofnąć publikację tego dokumentu. Jesteś pewien?', + aboutToUnpublishSelection: + 'Zamierzasz cofnąć publikację wszystkich {{label}} w zaznaczeniu. Jesteś pewny?', + autosave: 'Autozapis', + autosavedSuccessfully: 'Pomyślnie zapisano automatycznie.', + autosavedVersion: 'Wersja zapisana automatycznie', + changed: 'Zmieniono', + compareVersion: 'Porównaj wersję z:', + confirmPublish: 'Potwierdź publikację', + confirmRevertToSaved: 'Potwierdź powrót do zapisanego', + confirmUnpublish: 'Potwierdź cofnięcie publikacji', + confirmVersionRestoration: 'Potwierdź przywrócenie wersji', + currentDocumentStatus: 'Bieżący status {{docStatus}} dokumentu', + draft: 'Szkic', + draftSavedSuccessfully: 'Wersja robocza została pomyślnie zapisana.', + lastSavedAgo: 'Ostatnio zapisane {{distance}} temu', + noFurtherVersionsFound: 'Nie znaleziono dalszych wersji', + noRowsFound: 'Nie znaleziono {{label}}', + preview: 'Podgląd', + problemRestoringVersion: 'Wystąpił problem podczas przywracania tej wersji', + publish: 'Publikuj', + publishChanges: 'Opublikuj zmiany', + published: 'Opublikowano', + publising: 'Publikacja', + restoreThisVersion: 'Przywróć tę wersję', + restoredSuccessfully: 'Przywrócono pomyślnie.', + restoring: 'Przywracanie...', + revertToPublished: 'Przywróć do opublikowanego', + reverting: 'Cofanie...', + saveDraft: 'Zapisz szkic', + selectLocales: 'Wybierz ustawienia regionalne do wyświetlenia', + selectVersionToCompare: 'Wybierz wersję do porównania', + showLocales: 'Pokaż ustawienia regionalne:', + showingVersionsFor: 'Wyświetlanie wersji dla:', + status: 'Status', + unpublish: 'Cofnij publikację', + unpublishing: 'Cofanie publikacji...', + version: 'Wersja', + versionCount_many: 'Znalezionych wersji: {{count}}', + versionCount_none: 'Nie znaleziono wersji', + versionCount_one: 'Znaleziono {{count}} wersję', + versionCount_other: 'Znaleziono {{count}} wersji', + versionCreatedOn: 'Wersja {{version}} utworzona:', + versionID: 'ID wersji', + versions: 'Wersje', + viewingVersion: 'Przeglądanie wersji dla {{entityLabel}} {{documentTitle}}', + viewingVersionGlobal: 'Przeglądanie wersji dla globalnej kolekcji {{entityLabel}}', + viewingVersions: 'Przeglądanie wersji {{entityLabel}} {{documentTitle}}', + viewingVersionsGlobal: 'Przeglądanie wersji dla globalnej kolekcji {{entityLabel}}', + }, }, } diff --git a/packages/translations/src/languages/pt.ts b/packages/translations/src/languages/pt.ts index 115422a085..c0d3b07681 100644 --- a/packages/translations/src/languages/pt.ts +++ b/packages/translations/src/languages/pt.ts @@ -1,392 +1,398 @@ -export default { - authentication: { - account: 'Conta', - accountOfCurrentUser: 'Conta do usuário ativo', - alreadyActivated: 'Conta já ativada', - alreadyLoggedIn: 'Login já realizado', - apiKey: 'Chave da API', - backToLogin: 'Voltar para login', - beginCreateFirstUser: 'Para começar, crie seu primeiro usuário.', - changePassword: 'Mudar senha', - checkYourEmailForPasswordReset: - 'Verifique seu email para um link que permitirá que você redefina sua senha com segurança.', - confirmGeneration: 'Confirmar Geração', - confirmPassword: 'Confirmar Senha', - createFirstUser: 'Criar primeiro usuário', - emailNotValid: 'O email fornecido não é válido', - emailSent: 'Email Enviado', - enableAPIKey: 'Habilitar Chave API', - failedToUnlock: 'Falha ao desbloquear', - forceUnlock: 'Forçar Desbloqueio', - forgotPassword: 'Esqueci a senha', - forgotPasswordEmailInstructions: - 'Por favor, preencha seu email abaixo. Você receberá um email com instruções para gerar uma nova senha', - forgotPasswordQuestion: 'Esqueceu a senha?', - generate: 'Gerar', - generateNewAPIKey: 'Gerar nova chave API', - generatingNewAPIKeyWillInvalidate: - 'Gerar uma nova chave API <1>invalidará a chave anterior. Você tem certeza que deseja prosseguir?', - lockUntil: 'Bloquear Até', - logBackIn: 'Fazer login novamente', - logOut: 'Log out', - loggedIn: 'Para fazer login como outro usuário, você deve fazer o <0>log out antes.', - loggedInChangePassword: - 'Para mudar a sua senha, acesse a sua <0>conta e edite sua senha lá.', - loggedOutInactivity: 'Você foi desconectado devido a inatividade.', - loggedOutSuccessfully: 'Log out efetuado com sucesso.', - login: 'Login', - loginAttempts: 'Tentativas de Login', - loginUser: 'Iniciar sessão', - loginWithAnotherUser: - 'Para fazer login como outro usuário, você deve fazer o <0>log out antes.', - logout: 'Logout', - logoutUser: 'Encerrar sessão', - newAPIKeyGenerated: 'Nova Chave API Gerada.', - newAccountCreated: - 'Uma nova conta acaba de ser criada para que você possa acessar {{serverURL}} Por favor, clique no link a seguir ou cole a URL abaixo no seu navegador para verificar seu email: {{verificationURL}}
Após a verificação de email, você será capaz de fazer o login.', - newPassword: 'Nova Senha', - resetPassword: 'Redefinir Senha', - resetPasswordExpiration: 'Tempo Limite para Redefinição de Senha', - resetPasswordToken: 'Token para Redefinição de Senha', - resetYourPassword: 'Redefinir Sua Senha', - stayLoggedIn: 'Manter sessão ativa', - successfullyUnlocked: 'Desbloqueado com sucesso', - unableToVerify: 'Não foi possível verificar', - verified: 'Verificado', - verifiedSuccessfully: 'Verificado com Sucesso', - verify: 'Verificar', - verifyUser: 'Verificar Usuário', - verifyYourEmail: 'Verifique seu email', - youAreInactive: - 'Você não está ativo há algum tempo e sua sessão será automaticamente finalizada em breve, para sua própria segurança. Você gostaria de manter a sessão ativa?', - youAreReceivingResetPassword: - 'Você está recebendo essa mensagem porque você (ou outra pessoa) requisitou a redefinição de senha da sua conta. Por favor, clique no link a seguir ou cole no seu navegador para completar o processo:', - youDidNotRequestPassword: - 'Se você não fez essa requisição, por favor ignore esse email e sua senha permanecerá igual.', - }, - error: { - accountAlreadyActivated: 'Essa conta já foi ativada.', - autosaving: 'Ocorreu um problema ao salvar automaticamente esse documento.', - correctInvalidFields: 'Por favor, corrija os campos inválidos.', - deletingFile: 'Ocorreu um erro ao excluir o arquivo.', - deletingTitle: - 'Ocorreu um erro ao excluir {{title}}. Por favor, verifique sua conexão e tente novamente.', - emailOrPasswordIncorrect: 'O email ou senha fornecido está incorreto.', - followingFieldsInvalid_one: 'O campo a seguir está inválido:', - followingFieldsInvalid_other: 'Os campos a seguir estão inválidos:', - incorrectCollection: 'Coleção Incorreta', - invalidFileType: 'Tipo de arquivo inválido', - invalidFileTypeValue: 'Tipo de arquivo inválido: {{value}}', - loadingDocument: 'Ocorreu um problema ao carregar o documento com ID {{id}}.', - missingEmail: 'Email ausente.', - missingIDOfDocument: 'ID do documento a ser atualizado ausente.', - missingIDOfVersion: 'ID da versão ausente.', - missingRequiredData: 'Dados requeridos ausentes.', - noFilesUploaded: 'Nenhum arquivo foi carregado.', - noMatchedField: 'Não foi encontrado nenhum campo correspondente a "{{label}}"', - noUser: 'Nenhum Usuário', - notAllowedToAccessPage: 'Você não tem permissão para acessar essa página.', - notAllowedToPerformAction: 'Você não tem permissão para realizar essa ação.', - notFound: 'O recurso requisitado não foi encontrado.', - previewing: 'Ocorreu um problema ao visualizar esse documento.', - problemUploadingFile: 'Ocorreu um problema ao carregar o arquivo.', - tokenInvalidOrExpired: 'Token expirado ou inválido.', - unPublishingDocument: 'Ocorreu um problema ao despublicar esse documento', - unableToDeleteCount: 'Não é possível excluir {{count}} de {{total}} {{label}}.', - unableToUpdateCount: 'Não foi possível atualizar {{count}} de {{total}} {{label}}.', - unauthorized: 'Não autorizado. Você deve estar logado para fazer essa requisição', - unknown: 'Ocorreu um erro desconhecido.', - unspecific: 'Ocorreu um erro.', - userLocked: 'Esse usuário está bloqueado devido a muitas tentativas de login malsucedidas.', - valueMustBeUnique: 'Valor deve ser único', - verificationTokenInvalid: 'Token de verificação inválido.', - }, - fields: { - addLabel: 'Adicionar {{label}}', - addLink: 'Adicionar Link', - addNew: 'Adicionar novo', - addNewLabel: 'Adicionar novo {{label}}', - addRelationship: 'Adicionar Relação', - addUpload: 'Adicionar Upload', - block: 'bloco', - blockType: 'Tipo de bloco', - blocks: 'blocos', - chooseBetweenCustomTextOrDocument: - 'Escolha entre inserir um URL de texto personalizado ou vincular a outro documento.', - chooseDocumentToLink: 'Escolha um documento para vincular', - chooseFromExisting: 'Escolher entre os existentes', - chooseLabel: 'Escolher {{label}}', - collapseAll: 'Recolher todos', - customURL: 'URL personalizado', - editLabelData: 'Editar dados de {{label}}', - editLink: 'Editar Link', - editRelationship: 'Editar Relacionamento', - enterURL: 'Insira um URL', - internalLink: 'Link Interno', - itemsAndMore: '{{items}} e mais {{count}}', - labelRelationship: 'Relacionado a {{label}}', - latitude: 'Latitude', - linkType: 'Tipo de link', - linkedTo: 'Ligado a <0>{{label}}', - longitude: 'Longitude', - newLabel: 'Novo(a) {{label}}', - openInNewTab: 'Abrir em nova aba', - passwordsDoNotMatch: 'Senhas não coincidem.', - relatedDocument: 'Documento Relacionado', - relationTo: 'Relacionado a', - removeRelationship: 'Remover Relacionamento', - removeUpload: 'Remover Upload', - saveChanges: 'Salvar alterações', - searchForBlock: 'Procurar bloco', - selectExistingLabel: 'Selecionar {{label}} existente', - selectFieldsToEdit: 'Selecione os campos para editar', - showAll: 'Mostrar Tudo', - swapRelationship: 'Relação de Troca', - swapUpload: 'Substituir Upload', - textToDisplay: 'Texto a ser exibido', - toggleBlock: 'Alternar bloco', - uploadNewLabel: 'Carregar novo(a) {{label}}', - }, - general: { - aboutToDelete: 'Você está prestes a excluir o/a {{label}} <1>{{title}}. Tem certeza?', - aboutToDeleteCount_many: 'Você está prestes a deletar {{count}} {{label}}', - aboutToDeleteCount_one: 'Você está prestes a deletar {{count}} {{label}}', - aboutToDeleteCount_other: 'Você está prestes a deletar {{count}} {{label}}', - addBelow: 'Adicionar abaixo', - addFilter: 'Adicionar Filtro', - adminTheme: 'Tema do Admin', - and: 'E', - applyChanges: 'Aplicar alterações', - ascending: 'Ascendente', - automatic: 'Automático', - backToDashboard: 'Voltar para Painel de Controle', - cancel: 'Cancelar', - changesNotSaved: - 'Suas alterações não foram salvas. Se você sair agora, essas alterações serão perdidas.', - close: 'Fechar', - collapse: 'Recolher', - collections: 'Coleções', - columnToSort: 'Coluna para Ordenar', - columns: 'Colunas', - confirm: 'Confirmar', - confirmDeletion: 'Confirmar exclusão', - confirmDuplication: 'Confirmar duplicação', - copied: 'Copiado', - copy: 'Copiar', - create: 'Criar', - createNew: 'Criar Novo', - createNewLabel: 'Criar novo(a) {{label}}', - created: 'Criado', - createdAt: 'Criado Em', - creating: 'Criando', - creatingNewLabel: 'Criando novo(a) {{label}}', - dark: 'Escuro', - dashboard: 'Painel de Controle', - delete: 'Excluir', - deletedCountSuccessfully: 'Excluído {{count}} {{label}} com sucesso.', - deletedSuccessfully: 'Apagado com sucesso.', - deleting: 'Excluindo...', - descending: 'Decrescente', - deselectAllRows: 'Desmarcar todas as linhas', - duplicate: 'Duplicar', - duplicateWithoutSaving: 'Duplicar sem salvar alterações', - edit: 'Editar', - editLabel: 'Editar {{label}}', - editing: 'Editando', - editingLabel_many: 'Editando {{count}} {{label}}', - editingLabel_one: 'Editando {{count}} {{label}}', - editingLabel_other: 'Editando {{count}} {{label}}', - email: 'Email', - emailAddress: 'Endereço de Email', - enterAValue: 'Insira um valor', - error: 'Erro', - errors: 'Erros', - fallbackToDefaultLocale: 'Recuo para o local padrão', - filter: 'Filtro', - filterWhere: 'Filtrar {{label}} em que', - filters: 'Filtros', - globals: 'Globais', - language: 'Idioma', - lastModified: 'Última modificação', - leaveAnyway: 'Sair mesmo assim', - leaveWithoutSaving: 'Sair sem salvar', - light: 'Claro', - livePreview: 'Pré-visualização', - loading: 'Carregando', - locale: 'Local', - locales: 'Localizações', - menu: 'Cardápio', - moveDown: 'Mover para Baixo', - moveUp: 'Mover para Cima', - newPassword: 'Nova Senha', - noFiltersSet: 'Nenhum filtro definido', - noLabel: '', - noOptions: 'Sem opções', - noResults: - 'Nenhum {{label}} encontrado. Ou nenhum(a) {{label}} existe ainda, ou nenhum(a) corresponde aos filtros que você especificou acima.', - noValue: 'Nenhum valor', - none: 'Nenhum', - notFound: 'Não Encontrado', - nothingFound: 'Nada encontrado', - of: 'de', - open: 'Abrir', - or: 'Ou', - order: 'Ordem', - pageNotFound: 'Página não encontrada', - password: 'Senha', - payloadSettings: 'Configurações do Payload', - perPage: 'Itens por Página: {{limit}}', - remove: 'Remover', - reset: 'Redefinir', - row: 'Linha', - rows: 'Linhas', - save: 'Salvar', - saving: 'Salvando...', - searchBy: 'Buscar por {{label}}', - selectAll: 'Selecione tudo {{count}} {{label}}', - selectAllRows: 'Selecione todas as linhas', - selectValue: 'Selecione um valor', - selectedCount: '{{count}} {{label}} selecionado', - showAllLabel: 'Mostre todos {{label}}', - sorryNotFound: 'Desculpe—não há nada que corresponda à sua requisição.', - sort: 'Ordenar', - sortByLabelDirection: 'Ordenar por {{label}} {{direction}}', - stayOnThisPage: 'Permanecer nessa página', - submissionSuccessful: 'Envio bem-sucedido.', - submit: 'Enviar', - successfullyCreated: '{{label}} criado com sucesso.', - successfullyDuplicated: '{{label}} duplicado com sucesso.', - thisLanguage: 'Português', - titleDeleted: '{{label}} {{title}} excluído com sucesso.', - unauthorized: 'Não autorizado', - unsavedChangesDuplicate: 'Você tem mudanças não salvas. Você gostaria de continuar a duplicar?', - untitled: 'Sem título', - updatedAt: 'Atualizado Em', - updatedCountSuccessfully: 'Atualizado {{count}} {{label}} com sucesso.', - updatedSuccessfully: 'Atualizado com sucesso.', - updating: 'Atualizando', - uploading: 'Fazendo upload', - user: 'usuário', - users: 'usuários', - value: 'Valor', - welcome: 'Boas vindas', - }, - operators: { - contains: 'contém', - equals: 'igual', - exists: 'existe', - isGreaterThan: 'é maior que', - isGreaterThanOrEqualTo: 'é maior ou igual a', - isIn: 'está em', - isLessThan: 'é menor que', - isLessThanOrEqualTo: 'é menor ou igual a', - isLike: 'é como', - isNotEqualTo: 'não é igual a', - isNotIn: 'não está em', - near: 'perto', - }, - upload: { - crop: 'Cultura', - cropToolDescription: - 'Arraste as bordas da área selecionada, desenhe uma nova área ou ajuste os valores abaixo.', - dragAndDrop: 'Arraste e solte um arquivo', - dragAndDropHere: 'ou arraste um arquivo aqui', - editImage: 'Editar imagem', - fileName: 'Nome do Arquivo', - fileSize: 'Tamanho do Arquivo', - focalPoint: 'Ponto Focal', - focalPointDescription: - 'Arraste o ponto focal diretamente na pré-visualização ou ajuste os valores abaixo.', - height: 'Altura', - lessInfo: 'Ver menos', - moreInfo: 'Ver mais', - previewSizes: 'Tamanhos de Pré-visualização', - selectCollectionToBrowse: 'Selecione uma Coleção para Navegar', - selectFile: 'Selecione um arquivo', - setCropArea: 'Definir área de corte', - setFocalPoint: 'Definir ponto focal', - sizes: 'Tamanhos', - sizesFor: 'Tamanhos para {{label}}', - width: 'Largura', - }, - validation: { - emailAddress: 'Por favor, insira um endereço de email válido.', - enterNumber: 'Por favor, insira um número válido.', - fieldHasNo: 'Esse campo não contém {{label}}', - greaterThanMax: '{{value}} é maior que o máximo permitido de {{label}} que é {{max}}.', - invalidInput: 'Esse campo tem um conteúdo inválido.', - invalidSelection: 'Esse campo tem uma seleção inválida.', - invalidSelections: "'Esse campo tem as seguintes seleções inválidas:'", - lessThanMin: '{{value}} é menor que o mínimo permitido de {{label}} que é {{min}}.', - limitReached: 'Limite atingido, apenas {{max}} itens podem ser adicionados.', - longerThanMin: 'Esse valor deve ser maior do que o mínimo de {{minLength}} characters.', - notValidDate: '"{{value}}" não é uma data válida.', - required: 'Esse campo é obrigatório.', - requiresAtLeast: 'Esse campo requer no máximo {{count}} {{label}}.', - requiresNoMoreThan: 'Esse campo requer pelo menos {{count}} {{label}}.', - requiresTwoNumbers: 'Esse campo requer dois números.', - shorterThanMax: 'Esse valor deve ser menor do que o máximo de {{maxLength}} caracteres.', - trueOrFalse: 'Esse campo pode ser apenas verdadeiro (true) ou falso (false)', - validUploadID: "'Esse campo não é um ID de upload válido.'", - }, - version: { - aboutToPublishSelection: - 'Você está prestes a publicar todos os {{label}} da seleção. Tem certeza?', - aboutToRestore: - 'Você está prestes a restaurar o documento {{label}} para o estado em que ele se encontrava em {{versionDate}}.', - aboutToRestoreGlobal: - 'Você está prestes a restaurar o Global {{label}} para o estado em que ele se encontrava em {{versionDate}}.', - aboutToRevertToPublished: - 'Você está prestes a reverter as alterações desse documento para seu estado de publicação. Tem certeza?', - aboutToUnpublish: 'Você está prestes a despublicar esse documento. Tem certeza?', - aboutToUnpublishSelection: - 'Você está prestes a cancelar a publicação de todos os {{label}} na seleção. Tem certeza?', - autosave: 'Salvamento automático', - autosavedSuccessfully: 'Salvamento automático com sucesso.', - autosavedVersion: 'Versão de salvamento automático', - changed: 'Alterado', - compareVersion: 'Comparar versão com:', - confirmPublish: 'Confirmar publicação', - confirmRevertToSaved: 'Confirmar a reversão para o salvo', - confirmUnpublish: 'Confirmar despublicação', - confirmVersionRestoration: 'Confirmar Restauração de versão', - currentDocumentStatus: 'Documento {{docStatus}} atual', - draft: 'Rascunho', - draftSavedSuccessfully: 'Rascunho salvo com sucesso.', - lastSavedAgo: 'Última gravação há {{distance}}', - noFurtherVersionsFound: 'Nenhuma outra versão encontrada', - noRowsFound: 'Nenhum(a) {{label}} encontrado(a)', - preview: 'Pré-visualização', - problemRestoringVersion: 'Ocorreu um problema ao restaurar essa versão', - publish: 'Publicar', - publishChanges: 'Publicar alterações', - published: 'Publicado', - publishing: 'Publicação', - restoreThisVersion: 'Restaurar essa versão', - restoredSuccessfully: 'Restaurado com sucesso.', - restoring: 'Restaurando...', - revertToPublished: 'Reverter para publicado', - reverting: 'Revertendo...', - saveDraft: 'Salvar rascunho', - selectLocales: 'Selecione as localizações para exibir', - selectVersionToCompare: 'Selecione uma versão para comparar', - showLocales: 'Exibir localizações:', - showingVersionsFor: 'Mostrando versões para:', - status: 'Status', - type: 'Tipo', - unpublish: 'Despublicar', - unpublishing: 'Despublicando...', - version: 'Versão', - versionCount_many: '{{count}} versões encontradas', - versionCount_none: 'Nenhuma versão encontrada', - versionCount_one: '{{count}} versão encontrada', - versionCount_other: '{{count}} versões encontradas', - versionCreatedOn: '{{version}} criada em:', - versionID: 'ID da versão', - versions: 'Versões', - viewingVersion: 'Visualizando versão para o/a {{entityLabel}} {{documentTitle}}', - viewingVersionGlobal: '`Visualizando versão para o global {{entityLabel}}', - viewingVersions: 'Visualizando versões para o/a {{entityLabel}} {{documentTitle}}', - viewingVersionsGlobal: '`Visualizando versões para o global {{entityLabel}}', +import type { Language } from '../types.js' + +export const pt: Language = { + dateFNSKey: 'pt', + translations: { + authentication: { + account: 'Conta', + accountOfCurrentUser: 'Conta do usuário ativo', + alreadyActivated: 'Conta já ativada', + alreadyLoggedIn: 'Login já realizado', + apiKey: 'Chave da API', + backToLogin: 'Voltar para login', + beginCreateFirstUser: 'Para começar, crie seu primeiro usuário.', + changePassword: 'Mudar senha', + checkYourEmailForPasswordReset: + 'Verifique seu email para um link que permitirá que você redefina sua senha com segurança.', + confirmGeneration: 'Confirmar Geração', + confirmPassword: 'Confirmar Senha', + createFirstUser: 'Criar primeiro usuário', + emailNotValid: 'O email fornecido não é válido', + emailSent: 'Email Enviado', + enableAPIKey: 'Habilitar Chave API', + failedToUnlock: 'Falha ao desbloquear', + forceUnlock: 'Forçar Desbloqueio', + forgotPassword: 'Esqueci a senha', + forgotPasswordEmailInstructions: + 'Por favor, preencha seu email abaixo. Você receberá um email com instruções para gerar uma nova senha', + forgotPasswordQuestion: 'Esqueceu a senha?', + generate: 'Gerar', + generateNewAPIKey: 'Gerar nova chave API', + generatingNewAPIKeyWillInvalidate: + 'Gerar uma nova chave API <1>invalidará a chave anterior. Você tem certeza que deseja prosseguir?', + lockUntil: 'Bloquear Até', + logBackIn: 'Fazer login novamente', + logOut: 'Log out', + loggedIn: 'Para fazer login como outro usuário, você deve fazer o <0>log out antes.', + loggedInChangePassword: + 'Para mudar a sua senha, acesse a sua <0>conta e edite sua senha lá.', + loggedOutInactivity: 'Você foi desconectado devido a inatividade.', + loggedOutSuccessfully: 'Log out efetuado com sucesso.', + login: 'Login', + loginAttempts: 'Tentativas de Login', + loginUser: 'Iniciar sessão', + loginWithAnotherUser: + 'Para fazer login como outro usuário, você deve fazer o <0>log out antes.', + logout: 'Logout', + logoutUser: 'Encerrar sessão', + newAPIKeyGenerated: 'Nova Chave API Gerada.', + newAccountCreated: + 'Uma nova conta acaba de ser criada para que você possa acessar {{serverURL}} Por favor, clique no link a seguir ou cole a URL abaixo no seu navegador para verificar seu email: {{verificationURL}}
Após a verificação de email, você será capaz de fazer o login.', + newPassword: 'Nova Senha', + resetPassword: 'Redefinir Senha', + resetPasswordExpiration: 'Tempo Limite para Redefinição de Senha', + resetPasswordToken: 'Token para Redefinição de Senha', + resetYourPassword: 'Redefinir Sua Senha', + stayLoggedIn: 'Manter sessão ativa', + successfullyUnlocked: 'Desbloqueado com sucesso', + unableToVerify: 'Não foi possível verificar', + verified: 'Verificado', + verifiedSuccessfully: 'Verificado com Sucesso', + verify: 'Verificar', + verifyUser: 'Verificar Usuário', + verifyYourEmail: 'Verifique seu email', + youAreInactive: + 'Você não está ativo há algum tempo e sua sessão será automaticamente finalizada em breve, para sua própria segurança. Você gostaria de manter a sessão ativa?', + youAreReceivingResetPassword: + 'Você está recebendo essa mensagem porque você (ou outra pessoa) requisitou a redefinição de senha da sua conta. Por favor, clique no link a seguir ou cole no seu navegador para completar o processo:', + youDidNotRequestPassword: + 'Se você não fez essa requisição, por favor ignore esse email e sua senha permanecerá igual.', + }, + error: { + accountAlreadyActivated: 'Essa conta já foi ativada.', + autosaving: 'Ocorreu um problema ao salvar automaticamente esse documento.', + correctInvalidFields: 'Por favor, corrija os campos inválidos.', + deletingFile: 'Ocorreu um erro ao excluir o arquivo.', + deletingTitle: + 'Ocorreu um erro ao excluir {{title}}. Por favor, verifique sua conexão e tente novamente.', + emailOrPasswordIncorrect: 'O email ou senha fornecido está incorreto.', + followingFieldsInvalid_one: 'O campo a seguir está inválido:', + followingFieldsInvalid_other: 'Os campos a seguir estão inválidos:', + incorrectCollection: 'Coleção Incorreta', + invalidFileType: 'Tipo de arquivo inválido', + invalidFileTypeValue: 'Tipo de arquivo inválido: {{value}}', + loadingDocument: 'Ocorreu um problema ao carregar o documento com ID {{id}}.', + missingEmail: 'Email ausente.', + missingIDOfDocument: 'ID do documento a ser atualizado ausente.', + missingIDOfVersion: 'ID da versão ausente.', + missingRequiredData: 'Dados requeridos ausentes.', + noFilesUploaded: 'Nenhum arquivo foi carregado.', + noMatchedField: 'Não foi encontrado nenhum campo correspondente a "{{label}}"', + noUser: 'Nenhum Usuário', + notAllowedToAccessPage: 'Você não tem permissão para acessar essa página.', + notAllowedToPerformAction: 'Você não tem permissão para realizar essa ação.', + notFound: 'O recurso requisitado não foi encontrado.', + previewing: 'Ocorreu um problema ao visualizar esse documento.', + problemUploadingFile: 'Ocorreu um problema ao carregar o arquivo.', + tokenInvalidOrExpired: 'Token expirado ou inválido.', + unPublishingDocument: 'Ocorreu um problema ao despublicar esse documento', + unableToDeleteCount: 'Não é possível excluir {{count}} de {{total}} {{label}}.', + unableToUpdateCount: 'Não foi possível atualizar {{count}} de {{total}} {{label}}.', + unauthorized: 'Não autorizado. Você deve estar logado para fazer essa requisição', + unknown: 'Ocorreu um erro desconhecido.', + unspecific: 'Ocorreu um erro.', + userLocked: 'Esse usuário está bloqueado devido a muitas tentativas de login malsucedidas.', + valueMustBeUnique: 'Valor deve ser único', + verificationTokenInvalid: 'Token de verificação inválido.', + }, + fields: { + addLabel: 'Adicionar {{label}}', + addLink: 'Adicionar Link', + addNew: 'Adicionar novo', + addNewLabel: 'Adicionar novo {{label}}', + addRelationship: 'Adicionar Relação', + addUpload: 'Adicionar Upload', + block: 'bloco', + blockType: 'Tipo de bloco', + blocks: 'blocos', + chooseBetweenCustomTextOrDocument: + 'Escolha entre inserir um URL de texto personalizado ou vincular a outro documento.', + chooseDocumentToLink: 'Escolha um documento para vincular', + chooseFromExisting: 'Escolher entre os existentes', + chooseLabel: 'Escolher {{label}}', + collapseAll: 'Recolher todos', + customURL: 'URL personalizado', + editLabelData: 'Editar dados de {{label}}', + editLink: 'Editar Link', + editRelationship: 'Editar Relacionamento', + enterURL: 'Insira um URL', + internalLink: 'Link Interno', + itemsAndMore: '{{items}} e mais {{count}}', + labelRelationship: 'Relacionado a {{label}}', + latitude: 'Latitude', + linkType: 'Tipo de link', + linkedTo: 'Ligado a <0>{{label}}', + longitude: 'Longitude', + newLabel: 'Novo(a) {{label}}', + openInNewTab: 'Abrir em nova aba', + passwordsDoNotMatch: 'Senhas não coincidem.', + relatedDocument: 'Documento Relacionado', + relationTo: 'Relacionado a', + removeRelationship: 'Remover Relacionamento', + removeUpload: 'Remover Upload', + saveChanges: 'Salvar alterações', + searchForBlock: 'Procurar bloco', + selectExistingLabel: 'Selecionar {{label}} existente', + selectFieldsToEdit: 'Selecione os campos para editar', + showAll: 'Mostrar Tudo', + swapRelationship: 'Relação de Troca', + swapUpload: 'Substituir Upload', + textToDisplay: 'Texto a ser exibido', + toggleBlock: 'Alternar bloco', + uploadNewLabel: 'Carregar novo(a) {{label}}', + }, + general: { + aboutToDelete: 'Você está prestes a excluir o/a {{label}} <1>{{title}}. Tem certeza?', + aboutToDeleteCount_many: 'Você está prestes a deletar {{count}} {{label}}', + aboutToDeleteCount_one: 'Você está prestes a deletar {{count}} {{label}}', + aboutToDeleteCount_other: 'Você está prestes a deletar {{count}} {{label}}', + addBelow: 'Adicionar abaixo', + addFilter: 'Adicionar Filtro', + adminTheme: 'Tema do Admin', + and: 'E', + applyChanges: 'Aplicar alterações', + ascending: 'Ascendente', + automatic: 'Automático', + backToDashboard: 'Voltar para Painel de Controle', + cancel: 'Cancelar', + changesNotSaved: + 'Suas alterações não foram salvas. Se você sair agora, essas alterações serão perdidas.', + close: 'Fechar', + collapse: 'Recolher', + collections: 'Coleções', + columnToSort: 'Coluna para Ordenar', + columns: 'Colunas', + confirm: 'Confirmar', + confirmDeletion: 'Confirmar exclusão', + confirmDuplication: 'Confirmar duplicação', + copied: 'Copiado', + copy: 'Copiar', + create: 'Criar', + createNew: 'Criar Novo', + createNewLabel: 'Criar novo(a) {{label}}', + created: 'Criado', + createdAt: 'Criado Em', + creating: 'Criando', + creatingNewLabel: 'Criando novo(a) {{label}}', + dark: 'Escuro', + dashboard: 'Painel de Controle', + delete: 'Excluir', + deletedCountSuccessfully: 'Excluído {{count}} {{label}} com sucesso.', + deletedSuccessfully: 'Apagado com sucesso.', + deleting: 'Excluindo...', + descending: 'Decrescente', + deselectAllRows: 'Desmarcar todas as linhas', + duplicate: 'Duplicar', + duplicateWithoutSaving: 'Duplicar sem salvar alterações', + edit: 'Editar', + editLabel: 'Editar {{label}}', + editing: 'Editando', + editingLabel_many: 'Editando {{count}} {{label}}', + editingLabel_one: 'Editando {{count}} {{label}}', + editingLabel_other: 'Editando {{count}} {{label}}', + email: 'Email', + emailAddress: 'Endereço de Email', + enterAValue: 'Insira um valor', + error: 'Erro', + errors: 'Erros', + fallbackToDefaultLocale: 'Recuo para o local padrão', + filter: 'Filtro', + filterWhere: 'Filtrar {{label}} em que', + filters: 'Filtros', + globals: 'Globais', + language: 'Idioma', + lastModified: 'Última modificação', + leaveAnyway: 'Sair mesmo assim', + leaveWithoutSaving: 'Sair sem salvar', + light: 'Claro', + livePreview: 'Pré-visualização', + loading: 'Carregando', + locale: 'Local', + locales: 'Localizações', + menu: 'Cardápio', + moveDown: 'Mover para Baixo', + moveUp: 'Mover para Cima', + newPassword: 'Nova Senha', + noFiltersSet: 'Nenhum filtro definido', + noLabel: '', + noOptions: 'Sem opções', + noResults: + 'Nenhum {{label}} encontrado. Ou nenhum(a) {{label}} existe ainda, ou nenhum(a) corresponde aos filtros que você especificou acima.', + noValue: 'Nenhum valor', + none: 'Nenhum', + notFound: 'Não Encontrado', + nothingFound: 'Nada encontrado', + of: 'de', + open: 'Abrir', + or: 'Ou', + order: 'Ordem', + pageNotFound: 'Página não encontrada', + password: 'Senha', + payloadSettings: 'Configurações do Payload', + perPage: 'Itens por Página: {{limit}}', + remove: 'Remover', + reset: 'Redefinir', + row: 'Linha', + rows: 'Linhas', + save: 'Salvar', + saving: 'Salvando...', + searchBy: 'Buscar por {{label}}', + selectAll: 'Selecione tudo {{count}} {{label}}', + selectAllRows: 'Selecione todas as linhas', + selectValue: 'Selecione um valor', + selectedCount: '{{count}} {{label}} selecionado', + showAllLabel: 'Mostre todos {{label}}', + sorryNotFound: 'Desculpe—não há nada que corresponda à sua requisição.', + sort: 'Ordenar', + sortByLabelDirection: 'Ordenar por {{label}} {{direction}}', + stayOnThisPage: 'Permanecer nessa página', + submissionSuccessful: 'Envio bem-sucedido.', + submit: 'Enviar', + successfullyCreated: '{{label}} criado com sucesso.', + successfullyDuplicated: '{{label}} duplicado com sucesso.', + thisLanguage: 'Português', + titleDeleted: '{{label}} {{title}} excluído com sucesso.', + unauthorized: 'Não autorizado', + unsavedChangesDuplicate: + 'Você tem mudanças não salvas. Você gostaria de continuar a duplicar?', + untitled: 'Sem título', + updatedAt: 'Atualizado Em', + updatedCountSuccessfully: 'Atualizado {{count}} {{label}} com sucesso.', + updatedSuccessfully: 'Atualizado com sucesso.', + updating: 'Atualizando', + uploading: 'Fazendo upload', + user: 'usuário', + users: 'usuários', + value: 'Valor', + welcome: 'Boas vindas', + }, + operators: { + contains: 'contém', + equals: 'igual', + exists: 'existe', + isGreaterThan: 'é maior que', + isGreaterThanOrEqualTo: 'é maior ou igual a', + isIn: 'está em', + isLessThan: 'é menor que', + isLessThanOrEqualTo: 'é menor ou igual a', + isLike: 'é como', + isNotEqualTo: 'não é igual a', + isNotIn: 'não está em', + near: 'perto', + }, + upload: { + crop: 'Cultura', + cropToolDescription: + 'Arraste as bordas da área selecionada, desenhe uma nova área ou ajuste os valores abaixo.', + dragAndDrop: 'Arraste e solte um arquivo', + dragAndDropHere: 'ou arraste um arquivo aqui', + editImage: 'Editar imagem', + fileName: 'Nome do Arquivo', + fileSize: 'Tamanho do Arquivo', + focalPoint: 'Ponto Focal', + focalPointDescription: + 'Arraste o ponto focal diretamente na pré-visualização ou ajuste os valores abaixo.', + height: 'Altura', + lessInfo: 'Ver menos', + moreInfo: 'Ver mais', + previewSizes: 'Tamanhos de Pré-visualização', + selectCollectionToBrowse: 'Selecione uma Coleção para Navegar', + selectFile: 'Selecione um arquivo', + setCropArea: 'Definir área de corte', + setFocalPoint: 'Definir ponto focal', + sizes: 'Tamanhos', + sizesFor: 'Tamanhos para {{label}}', + width: 'Largura', + }, + validation: { + emailAddress: 'Por favor, insira um endereço de email válido.', + enterNumber: 'Por favor, insira um número válido.', + fieldHasNo: 'Esse campo não contém {{label}}', + greaterThanMax: '{{value}} é maior que o máximo permitido de {{label}} que é {{max}}.', + invalidInput: 'Esse campo tem um conteúdo inválido.', + invalidSelection: 'Esse campo tem uma seleção inválida.', + invalidSelections: "'Esse campo tem as seguintes seleções inválidas:'", + lessThanMin: '{{value}} é menor que o mínimo permitido de {{label}} que é {{min}}.', + limitReached: 'Limite atingido, apenas {{max}} itens podem ser adicionados.', + longerThanMin: 'Esse valor deve ser maior do que o mínimo de {{minLength}} characters.', + notValidDate: '"{{value}}" não é uma data válida.', + required: 'Esse campo é obrigatório.', + requiresAtLeast: 'Esse campo requer no máximo {{count}} {{label}}.', + requiresNoMoreThan: 'Esse campo requer pelo menos {{count}} {{label}}.', + requiresTwoNumbers: 'Esse campo requer dois números.', + shorterThanMax: 'Esse valor deve ser menor do que o máximo de {{maxLength}} caracteres.', + trueOrFalse: 'Esse campo pode ser apenas verdadeiro (true) ou falso (false)', + validUploadID: "'Esse campo não é um ID de upload válido.'", + }, + version: { + type: 'Tipo', + aboutToPublishSelection: + 'Você está prestes a publicar todos os {{label}} da seleção. Tem certeza?', + aboutToRestore: + 'Você está prestes a restaurar o documento {{label}} para o estado em que ele se encontrava em {{versionDate}}.', + aboutToRestoreGlobal: + 'Você está prestes a restaurar o Global {{label}} para o estado em que ele se encontrava em {{versionDate}}.', + aboutToRevertToPublished: + 'Você está prestes a reverter as alterações desse documento para seu estado de publicação. Tem certeza?', + aboutToUnpublish: 'Você está prestes a despublicar esse documento. Tem certeza?', + aboutToUnpublishSelection: + 'Você está prestes a cancelar a publicação de todos os {{label}} na seleção. Tem certeza?', + autosave: 'Salvamento automático', + autosavedSuccessfully: 'Salvamento automático com sucesso.', + autosavedVersion: 'Versão de salvamento automático', + changed: 'Alterado', + compareVersion: 'Comparar versão com:', + confirmPublish: 'Confirmar publicação', + confirmRevertToSaved: 'Confirmar a reversão para o salvo', + confirmUnpublish: 'Confirmar despublicação', + confirmVersionRestoration: 'Confirmar Restauração de versão', + currentDocumentStatus: 'Documento {{docStatus}} atual', + draft: 'Rascunho', + draftSavedSuccessfully: 'Rascunho salvo com sucesso.', + lastSavedAgo: 'Última gravação há {{distance}}', + noFurtherVersionsFound: 'Nenhuma outra versão encontrada', + noRowsFound: 'Nenhum(a) {{label}} encontrado(a)', + preview: 'Pré-visualização', + problemRestoringVersion: 'Ocorreu um problema ao restaurar essa versão', + publish: 'Publicar', + publishChanges: 'Publicar alterações', + published: 'Publicado', + publishing: 'Publicação', + restoreThisVersion: 'Restaurar essa versão', + restoredSuccessfully: 'Restaurado com sucesso.', + restoring: 'Restaurando...', + revertToPublished: 'Reverter para publicado', + reverting: 'Revertendo...', + saveDraft: 'Salvar rascunho', + selectLocales: 'Selecione as localizações para exibir', + selectVersionToCompare: 'Selecione uma versão para comparar', + showLocales: 'Exibir localizações:', + showingVersionsFor: 'Mostrando versões para:', + status: 'Status', + unpublish: 'Despublicar', + unpublishing: 'Despublicando...', + version: 'Versão', + versionCount_many: '{{count}} versões encontradas', + versionCount_none: 'Nenhuma versão encontrada', + versionCount_one: '{{count}} versão encontrada', + versionCount_other: '{{count}} versões encontradas', + versionCreatedOn: '{{version}} criada em:', + versionID: 'ID da versão', + versions: 'Versões', + viewingVersion: 'Visualizando versão para o/a {{entityLabel}} {{documentTitle}}', + viewingVersionGlobal: '`Visualizando versão para o global {{entityLabel}}', + viewingVersions: 'Visualizando versões para o/a {{entityLabel}} {{documentTitle}}', + viewingVersionsGlobal: '`Visualizando versões para o global {{entityLabel}}', + }, }, } diff --git a/packages/translations/src/languages/ro.ts b/packages/translations/src/languages/ro.ts index d4e7bd0d19..18149f9653 100644 --- a/packages/translations/src/languages/ro.ts +++ b/packages/translations/src/languages/ro.ts @@ -1,398 +1,403 @@ -export default { - authentication: { - account: 'Cont', - accountOfCurrentUser: 'Contul utilizatorului curent', - alreadyActivated: 'Deja activat', - alreadyLoggedIn: 'Deja autorizat', - apiKey: 'Cheia API', - backToLogin: 'Înapoi la login', - beginCreateFirstUser: 'Pentru a începe, creați primul utilizator.', - changePassword: 'Schimbați parola', - checkYourEmailForPasswordReset: - 'Verificați emailul pentru un link care vă va permite să vă resetați parola în siguranță.', - confirmGeneration: 'Confirmați generarea', - confirmPassword: 'Confirmați parola', - createFirstUser: 'Creați primul utilizator', - emailNotValid: 'Emailul furnizat nu este valid', - emailSent: 'Email trimis', - enableAPIKey: 'Activați cheia API', - failedToUnlock: 'Nu s-a reușit deblocarea', - forceUnlock: 'Forțați deblocarea', - forgotPassword: 'Am uitat parola', - forgotPasswordEmailInstructions: - 'Vă rugăm să introduceți emailul dumneavoastră mai jos. Veți primi un mesaj de email cu instrucțiuni despre cum să vă resetați parola.', - forgotPasswordQuestion: 'Ați uitat parola?', - generate: 'Generează', - generateNewAPIKey: 'Generează o nouă cheie API', - generatingNewAPIKeyWillInvalidate: - 'Generarea unei noi chei API va <1>invalida cheia anterioară. Sunteți sigur că doriți să continuați?', - lockUntil: 'Blocați până la', - logBackIn: 'Autentificați-vă din nou', - logOut: 'Deconectează-te', - loggedIn: - 'Pentru a vă autentifica cu un alt utilizator, trebuie să vă <0>deconectați mai întâi.', - loggedInChangePassword: - 'Pentru a vă schimba parola, accesați <0>contul și editați-vă parola acolo.', - loggedOutInactivity: 'Ați fost deconectat din cauza inactivității.', - loggedOutSuccessfully: 'Ați fost deconectat cu succes.', - login: 'Autentificare', - loginAttempts: 'Încercări de autentificare', - loginUser: 'Autentificare utilizator', - loginWithAnotherUser: - 'Pentru a vă autentifica cu un alt utilizator, trebuie să vă <0>deconectați mai întâi.', - logout: 'Ieșire', - logoutUser: 'Deconectați utilizatorul', - newAPIKeyGenerated: 'Cheie nouă API generată.', - newAccountCreated: - 'A fost creat un nou cont pe care îl puteți accesa {{serverURL}} Vă rugăm să intrați pe următorul link sau să copiați URL-ul de mai jos în browserul dvs. pentru a vă verifica emailul: {{verificationURL}}
După ce vă verificați adresa de email, vă veți putea autentifica cu succes.', - newPassword: 'Parolă nouă', - resetPassword: 'Resetează parola', - resetPasswordExpiration: 'Resetați expirarea parolei', - resetPasswordToken: 'Resetați token-ul parolei', - resetYourPassword: 'Resetați-vă parola', - stayLoggedIn: 'Rămâneți conectat', - successfullyUnlocked: 'Deblocat cu succes', - unableToVerify: 'Nu se poate verifica', - verified: 'Verificat', - verifiedSuccessfully: 'Verificat cu succes', - verify: 'Verifică', - verifyUser: 'Verifică utilizatorul', - verifyYourEmail: 'Verifică-ți emailul', - youAreInactive: - 'Nu ați mai fost activ de ceva timp și în scurt timp veți fi deconectat automat pentru propria dvs. securitate. Doriți să rămâneți conectat(ă)?', - youAreReceivingResetPassword: - 'Primiți acest mesaj deoarece dumneavoastră (sau altcineva) ați solicitat resetarea parolei pentru contul dumneavoastră. Vă rugăm să dați clic pe următorul link sau să îl copiați în browserul dvs. pentru a finaliza procesul:', - youDidNotRequestPassword: - 'Dacă nu ați solicitat acest lucru, vă rugăm să ignorați acest email și parola dvs. va rămâne neschimbată.', - }, - error: { - accountAlreadyActivated: 'Acest cont a fost deja activat.', - autosaving: 'A existat o problemă în timpul salvării automate a acestui document.', - correctInvalidFields: 'Vă rugăm să corectați datele invalide.', - deletingFile: 'S-a produs o eroare la ștergerea fișierului.', - deletingTitle: - 'S-a produs o eroare în timpul ștergerii {{title}}. Vă rugăm să verificați conexiunea și să încercați din nou.', - emailOrPasswordIncorrect: 'Adresa de e-mail sau parola este incorectă.', - followingFieldsInvalid_one: 'Următorul câmp nu este valid:', - followingFieldsInvalid_other: 'Următoarele câmpuri nu sunt valabile:', - incorrectCollection: 'Colecție incorectă', - invalidFileType: 'Tip de fișier invalid', - invalidFileTypeValue: 'Tip de fișier invalid: {{value}}', - loadingDocument: 'A existat o problemă la încărcarea documentului cu ID-ul de {{id}}.', - missingEmail: 'Lipsește emailul.', - missingIDOfDocument: 'Lipsește ID-ul documentului care trebuie actualizat.', - missingIDOfVersion: 'Lipsește ID-ul versiunii.', - missingRequiredData: 'Lipsesc datele necesare.', - noFilesUploaded: 'Nu a fost încărcat niciun fișier.', - noMatchedField: 'Nu s-a găsit niciun câmp corespunzător pentru "{{label}}"', - noUser: 'Nici un utilizator', - notAllowedToAccessPage: 'Nu aveți voie să accesați această pagină.', - notAllowedToPerformAction: 'Nu aveți voie să efectuați această acțiune.', - notFound: 'Resursa solicitată nu a fost găsită.', - previewing: 'A existat o problemă la previzualizarea acestui document.', - problemUploadingFile: 'A existat o problemă în timpul încărcării fișierului.', - tokenInvalidOrExpired: 'Tokenul este invalid sau a expirat.', - unPublishingDocument: 'A existat o problemă în timpul nepublicării acestui document.', - unableToDeleteCount: 'Nu se poate șterge {{count}} din {{total}} {{label}}.', - unableToUpdateCount: 'Nu se poate șterge {{count}} din {{total}} {{label}}.', - unauthorized: 'neautorizat, trebuie să vă conectați pentru a face această cerere.', - unknown: 'S-a produs o eroare necunoscută.', - unspecific: 'S-a produs o eroare.', - userLocked: - 'Acest utilizator este blocat din cauza unui număr prea mare de încercări de autentificare eșuate.', - valueMustBeUnique: 'Valoarea trebuie să fie unică', - verificationTokenInvalid: 'Tokenul de verificare este invalid.', - }, - fields: { - addLabel: 'Adăugați {{label}}', - addLink: 'Adăugați un link', - addNew: 'Adăugați un nou', - addNewLabel: 'Adăugați un nou {{label}}', - addRelationship: 'Adăugați o relație', - addUpload: 'Adăugați un fișier', - block: 'bloc', - blockType: 'Tip de bloc', - blocks: 'Blocuri', - chooseBetweenCustomTextOrDocument: - 'Alegeți între a introduce un text URL personalizat sau a crea un link către un alt document.', - chooseDocumentToLink: 'Alegeți un document către care să creați un link', - chooseFromExisting: 'Alegeți dintre cele existente', - chooseLabel: 'Alege {{label}}', - collapseAll: 'Colapsează toate', - customURL: 'URL personalizat', - editLabelData: 'Editați {{label}}', - editLink: 'Editați Link-ul', - editRelationship: 'Editați relația', - enterURL: 'Introduceți un URL', - internalLink: 'Link intern', - itemsAndMore: '{{items}} şi {{count}} mai multe', - labelRelationship: 'Relația cu {{label}}', - latitude: 'Latitudine', - linkType: 'Tip de link', - linkedTo: 'Legat de <0>{{label}}', - longitude: 'Longitudine', - newLabel: 'Nou {{label}}', - openInNewTab: 'Deschideți în tab nou', - passwordsDoNotMatch: 'Parolele nu corespund.', - relatedDocument: 'Document asociat', - relationTo: 'Relație cu', - removeRelationship: 'Eliminați relația', - removeUpload: 'Eliminați încărcarea', - saveChanges: 'Salvați modificările', - searchForBlock: 'Căutați un bloc', - selectExistingLabel: 'Selectați existent {{label}}', - selectFieldsToEdit: 'Selectați câmpurile de editat', - showAll: 'Afișați toate', - swapRelationship: 'Schimbați relația', - swapUpload: 'Schimbați Încărcarea', - textToDisplay: 'Text de afișat', - toggleBlock: 'Toggle bloc', - uploadNewLabel: 'Încărcați un nou {{label}}', - }, - general: { - aboutToDelete: 'Sunteți pe cale să ștergeți {{label}} <1>{{title}}. Sunteți sigur?', - aboutToDeleteCount_many: 'Sunteți pe cale să ștergeți {{count}} {{label}}', - aboutToDeleteCount_one: 'Sunteți pe cale să ștergeți {{count}} {{label}}', - aboutToDeleteCount_other: 'Sunteți pe cale să ștergeți {{count}} {{label}}', - addBelow: 'Adaugă mai jos', - addFilter: 'Adaugă filtru', - adminTheme: 'Tema Admin', - and: 'Şi', - applyChanges: 'Aplicați modificările', - ascending: 'Ascendant', - automatic: 'Automat', - backToDashboard: 'Înapoi la panoul de bord', - cancel: 'Anulați', - changesNotSaved: - 'Modificările dvs. nu au fost salvate. Dacă plecați acum, vă veți pierde modificările.', - close: 'Închide', - collapse: 'Colaps', - collections: 'Colecții', - columnToSort: 'Coloana de sortat', - columns: 'Coloane', - confirm: 'Confirmați', - confirmDeletion: 'Confirmați ștergerea', - confirmDuplication: 'Confirmați duplicarea', - copied: 'Copiat', - copy: 'Copiați', - create: 'Creează', - createNew: 'Creați unul nou', - createNewLabel: 'Creați un nou {{label}}', - created: 'Creat', - createdAt: 'Creat la', - creating: 'Creare', - creatingNewLabel: 'Crearea unui nou {{label}}', - dark: 'Dark', - dashboard: 'Panoul de bord', - delete: 'Șterge', - deletedCountSuccessfully: 'Șterse cu succes {{count}} {{label}}.', - deletedSuccessfully: 'Șters cu succes.', - deleting: 'Deleting...', - descending: 'Descendentă', - deselectAllRows: 'Deselectează toate rândurile', - duplicate: 'Duplicați', - duplicateWithoutSaving: 'Duplicați fără salvarea modificărilor', - edit: 'Editează', - editLabel: 'Editați {{label}}', - editing: 'Editare', - editingLabel_many: 'Editare {{count}} {{label}}', - editingLabel_one: 'Editare {{count}} {{label}}', - editingLabel_other: 'Editare {{count}} {{label}}', - email: 'Email', - emailAddress: 'Adresa de email', - enterAValue: 'Introduceți o valoare', - error: 'Eroare', - errors: 'Erori', - fallbackToDefaultLocale: 'Revenire la locația implicită', - filter: 'Filtru', - filterWhere: 'Filtrează {{label}} unde', - filters: 'Filtre', - globals: 'Globale', - language: 'Limba', - lastModified: 'Ultima modificare', - leaveAnyway: 'Pleacă oricum', - leaveWithoutSaving: 'Plecare fără a salva', - light: 'Light', - livePreview: 'Previzualizare', - loading: 'Încărcare', - locale: 'Localitate', - locales: 'Localuri', - menu: 'Meniu', - moveDown: 'Mutați în jos', - moveUp: 'Mutați în sus', - newPassword: 'Parolă nouă', - noFiltersSet: 'Nici un filtru setat', - noLabel: '', - noOptions: 'Fără opțiuni', - noResults: - 'Nici un {{label}} găsit. Fie nu există încă niciun {{label}}, fie niciunul nu se potrivește cu filtrele pe care le-ați specificat mai sus..', - noValue: 'Nici o valoare', - none: 'Nici unul', - notFound: 'Nu a fost găsit', - nothingFound: 'Nimic găsit', - of: 'de', - open: 'Deschide', - or: 'Sau', - order: 'ORdine', - pageNotFound: 'Pagina nu a fost găsită', - password: 'Parola', - payloadSettings: 'Setări de Payload', - perPage: 'Pe pagină: {{limit}}', - remove: 'Eliminați', - reset: 'Resetare', - row: 'Rând', - rows: 'Rânduri', - save: 'Salvează', - saving: 'Salvare...', - searchBy: 'Căutați după {{label}}', - selectAll: 'Selectați toate {{count}} {{label}}', - selectAllRows: 'Selectează toate rândurile', - selectValue: 'Selectați o valoare', - selectedCount: '{{count}} {{label}} selectate', - showAllLabel: 'Afișează toate {{eticheta}}', - sorryNotFound: 'Ne pare rău - nu există nimic care să corespundă cu cererea dvs.', - sort: 'Sortează', - sortByLabelDirection: 'Sortează după {{etichetă}} {{direcţie}}', - stayOnThisPage: 'Rămâneți pe această pagină', - submissionSuccessful: 'Trimitere cu succes.', - submit: 'Trimite', - successfullyCreated: '{{label}} creat(ă) cu succes.', - successfullyDuplicated: '{{label}} duplicat(ă) cu succes.', - thisLanguage: 'Română', - titleDeleted: '{{label}} "{{title}}" șters cu succes.', - unauthorized: 'neautorizat(ă)', - unsavedChangesDuplicate: 'Aveți modificări nesalvate. Doriți să continuați să duplicați?', - untitled: 'Fără titlu', - updatedAt: 'Actualizat la', - updatedCountSuccessfully: 'Actualizate {{count}} {{label}} cu succes.', - updatedSuccessfully: 'Actualizat cu succes.', - updating: 'Actualizare', - uploading: 'Încărcare', - user: 'Utilizator', - users: 'Utilizatori', - value: 'Valoare', - welcome: 'Bine ați venit', - }, - operators: { - contains: 'conține', - equals: 'egal cu', - exists: 'există', - isGreaterThan: 'este mai mare decât', - isGreaterThanOrEqualTo: 'este mai mare sau egal cu', - isIn: 'este în', - isLessThan: 'este mai mic decât', - isLessThanOrEqualTo: 'este mai mic decât sau egal cu', - isLike: 'este ca', - isNotEqualTo: 'nu este egal cu', - isNotIn: 'nu este în', - near: 'în apropiere de', - }, - upload: { - crop: 'Cultură', - cropToolDescription: - 'Trageți colțurile zonei selectate, desenați o nouă zonă sau ajustați valorile de mai jos.', - dragAndDrop: 'Trageți și plasați un fișier', - dragAndDropHere: 'sau trageți și plasați un fișier aici', - editImage: 'Editează imaginea', - fileName: 'Numele fișierului', - fileSize: 'Dimensiunea fișierului', - focalPoint: 'Punct central', - focalPointDescription: - 'Trageți punctul focal direct pe previzualizare sau ajustați valorile de mai jos.', - height: 'Înălțime', - lessInfo: 'Mai puține informații', - moreInfo: 'Mai multe informații', - previewSizes: 'Dimensiuni Previzualizare', - selectCollectionToBrowse: 'Selectați o colecție pentru navigare', - selectFile: 'Selectați un fișier', - setCropArea: 'Setați zona de decupare', - setFocalPoint: 'Setează punctul focal', - sizes: 'Dimensiuni', - sizesFor: 'Mărimi pentru {{label}}', - width: 'Lățime', - }, - validation: { - emailAddress: 'Vă rugăm să introduceți o adresă de email validă.', - enterNumber: 'Vă rugăm să introduceți un număr valid.', - fieldHasNo: 'Acest câmp nu are un {{label}}', - greaterThanMax: - '{{value}} este mai mare decât valoarea maximă permisă pentru {{label}} de {{max}}.', - invalidInput: 'Acest câmp are o intrare invalidă.', - invalidSelection: 'Acest câmp are o selecție invalidă.', - invalidSelections: 'Acest câmp are următoarele selecții invalide:', - lessThanMin: - '{{value}} este mai mic decât valoarea minimă permisă pentru {{label}} de {{min}}.', - limitReached: 'Limita atinsă, doar {{max}} elemente pot fi adăugate.', - longerThanMin: - 'Această valoare trebuie să fie mai mare decât lungimea minimă de {{minLength}} caractere.', - notValidDate: '"{{value}}" nu este o dată valabilă.', - required: 'Acest câmp este obligatoriu.', - requiresAtLeast: 'Acest domeniu necesită cel puțin {{count}} {{label}}.', - requiresNoMoreThan: 'Acest câmp nu necesită mai mult de {{count}} {{label}}.', - requiresTwoNumbers: 'Acest câmp necesită două numere.', - shorterThanMax: - 'Această valoare trebuie să fie mai scurtă decât lungimea maximă de {{maxLength}} caractere.', - trueOrFalse: 'Acest câmp poate fi doar egal cu true sau false.', - validUploadID: 'Acest câmp nu este un ID de încărcare valid.', - }, - version: { - aboutToPublishSelection: - 'Sunteți pe cale să publicați toate {{label}} din selecție. Sunteți sigur?', - aboutToRestore: - 'Sunteți pe cale să readuceți acest document {{label}} în starea în care se afla la data de {{versionDate}}.', - aboutToRestoreGlobal: - 'Sunteți pe cale să readuceți {{label}} global în starea în care se afla la data de {{versionDate}}.', - aboutToRevertToPublished: - 'Sunteți pe cale să readuceți modificările aduse acestui document la starea sa publicată. Sunteți sigur?', - aboutToUnpublish: 'Sunteți pe cale să nepublicați acest document. Sunteți sigur?', - aboutToUnpublishSelection: - 'Sunteți pe punctul de a nepublica toate {{label}} din selecție. Sunteți sigur?', - autosave: 'Autosalvare', - autosavedSuccessfully: 'Autosalvare cu succes.', - autosavedVersion: 'Versiunea salvată automat.', - changed: 'Schimbat', - compareVersion: 'Comparați versiunea cu:', - confirmPublish: 'Confirmați publicarea', - confirmRevertToSaved: 'Confirmați revenirea la starea salvată', - confirmUnpublish: 'Confirmați nepublicarea', - confirmVersionRestoration: 'Confirmați restaurarea versiunii', - currentDocumentStatus: 'Documentul {{docStatus}} curent', - draft: 'Proiect', - draftSavedSuccessfully: 'Proiect salvat cu succes.', - lastSavedAgo: 'Ultima salvare acum {{distance}}', - noFurtherVersionsFound: 'Nu s-au găsit alte versiuni', - noRowsFound: 'Nu s-a găsit niciun {{label}}', - preview: 'Previzualizare', - problemRestoringVersion: 'A existat o problemă la restaurarea acestei versiuni', - publish: 'Publicați', - publishChanges: 'Publicați modificările', - published: 'Publicat', - publishin: 'Publicare', - restoreThisVersion: 'Restaurați această versiune', - restoredSuccessfully: 'Restaurat cu succes.', - restoring: 'Restaurare...', - revertToPublished: 'Reveniți la publicat', - reverting: 'Revenire...', - saveDraft: 'Salvați proiectul', - selectLocales: 'Selectați localitățile de afișat', - selectVersionToCompare: 'Selectați o versiune pentru a compara', - showLocales: 'Afișați localitățile:', - showingVersionsFor: 'Se afișează versiuni pentru:', - status: 'Status', - type: 'Tip', - unpublish: 'Dezpublicare', - unpublishing: 'Dezpublicare...', - version: 'Versiune', - versionCount_many: '{{count}} versiuni găsite', - versionCount_none: 'Nici o versiune găsită', - versionCount_one: '{{count}} versiune găsită', - versionCount_other: '{{count}} versiuni găsite', - versionCreatedOn: '{{version}} creată pe:', - versionID: 'ID-ul versiunii', - versions: 'Versiuni', - viewingVersion: 'Vizualizarea versiunii pentru {{entityLabel}} {{documentTitle}}', - viewingVersionGlobal: 'Vizualizarea versiunii pentru globala {{entityLabel}}', - viewingVersions: 'Vizualizarea versiunilor pentru {{entityLabel}} {{documentTitle}}', - viewingVersionsGlobal: 'Vizualizarea versiunilor pentru globala {{entityLabel}}', +import type { Language } from '../types.js' + +export const ro: Language = { + dateFNSKey: 'ro', + translations: { + authentication: { + account: 'Cont', + accountOfCurrentUser: 'Contul utilizatorului curent', + alreadyActivated: 'Deja activat', + alreadyLoggedIn: 'Deja autorizat', + apiKey: 'Cheia API', + backToLogin: 'Înapoi la login', + beginCreateFirstUser: 'Pentru a începe, creați primul utilizator.', + changePassword: 'Schimbați parola', + checkYourEmailForPasswordReset: + 'Verificați emailul pentru un link care vă va permite să vă resetați parola în siguranță.', + confirmGeneration: 'Confirmați generarea', + confirmPassword: 'Confirmați parola', + createFirstUser: 'Creați primul utilizator', + emailNotValid: 'Emailul furnizat nu este valid', + emailSent: 'Email trimis', + enableAPIKey: 'Activați cheia API', + failedToUnlock: 'Nu s-a reușit deblocarea', + forceUnlock: 'Forțați deblocarea', + forgotPassword: 'Am uitat parola', + forgotPasswordEmailInstructions: + 'Vă rugăm să introduceți emailul dumneavoastră mai jos. Veți primi un mesaj de email cu instrucțiuni despre cum să vă resetați parola.', + forgotPasswordQuestion: 'Ați uitat parola?', + generate: 'Generează', + generateNewAPIKey: 'Generează o nouă cheie API', + generatingNewAPIKeyWillInvalidate: + 'Generarea unei noi chei API va <1>invalida cheia anterioară. Sunteți sigur că doriți să continuați?', + lockUntil: 'Blocați până la', + logBackIn: 'Autentificați-vă din nou', + logOut: 'Deconectează-te', + loggedIn: + 'Pentru a vă autentifica cu un alt utilizator, trebuie să vă <0>deconectați mai întâi.', + loggedInChangePassword: + 'Pentru a vă schimba parola, accesați <0>contul și editați-vă parola acolo.', + loggedOutInactivity: 'Ați fost deconectat din cauza inactivității.', + loggedOutSuccessfully: 'Ați fost deconectat cu succes.', + login: 'Autentificare', + loginAttempts: 'Încercări de autentificare', + loginUser: 'Autentificare utilizator', + loginWithAnotherUser: + 'Pentru a vă autentifica cu un alt utilizator, trebuie să vă <0>deconectați mai întâi.', + logout: 'Ieșire', + logoutUser: 'Deconectați utilizatorul', + newAPIKeyGenerated: 'Cheie nouă API generată.', + newAccountCreated: + 'A fost creat un nou cont pe care îl puteți accesa {{serverURL}} Vă rugăm să intrați pe următorul link sau să copiați URL-ul de mai jos în browserul dvs. pentru a vă verifica emailul: {{verificationURL}}
După ce vă verificați adresa de email, vă veți putea autentifica cu succes.', + newPassword: 'Parolă nouă', + resetPassword: 'Resetează parola', + resetPasswordExpiration: 'Resetați expirarea parolei', + resetPasswordToken: 'Resetați token-ul parolei', + resetYourPassword: 'Resetați-vă parola', + stayLoggedIn: 'Rămâneți conectat', + successfullyUnlocked: 'Deblocat cu succes', + unableToVerify: 'Nu se poate verifica', + verified: 'Verificat', + verifiedSuccessfully: 'Verificat cu succes', + verify: 'Verifică', + verifyUser: 'Verifică utilizatorul', + verifyYourEmail: 'Verifică-ți emailul', + youAreInactive: + 'Nu ați mai fost activ de ceva timp și în scurt timp veți fi deconectat automat pentru propria dvs. securitate. Doriți să rămâneți conectat(ă)?', + youAreReceivingResetPassword: + 'Primiți acest mesaj deoarece dumneavoastră (sau altcineva) ați solicitat resetarea parolei pentru contul dumneavoastră. Vă rugăm să dați clic pe următorul link sau să îl copiați în browserul dvs. pentru a finaliza procesul:', + youDidNotRequestPassword: + 'Dacă nu ați solicitat acest lucru, vă rugăm să ignorați acest email și parola dvs. va rămâne neschimbată.', + }, + error: { + accountAlreadyActivated: 'Acest cont a fost deja activat.', + autosaving: 'A existat o problemă în timpul salvării automate a acestui document.', + correctInvalidFields: 'Vă rugăm să corectați datele invalide.', + deletingFile: 'S-a produs o eroare la ștergerea fișierului.', + deletingTitle: + 'S-a produs o eroare în timpul ștergerii {{title}}. Vă rugăm să verificați conexiunea și să încercați din nou.', + emailOrPasswordIncorrect: 'Adresa de e-mail sau parola este incorectă.', + followingFieldsInvalid_one: 'Următorul câmp nu este valid:', + followingFieldsInvalid_other: 'Următoarele câmpuri nu sunt valabile:', + incorrectCollection: 'Colecție incorectă', + invalidFileType: 'Tip de fișier invalid', + invalidFileTypeValue: 'Tip de fișier invalid: {{value}}', + loadingDocument: 'A existat o problemă la încărcarea documentului cu ID-ul de {{id}}.', + missingEmail: 'Lipsește emailul.', + missingIDOfDocument: 'Lipsește ID-ul documentului care trebuie actualizat.', + missingIDOfVersion: 'Lipsește ID-ul versiunii.', + missingRequiredData: 'Lipsesc datele necesare.', + noFilesUploaded: 'Nu a fost încărcat niciun fișier.', + noMatchedField: 'Nu s-a găsit niciun câmp corespunzător pentru "{{label}}"', + noUser: 'Nici un utilizator', + notAllowedToAccessPage: 'Nu aveți voie să accesați această pagină.', + notAllowedToPerformAction: 'Nu aveți voie să efectuați această acțiune.', + notFound: 'Resursa solicitată nu a fost găsită.', + previewing: 'A existat o problemă la previzualizarea acestui document.', + problemUploadingFile: 'A existat o problemă în timpul încărcării fișierului.', + tokenInvalidOrExpired: 'Tokenul este invalid sau a expirat.', + unPublishingDocument: 'A existat o problemă în timpul nepublicării acestui document.', + unableToDeleteCount: 'Nu se poate șterge {{count}} din {{total}} {{label}}.', + unableToUpdateCount: 'Nu se poate șterge {{count}} din {{total}} {{label}}.', + unauthorized: 'neautorizat, trebuie să vă conectați pentru a face această cerere.', + unknown: 'S-a produs o eroare necunoscută.', + unspecific: 'S-a produs o eroare.', + userLocked: + 'Acest utilizator este blocat din cauza unui număr prea mare de încercări de autentificare eșuate.', + valueMustBeUnique: 'Valoarea trebuie să fie unică', + verificationTokenInvalid: 'Tokenul de verificare este invalid.', + }, + fields: { + addLabel: 'Adăugați {{label}}', + addLink: 'Adăugați un link', + addNew: 'Adăugați un nou', + addNewLabel: 'Adăugați un nou {{label}}', + addRelationship: 'Adăugați o relație', + addUpload: 'Adăugați un fișier', + block: 'bloc', + blockType: 'Tip de bloc', + blocks: 'Blocuri', + chooseBetweenCustomTextOrDocument: + 'Alegeți între a introduce un text URL personalizat sau a crea un link către un alt document.', + chooseDocumentToLink: 'Alegeți un document către care să creați un link', + chooseFromExisting: 'Alegeți dintre cele existente', + chooseLabel: 'Alege {{label}}', + collapseAll: 'Colapsează toate', + customURL: 'URL personalizat', + editLabelData: 'Editați {{label}}', + editLink: 'Editați Link-ul', + editRelationship: 'Editați relația', + enterURL: 'Introduceți un URL', + internalLink: 'Link intern', + itemsAndMore: '{{items}} şi {{count}} mai multe', + labelRelationship: 'Relația cu {{label}}', + latitude: 'Latitudine', + linkType: 'Tip de link', + linkedTo: 'Legat de <0>{{label}}', + longitude: 'Longitudine', + newLabel: 'Nou {{label}}', + openInNewTab: 'Deschideți în tab nou', + passwordsDoNotMatch: 'Parolele nu corespund.', + relatedDocument: 'Document asociat', + relationTo: 'Relație cu', + removeRelationship: 'Eliminați relația', + removeUpload: 'Eliminați încărcarea', + saveChanges: 'Salvați modificările', + searchForBlock: 'Căutați un bloc', + selectExistingLabel: 'Selectați existent {{label}}', + selectFieldsToEdit: 'Selectați câmpurile de editat', + showAll: 'Afișați toate', + swapRelationship: 'Schimbați relația', + swapUpload: 'Schimbați Încărcarea', + textToDisplay: 'Text de afișat', + toggleBlock: 'Toggle bloc', + uploadNewLabel: 'Încărcați un nou {{label}}', + }, + general: { + aboutToDelete: 'Sunteți pe cale să ștergeți {{label}} <1>{{title}}. Sunteți sigur?', + aboutToDeleteCount_many: 'Sunteți pe cale să ștergeți {{count}} {{label}}', + aboutToDeleteCount_one: 'Sunteți pe cale să ștergeți {{count}} {{label}}', + aboutToDeleteCount_other: 'Sunteți pe cale să ștergeți {{count}} {{label}}', + addBelow: 'Adaugă mai jos', + addFilter: 'Adaugă filtru', + adminTheme: 'Tema Admin', + and: 'Şi', + applyChanges: 'Aplicați modificările', + ascending: 'Ascendant', + automatic: 'Automat', + backToDashboard: 'Înapoi la panoul de bord', + cancel: 'Anulați', + changesNotSaved: + 'Modificările dvs. nu au fost salvate. Dacă plecați acum, vă veți pierde modificările.', + close: 'Închide', + collapse: 'Colaps', + collections: 'Colecții', + columnToSort: 'Coloana de sortat', + columns: 'Coloane', + confirm: 'Confirmați', + confirmDeletion: 'Confirmați ștergerea', + confirmDuplication: 'Confirmați duplicarea', + copied: 'Copiat', + copy: 'Copiați', + create: 'Creează', + createNew: 'Creați unul nou', + createNewLabel: 'Creați un nou {{label}}', + created: 'Creat', + createdAt: 'Creat la', + creating: 'Creare', + creatingNewLabel: 'Crearea unui nou {{label}}', + dark: 'Dark', + dashboard: 'Panoul de bord', + delete: 'Șterge', + deletedCountSuccessfully: 'Șterse cu succes {{count}} {{label}}.', + deletedSuccessfully: 'Șters cu succes.', + deleting: 'Deleting...', + descending: 'Descendentă', + deselectAllRows: 'Deselectează toate rândurile', + duplicate: 'Duplicați', + duplicateWithoutSaving: 'Duplicați fără salvarea modificărilor', + edit: 'Editează', + editLabel: 'Editați {{label}}', + editing: 'Editare', + editingLabel_many: 'Editare {{count}} {{label}}', + editingLabel_one: 'Editare {{count}} {{label}}', + editingLabel_other: 'Editare {{count}} {{label}}', + email: 'Email', + emailAddress: 'Adresa de email', + enterAValue: 'Introduceți o valoare', + error: 'Eroare', + errors: 'Erori', + fallbackToDefaultLocale: 'Revenire la locația implicită', + filter: 'Filtru', + filterWhere: 'Filtrează {{label}} unde', + filters: 'Filtre', + globals: 'Globale', + language: 'Limba', + lastModified: 'Ultima modificare', + leaveAnyway: 'Pleacă oricum', + leaveWithoutSaving: 'Plecare fără a salva', + light: 'Light', + livePreview: 'Previzualizare', + loading: 'Încărcare', + locale: 'Localitate', + locales: 'Localuri', + menu: 'Meniu', + moveDown: 'Mutați în jos', + moveUp: 'Mutați în sus', + newPassword: 'Parolă nouă', + noFiltersSet: 'Nici un filtru setat', + noLabel: '', + noOptions: 'Fără opțiuni', + noResults: + 'Nici un {{label}} găsit. Fie nu există încă niciun {{label}}, fie niciunul nu se potrivește cu filtrele pe care le-ați specificat mai sus..', + noValue: 'Nici o valoare', + none: 'Nici unul', + notFound: 'Nu a fost găsit', + nothingFound: 'Nimic găsit', + of: 'de', + open: 'Deschide', + or: 'Sau', + order: 'ORdine', + pageNotFound: 'Pagina nu a fost găsită', + password: 'Parola', + payloadSettings: 'Setări de Payload', + perPage: 'Pe pagină: {{limit}}', + remove: 'Eliminați', + reset: 'Resetare', + row: 'Rând', + rows: 'Rânduri', + save: 'Salvează', + saving: 'Salvare...', + searchBy: 'Căutați după {{label}}', + selectAll: 'Selectați toate {{count}} {{label}}', + selectAllRows: 'Selectează toate rândurile', + selectValue: 'Selectați o valoare', + selectedCount: '{{count}} {{label}} selectate', + showAllLabel: 'Afișează toate {{eticheta}}', + sorryNotFound: 'Ne pare rău - nu există nimic care să corespundă cu cererea dvs.', + sort: 'Sortează', + sortByLabelDirection: 'Sortează după {{etichetă}} {{direcţie}}', + stayOnThisPage: 'Rămâneți pe această pagină', + submissionSuccessful: 'Trimitere cu succes.', + submit: 'Trimite', + successfullyCreated: '{{label}} creat(ă) cu succes.', + successfullyDuplicated: '{{label}} duplicat(ă) cu succes.', + thisLanguage: 'Română', + titleDeleted: '{{label}} "{{title}}" șters cu succes.', + unauthorized: 'neautorizat(ă)', + unsavedChangesDuplicate: 'Aveți modificări nesalvate. Doriți să continuați să duplicați?', + untitled: 'Fără titlu', + updatedAt: 'Actualizat la', + updatedCountSuccessfully: 'Actualizate {{count}} {{label}} cu succes.', + updatedSuccessfully: 'Actualizat cu succes.', + updating: 'Actualizare', + uploading: 'Încărcare', + user: 'Utilizator', + users: 'Utilizatori', + value: 'Valoare', + welcome: 'Bine ați venit', + }, + operators: { + contains: 'conține', + equals: 'egal cu', + exists: 'există', + isGreaterThan: 'este mai mare decât', + isGreaterThanOrEqualTo: 'este mai mare sau egal cu', + isIn: 'este în', + isLessThan: 'este mai mic decât', + isLessThanOrEqualTo: 'este mai mic decât sau egal cu', + isLike: 'este ca', + isNotEqualTo: 'nu este egal cu', + isNotIn: 'nu este în', + near: 'în apropiere de', + }, + upload: { + crop: 'Cultură', + cropToolDescription: + 'Trageți colțurile zonei selectate, desenați o nouă zonă sau ajustați valorile de mai jos.', + dragAndDrop: 'Trageți și plasați un fișier', + dragAndDropHere: 'sau trageți și plasați un fișier aici', + editImage: 'Editează imaginea', + fileName: 'Numele fișierului', + fileSize: 'Dimensiunea fișierului', + focalPoint: 'Punct central', + focalPointDescription: + 'Trageți punctul focal direct pe previzualizare sau ajustați valorile de mai jos.', + height: 'Înălțime', + lessInfo: 'Mai puține informații', + moreInfo: 'Mai multe informații', + previewSizes: 'Dimensiuni Previzualizare', + selectCollectionToBrowse: 'Selectați o colecție pentru navigare', + selectFile: 'Selectați un fișier', + setCropArea: 'Setați zona de decupare', + setFocalPoint: 'Setează punctul focal', + sizes: 'Dimensiuni', + sizesFor: 'Mărimi pentru {{label}}', + width: 'Lățime', + }, + validation: { + emailAddress: 'Vă rugăm să introduceți o adresă de email validă.', + enterNumber: 'Vă rugăm să introduceți un număr valid.', + fieldHasNo: 'Acest câmp nu are un {{label}}', + greaterThanMax: + '{{value}} este mai mare decât valoarea maximă permisă pentru {{label}} de {{max}}.', + invalidInput: 'Acest câmp are o intrare invalidă.', + invalidSelection: 'Acest câmp are o selecție invalidă.', + invalidSelections: 'Acest câmp are următoarele selecții invalide:', + lessThanMin: + '{{value}} este mai mic decât valoarea minimă permisă pentru {{label}} de {{min}}.', + limitReached: 'Limita atinsă, doar {{max}} elemente pot fi adăugate.', + longerThanMin: + 'Această valoare trebuie să fie mai mare decât lungimea minimă de {{minLength}} caractere.', + notValidDate: '"{{value}}" nu este o dată valabilă.', + required: 'Acest câmp este obligatoriu.', + requiresAtLeast: 'Acest domeniu necesită cel puțin {{count}} {{label}}.', + requiresNoMoreThan: 'Acest câmp nu necesită mai mult de {{count}} {{label}}.', + requiresTwoNumbers: 'Acest câmp necesită două numere.', + shorterThanMax: + 'Această valoare trebuie să fie mai scurtă decât lungimea maximă de {{maxLength}} caractere.', + trueOrFalse: 'Acest câmp poate fi doar egal cu true sau false.', + validUploadID: 'Acest câmp nu este un ID de încărcare valid.', + }, + version: { + type: 'Tip', + aboutToPublishSelection: + 'Sunteți pe cale să publicați toate {{label}} din selecție. Sunteți sigur?', + aboutToRestore: + 'Sunteți pe cale să readuceți acest document {{label}} în starea în care se afla la data de {{versionDate}}.', + aboutToRestoreGlobal: + 'Sunteți pe cale să readuceți {{label}} global în starea în care se afla la data de {{versionDate}}.', + aboutToRevertToPublished: + 'Sunteți pe cale să readuceți modificările aduse acestui document la starea sa publicată. Sunteți sigur?', + aboutToUnpublish: 'Sunteți pe cale să nepublicați acest document. Sunteți sigur?', + aboutToUnpublishSelection: + 'Sunteți pe punctul de a nepublica toate {{label}} din selecție. Sunteți sigur?', + autosave: 'Autosalvare', + autosavedSuccessfully: 'Autosalvare cu succes.', + autosavedVersion: 'Versiunea salvată automat.', + changed: 'Schimbat', + compareVersion: 'Comparați versiunea cu:', + confirmPublish: 'Confirmați publicarea', + confirmRevertToSaved: 'Confirmați revenirea la starea salvată', + confirmUnpublish: 'Confirmați nepublicarea', + confirmVersionRestoration: 'Confirmați restaurarea versiunii', + currentDocumentStatus: 'Documentul {{docStatus}} curent', + draft: 'Proiect', + draftSavedSuccessfully: 'Proiect salvat cu succes.', + lastSavedAgo: 'Ultima salvare acum {{distance}}', + noFurtherVersionsFound: 'Nu s-au găsit alte versiuni', + noRowsFound: 'Nu s-a găsit niciun {{label}}', + preview: 'Previzualizare', + problemRestoringVersion: 'A existat o problemă la restaurarea acestei versiuni', + publish: 'Publicați', + publishChanges: 'Publicați modificările', + published: 'Publicat', + publishin: 'Publicare', + restoreThisVersion: 'Restaurați această versiune', + restoredSuccessfully: 'Restaurat cu succes.', + restoring: 'Restaurare...', + revertToPublished: 'Reveniți la publicat', + reverting: 'Revenire...', + saveDraft: 'Salvați proiectul', + selectLocales: 'Selectați localitățile de afișat', + selectVersionToCompare: 'Selectați o versiune pentru a compara', + showLocales: 'Afișați localitățile:', + showingVersionsFor: 'Se afișează versiuni pentru:', + status: 'Status', + unpublish: 'Dezpublicare', + unpublishing: 'Dezpublicare...', + version: 'Versiune', + versionCount_many: '{{count}} versiuni găsite', + versionCount_none: 'Nici o versiune găsită', + versionCount_one: '{{count}} versiune găsită', + versionCount_other: '{{count}} versiuni găsite', + versionCreatedOn: '{{version}} creată pe:', + versionID: 'ID-ul versiunii', + versions: 'Versiuni', + viewingVersion: 'Vizualizarea versiunii pentru {{entityLabel}} {{documentTitle}}', + viewingVersionGlobal: 'Vizualizarea versiunii pentru globala {{entityLabel}}', + viewingVersions: 'Vizualizarea versiunilor pentru {{entityLabel}} {{documentTitle}}', + viewingVersionsGlobal: 'Vizualizarea versiunilor pentru globala {{entityLabel}}', + }, }, } diff --git a/packages/translations/src/languages/rs.ts b/packages/translations/src/languages/rs.ts index 65a2567e2a..81017cb28f 100644 --- a/packages/translations/src/languages/rs.ts +++ b/packages/translations/src/languages/rs.ts @@ -1,386 +1,393 @@ -export default { - authentication: { - account: 'Налог', - accountOfCurrentUser: 'Налог тренутног корисника', - alreadyActivated: 'Већ активирано', - alreadyLoggedIn: 'Већ пријављен', - apiKey: 'АПИ кључ', - backToLogin: 'Назад на пријаву', - beginCreateFirstUser: 'На самом почетку креирај свог првог корисника', - changePassword: 'Промени лозинку', - checkYourEmailForPasswordReset: 'Проверите е-пошту и поруку са линком за промену лозинке.', - confirmGeneration: 'Потврди креирање', - confirmPassword: 'Потврди лозинку', - createFirstUser: 'Креирај првог корисника', - emailNotValid: 'Адреса е-поште није валидна', - emailSent: 'Порука е-поште прослеђена', - enableAPIKey: 'Омогући API кључ', - failedToUnlock: 'Неуспешно откључавање.', - forceUnlock: 'Принудно откључај', - forgotPassword: 'Заборављена лозинка', - forgotPasswordEmailInstructions: - 'Молимо Вас да унесете својy адресy е-поште. Примићете поруку са упутством за поновно постављање лозинке.', - forgotPasswordQuestion: 'Заборављена лозинка?', - generate: 'Генериши', - generateNewAPIKey: 'Генериши нови АПИ кључ', - generatingNewAPIKeyWillInvalidate: - 'Генерисање новог АПИ кључа ће <1>поништити претходни кључ. Да ли сте сигурни да желите наставити?', - lockUntil: 'Закључај док', - logBackIn: 'Поновна пријава', - logOut: 'Одјава', - loggedIn: 'За пријаву са другим корисничким налогом потребно је прво <0>одјавити се', - loggedInChangePassword: - 'Да бисте променили лозинку, отворите свој <0>налог и промените лозинку.', - loggedOutInactivity: 'Одјављени се због неактивности.', - loggedOutSuccessfully: 'Успешно сте одјављени', - login: 'Пријава', - loginAttempts: 'Покушаји пријаве', - loginUser: 'Пријава корисника', - loginWithAnotherUser: - 'За пријаву са другим корисничким налогом потребно је прво <0>одјавити се', - logout: 'Одјава', - logoutUser: 'Одјава корисника', - newAPIKeyGenerated: 'Нови АПИ кључ генерисан.', - newAccountCreated: - 'Нови налог је креиран. Приступите налогу кликом на {{serverURL}}. Молимо Вас кликните на следећи линк или залепите адресу која се налази испод у претраживач да бисте потврдили адресу е-поште: {{verificationURL}}
Након што потврдите адресу е-поште можете се улоговати.', - newPassword: 'Нова лозинка', - resetPassword: 'Промена лозинке', - resetPasswordExpiration: 'Промена рока трајања лозинке', - resetPasswordToken: 'Промена лозинке токена', - resetYourPassword: 'Промени своју лозинку', - stayLoggedIn: 'Остани пријављен', - successfullyUnlocked: 'Успешно откључано', - unableToVerify: 'Није могуће потврдити', - verified: 'Потврђено', - verifiedSuccessfully: 'Успешно потврђено', - verify: 'Потврди', - verifyUser: 'Потврди корисника', - verifyYourEmail: 'Потврди своју адресу е-поште', - youAreInactive: - 'Неактивни сте већ неко време и ускоро ћете бити аутоматски одјављени због сигурности. Да ли желите остати пријављени?', - youAreReceivingResetPassword: - 'Примили сте поруку пошто сте Ви (или неко у ваше име) затражили промену лозинке налога. Молимо Вас кликните на линк или залепите адресу у свој претраживач да бисте завршили процес:', - youDidNotRequestPassword: - 'Ако нисте затражили промену лозинке игноришите ову поруку и лозинка ће остати непромењена.', - }, - error: { - accountAlreadyActivated: 'Овај налог је већ активиран.', - autosaving: 'Настао је проблем при аутоматском чувању овог документа.', - correctInvalidFields: 'Молимо исправите невалидна поља.', - deletingFile: 'Догодила се грешка при брисању датотеке.', - deletingTitle: - 'Догодила се грешка при брисању {{title}}. Проверите интернет конекцију и покушајте поново.', - emailOrPasswordIncorrect: 'Емаил или лозинка су неисправни.', - followingFieldsInvalid_one: 'Ово поље је невалидно:', - followingFieldsInvalid_other: 'Ова поља су невалидна:', - incorrectCollection: 'Невалидна колекција', - invalidFileType: 'Невалидан тип датотеке', - invalidFileTypeValue: 'Невалидан тип датотеке: {{value}}', - loadingDocument: 'Постоји проблем при учитавању документа чији је ИД {{id}}.', - missingEmail: 'Недостаје емаил.', - missingIDOfDocument: 'Недостаје ИД документа да би се ажурирао.', - missingIDOfVersion: 'Недостаје ИД верзије.', - missingRequiredData: 'Недостају обавезни подаци.', - noFilesUploaded: 'Ниједна датотека није учитана.', - noMatchedField: 'Нема подударајућих поља за "{{label}}"', - noUser: 'Нема корисника', - notAllowedToAccessPage: 'Немате дозволу за приступ овој страници.', - notAllowedToPerformAction: 'Немате дозволу за извршење ове радње.', - notFound: 'Тражени ресурс није пронађен.', - previewing: 'Постоји проблем при прегледу овог документа.', - problemUploadingFile: 'Постоји проблем при учитавању датотеке.', - tokenInvalidOrExpired: 'Токен је невалидан или је истекао.', - unPublishingDocument: 'Постоји проблем при поништавању објаве овог документа.', - unableToDeleteCount: 'Није могуће избрисати {{count}} од {{total}} {{label}}.', - unableToUpdateCount: 'Није могуће ажурирати {{count}} од {{total}} {{label}}.', - unauthorized: 'Нисте ауторизовани да бисте упутили овај захтев.', - unknown: 'Дошло је до непознате грешке.', - unspecific: 'Дошло је до грешке.', - userLocked: 'Овај корисник је закључан због превеликог броја неуспешних покушаја пријаве.', - valueMustBeUnique: 'Вредност мора бити јединствена.', - verificationTokenInvalid: 'Верификациони токен је невалидан.', - }, - fields: { - addLabel: 'Додај {{label}}', - addLink: 'Додај линк', - addNew: 'Додај нови', - addNewLabel: 'Додај нови {{label}}', - addRelationship: 'Додај релацију', - addUpload: 'Додај учитавање', - block: 'блокирање', - blockType: 'Врста блокирања', - blocks: 'блокирања', - chooseBetweenCustomTextOrDocument: - 'Изаберите између уноса прилагођеног текста адресе или линка на други документ.', - chooseDocumentToLink: 'Одаберите документ који желите линковати.', - chooseFromExisting: 'Одаберите из постојећих.', - chooseLabel: 'Одаберите {{label}}', - collapseAll: 'Скупи све', - customURL: 'Прилагођени линк', - editLabelData: 'Уреди {{label}} податке', - editLink: 'Измени линк', - editRelationship: 'Измени однос', - enterURL: 'Унеси адресу', - internalLink: 'Интерни линк', - itemsAndMore: '{{items}} и {{count}} више', - labelRelationship: '{{label}} веза', - latitude: 'Географска ширина', - linkType: 'Тип линка', - linkedTo: 'Повезани са <0>{{label}}', - longitude: 'Географска дужина', - newLabel: 'Ново {{label}}', - openInNewTab: 'Отвори у новој картици.', - passwordsDoNotMatch: 'Лозинке нису исте.', - relatedDocument: 'Повезани документ', - relationTo: 'Веза са', - removeRelationship: 'Уклони везу', - removeUpload: 'Уклони пренос', - saveChanges: 'Сачувај промене', - searchForBlock: 'Претражи блок', - selectExistingLabel: 'Одабери постојећу {{label}}', - selectFieldsToEdit: 'Одаберите поља за промену', - showAll: 'Покажи све', - swapRelationship: 'Замени везу', - swapUpload: 'Замени пренос', - textToDisplay: 'Текст за приказ', - toggleBlock: 'Пребаци блок', - uploadNewLabel: 'Учитај нови {{label}}', - }, - general: { - aboutToDelete: 'Избрисаћете {{label}} <1>{{title}}. Да ли сте сигурни?', - aboutToDeleteCount_many: 'Избрисаћете {{count}} {{label}}', - aboutToDeleteCount_one: 'Избрисаћете {{count}} {{label}}', - aboutToDeleteCount_other: 'Избрисаћете {{count}} {{label}}', - addBelow: 'Додај испод', - addFilter: 'Додај филтер', - adminTheme: 'Администраторска тема', - and: 'И', - applyChanges: 'Примени промене', - ascending: 'Узлазно', - automatic: 'Аутоматско', - backToDashboard: 'Назад на контролни панел', - cancel: 'Откажи', - changesNotSaved: 'Ваше промене нису сачуване. Ако изађете сада, изгубићете промене.', - close: 'Затвори', - collapse: 'Скупи', - collections: 'Колекције', - columnToSort: 'Колона за сортирање', - columns: 'Колоне', - confirm: 'Потврди', - confirmDeletion: 'Потврди брисање', - confirmDuplication: 'Потврди дупликацију', - copied: 'Копирано', - copy: 'Копирај', - create: 'Креирај', - createNew: 'Креирај ново', - createNewLabel: 'Креирај ново {{label}}', - created: 'Креирано', - createdAt: 'Креирано у', - creating: 'Креира се', - creatingNewLabel: 'Креирање новог {{label}}', - dark: 'Тамно', - dashboard: 'Контролни панел', - delete: 'Обриши', - deletedCountSuccessfully: 'Успешно избрисано {{count}} {{label}}.', - deletedSuccessfully: 'Успешно избрисано.', - deleting: 'Брисање...', - descending: 'Опадајуће', - deselectAllRows: 'Деселектујте све редове', - duplicate: 'Дупликат', - duplicateWithoutSaving: 'Понови без чувања промена', - edit: 'Уреди', - editLabel: 'Уреди {{label}}', - editing: 'Уређивање', - editingLabel_many: 'Уређивање {{count}} {{label}}', - editingLabel_one: 'Уређивање {{count}} {{label}}', - editingLabel_other: 'Уређивање {{count}} {{label}}', - email: 'Е-пошта', - emailAddress: 'Адреса е-поште', - enterAValue: 'Унеси вредност', - error: 'Грешка', - errors: 'Грешке', - fallbackToDefaultLocale: 'Враћање на задати језик', - filter: 'Филтер', - filterWhere: 'Филтер {{label}} где', - filters: 'Филтери', - globals: 'Глобали', - language: 'Језик', - lastModified: 'Задња промена', - leaveAnyway: 'Свеједно напусти', - leaveWithoutSaving: 'Напусти без чувања', - light: 'Светло', - livePreview: 'Преглед', - loading: 'Учитавање', - locale: 'Језик', - locales: 'Преводи', - menu: 'Мени', - moveDown: 'Помери доле', - moveUp: 'Помери горе', - newPassword: 'Нова лозинка', - noFiltersSet: 'Нема постављених филтера', - noLabel: '<Нема {{label}}>', - noOptions: 'Нема опција', - noResults: - 'Нема пронађених {{label}}. Могуће да {{label}} још увек не постоји или нема резултата у складу са постављеним филтерима.', - noValue: 'Без вредности', - none: 'Ниједан', - notFound: 'Није пронађено', - nothingFound: 'Ништа није пронађено', - of: 'Од', - open: 'Отвори', - or: 'Или', - order: 'Редослед', - pageNotFound: 'Страница није пронађена', - password: 'Лозинка', - payloadSettings: 'Payload поставке', - perPage: 'По страници: {{limit}}', - remove: 'Уклони', - reset: 'Поново постави', - row: 'Ред', - rows: 'Редови', - save: 'Сачувај', - saving: 'Чување у току...', - searchBy: 'Тражи по {{label}}', - selectAll: 'Одаберите све {{count}} {{label}}', - selectAllRows: 'Одаберите све редове', - selectValue: 'Одабери вредност', - selectedCount: '{{count}} {{label}} одабрано', - showAllLabel: 'Прикажи све {{label}}', - sorryNotFound: 'Нажалост, не постоји ништа што одговара вашем захтеву.', - sort: 'Сортирај', - sortByLabelDirection: 'Сортирај према {{label}} {{дирецтион}}', - stayOnThisPage: 'Остани на овој страници', - submissionSuccessful: 'Успешно слање', - submit: 'Потврди', - successfullyCreated: '{{label}} успешно креирано.', - successfullyDuplicated: '{{label}} успешно дуплицирано.', - thisLanguage: 'Српски (ћирилица)', - titleDeleted: '{{label}} "{{title}}" успешно обрисано.', - unauthorized: 'Нисте ауторизовани', - unsavedChangesDuplicate: 'Имате несачуване промене. Да ли желите наставити са дуплицирањем?', - untitled: 'Без наслова', - updatedAt: 'Ажурирано у', - updatedCountSuccessfully: 'Успешно ажурирано {{count}} {{label}}.', - updatedSuccessfully: 'Успешно ажурирано.', - updating: 'Ажурирање', - uploading: 'Пренос', - user: 'Корисник', - users: 'Корисници', - value: 'Вредност', - welcome: 'Добродошли', - }, - operators: { - contains: 'садржи', - equals: 'једнако', - exists: 'постоји', - isGreaterThan: 'је веће од', - isGreaterThanOrEqualTo: 'је веће од или једнако', - isIn: 'је у', - isLessThan: 'мање је од', - isLessThanOrEqualTo: 'мање је или једнако', - isLike: 'је као', - isNotEqualTo: 'није једнако', - isNotIn: 'није у', - near: 'близу', - }, - upload: { - crop: 'Исеците слику', - cropToolDescription: - 'Превуците углове изабраног подручја, нацртајте ново подручје или прилагодите вредности испод.', - dragAndDrop: 'Превуците и испустите датотеку', - dragAndDropHere: 'или превуците и испустите датотеку овде', - editImage: 'Уреди слику', - fileName: 'Име датотеке', - fileSize: 'Величина датотеке', - focalPoint: 'Централна тачка', - focalPointDescription: - 'Превуците средишњу тачку директно на преглед или прилагодите вредности испод.', - height: 'Висина', - lessInfo: 'Мање информација', - moreInfo: 'Више информација', - previewSizes: 'Величине прегледа', - selectCollectionToBrowse: 'Одаберите колекцију за преглед', - selectFile: 'Одаберите датотеку', - setCropArea: 'Поставите подручје за исечену слику', - setFocalPoint: 'Поставите централну тачку', - sizes: 'Величине', - sizesFor: 'Величине за {{label}}', - width: 'Ширина', - }, - validation: { - emailAddress: 'Молимо Вас унесите валидну емаил адресу.', - enterNumber: 'Молимо Вас унесите валидан број.', - fieldHasNo: 'Ово поље нема {{label}}', - greaterThanMax: '{{value}} прекорачује максималан дозвољени {{label}} лимит од {{max}}.', - invalidInput: 'Ово поље садржи невалидан унос.', - invalidSelection: 'Ово поље садржи невалидан одабир.', - invalidSelections: 'Ово поље има следеће невалидне одабире:', - lessThanMin: '{{value}} је испод дозвољеног минимума за {{label}} (доњи лимит је {{min}}).', - limitReached: 'Досегнут је лимит, може се додати само {{max}} ставки.', - longerThanMin: 'Ова вредност мора бити дужа од минималне дужине од {{минЛенгтх}} карактера', - notValidDate: '"{{value}}" није валидан датум.', - required: 'Ово поље је обавезно.', - requiresAtLeast: 'Ово поље захтева минимално {{count}} {{label}}.', - requiresNoMoreThan: 'Ово поље захтева не више од {{count}} {{label}}.', - requiresTwoNumbers: 'Ово поље захтева два броја.', - shorterThanMax: 'Ова вредност мора бити краћа од максималне дужине од {{maxLength}} карактера', - trueOrFalse: 'Ово поље може бити само тачно или нетачно', - validUploadID: 'Ово поље не садржи валидан ИД преноса.', - }, - version: { - aboutToPublishSelection: 'Управо ћете објавити све {{label}} у избору. Да ли сте сигурни?', - aboutToRestore: 'Вратићете {{label}} документ у стање у којем је био {{versionDate}}', - aboutToRestoreGlobal: 'Вратићете глобални {{label}} у стање у којем је био {{versionDate}}.', - aboutToRevertToPublished: 'Вратићете промене у документу у објављено стање. Да ли сте сигурни?', - aboutToUnpublish: 'Поништићете објаву овог документа. Да ли сте сигурни?', - aboutToUnpublishSelection: - 'Управо ћете поништити објаву свих {{label}} у одабиру. Да ли сте сигурни?', - autosave: 'Аутоматско чување', - autosavedSuccessfully: 'Аутоматско чување успешно.', - autosavedVersion: 'Верзија аутоматски сачуваног документа', - changed: 'Промењено', - compareVersion: 'Упореди верзију са:', - confirmPublish: 'Потврди објаву', - confirmRevertToSaved: 'Потврдите враћање на сачувано', - confirmUnpublish: 'Потврдите поништавање објаве', - confirmVersionRestoration: 'Потврдите враћање верзије', - currentDocumentStatus: 'Тренутни {{docStatus}} документа', - draft: 'Нацрт', - draftSavedSuccessfully: 'Нацрт успешно сачуван.', - lastSavedAgo: 'Задњи пут сачувано пре {{distance}', - noFurtherVersionsFound: 'Нису пронађене наредне верзије', - noRowsFound: '{{label}} није пронађено', - preview: 'Преглед', - problemRestoringVersion: 'Настао је проблем при враћању ове верзије', - publish: 'Објавити', - publishChanges: 'Објави промене', - published: 'Објављено', - publishing: 'Objavljivanje', - restoreThisVersion: 'Врати ову верзију', - restoredSuccessfully: 'Успешно враћено.', - restoring: 'Враћање...', - revertToPublished: 'Врати на објављено', - reverting: 'Враћање...', - saveDraft: 'Сачувај нацрт', - selectLocales: 'Одаберите језике', - selectVersionToCompare: 'Одаберите верзију за упоређивање', - showLocales: 'Прикажи језике:', - showingVersionsFor: 'Показујем верзије за:', - status: 'Статус', - type: 'Тип', - unpublish: 'Поништи објаву', - unpublishing: 'Поништавање објаве...', - version: 'Верзија', - versionCount_many: '{{count}} пронађених верзија', - versionCount_none: 'Нема пронађених верзија', - versionCount_one: '{{count}} пронађена верзија', - versionCount_other: '{{count}} пронађених верзија', - versionCreatedOn: '{{version}} креираних:', - versionID: 'Идентификатор верзије', - versions: 'Верзије', - viewingVersion: 'Преглед верзије за {{entityLabel}} {{documentTitle}}', - viewingVersionGlobal: 'Преглед верзије за глобални {{entityLabel}}', - viewingVersions: 'Преглед верзија за {{entityLabel}} {{documentTitle}}', - viewingVersionsGlobal: 'Преглед верзије за глобални {{entityLabel}}', +import type { Language } from '../types.js' + +export const rs: Language = { + dateFNSKey: 'rs', + translations: { + authentication: { + account: 'Налог', + accountOfCurrentUser: 'Налог тренутног корисника', + alreadyActivated: 'Већ активирано', + alreadyLoggedIn: 'Већ пријављен', + apiKey: 'АПИ кључ', + backToLogin: 'Назад на пријаву', + beginCreateFirstUser: 'На самом почетку креирај свог првог корисника', + changePassword: 'Промени лозинку', + checkYourEmailForPasswordReset: 'Проверите е-пошту и поруку са линком за промену лозинке.', + confirmGeneration: 'Потврди креирање', + confirmPassword: 'Потврди лозинку', + createFirstUser: 'Креирај првог корисника', + emailNotValid: 'Адреса е-поште није валидна', + emailSent: 'Порука е-поште прослеђена', + enableAPIKey: 'Омогући API кључ', + failedToUnlock: 'Неуспешно откључавање.', + forceUnlock: 'Принудно откључај', + forgotPassword: 'Заборављена лозинка', + forgotPasswordEmailInstructions: + 'Молимо Вас да унесете својy адресy е-поште. Примићете поруку са упутством за поновно постављање лозинке.', + forgotPasswordQuestion: 'Заборављена лозинка?', + generate: 'Генериши', + generateNewAPIKey: 'Генериши нови АПИ кључ', + generatingNewAPIKeyWillInvalidate: + 'Генерисање новог АПИ кључа ће <1>поништити претходни кључ. Да ли сте сигурни да желите наставити?', + lockUntil: 'Закључај док', + logBackIn: 'Поновна пријава', + logOut: 'Одјава', + loggedIn: 'За пријаву са другим корисничким налогом потребно је прво <0>одјавити се', + loggedInChangePassword: + 'Да бисте променили лозинку, отворите свој <0>налог и промените лозинку.', + loggedOutInactivity: 'Одјављени се због неактивности.', + loggedOutSuccessfully: 'Успешно сте одјављени', + login: 'Пријава', + loginAttempts: 'Покушаји пријаве', + loginUser: 'Пријава корисника', + loginWithAnotherUser: + 'За пријаву са другим корисничким налогом потребно је прво <0>одјавити се', + logout: 'Одјава', + logoutUser: 'Одјава корисника', + newAPIKeyGenerated: 'Нови АПИ кључ генерисан.', + newAccountCreated: + 'Нови налог је креиран. Приступите налогу кликом на {{serverURL}}. Молимо Вас кликните на следећи линк или залепите адресу која се налази испод у претраживач да бисте потврдили адресу е-поште: {{verificationURL}}
Након што потврдите адресу е-поште можете се улоговати.', + newPassword: 'Нова лозинка', + resetPassword: 'Промена лозинке', + resetPasswordExpiration: 'Промена рока трајања лозинке', + resetPasswordToken: 'Промена лозинке токена', + resetYourPassword: 'Промени своју лозинку', + stayLoggedIn: 'Остани пријављен', + successfullyUnlocked: 'Успешно откључано', + unableToVerify: 'Није могуће потврдити', + verified: 'Потврђено', + verifiedSuccessfully: 'Успешно потврђено', + verify: 'Потврди', + verifyUser: 'Потврди корисника', + verifyYourEmail: 'Потврди своју адресу е-поште', + youAreInactive: + 'Неактивни сте већ неко време и ускоро ћете бити аутоматски одјављени због сигурности. Да ли желите остати пријављени?', + youAreReceivingResetPassword: + 'Примили сте поруку пошто сте Ви (или неко у ваше име) затражили промену лозинке налога. Молимо Вас кликните на линк или залепите адресу у свој претраживач да бисте завршили процес:', + youDidNotRequestPassword: + 'Ако нисте затражили промену лозинке игноришите ову поруку и лозинка ће остати непромењена.', + }, + error: { + accountAlreadyActivated: 'Овај налог је већ активиран.', + autosaving: 'Настао је проблем при аутоматском чувању овог документа.', + correctInvalidFields: 'Молимо исправите невалидна поља.', + deletingFile: 'Догодила се грешка при брисању датотеке.', + deletingTitle: + 'Догодила се грешка при брисању {{title}}. Проверите интернет конекцију и покушајте поново.', + emailOrPasswordIncorrect: 'Емаил или лозинка су неисправни.', + followingFieldsInvalid_one: 'Ово поље је невалидно:', + followingFieldsInvalid_other: 'Ова поља су невалидна:', + incorrectCollection: 'Невалидна колекција', + invalidFileType: 'Невалидан тип датотеке', + invalidFileTypeValue: 'Невалидан тип датотеке: {{value}}', + loadingDocument: 'Постоји проблем при учитавању документа чији је ИД {{id}}.', + missingEmail: 'Недостаје емаил.', + missingIDOfDocument: 'Недостаје ИД документа да би се ажурирао.', + missingIDOfVersion: 'Недостаје ИД верзије.', + missingRequiredData: 'Недостају обавезни подаци.', + noFilesUploaded: 'Ниједна датотека није учитана.', + noMatchedField: 'Нема подударајућих поља за "{{label}}"', + noUser: 'Нема корисника', + notAllowedToAccessPage: 'Немате дозволу за приступ овој страници.', + notAllowedToPerformAction: 'Немате дозволу за извршење ове радње.', + notFound: 'Тражени ресурс није пронађен.', + previewing: 'Постоји проблем при прегледу овог документа.', + problemUploadingFile: 'Постоји проблем при учитавању датотеке.', + tokenInvalidOrExpired: 'Токен је невалидан или је истекао.', + unPublishingDocument: 'Постоји проблем при поништавању објаве овог документа.', + unableToDeleteCount: 'Није могуће избрисати {{count}} од {{total}} {{label}}.', + unableToUpdateCount: 'Није могуће ажурирати {{count}} од {{total}} {{label}}.', + unauthorized: 'Нисте ауторизовани да бисте упутили овај захтев.', + unknown: 'Дошло је до непознате грешке.', + unspecific: 'Дошло је до грешке.', + userLocked: 'Овај корисник је закључан због превеликог броја неуспешних покушаја пријаве.', + valueMustBeUnique: 'Вредност мора бити јединствена.', + verificationTokenInvalid: 'Верификациони токен је невалидан.', + }, + fields: { + addLabel: 'Додај {{label}}', + addLink: 'Додај линк', + addNew: 'Додај нови', + addNewLabel: 'Додај нови {{label}}', + addRelationship: 'Додај релацију', + addUpload: 'Додај учитавање', + block: 'блокирање', + blockType: 'Врста блокирања', + blocks: 'блокирања', + chooseBetweenCustomTextOrDocument: + 'Изаберите између уноса прилагођеног текста адресе или линка на други документ.', + chooseDocumentToLink: 'Одаберите документ који желите линковати.', + chooseFromExisting: 'Одаберите из постојећих.', + chooseLabel: 'Одаберите {{label}}', + collapseAll: 'Скупи све', + customURL: 'Прилагођени линк', + editLabelData: 'Уреди {{label}} податке', + editLink: 'Измени линк', + editRelationship: 'Измени однос', + enterURL: 'Унеси адресу', + internalLink: 'Интерни линк', + itemsAndMore: '{{items}} и {{count}} више', + labelRelationship: '{{label}} веза', + latitude: 'Географска ширина', + linkType: 'Тип линка', + linkedTo: 'Повезани са <0>{{label}}', + longitude: 'Географска дужина', + newLabel: 'Ново {{label}}', + openInNewTab: 'Отвори у новој картици.', + passwordsDoNotMatch: 'Лозинке нису исте.', + relatedDocument: 'Повезани документ', + relationTo: 'Веза са', + removeRelationship: 'Уклони везу', + removeUpload: 'Уклони пренос', + saveChanges: 'Сачувај промене', + searchForBlock: 'Претражи блок', + selectExistingLabel: 'Одабери постојећу {{label}}', + selectFieldsToEdit: 'Одаберите поља за промену', + showAll: 'Покажи све', + swapRelationship: 'Замени везу', + swapUpload: 'Замени пренос', + textToDisplay: 'Текст за приказ', + toggleBlock: 'Пребаци блок', + uploadNewLabel: 'Учитај нови {{label}}', + }, + general: { + aboutToDelete: 'Избрисаћете {{label}} <1>{{title}}. Да ли сте сигурни?', + aboutToDeleteCount_many: 'Избрисаћете {{count}} {{label}}', + aboutToDeleteCount_one: 'Избрисаћете {{count}} {{label}}', + aboutToDeleteCount_other: 'Избрисаћете {{count}} {{label}}', + addBelow: 'Додај испод', + addFilter: 'Додај филтер', + adminTheme: 'Администраторска тема', + and: 'И', + applyChanges: 'Примени промене', + ascending: 'Узлазно', + automatic: 'Аутоматско', + backToDashboard: 'Назад на контролни панел', + cancel: 'Откажи', + changesNotSaved: 'Ваше промене нису сачуване. Ако изађете сада, изгубићете промене.', + close: 'Затвори', + collapse: 'Скупи', + collections: 'Колекције', + columnToSort: 'Колона за сортирање', + columns: 'Колоне', + confirm: 'Потврди', + confirmDeletion: 'Потврди брисање', + confirmDuplication: 'Потврди дупликацију', + copied: 'Копирано', + copy: 'Копирај', + create: 'Креирај', + createNew: 'Креирај ново', + createNewLabel: 'Креирај ново {{label}}', + created: 'Креирано', + createdAt: 'Креирано у', + creating: 'Креира се', + creatingNewLabel: 'Креирање новог {{label}}', + dark: 'Тамно', + dashboard: 'Контролни панел', + delete: 'Обриши', + deletedCountSuccessfully: 'Успешно избрисано {{count}} {{label}}.', + deletedSuccessfully: 'Успешно избрисано.', + deleting: 'Брисање...', + descending: 'Опадајуће', + deselectAllRows: 'Деселектујте све редове', + duplicate: 'Дупликат', + duplicateWithoutSaving: 'Понови без чувања промена', + edit: 'Уреди', + editLabel: 'Уреди {{label}}', + editing: 'Уређивање', + editingLabel_many: 'Уређивање {{count}} {{label}}', + editingLabel_one: 'Уређивање {{count}} {{label}}', + editingLabel_other: 'Уређивање {{count}} {{label}}', + email: 'Е-пошта', + emailAddress: 'Адреса е-поште', + enterAValue: 'Унеси вредност', + error: 'Грешка', + errors: 'Грешке', + fallbackToDefaultLocale: 'Враћање на задати језик', + filter: 'Филтер', + filterWhere: 'Филтер {{label}} где', + filters: 'Филтери', + globals: 'Глобали', + language: 'Језик', + lastModified: 'Задња промена', + leaveAnyway: 'Свеједно напусти', + leaveWithoutSaving: 'Напусти без чувања', + light: 'Светло', + livePreview: 'Преглед', + loading: 'Учитавање', + locale: 'Језик', + locales: 'Преводи', + menu: 'Мени', + moveDown: 'Помери доле', + moveUp: 'Помери горе', + newPassword: 'Нова лозинка', + noFiltersSet: 'Нема постављених филтера', + noLabel: '<Нема {{label}}>', + noOptions: 'Нема опција', + noResults: + 'Нема пронађених {{label}}. Могуће да {{label}} још увек не постоји или нема резултата у складу са постављеним филтерима.', + noValue: 'Без вредности', + none: 'Ниједан', + notFound: 'Није пронађено', + nothingFound: 'Ништа није пронађено', + of: 'Од', + open: 'Отвори', + or: 'Или', + order: 'Редослед', + pageNotFound: 'Страница није пронађена', + password: 'Лозинка', + payloadSettings: 'Payload поставке', + perPage: 'По страници: {{limit}}', + remove: 'Уклони', + reset: 'Поново постави', + row: 'Ред', + rows: 'Редови', + save: 'Сачувај', + saving: 'Чување у току...', + searchBy: 'Тражи по {{label}}', + selectAll: 'Одаберите све {{count}} {{label}}', + selectAllRows: 'Одаберите све редове', + selectValue: 'Одабери вредност', + selectedCount: '{{count}} {{label}} одабрано', + showAllLabel: 'Прикажи све {{label}}', + sorryNotFound: 'Нажалост, не постоји ништа што одговара вашем захтеву.', + sort: 'Сортирај', + sortByLabelDirection: 'Сортирај према {{label}} {{дирецтион}}', + stayOnThisPage: 'Остани на овој страници', + submissionSuccessful: 'Успешно слање', + submit: 'Потврди', + successfullyCreated: '{{label}} успешно креирано.', + successfullyDuplicated: '{{label}} успешно дуплицирано.', + thisLanguage: 'Српски (ћирилица)', + titleDeleted: '{{label}} "{{title}}" успешно обрисано.', + unauthorized: 'Нисте ауторизовани', + unsavedChangesDuplicate: 'Имате несачуване промене. Да ли желите наставити са дуплицирањем?', + untitled: 'Без наслова', + updatedAt: 'Ажурирано у', + updatedCountSuccessfully: 'Успешно ажурирано {{count}} {{label}}.', + updatedSuccessfully: 'Успешно ажурирано.', + updating: 'Ажурирање', + uploading: 'Пренос', + user: 'Корисник', + users: 'Корисници', + value: 'Вредност', + welcome: 'Добродошли', + }, + operators: { + contains: 'садржи', + equals: 'једнако', + exists: 'постоји', + isGreaterThan: 'је веће од', + isGreaterThanOrEqualTo: 'је веће од или једнако', + isIn: 'је у', + isLessThan: 'мање је од', + isLessThanOrEqualTo: 'мање је или једнако', + isLike: 'је као', + isNotEqualTo: 'није једнако', + isNotIn: 'није у', + near: 'близу', + }, + upload: { + crop: 'Исеците слику', + cropToolDescription: + 'Превуците углове изабраног подручја, нацртајте ново подручје или прилагодите вредности испод.', + dragAndDrop: 'Превуците и испустите датотеку', + dragAndDropHere: 'или превуците и испустите датотеку овде', + editImage: 'Уреди слику', + fileName: 'Име датотеке', + fileSize: 'Величина датотеке', + focalPoint: 'Централна тачка', + focalPointDescription: + 'Превуците средишњу тачку директно на преглед или прилагодите вредности испод.', + height: 'Висина', + lessInfo: 'Мање информација', + moreInfo: 'Више информација', + previewSizes: 'Величине прегледа', + selectCollectionToBrowse: 'Одаберите колекцију за преглед', + selectFile: 'Одаберите датотеку', + setCropArea: 'Поставите подручје за исечену слику', + setFocalPoint: 'Поставите централну тачку', + sizes: 'Величине', + sizesFor: 'Величине за {{label}}', + width: 'Ширина', + }, + validation: { + emailAddress: 'Молимо Вас унесите валидну емаил адресу.', + enterNumber: 'Молимо Вас унесите валидан број.', + fieldHasNo: 'Ово поље нема {{label}}', + greaterThanMax: '{{value}} прекорачује максималан дозвољени {{label}} лимит од {{max}}.', + invalidInput: 'Ово поље садржи невалидан унос.', + invalidSelection: 'Ово поље садржи невалидан одабир.', + invalidSelections: 'Ово поље има следеће невалидне одабире:', + lessThanMin: '{{value}} је испод дозвољеног минимума за {{label}} (доњи лимит је {{min}}).', + limitReached: 'Досегнут је лимит, може се додати само {{max}} ставки.', + longerThanMin: 'Ова вредност мора бити дужа од минималне дужине од {{минЛенгтх}} карактера', + notValidDate: '"{{value}}" није валидан датум.', + required: 'Ово поље је обавезно.', + requiresAtLeast: 'Ово поље захтева минимално {{count}} {{label}}.', + requiresNoMoreThan: 'Ово поље захтева не више од {{count}} {{label}}.', + requiresTwoNumbers: 'Ово поље захтева два броја.', + shorterThanMax: + 'Ова вредност мора бити краћа од максималне дужине од {{maxLength}} карактера', + trueOrFalse: 'Ово поље може бити само тачно или нетачно', + validUploadID: 'Ово поље не садржи валидан ИД преноса.', + }, + version: { + type: 'Тип', + aboutToPublishSelection: 'Управо ћете објавити све {{label}} у избору. Да ли сте сигурни?', + aboutToRestore: 'Вратићете {{label}} документ у стање у којем је био {{versionDate}}', + aboutToRestoreGlobal: 'Вратићете глобални {{label}} у стање у којем је био {{versionDate}}.', + aboutToRevertToPublished: + 'Вратићете промене у документу у објављено стање. Да ли сте сигурни?', + aboutToUnpublish: 'Поништићете објаву овог документа. Да ли сте сигурни?', + aboutToUnpublishSelection: + 'Управо ћете поништити објаву свих {{label}} у одабиру. Да ли сте сигурни?', + autosave: 'Аутоматско чување', + autosavedSuccessfully: 'Аутоматско чување успешно.', + autosavedVersion: 'Верзија аутоматски сачуваног документа', + changed: 'Промењено', + compareVersion: 'Упореди верзију са:', + confirmPublish: 'Потврди објаву', + confirmRevertToSaved: 'Потврдите враћање на сачувано', + confirmUnpublish: 'Потврдите поништавање објаве', + confirmVersionRestoration: 'Потврдите враћање верзије', + currentDocumentStatus: 'Тренутни {{docStatus}} документа', + draft: 'Нацрт', + draftSavedSuccessfully: 'Нацрт успешно сачуван.', + lastSavedAgo: 'Задњи пут сачувано пре {{distance}', + noFurtherVersionsFound: 'Нису пронађене наредне верзије', + noRowsFound: '{{label}} није пронађено', + preview: 'Преглед', + problemRestoringVersion: 'Настао је проблем при враћању ове верзије', + publish: 'Објавити', + publishChanges: 'Објави промене', + published: 'Објављено', + publishing: 'Objavljivanje', + restoreThisVersion: 'Врати ову верзију', + restoredSuccessfully: 'Успешно враћено.', + restoring: 'Враћање...', + revertToPublished: 'Врати на објављено', + reverting: 'Враћање...', + saveDraft: 'Сачувај нацрт', + selectLocales: 'Одаберите језике', + selectVersionToCompare: 'Одаберите верзију за упоређивање', + showLocales: 'Прикажи језике:', + showingVersionsFor: 'Показујем верзије за:', + status: 'Статус', + unpublish: 'Поништи објаву', + unpublishing: 'Поништавање објаве...', + version: 'Верзија', + versionCount_many: '{{count}} пронађених верзија', + versionCount_none: 'Нема пронађених верзија', + versionCount_one: '{{count}} пронађена верзија', + versionCount_other: '{{count}} пронађених верзија', + versionCreatedOn: '{{version}} креираних:', + versionID: 'Идентификатор верзије', + versions: 'Верзије', + viewingVersion: 'Преглед верзије за {{entityLabel}} {{documentTitle}}', + viewingVersionGlobal: 'Преглед верзије за глобални {{entityLabel}}', + viewingVersions: 'Преглед верзија за {{entityLabel}} {{documentTitle}}', + viewingVersionsGlobal: 'Преглед верзије за глобални {{entityLabel}}', + }, }, } diff --git a/packages/translations/src/languages/rsLatin.ts b/packages/translations/src/languages/rsLatin.ts index 3aff0e2b04..b9433a9fdd 100644 --- a/packages/translations/src/languages/rsLatin.ts +++ b/packages/translations/src/languages/rsLatin.ts @@ -1,387 +1,393 @@ -export default { - authentication: { - account: 'Nalog', - accountOfCurrentUser: 'Nalog trenutnog korisnika', - alreadyActivated: 'Već aktivirano', - alreadyLoggedIn: 'Već prijavljen', - apiKey: 'API ključ', - backToLogin: 'Nazad na prijavu', - beginCreateFirstUser: 'Na samom početku kreiraj svog prvog korisnika', - changePassword: 'Promeni lozinku', - checkYourEmailForPasswordReset: 'Proverite e-poštu i poruku sa linkom za promenu lozinke.', - confirmGeneration: 'Potvrdi kreiranje', - confirmPassword: 'Potvrdi lozinku', - createFirstUser: 'Kreiraj prvog korisnika', - emailNotValid: 'Adresa e-pošte nije validna', - emailSent: 'Poruka e-pošte prosleđena', - enableAPIKey: 'Omogući API ključ', - failedToUnlock: 'Neuspešno otključavanje.', - forceUnlock: 'Prinudno otključaj', - forgotPassword: 'Zaboravljena lozinka', - forgotPasswordEmailInstructions: - 'Molimo Vas da unesete svoj adresu e-pošte. Primićete poruku sa uputstvom za ponovno postavljanje lozinke.', - forgotPasswordQuestion: 'Zaboravljena lozinka?', - generate: 'Generiši', - generateNewAPIKey: 'Generiši novi API ključ', - generatingNewAPIKeyWillInvalidate: - 'Generisanje novog API ključa će <1>poništiti prethodni ključ. Da li ste sigurni da želite nastaviti?', - lockUntil: 'Zaključaj dok', - logBackIn: 'Ponovna prijava', - logOut: 'Odjava', - loggedIn: 'Za prijavu sa drugim korisničkim nalogom potrebno je prvo <0>odjaviti se', - loggedInChangePassword: - 'Da biste promenili lozinku, otvorite svoj <0>nalog i promenite lozinku.', - loggedOutInactivity: 'Odjavljeni se zbog neaktivnosti.', - loggedOutSuccessfully: 'Uspešno ste odjavljeni', - login: 'Prijava', - loginAttempts: 'Pokušaji prijave', - loginUser: 'Prijava korisnika', - loginWithAnotherUser: - 'Za prijavu sa drugim korisničkim nalogom potrebno je prvo <0>odjaviti se', - logout: 'Odjava', - logoutUser: 'Odjava korisnika', - newAPIKeyGenerated: 'Novi API ključ generisan.', - newAccountCreated: - 'Novi nalog je kreiran. Pristupite nalogu klikom na {{serverURL}}. Molimo Vas kliknite na sledeći link ili zalepite URL koji se nalazi ispod u pretraživač da biste potvrdili adresu e-pošte: {{verificationURL}}
Nakon što potvrdite adresu e-pošte možete se ulogovati.', - newPassword: 'Nova lozinka', - resetPassword: 'Promena lozinke', - resetPasswordExpiration: 'Promena roka trajanja lozinke', - resetPasswordToken: 'Promena lozinke tokena', - resetYourPassword: 'Promeni svoju lozinku', - stayLoggedIn: 'Ostani prijavljen', - successfullyUnlocked: 'Uspešno otključano', - unableToVerify: 'Nije moguće potvrditi', - verified: 'Potvrđeno', - verifiedSuccessfully: 'Uspešno potvrđeno', - verify: 'Potvrdi', - verifyUser: 'Potvrdi korisnika', - verifyYourEmail: 'Potvrdi svoju adresu e-pošte', - youAreInactive: - 'Neaktivni ste već neko vreme i uskoro ćete biti automatski odjavljeni zbog sigurnosti. Da li želite ostati prijavljeni?', - youAreReceivingResetPassword: - 'Primili ste ovo pošto ste Vi (ili neko u vaše ime) zatražili promenu lozinke naloga. Molimo Vas kliknite na link ili zalepite URL u svoj pretraživač da biste završili proces:', - youDidNotRequestPassword: - 'Ako niste zatražili promenu lozinke ignorišite ovu poruku i lozinka će ostati nepromenjena.', - }, - error: { - accountAlreadyActivated: 'Ovaj nalog je već aktiviran.', - autosaving: 'Nastao je problem pri automatskom čuvanju ovog dokumenta.', - correctInvalidFields: 'Molimo ispravite nevalidna polja.', - deletingFile: 'Dogodila se greška pri brisanju datoteke.', - deletingTitle: - 'Dogodila se greška pri brisanju {{title}}. Proverite internet konekciju i pokušajte ponovo.', - emailOrPasswordIncorrect: 'Adresa e-pošte ili lozinka su neispravni.', - followingFieldsInvalid_one: 'Ovo polje je nevalidno:', - followingFieldsInvalid_other: 'Ova polja su nevalidna:', - incorrectCollection: 'Nevalidna kolekcija', - invalidFileType: 'Nevalidan tip datoteke', - invalidFileTypeValue: 'Nevalidan tip datoteke: {{value}}', - loadingDocument: 'Postoji problem pri učitavanju dokumenta čiji je ID {{id}}.', - missingEmail: 'Nedostaje adresa e-pošte.', - missingIDOfDocument: 'Nedostaje ID dokumenta da bi se ažurirao.', - missingIDOfVersion: 'Nedostaje ID verzije.', - missingRequiredData: 'Nedostaju obavezni podaci.', - noFilesUploaded: 'Nijedna datoteka nije učitana.', - noMatchedField: 'Nema podudarajućih polja za "{{label}}"', - noUser: 'Nema korisnika', - notAllowedToAccessPage: 'Nemate dozvolu za pristup ovoj stranici.', - notAllowedToPerformAction: 'Nemate dozvolu za izvršenje ove radnje.', - notFound: 'Traženi resurs nije pronađen.', - previewing: 'Postoji problem pri pregledu ovog dokumenta.', - problemUploadingFile: 'Postoji problem pri učitavanju datoteke.', - tokenInvalidOrExpired: 'Token je nevalidan ili je istekao.', - unPublishingDocument: 'Postoji problem pri poništavanju objave ovog dokumenta.', - unableToDeleteCount: 'Nije moguće izbrisati {{count}} od {{total}} {{label}}.', - unableToUpdateCount: 'Nije moguće ažurirati {{count}} od {{total}} {{label}}.', - unauthorized: 'Niste autorizovani da biste uputili ovaj zahtev.', - unknown: 'Došlo je do nepoznate greške.', - unspecific: 'Došlo je do greške.', - userLocked: 'Ovaj korisnik je zaključan zbog prevelikog broja neuspešnih pokušaja prijave.', - valueMustBeUnique: 'Vrednost mora biti jedinstvena.', - verificationTokenInvalid: 'Verifikacioni token je nevalidan.', - }, - fields: { - addLabel: 'Dodaj {{label}}', - addLink: 'Dodaj link', - addNew: 'Dodaj novi', - addNewLabel: 'Dodaj novi {{label}}', - addRelationship: 'Dodaj relaciju', - addUpload: 'Dodaj učitavanje', - block: 'blokiranje', - blockType: 'Vrsta blokiranja', - blocks: 'blokiranja', - chooseBetweenCustomTextOrDocument: - 'Izaberite između unosa prilagođenog teksta URL ili linka na drugi dokument.', - chooseDocumentToLink: 'Odaberite dokument koji želite linkovati.', - chooseFromExisting: 'Odaberite iz postojećih.', - chooseLabel: 'Odaberite {{label}}', - collapseAll: 'Skupi sve', - customURL: 'Prilagođeni URL', - editLabelData: 'Izmeni {{label}} podatke', - editLink: 'Izmeni link', - editRelationship: 'Izmeni odnos', - enterURL: 'Unesi URL', - internalLink: 'Interni link', - itemsAndMore: '{{items}} i {{count}} više', - labelRelationship: '{{label}} veza', - latitude: 'Geografska širina', - linkType: 'Tip linka', - linkedTo: 'Povezani sa <0>{{label}}', - longitude: 'Geografska dužina', - newLabel: 'Novo {{label}}', - openInNewTab: 'Otvori u novoj kartici.', - passwordsDoNotMatch: 'Lozinke nisu iste.', - relatedDocument: 'Povezani dokument', - relationTo: 'Veza sa', - removeRelationship: 'Ukloni vezu', - removeUpload: 'Ukloni prenos', - saveChanges: 'Sačuvaj promene', - searchForBlock: 'Pretraži blok', - selectExistingLabel: 'Odaberi postojeću {{label}}', - selectFieldsToEdit: 'Odaberite polja za promenu', - showAll: 'Pokaži sve', - swapRelationship: 'Zameni vezu', - swapUpload: 'Zameni prenos', - textToDisplay: 'Tekst za prikaz', - toggleBlock: 'Prebaci blok', - uploadNewLabel: 'Učitaj novi {{label}}', - }, - general: { - aboutToDelete: 'Izbrisaćete {{label}} <1>{{title}}. Da li ste sigurni?', - aboutToDeleteCount_many: 'Izbrisaćete {{count}} {{label}}', - aboutToDeleteCount_one: 'Izbrisaćete {{count}} {{label}}', - aboutToDeleteCount_other: 'Izbrisaćete {{count}} {{label}}', - addBelow: 'Dodaj ispod', - addFilter: 'Dodaj filter', - adminTheme: 'Administratorska tema', - and: 'I', - applyChanges: 'Primeni promene', - ascending: 'Uzlazno', - automatic: 'Automatsko', - backToDashboard: 'Nazad na kontrolni panel', - cancel: 'Otkaži', - changesNotSaved: 'Vaše promene nisu sačuvane. Ako izađete sada, izgubićete promene.', - close: 'Zatvori', - collapse: 'Skupi', - collections: 'Kolekcije', - columnToSort: 'Kolona za sortiranje', - columns: 'Kolone', - confirm: 'Potvrdi', - confirmDeletion: 'Potvrdi brisanje', - confirmDuplication: 'Potvrdi duplikaciju', - copied: 'Kopirano', - copy: 'Kopiraj', - create: 'Kreiraj', - createNew: 'Kreiraj novo', - createNewLabel: 'Kreiraj novo {{label}}', - created: 'Kreirano', - createdAt: 'Kreirano u', - creating: 'Kreira se', - creatingNewLabel: 'Kreiranje novog {{label}}', - dark: 'Tamno', - dashboard: 'Kontrolni panel', - delete: 'Obriši', - deletedCountSuccessfully: 'Uspešno izbrisano {{count}} {{label}}.', - deletedSuccessfully: 'Uspešno izbrisano.', - deleting: 'Brisanje...', - descending: 'Opadajuće', - deselectAllRows: 'Deselektujte sve redove', - duplicate: 'Duplikat', - duplicateWithoutSaving: 'Ponovi bez čuvanja promena', - edit: 'Uredi', - editLabel: 'Uredi {{label}}', - editing: 'Uređivanje', - editingLabel_many: 'Uređivanje {{count}} {{label}}', - editingLabel_one: 'Uređivanje {{count}} {{label}}', - editingLabel_other: 'Uređivanje {{count}} {{label}}', - email: 'E-pošta', - emailAddress: 'Аdresa e-pošte', - enterAValue: 'Unesi vrednost', - error: 'Greška', - errors: 'Greške', - fallbackToDefaultLocale: 'Vraćanje na zadati jezik', - filter: 'Filter', - filterWhere: 'Filter {{label}} gde', - filters: 'Filteri', - globals: 'Globali', - language: 'Jezik', - lastModified: 'Zadnja promena', - leaveAnyway: 'Svejedno napusti', - leaveWithoutSaving: 'Napusti bez čuvanja', - light: 'Svetlo', - livePreview: 'Pregled', - loading: 'Učitavanje', - locale: 'Jezik', - locales: 'Prevodi', - menu: 'Meni', - moveDown: 'Pomeri dole', - moveUp: 'Pomeri gore', - newPassword: 'Nova lozinka', - noFiltersSet: 'Nema postavljenih filtera', - noLabel: '', - noOptions: 'Nema opcija', - noResults: - 'Nema pronađenih {{label}}. Moguće da {{label}} još uvek ne postoji ili nema rezultata u skladu sa postavljenim filterima.', - noValue: 'Bez vrednosti', - none: 'Nijedan', - notFound: 'Nije pronađeno', - nothingFound: 'Ništa nije pronađeno', - of: 'Od', - open: 'Otvori', - or: 'Ili', - order: 'Redosled', - pageNotFound: 'Stranica nije pronađena', - password: 'Lozinka', - payloadSettings: 'Payload postavke', - perPage: 'Po stranici: {{limit}}', - remove: 'Ukloni', - reset: 'Ponovo postavi', - row: 'Red', - rows: 'Redovi', - save: 'Sačuvaj', - saving: 'Čuvanje u toku...', - searchBy: 'Traži po {{label}}', - selectAll: 'Odaberite sve {{count}} {{label}}', - selectAllRows: 'Odaberite sve redove', - selectValue: 'Odaberi vrednost', - selectedCount: '{{count}} {{label}} odabrano', - showAllLabel: 'Prikaži sve {{label}}', - sorryNotFound: 'Nažalost, ne postoji ništa što odgovara vašem zahtevu.', - sort: 'Sortiraj', - sortByLabelDirection: 'Sortiraj prema {{label}} {{direction}}', - stayOnThisPage: 'Ostani na ovoj stranici', - submissionSuccessful: 'Uspešno slanje', - submit: 'Potvrdi', - successfullyCreated: '{{label}} uspešno kreirano.', - successfullyDuplicated: '{{label}} uspešno duplicirano.', - thisLanguage: 'Srpski (latinica)', - titleDeleted: '{{label}} "{{title}}" uspešno obrisano.', - unauthorized: 'Niste autorizovani', - unsavedChangesDuplicate: 'Imate nesačuvane promene. Da li želite nastaviti sa dupliciranjem?', - untitled: 'Bez naslova', - updatedAt: 'Ažurirano u', - updatedCountSuccessfully: 'Uspešno ažurirano {{count}} {{label}}.', - updatedSuccessfully: 'Uspešno ažurirano.', - updating: 'Ažuriranje', - uploading: 'Prenos', - user: 'Korisnik', - users: 'Korisnici', - value: 'Vrednost', - welcome: 'Dobrodošli', - }, - operators: { - contains: 'sadrži', - equals: 'jednako', - exists: 'postoji', - isGreaterThan: 'je veće od', - isGreaterThanOrEqualTo: 'je veće od ili jednako', - isIn: 'je u', - isLessThan: 'manje je od', - isLessThanOrEqualTo: 'manje je ili jednako', - isLike: 'je kao', - isNotEqualTo: 'nije jednako', - isNotIn: 'nije unutra', - near: 'blizu', - }, - upload: { - crop: 'Isecite sliku', - cropToolDescription: - 'Prevucite uglove izabranog područja, nacrtajte novo područje ili prilagodite vrednosti ispod.', - dragAndDrop: 'Prevucite i ispustite datoteku', - dragAndDropHere: 'ili povucite i ispustite datoteku ovde', - editImage: 'Uredi sliku', - fileName: 'Ime datoteke', - fileSize: 'Veličina datoteke', - focalPoint: 'Centralna tačka', - focalPointDescription: - 'Prevucite središnju tačku direktno na pregled ili prilagodite vrednosti ispod.', - height: 'Visina', - lessInfo: 'Manje informacija', - moreInfo: 'Više informacija', - previewSizes: 'Veličine pregleda', - selectCollectionToBrowse: 'Odaberite kolekciju za pregled', - selectFile: 'Odaberite datoteku', - setCropArea: 'Postavite područje za isečenu sliku', - setFocalPoint: 'Postavite centralnu tačku', - sizes: 'Veličine', - sizesFor: 'Veličine za {{label}}', - width: 'Širina', - }, - validation: { - emailAddress: 'Molimo Vas unesite validnu email adresu.', - enterNumber: 'Molimo Vas unesite validan broj.', - fieldHasNo: 'Ovo polje nema {{label}}', - greaterThanMax: '{{value}} prekoračuje maksimalan dozvoljeni {{label}} limit od {{max}}.', - invalidInput: 'Ovo polje sadrži nevalidan unos.', - invalidSelection: 'Ovo polje sadrži nevalidan odabir.', - invalidSelections: 'Ovo polje ima sledeće nevalidne odabire:', - lessThanMin: '{{value}} je ispod dozvoljenog minimuma za {{label}} (donji limit je {{min}}).', - limitReached: 'Dosegnut je limit, može se dodati samo {{max}} stavki.', - longerThanMin: 'Ova vrednost mora biti duža od minimalne dužine od {{minLength}} karaktera', - notValidDate: '"{{value}}" nije validan datum.', - required: 'Ovo polje je obavezno.', - requiresAtLeast: 'Ovo polje zahteva minimalno {{count}} {{label}}.', - requiresNoMoreThan: 'Ovo polje zahteva ne više od {{count}} {{label}}.', - requiresTwoNumbers: 'Ovo polje zahteva dva broja.', - shorterThanMax: 'Ova vrednost mora biti kraća od maksimalne dužine od {{maxLength}} karaktera', - trueOrFalse: 'Ovo polje može biti samo tačno ili netačno', - validUploadID: 'Ovo polje ne sadrži validan ID prenosa.', - }, - version: { - aboutToPublishSelection: 'Upravo ćete objaviti sve {{label}} u izboru. Da li ste sigurni?', - aboutToRestore: 'Vratićete {{label}} dokument u stanje u kojem je bio {{versionDate}}', - aboutToRestoreGlobal: 'Vratićete globalni {{label}} u stanje u kojem je bio {{versionDate}}.', - aboutToRevertToPublished: - 'Vratićete promene u dokumentu u objavljeno stanje. Da li ste sigurni?', - aboutToUnpublish: 'Poništićete objavu ovog dokumenta. Da li ste sigurni?', - aboutToUnpublishSelection: - 'Upravo ćete poništiti objavu svih {{label}} u odabiru. Da li ste sigurni?', - autosave: 'Automatsko čuvanje', - autosavedSuccessfully: 'Automatsko čuvanje uspešno.', - autosavedVersion: 'Verzija automatski sačuvanog dokumenta', - changed: 'Promenjeno', - compareVersion: 'Uporedi verziju sa:', - confirmPublish: 'Potvrdi objavu', - confirmRevertToSaved: 'Potvrdite vraćanje na sačuvano', - confirmUnpublish: 'Potvrdite poništavanje objave', - confirmVersionRestoration: 'Potvrdite vraćanje verzije', - currentDocumentStatus: 'Trenutni {{docStatus}} dokumenta', - draft: 'Nacrt', - draftSavedSuccessfully: 'Nacrt uspešno sačuvan.', - lastSavedAgo: 'Zadnji put sačuvano pre {{distance}', - noFurtherVersionsFound: 'Nisu pronađene naredne verzije', - noRowsFound: '{{label}} nije pronađeno', - preview: 'Pregled', - problemRestoringVersion: 'Nastao je problem pri vraćanju ove verzije', - publish: 'Objaviti', - publishChanges: 'Objavljivanje', - published: 'Objavljeno', - publishing: 'Objavljivanje', - restoreThisVersion: 'Vrati ovu verziju', - restoredSuccessfully: 'Uspešno vraćeno.', - restoring: 'Vraćanje...', - revertToPublished: 'Vrati na objavljeno', - reverting: 'Vraćanje...', - saveDraft: 'Sačuvaj nacrt', - selectLocales: 'Odaberite jezike', - selectVersionToCompare: 'Odaberite verziju za upoređivanje', - showLocales: 'Prikaži jezike:', - showingVersionsFor: 'Pokazujem verzije za:', - status: 'Status', - type: 'Tip', - unpublish: 'Poništi objavu', - unpublishing: 'Poništavanje objave...', - version: 'Verzija', - versionCount_many: '{{count}} pronađenih verzija', - versionCount_none: 'Nema pronađenih verzija', - versionCount_one: '{{count}} pronađena verzija', - versionCount_other: '{{count}} pronađenih verzija', - versionCreatedOn: '{{version}} kreiranih:', - versionID: 'ID verzije', - versions: 'Verzije', - viewingVersion: 'Pregled verzije za {{entityLabel}} {{documentTitle}}', - viewingVersionGlobal: 'Pregled verzije za globalni {{entityLabel}}', - viewingVersions: 'Pregled verzija za {{entityLabel}} {{documentTitle}}', - viewingVersionsGlobal: 'Pregled verzije za globalni {{entityLabel}}', +import type { Language } from '../types.js' + +export const rsLatin: Language = { + dateFNSKey: 'rs-latin', + translations: { + authentication: { + account: 'Nalog', + accountOfCurrentUser: 'Nalog trenutnog korisnika', + alreadyActivated: 'Već aktivirano', + alreadyLoggedIn: 'Već prijavljen', + apiKey: 'API ključ', + backToLogin: 'Nazad na prijavu', + beginCreateFirstUser: 'Na samom početku kreiraj svog prvog korisnika', + changePassword: 'Promeni lozinku', + checkYourEmailForPasswordReset: 'Proverite e-poštu i poruku sa linkom za promenu lozinke.', + confirmGeneration: 'Potvrdi kreiranje', + confirmPassword: 'Potvrdi lozinku', + createFirstUser: 'Kreiraj prvog korisnika', + emailNotValid: 'Adresa e-pošte nije validna', + emailSent: 'Poruka e-pošte prosleđena', + enableAPIKey: 'Omogući API ključ', + failedToUnlock: 'Neuspešno otključavanje.', + forceUnlock: 'Prinudno otključaj', + forgotPassword: 'Zaboravljena lozinka', + forgotPasswordEmailInstructions: + 'Molimo Vas da unesete svoj adresu e-pošte. Primićete poruku sa uputstvom za ponovno postavljanje lozinke.', + forgotPasswordQuestion: 'Zaboravljena lozinka?', + generate: 'Generiši', + generateNewAPIKey: 'Generiši novi API ključ', + generatingNewAPIKeyWillInvalidate: + 'Generisanje novog API ključa će <1>poništiti prethodni ključ. Da li ste sigurni da želite nastaviti?', + lockUntil: 'Zaključaj dok', + logBackIn: 'Ponovna prijava', + logOut: 'Odjava', + loggedIn: 'Za prijavu sa drugim korisničkim nalogom potrebno je prvo <0>odjaviti se', + loggedInChangePassword: + 'Da biste promenili lozinku, otvorite svoj <0>nalog i promenite lozinku.', + loggedOutInactivity: 'Odjavljeni se zbog neaktivnosti.', + loggedOutSuccessfully: 'Uspešno ste odjavljeni', + login: 'Prijava', + loginAttempts: 'Pokušaji prijave', + loginUser: 'Prijava korisnika', + loginWithAnotherUser: + 'Za prijavu sa drugim korisničkim nalogom potrebno je prvo <0>odjaviti se', + logout: 'Odjava', + logoutUser: 'Odjava korisnika', + newAPIKeyGenerated: 'Novi API ključ generisan.', + newAccountCreated: + 'Novi nalog je kreiran. Pristupite nalogu klikom na {{serverURL}}. Molimo Vas kliknite na sledeći link ili zalepite URL koji se nalazi ispod u pretraživač da biste potvrdili adresu e-pošte: {{verificationURL}}
Nakon što potvrdite adresu e-pošte možete se ulogovati.', + newPassword: 'Nova lozinka', + resetPassword: 'Promena lozinke', + resetPasswordExpiration: 'Promena roka trajanja lozinke', + resetPasswordToken: 'Promena lozinke tokena', + resetYourPassword: 'Promeni svoju lozinku', + stayLoggedIn: 'Ostani prijavljen', + successfullyUnlocked: 'Uspešno otključano', + unableToVerify: 'Nije moguće potvrditi', + verified: 'Potvrđeno', + verifiedSuccessfully: 'Uspešno potvrđeno', + verify: 'Potvrdi', + verifyUser: 'Potvrdi korisnika', + verifyYourEmail: 'Potvrdi svoju adresu e-pošte', + youAreInactive: + 'Neaktivni ste već neko vreme i uskoro ćete biti automatski odjavljeni zbog sigurnosti. Da li želite ostati prijavljeni?', + youAreReceivingResetPassword: + 'Primili ste ovo pošto ste Vi (ili neko u vaše ime) zatražili promenu lozinke naloga. Molimo Vas kliknite na link ili zalepite URL u svoj pretraživač da biste završili proces:', + youDidNotRequestPassword: + 'Ako niste zatražili promenu lozinke ignorišite ovu poruku i lozinka će ostati nepromenjena.', + }, + error: { + accountAlreadyActivated: 'Ovaj nalog je već aktiviran.', + autosaving: 'Nastao je problem pri automatskom čuvanju ovog dokumenta.', + correctInvalidFields: 'Molimo ispravite nevalidna polja.', + deletingFile: 'Dogodila se greška pri brisanju datoteke.', + deletingTitle: + 'Dogodila se greška pri brisanju {{title}}. Proverite internet konekciju i pokušajte ponovo.', + emailOrPasswordIncorrect: 'Adresa e-pošte ili lozinka su neispravni.', + followingFieldsInvalid_one: 'Ovo polje je nevalidno:', + followingFieldsInvalid_other: 'Ova polja su nevalidna:', + incorrectCollection: 'Nevalidna kolekcija', + invalidFileType: 'Nevalidan tip datoteke', + invalidFileTypeValue: 'Nevalidan tip datoteke: {{value}}', + loadingDocument: 'Postoji problem pri učitavanju dokumenta čiji je ID {{id}}.', + missingEmail: 'Nedostaje adresa e-pošte.', + missingIDOfDocument: 'Nedostaje ID dokumenta da bi se ažurirao.', + missingIDOfVersion: 'Nedostaje ID verzije.', + missingRequiredData: 'Nedostaju obavezni podaci.', + noFilesUploaded: 'Nijedna datoteka nije učitana.', + noMatchedField: 'Nema podudarajućih polja za "{{label}}"', + noUser: 'Nema korisnika', + notAllowedToAccessPage: 'Nemate dozvolu za pristup ovoj stranici.', + notAllowedToPerformAction: 'Nemate dozvolu za izvršenje ove radnje.', + notFound: 'Traženi resurs nije pronađen.', + previewing: 'Postoji problem pri pregledu ovog dokumenta.', + problemUploadingFile: 'Postoji problem pri učitavanju datoteke.', + tokenInvalidOrExpired: 'Token je nevalidan ili je istekao.', + unPublishingDocument: 'Postoji problem pri poništavanju objave ovog dokumenta.', + unableToDeleteCount: 'Nije moguće izbrisati {{count}} od {{total}} {{label}}.', + unableToUpdateCount: 'Nije moguće ažurirati {{count}} od {{total}} {{label}}.', + unauthorized: 'Niste autorizovani da biste uputili ovaj zahtev.', + unknown: 'Došlo je do nepoznate greške.', + unspecific: 'Došlo je do greške.', + userLocked: 'Ovaj korisnik je zaključan zbog prevelikog broja neuspešnih pokušaja prijave.', + valueMustBeUnique: 'Vrednost mora biti jedinstvena.', + verificationTokenInvalid: 'Verifikacioni token je nevalidan.', + }, + fields: { + addLabel: 'Dodaj {{label}}', + addLink: 'Dodaj link', + addNew: 'Dodaj novi', + addNewLabel: 'Dodaj novi {{label}}', + addRelationship: 'Dodaj relaciju', + addUpload: 'Dodaj učitavanje', + block: 'blokiranje', + blockType: 'Vrsta blokiranja', + blocks: 'blokiranja', + chooseBetweenCustomTextOrDocument: + 'Izaberite između unosa prilagođenog teksta URL ili linka na drugi dokument.', + chooseDocumentToLink: 'Odaberite dokument koji želite linkovati.', + chooseFromExisting: 'Odaberite iz postojećih.', + chooseLabel: 'Odaberite {{label}}', + collapseAll: 'Skupi sve', + customURL: 'Prilagođeni URL', + editLabelData: 'Izmeni {{label}} podatke', + editLink: 'Izmeni link', + editRelationship: 'Izmeni odnos', + enterURL: 'Unesi URL', + internalLink: 'Interni link', + itemsAndMore: '{{items}} i {{count}} više', + labelRelationship: '{{label}} veza', + latitude: 'Geografska širina', + linkType: 'Tip linka', + linkedTo: 'Povezani sa <0>{{label}}', + longitude: 'Geografska dužina', + newLabel: 'Novo {{label}}', + openInNewTab: 'Otvori u novoj kartici.', + passwordsDoNotMatch: 'Lozinke nisu iste.', + relatedDocument: 'Povezani dokument', + relationTo: 'Veza sa', + removeRelationship: 'Ukloni vezu', + removeUpload: 'Ukloni prenos', + saveChanges: 'Sačuvaj promene', + searchForBlock: 'Pretraži blok', + selectExistingLabel: 'Odaberi postojeću {{label}}', + selectFieldsToEdit: 'Odaberite polja za promenu', + showAll: 'Pokaži sve', + swapRelationship: 'Zameni vezu', + swapUpload: 'Zameni prenos', + textToDisplay: 'Tekst za prikaz', + toggleBlock: 'Prebaci blok', + uploadNewLabel: 'Učitaj novi {{label}}', + }, + general: { + aboutToDelete: 'Izbrisaćete {{label}} <1>{{title}}. Da li ste sigurni?', + aboutToDeleteCount_many: 'Izbrisaćete {{count}} {{label}}', + aboutToDeleteCount_one: 'Izbrisaćete {{count}} {{label}}', + aboutToDeleteCount_other: 'Izbrisaćete {{count}} {{label}}', + addBelow: 'Dodaj ispod', + addFilter: 'Dodaj filter', + adminTheme: 'Administratorska tema', + and: 'I', + applyChanges: 'Primeni promene', + ascending: 'Uzlazno', + automatic: 'Automatsko', + backToDashboard: 'Nazad na kontrolni panel', + cancel: 'Otkaži', + changesNotSaved: 'Vaše promene nisu sačuvane. Ako izađete sada, izgubićete promene.', + close: 'Zatvori', + collapse: 'Skupi', + collections: 'Kolekcije', + columnToSort: 'Kolona za sortiranje', + columns: 'Kolone', + confirm: 'Potvrdi', + confirmDeletion: 'Potvrdi brisanje', + confirmDuplication: 'Potvrdi duplikaciju', + copied: 'Kopirano', + copy: 'Kopiraj', + create: 'Kreiraj', + createNew: 'Kreiraj novo', + createNewLabel: 'Kreiraj novo {{label}}', + created: 'Kreirano', + createdAt: 'Kreirano u', + creating: 'Kreira se', + creatingNewLabel: 'Kreiranje novog {{label}}', + dark: 'Tamno', + dashboard: 'Kontrolni panel', + delete: 'Obriši', + deletedCountSuccessfully: 'Uspešno izbrisano {{count}} {{label}}.', + deletedSuccessfully: 'Uspešno izbrisano.', + deleting: 'Brisanje...', + descending: 'Opadajuće', + deselectAllRows: 'Deselektujte sve redove', + duplicate: 'Duplikat', + duplicateWithoutSaving: 'Ponovi bez čuvanja promena', + edit: 'Uredi', + editLabel: 'Uredi {{label}}', + editing: 'Uređivanje', + editingLabel_many: 'Uređivanje {{count}} {{label}}', + editingLabel_one: 'Uređivanje {{count}} {{label}}', + editingLabel_other: 'Uređivanje {{count}} {{label}}', + email: 'E-pošta', + emailAddress: 'Аdresa e-pošte', + enterAValue: 'Unesi vrednost', + error: 'Greška', + errors: 'Greške', + fallbackToDefaultLocale: 'Vraćanje na zadati jezik', + filter: 'Filter', + filterWhere: 'Filter {{label}} gde', + filters: 'Filteri', + globals: 'Globali', + language: 'Jezik', + lastModified: 'Zadnja promena', + leaveAnyway: 'Svejedno napusti', + leaveWithoutSaving: 'Napusti bez čuvanja', + light: 'Svetlo', + livePreview: 'Pregled', + loading: 'Učitavanje', + locale: 'Jezik', + locales: 'Prevodi', + menu: 'Meni', + moveDown: 'Pomeri dole', + moveUp: 'Pomeri gore', + newPassword: 'Nova lozinka', + noFiltersSet: 'Nema postavljenih filtera', + noLabel: '', + noOptions: 'Nema opcija', + noResults: + 'Nema pronađenih {{label}}. Moguće da {{label}} još uvek ne postoji ili nema rezultata u skladu sa postavljenim filterima.', + noValue: 'Bez vrednosti', + none: 'Nijedan', + notFound: 'Nije pronađeno', + nothingFound: 'Ništa nije pronađeno', + of: 'Od', + open: 'Otvori', + or: 'Ili', + order: 'Redosled', + pageNotFound: 'Stranica nije pronađena', + password: 'Lozinka', + payloadSettings: 'Payload postavke', + perPage: 'Po stranici: {{limit}}', + remove: 'Ukloni', + reset: 'Ponovo postavi', + row: 'Red', + rows: 'Redovi', + save: 'Sačuvaj', + saving: 'Čuvanje u toku...', + searchBy: 'Traži po {{label}}', + selectAll: 'Odaberite sve {{count}} {{label}}', + selectAllRows: 'Odaberite sve redove', + selectValue: 'Odaberi vrednost', + selectedCount: '{{count}} {{label}} odabrano', + showAllLabel: 'Prikaži sve {{label}}', + sorryNotFound: 'Nažalost, ne postoji ništa što odgovara vašem zahtevu.', + sort: 'Sortiraj', + sortByLabelDirection: 'Sortiraj prema {{label}} {{direction}}', + stayOnThisPage: 'Ostani na ovoj stranici', + submissionSuccessful: 'Uspešno slanje', + submit: 'Potvrdi', + successfullyCreated: '{{label}} uspešno kreirano.', + successfullyDuplicated: '{{label}} uspešno duplicirano.', + thisLanguage: 'Srpski (latinica)', + titleDeleted: '{{label}} "{{title}}" uspešno obrisano.', + unauthorized: 'Niste autorizovani', + unsavedChangesDuplicate: 'Imate nesačuvane promene. Da li želite nastaviti sa dupliciranjem?', + untitled: 'Bez naslova', + updatedAt: 'Ažurirano u', + updatedCountSuccessfully: 'Uspešno ažurirano {{count}} {{label}}.', + updatedSuccessfully: 'Uspešno ažurirano.', + updating: 'Ažuriranje', + uploading: 'Prenos', + user: 'Korisnik', + users: 'Korisnici', + value: 'Vrednost', + welcome: 'Dobrodošli', + }, + operators: { + contains: 'sadrži', + equals: 'jednako', + exists: 'postoji', + isGreaterThan: 'je veće od', + isGreaterThanOrEqualTo: 'je veće od ili jednako', + isIn: 'je u', + isLessThan: 'manje je od', + isLessThanOrEqualTo: 'manje je ili jednako', + isLike: 'je kao', + isNotEqualTo: 'nije jednako', + isNotIn: 'nije unutra', + near: 'blizu', + }, + upload: { + crop: 'Isecite sliku', + cropToolDescription: + 'Prevucite uglove izabranog područja, nacrtajte novo područje ili prilagodite vrednosti ispod.', + dragAndDrop: 'Prevucite i ispustite datoteku', + dragAndDropHere: 'ili povucite i ispustite datoteku ovde', + editImage: 'Uredi sliku', + fileName: 'Ime datoteke', + fileSize: 'Veličina datoteke', + focalPoint: 'Centralna tačka', + focalPointDescription: + 'Prevucite središnju tačku direktno na pregled ili prilagodite vrednosti ispod.', + height: 'Visina', + lessInfo: 'Manje informacija', + moreInfo: 'Više informacija', + previewSizes: 'Veličine pregleda', + selectCollectionToBrowse: 'Odaberite kolekciju za pregled', + selectFile: 'Odaberite datoteku', + setCropArea: 'Postavite područje za isečenu sliku', + setFocalPoint: 'Postavite centralnu tačku', + sizes: 'Veličine', + sizesFor: 'Veličine za {{label}}', + width: 'Širina', + }, + validation: { + emailAddress: 'Molimo Vas unesite validnu email adresu.', + enterNumber: 'Molimo Vas unesite validan broj.', + fieldHasNo: 'Ovo polje nema {{label}}', + greaterThanMax: '{{value}} prekoračuje maksimalan dozvoljeni {{label}} limit od {{max}}.', + invalidInput: 'Ovo polje sadrži nevalidan unos.', + invalidSelection: 'Ovo polje sadrži nevalidan odabir.', + invalidSelections: 'Ovo polje ima sledeće nevalidne odabire:', + lessThanMin: '{{value}} je ispod dozvoljenog minimuma za {{label}} (donji limit je {{min}}).', + limitReached: 'Dosegnut je limit, može se dodati samo {{max}} stavki.', + longerThanMin: 'Ova vrednost mora biti duža od minimalne dužine od {{minLength}} karaktera', + notValidDate: '"{{value}}" nije validan datum.', + required: 'Ovo polje je obavezno.', + requiresAtLeast: 'Ovo polje zahteva minimalno {{count}} {{label}}.', + requiresNoMoreThan: 'Ovo polje zahteva ne više od {{count}} {{label}}.', + requiresTwoNumbers: 'Ovo polje zahteva dva broja.', + shorterThanMax: + 'Ova vrednost mora biti kraća od maksimalne dužine od {{maxLength}} karaktera', + trueOrFalse: 'Ovo polje može biti samo tačno ili netačno', + validUploadID: 'Ovo polje ne sadrži validan ID prenosa.', + }, + version: { + type: 'Tip', + aboutToPublishSelection: 'Upravo ćete objaviti sve {{label}} u izboru. Da li ste sigurni?', + aboutToRestore: 'Vratićete {{label}} dokument u stanje u kojem je bio {{versionDate}}', + aboutToRestoreGlobal: 'Vratićete globalni {{label}} u stanje u kojem je bio {{versionDate}}.', + aboutToRevertToPublished: + 'Vratićete promene u dokumentu u objavljeno stanje. Da li ste sigurni?', + aboutToUnpublish: 'Poništićete objavu ovog dokumenta. Da li ste sigurni?', + aboutToUnpublishSelection: + 'Upravo ćete poništiti objavu svih {{label}} u odabiru. Da li ste sigurni?', + autosave: 'Automatsko čuvanje', + autosavedSuccessfully: 'Automatsko čuvanje uspešno.', + autosavedVersion: 'Verzija automatski sačuvanog dokumenta', + changed: 'Promenjeno', + compareVersion: 'Uporedi verziju sa:', + confirmPublish: 'Potvrdi objavu', + confirmRevertToSaved: 'Potvrdite vraćanje na sačuvano', + confirmUnpublish: 'Potvrdite poništavanje objave', + confirmVersionRestoration: 'Potvrdite vraćanje verzije', + currentDocumentStatus: 'Trenutni {{docStatus}} dokumenta', + draft: 'Nacrt', + draftSavedSuccessfully: 'Nacrt uspešno sačuvan.', + lastSavedAgo: 'Zadnji put sačuvano pre {{distance}', + noFurtherVersionsFound: 'Nisu pronađene naredne verzije', + noRowsFound: '{{label}} nije pronađeno', + preview: 'Pregled', + problemRestoringVersion: 'Nastao je problem pri vraćanju ove verzije', + publish: 'Objaviti', + publishChanges: 'Objavljivanje', + published: 'Objavljeno', + publishing: 'Objavljivanje', + restoreThisVersion: 'Vrati ovu verziju', + restoredSuccessfully: 'Uspešno vraćeno.', + restoring: 'Vraćanje...', + revertToPublished: 'Vrati na objavljeno', + reverting: 'Vraćanje...', + saveDraft: 'Sačuvaj nacrt', + selectLocales: 'Odaberite jezike', + selectVersionToCompare: 'Odaberite verziju za upoređivanje', + showLocales: 'Prikaži jezike:', + showingVersionsFor: 'Pokazujem verzije za:', + status: 'Status', + unpublish: 'Poništi objavu', + unpublishing: 'Poništavanje objave...', + version: 'Verzija', + versionCount_many: '{{count}} pronađenih verzija', + versionCount_none: 'Nema pronađenih verzija', + versionCount_one: '{{count}} pronađena verzija', + versionCount_other: '{{count}} pronađenih verzija', + versionCreatedOn: '{{version}} kreiranih:', + versionID: 'ID verzije', + versions: 'Verzije', + viewingVersion: 'Pregled verzije za {{entityLabel}} {{documentTitle}}', + viewingVersionGlobal: 'Pregled verzije za globalni {{entityLabel}}', + viewingVersions: 'Pregled verzija za {{entityLabel}} {{documentTitle}}', + viewingVersionsGlobal: 'Pregled verzije za globalni {{entityLabel}}', + }, }, } diff --git a/packages/translations/src/languages/ru.ts b/packages/translations/src/languages/ru.ts index 8a90749b33..dacb23f60d 100644 --- a/packages/translations/src/languages/ru.ts +++ b/packages/translations/src/languages/ru.ts @@ -1,393 +1,398 @@ -export default { - authentication: { - account: 'Аккаунт', - accountOfCurrentUser: 'Аккаунт текущего пользователя', - alreadyActivated: 'Уже активирован', - alreadyLoggedIn: 'Уже вошли в систему', - apiKey: 'API ключ', - backToLogin: 'Вернуться к входу', - beginCreateFirstUser: 'Чтобы начать - создайте первого пользователя.', - changePassword: 'Сменить пароль', - checkYourEmailForPasswordReset: - 'На ваш email отправлена ссылка, с помощью которой можно будет сбросить пароль.', - confirmGeneration: 'Подтвердить генерацию', - confirmPassword: 'Подтверждение пароля', - createFirstUser: 'Создание первого пользователя', - emailNotValid: 'Указанный адрес электронной почты неверен', - emailSent: 'Email отправлен', - enableAPIKey: 'Активировать API ключ', - failedToUnlock: 'Не удалось разблокировать', - forceUnlock: 'Принудительная разблокировка', - forgotPassword: 'Забыли пароль', - forgotPasswordEmailInstructions: - 'Пожалуйста, введите ваш email. Вы получите письмо с инструкцией по восстановлению пароля.', - forgotPasswordQuestion: 'Забыли пароль?', - generate: 'Сгенерировать', - generateNewAPIKey: 'Сгенерировать новый API ключ', - generatingNewAPIKeyWillInvalidate: - 'Генерация нового API ключа приведёт к <1>недействительности предыдущего ключа. Вы уверены, что хотите продолжить?', - lockUntil: 'Заблокировать до', - logBackIn: 'Войти снова', - logOut: 'Выйти', - loggedIn: 'Чтобы войти в другую учетную запись, сначала <0>выйдите.', - loggedInChangePassword: - 'Чтобы изменить пароль, зайдите в свой <0>аккаунт и измените пароль там.', - loggedOutInactivity: 'Вы вышли из системы из-за неактивности.', - loggedOutSuccessfully: 'Вы успешно вышли из системы.', - login: 'Войти', - loginAttempts: 'Попытки входа', - loginUser: 'Вход пользователя в систему', - loginWithAnotherUser: - 'Чтобы войти в систему под другим пользователем, необходимо сначала <0>выйти.', - logout: 'Выйти', - logoutUser: 'Вход из системы', - newAPIKeyGenerated: 'Новый API ключ сгенерирован.', - newAccountCreated: - 'Новый аккаунт был создан для доступа к {{serverURL}} Пожалуйста, кликните по следующей ссылке или вставьте в адресную строку браузера чтобы подтвердить email: {{verificationURL}}
После подтверждения вашего email, вы сможете успешно войти в систему.', - newPassword: 'Новый пароль', - resetPassword: 'Сброс пароля', - resetPasswordExpiration: 'Сброс пароля по истечении срока действия', - resetPasswordToken: 'Токен сброса пароля', - resetYourPassword: 'Сброс вашего пароля', - stayLoggedIn: 'Остаться в системе', - successfullyUnlocked: 'Успешно разблокирован', - unableToVerify: 'Невозможно подтвердить', - verified: 'Подтверждено', - verifiedSuccessfully: 'Успешно подтверждено', - verify: 'Подтвердить', - verifyUser: 'Подтвердить пользователя', - verifyYourEmail: 'Подтвердить ваш email', - youAreInactive: - 'Вы не были активны в течение некоторого времени и скоро автоматически выйдете из системы в целях вашей безопасности. Вы хотите остаться в системе?', - youAreReceivingResetPassword: - 'Вы получили это сообщение, потому что вы (или кто-то другой) запросили сброс пароля для вашей учетной записи. Пожалуйста, нажмите на следующую ссылку или вставьте ее в браузер, чтобы завершить процесс:', - youDidNotRequestPassword: - 'Если вы не запрашивали этого, пожалуйста, проигнорируйте это письмо, и ваш пароль останется неизменным.', - }, - error: { - accountAlreadyActivated: 'Этот аккаунт уже был активирован.', - autosaving: 'При автосохранении этого документа возникла проблема.', - correctInvalidFields: 'Пожалуйста, исправьте неправильные поля.', - deletingFile: 'Произошла ошибка при удалении файла.', - deletingTitle: - 'При удалении {{title}} произошла ошибка. Пожалуйста, проверьте соединение и повторите попытку.', - emailOrPasswordIncorrect: 'Указанный email или пароль неверен.', - followingFieldsInvalid_one: 'Следующее поле недействительно:', - followingFieldsInvalid_other: 'Следующие поля недействительны:', - incorrectCollection: 'Неправильная Коллекция', - invalidFileType: 'Недопустимый тип файла', - invalidFileTypeValue: 'Недопустимый тип файла: {{value}}', - loadingDocument: 'Возникла проблема при загрузке документа с ID {{id}}.', - missingEmail: 'Отсутствует email.', - missingIDOfDocument: 'Отсутствующий ID документа для обновления.', - missingIDOfVersion: 'Отсутствует ID версии.', - missingRequiredData: 'Отсутствуют необходимые данные.', - noFilesUploaded: 'Не было загружено ни одного файла.', - noMatchedField: 'Не найдено подходящего поля для "{{label}}"', - noUser: 'Нет Пользователя', - notAllowedToAccessPage: 'Вы не имеете права доступа к этой странице.', - notAllowedToPerformAction: 'У вас нет права на выполнение этого действия.', - notFound: 'Запрашиваемый ресурс не найден.', - previewing: 'При предварительном просмотре этого документа возникла проблема.', - problemUploadingFile: 'Возникла проблема при загрузке файла.', - tokenInvalidOrExpired: 'Токен либо недействителен, либо срок его действия истек.', - unPublishingDocument: 'При отмене публикации этого документа возникла проблема.', - unableToDeleteCount: 'Не удалось удалить {{count}} из {{total}} {{label}}.', - unableToUpdateCount: 'Не удалось обновить {{count}} из {{total}} {{label}}.', - unauthorized: 'Нет доступа, вы должны войти, чтобы сделать этот запрос.', - unknown: 'Произошла неизвестная ошибка.', - unspecific: 'Произошла ошибка.', - userLocked: - 'Этот пользователь заблокирован из-за слишком большого количества неудачных попыток входа.', - valueMustBeUnique: 'Значение должно быть уникальным', - verificationTokenInvalid: 'Проверочный токен недействителен.', - }, - fields: { - addLabel: 'Добавить {{label}}', - addLink: 'Добавить ссылку', - addNew: 'Добавить новый', - addNewLabel: 'Добавить {{label}}', - addRelationship: 'Добавить Отношения', - addUpload: 'Добавить загрузку', - block: 'Блок', - blockType: 'Тип Блока', - blocks: 'Блоки', - chooseBetweenCustomTextOrDocument: - 'Выберите между вводом пользовательского текстового URL и ссылкой на другой документ.', - chooseDocumentToLink: 'Выберите документ для ссылки', - chooseFromExisting: 'Выбрать из существующих', - chooseLabel: 'Выбрать {{label}}', - collapseAll: 'Свернуть все', - customURL: 'Пользовательский URL', - editLabelData: 'Редактировать данные {{label}}', - editLink: 'Редактировать ссылку', - editRelationship: 'Редактировать Отношения', - enterURL: 'Введите URL', - internalLink: 'Внутренняя ссылка', - itemsAndMore: '{{items}} и ещё {{count}}', - labelRelationship: '{{label}} Отношения', - latitude: 'Широта', - linkType: 'Тип ссылки', - linkedTo: 'Связано с <0>{{label}}', - longitude: 'Долгота', - newLabel: 'Новый {{label}}', - openInNewTab: 'Открывать в новой вкладке', - passwordsDoNotMatch: 'Пароли не совпадают.', - relatedDocument: 'Связанный документ', - relationTo: 'Отношение к', - removeRelationship: 'Удалить связь', - removeUpload: 'Удалить загруженное', - saveChanges: 'Сохранить изменения', - searchForBlock: 'Найти Блок', - selectExistingLabel: 'Выберите существующий {{label}}', - selectFieldsToEdit: 'Выберите поля для редактирования', - showAll: 'Показать все', - swapRelationship: 'Поменять отношения', - swapUpload: 'Заменить загруженное', - textToDisplay: 'Текст для отображения', - toggleBlock: 'Переключить Блок', - uploadNewLabel: 'Загрузить новый {{label}}', - }, - general: { - aboutToDelete: 'Вы собираетесь удалить {{label}} <1>{{title}}. Вы уверены?', - aboutToDeleteCount_many: 'Вы собираетесь удалить {{count}} {{label}}', - aboutToDeleteCount_one: 'Вы собираетесь удалить {{count}} {{label}}', - aboutToDeleteCount_other: 'Вы собираетесь удалить {{count}} {{label}}', - addBelow: 'Добавить ниже', - addFilter: 'Добавить фильтр', - adminTheme: 'Тема Панели', - and: 'А также', - applyChanges: 'Применить изменения', - ascending: 'Восходящий', - automatic: 'Автоматически', - backToDashboard: 'Назад к Панели', - cancel: 'Отмена', - changesNotSaved: - 'Ваши изменения не были сохранены. Если вы сейчас уйдете, то потеряете свои изменения.', - close: 'Закрыть', - collapse: 'Свернуть', - collections: 'Коллекции', - columnToSort: 'Колонка для сортировки', - columns: 'Колонки', - confirm: 'Подтвердить', - confirmDeletion: 'Подтвердить удаление', - confirmDuplication: 'Подтвердить копирование', - copied: 'Скопировано', - copy: 'Скопировать', - create: 'Создать', - createNew: 'Создать', - createNewLabel: 'Создать новый {{label}}', - created: 'Создано', - createdAt: 'Дата создания', - creating: 'Создание', - creatingNewLabel: 'Создание нового {{label}}', - dark: 'Тёмная', - dashboard: 'Панель', - delete: 'Удалить', - deletedCountSuccessfully: 'Удалено {{count}} {{label}} успешно.', - deletedSuccessfully: 'Удален успешно.', - deleting: 'Удаление...', - descending: 'Уменьшение', - deselectAllRows: 'Снять выделение со всех строк', - duplicate: 'Дублировать', - duplicateWithoutSaving: 'Дублирование без сохранения изменений', - edit: 'Редактировать', - editLabel: 'Редактировать {{label}}', - editing: 'Редактирование', - editingLabel_many: 'Редактирование {{count}} {{label}}', - editingLabel_one: 'Редактирование {{count}} {{label}}', - editingLabel_other: 'Редактирование {{count}} {{label}}', - email: 'Email', - emailAddress: 'Email', - enterAValue: 'Введите значение', - error: 'Ошибка', - errors: 'Ошибки', - fallbackToDefaultLocale: 'Возврат к локали по умолчанию', - filter: 'Фильтр', - filterWhere: 'Где фильтровать', - filters: 'Фильтры', - globals: 'Глобальные', - language: 'Язык', - lastModified: 'Последнее изменение', - leaveAnyway: 'Все равно уйти', - leaveWithoutSaving: 'Выход без сохранения', - light: 'Светлая', - livePreview: 'Предпросмотр', - loading: 'Загрузка', - locale: 'Локаль', - locales: 'Локали', - menu: 'Меню', - moveDown: 'Сдвинуть вниз', - moveUp: 'Сдвинуть вверх', - newPassword: 'Новый пароль', - noFiltersSet: 'Фильтры не установлены', - noLabel: 'Без метки', - noOptions: 'Нет вариантов', - noResults: - 'Не найдено ни одной {{label}}. Либо {{label}} еще не существует, либо ни одна из них не соответствует фильтрам, которые вы указали выше.', - noValue: 'Нет значения', - none: 'Никто', - notFound: 'Не найдено', - nothingFound: 'Ничего не найдено', - of: 'из', - open: 'Открыть', - or: 'Или же', - order: 'Порядок', - pageNotFound: 'Страница не найдена', - password: 'Пароль', - payloadSettings: 'Настройки Payload', - perPage: 'На странице: {{limit}}', - remove: 'Удалить', - reset: 'Сброс', - row: 'Строка', - rows: 'Строки', - save: 'Сохранить', - saving: 'Сохранение...', - searchBy: 'Искать по', - selectAll: 'Выбрать все {{count}} {{label}}', - selectAllRows: 'Выбрать все строки', - selectValue: 'Выбрать значение', - selectedCount: '{{count}} {{label}} выбрано', - showAllLabel: 'Показать все {{label}}', - sorryNotFound: 'К сожалению, ничего подходящего под ваш запрос нет.', - sort: 'Сортировать', - sortByLabelDirection: 'Сортировать по {{label}} {{direction}}', - stayOnThisPage: 'Остаться на этой странице', - submissionSuccessful: 'Успешно отправлено.', - submit: 'Отправить', - successfullyCreated: '{{label}} успешно создан.', - successfullyDuplicated: '{{label}} успешно продублирован.', - thisLanguage: 'Русский', - titleDeleted: '{{label}} {{title}} успешно удалено.', - unauthorized: 'Нет доступа', - unsavedChangesDuplicate: - 'У вас есть несохраненные изменения. Вы хотите продолжить дублирование?', - untitled: 'Без названия', - updatedAt: 'Дата правки', - updatedCountSuccessfully: 'Обновлено {{count}} {{label}} успешно.', - updatedSuccessfully: 'Успешно Обновлено.', - updating: 'Обновление', - uploading: 'Загрузка', - user: 'пользователь', - users: 'пользователи', - value: 'Значение', - welcome: 'Добро пожаловать', - }, - operators: { - contains: 'содержит', - equals: 'равно', - exists: 'существует', - isGreaterThan: 'больше чем', - isGreaterThanOrEqualTo: 'больше или равно', - isIn: 'находится', - isLessThan: 'меньше чем', - isLessThanOrEqualTo: 'меньше или равно', - isLike: 'похоже', - isNotEqualTo: 'не равно', - isNotIn: 'нет в', - near: 'рядом', - }, - upload: { - crop: 'Обрезать', - cropToolDescription: - 'Перетащите углы выбранной области, нарисуйте новую область или отрегулируйте значения ниже.', - dragAndDrop: 'Перетащите файл', - dragAndDropHere: 'или перетащите файл сюда', - editImage: 'Редактировать изображение', - fileName: 'Имя файла', - fileSize: 'Размер файла', - focalPoint: 'Центральная точка', - focalPointDescription: - 'Перетащите фокусное расстояние прямо на предварительный просмотр или отрегулируйте значения ниже.', - height: 'Высота', - lessInfo: 'Меньше информации', - moreInfo: 'Больше информации', - previewSizes: 'Предварительный просмотр размеров', - selectCollectionToBrowse: 'Выберите Коллекцию для просмотра', - selectFile: 'Выберите файл', - setCropArea: 'Установите область обрезки', - setFocalPoint: 'Установить фокусное расстояние', - sizes: 'Размеры', - sizesFor: 'Размеры для {{label}}', - width: 'Ширина', - }, - validation: { - emailAddress: 'Пожалуйста, введите корректный адрес email.', - enterNumber: 'Пожалуйста, введите корректный номер.', - fieldHasNo: 'У этого поля нет {{label}}', - greaterThanMax: '{{value}} больше максимально допустимого значения {{label}} {{max}}.', - invalidInput: 'Это поле имеет недопустимое значение.', - invalidSelection: 'В этом поле выбран недопустимый вариант.', - invalidSelections: "'Это поле содержит следующие неправильные варианты:'", - lessThanMin: '{{value}} меньше минимально допустимого значения {{label}} {{min}}.', - limitReached: 'Достигнут лимит, можно добавить только {{max}} элементов.', - longerThanMin: 'Это значение должно быть больше минимальной длины символов: {{minLength}}.', - notValidDate: '"{{value}}" это не действительная дата.', - required: 'Это обязательное поле.', - requiresAtLeast: 'Это поле требует не менее {{count}} {{label}}', - requiresNoMoreThan: 'Это поле требует не более {{count}} {{label}}', - requiresTwoNumbers: 'В этом поле требуется два числа.', - shorterThanMax: 'Это значение должно быть короче максимальной длины символов {{maxLength}}.', - trueOrFalse: 'Это поле может быть равно только true или false.', - validUploadID: "'Это поле не является действительным ID загрузки.'", - }, - version: { - aboutToPublishSelection: 'Вы собираетесь опубликовать все {{label}} в выборе. Вы уверены?', - aboutToRestore: - 'Вы собираетесь восстановить этот документ {{label}} в состояние, в котором он находился {{versionDate}}.', - aboutToRestoreGlobal: - 'Вы собираетесь восстановить глобальную запись {{label}} в состояние, в котором она находилась {{versionDate}}.', - aboutToRevertToPublished: - 'Вы собираетесь вернуть изменения этого документа к его опубликованному состоянию. Вы уверены?', - aboutToUnpublish: 'Вы собираетесь отменить публикацию этого документа. Вы уверены?', - aboutToUnpublishSelection: - 'Вы собираетесь отменить публикацию всех выбранных {{label}}. Вы уверены?', - autosave: 'Автосохранение', - autosavedSuccessfully: 'Автосохранение успешно.', - autosavedVersion: 'Автоматически сохраненная версия', - changed: 'Изменено', - compareVersion: 'Сравнить версию с:', - confirmPublish: 'Подтвердить публикацию', - confirmRevertToSaved: 'Подтвердить возврат к сохраненному', - confirmUnpublish: 'Подтвердить отмену публикации', - confirmVersionRestoration: 'Подтвердить восстановление версии', - currentDocumentStatus: 'Текущий статус {{docStatus}} документа', - draft: 'Черновик', - draftSavedSuccessfully: 'Черновик успешно сохранен.', - lastSavedAgo: 'Последний раз сохранено {{distance}} назад', - noFurtherVersionsFound: 'Другие версии не найдены', - noRowsFound: 'Не найдено {{label}}', - preview: 'Предпросмотр', - problemRestoringVersion: 'Возникла проблема с восстановлением этой версии', - publish: 'Публиковать', - publishChanges: 'Опубликовать изменения', - published: 'Опубликовано', - publishing: 'Публикация', - restoreThisVersion: 'Восстановить эту версию', - restoredSuccessfully: 'Восстановлен успешно.', - restoring: 'Восстановление...', - revertToPublished: 'Вернуться к опубликованному', - reverting: 'Возврат...', - saveDraft: 'Сохранить черновик', - selectLocales: 'Выберите локали для отображения', - selectVersionToCompare: 'Выбрать версию для сравнения', - showLocales: 'Показать локали:', - showingVersionsFor: 'Показаны версии для:', - status: 'Статус', - type: 'Тип', - unpublish: 'Отменить публикацию', - unpublishing: 'Отмена публикации...', - version: 'Версия', - versionCount_many: '{{count}} версий найдено', - versionCount_none: 'Версий не найдено', - versionCount_one: '{{count}} версия найдена', - versionCount_other: 'Найдено {{count}} версий', - versionCreatedOn: '{{version}} создана:', - versionID: 'ID версии', - versions: 'Версии', - viewingVersion: 'Просмотр версии для {{entityLabel}} {{documentTitle}}', - viewingVersionGlobal: '`Просмотр версии для глобальной Коллекции {{entityLabel}}', - viewingVersions: 'Просмотр версий для {{entityLabel}} {{documentTitle}}', - viewingVersionsGlobal: '`Просмотр версии для глобальной Коллекции {{entityLabel}}', +import type { Language } from '../types.js' + +export const ru: Language = { + dateFNSKey: 'ru', + translations: { + authentication: { + account: 'Аккаунт', + accountOfCurrentUser: 'Аккаунт текущего пользователя', + alreadyActivated: 'Уже активирован', + alreadyLoggedIn: 'Уже вошли в систему', + apiKey: 'API ключ', + backToLogin: 'Вернуться к входу', + beginCreateFirstUser: 'Чтобы начать - создайте первого пользователя.', + changePassword: 'Сменить пароль', + checkYourEmailForPasswordReset: + 'На ваш email отправлена ссылка, с помощью которой можно будет сбросить пароль.', + confirmGeneration: 'Подтвердить генерацию', + confirmPassword: 'Подтверждение пароля', + createFirstUser: 'Создание первого пользователя', + emailNotValid: 'Указанный адрес электронной почты неверен', + emailSent: 'Email отправлен', + enableAPIKey: 'Активировать API ключ', + failedToUnlock: 'Не удалось разблокировать', + forceUnlock: 'Принудительная разблокировка', + forgotPassword: 'Забыли пароль', + forgotPasswordEmailInstructions: + 'Пожалуйста, введите ваш email. Вы получите письмо с инструкцией по восстановлению пароля.', + forgotPasswordQuestion: 'Забыли пароль?', + generate: 'Сгенерировать', + generateNewAPIKey: 'Сгенерировать новый API ключ', + generatingNewAPIKeyWillInvalidate: + 'Генерация нового API ключа приведёт к <1>недействительности предыдущего ключа. Вы уверены, что хотите продолжить?', + lockUntil: 'Заблокировать до', + logBackIn: 'Войти снова', + logOut: 'Выйти', + loggedIn: 'Чтобы войти в другую учетную запись, сначала <0>выйдите.', + loggedInChangePassword: + 'Чтобы изменить пароль, зайдите в свой <0>аккаунт и измените пароль там.', + loggedOutInactivity: 'Вы вышли из системы из-за неактивности.', + loggedOutSuccessfully: 'Вы успешно вышли из системы.', + login: 'Войти', + loginAttempts: 'Попытки входа', + loginUser: 'Вход пользователя в систему', + loginWithAnotherUser: + 'Чтобы войти в систему под другим пользователем, необходимо сначала <0>выйти.', + logout: 'Выйти', + logoutUser: 'Вход из системы', + newAPIKeyGenerated: 'Новый API ключ сгенерирован.', + newAccountCreated: + 'Новый аккаунт был создан для доступа к {{serverURL}} Пожалуйста, кликните по следующей ссылке или вставьте в адресную строку браузера чтобы подтвердить email: {{verificationURL}}
После подтверждения вашего email, вы сможете успешно войти в систему.', + newPassword: 'Новый пароль', + resetPassword: 'Сброс пароля', + resetPasswordExpiration: 'Сброс пароля по истечении срока действия', + resetPasswordToken: 'Токен сброса пароля', + resetYourPassword: 'Сброс вашего пароля', + stayLoggedIn: 'Остаться в системе', + successfullyUnlocked: 'Успешно разблокирован', + unableToVerify: 'Невозможно подтвердить', + verified: 'Подтверждено', + verifiedSuccessfully: 'Успешно подтверждено', + verify: 'Подтвердить', + verifyUser: 'Подтвердить пользователя', + verifyYourEmail: 'Подтвердить ваш email', + youAreInactive: + 'Вы не были активны в течение некоторого времени и скоро автоматически выйдете из системы в целях вашей безопасности. Вы хотите остаться в системе?', + youAreReceivingResetPassword: + 'Вы получили это сообщение, потому что вы (или кто-то другой) запросили сброс пароля для вашей учетной записи. Пожалуйста, нажмите на следующую ссылку или вставьте ее в браузер, чтобы завершить процесс:', + youDidNotRequestPassword: + 'Если вы не запрашивали этого, пожалуйста, проигнорируйте это письмо, и ваш пароль останется неизменным.', + }, + error: { + accountAlreadyActivated: 'Этот аккаунт уже был активирован.', + autosaving: 'При автосохранении этого документа возникла проблема.', + correctInvalidFields: 'Пожалуйста, исправьте неправильные поля.', + deletingFile: 'Произошла ошибка при удалении файла.', + deletingTitle: + 'При удалении {{title}} произошла ошибка. Пожалуйста, проверьте соединение и повторите попытку.', + emailOrPasswordIncorrect: 'Указанный email или пароль неверен.', + followingFieldsInvalid_one: 'Следующее поле недействительно:', + followingFieldsInvalid_other: 'Следующие поля недействительны:', + incorrectCollection: 'Неправильная Коллекция', + invalidFileType: 'Недопустимый тип файла', + invalidFileTypeValue: 'Недопустимый тип файла: {{value}}', + loadingDocument: 'Возникла проблема при загрузке документа с ID {{id}}.', + missingEmail: 'Отсутствует email.', + missingIDOfDocument: 'Отсутствующий ID документа для обновления.', + missingIDOfVersion: 'Отсутствует ID версии.', + missingRequiredData: 'Отсутствуют необходимые данные.', + noFilesUploaded: 'Не было загружено ни одного файла.', + noMatchedField: 'Не найдено подходящего поля для "{{label}}"', + noUser: 'Нет Пользователя', + notAllowedToAccessPage: 'Вы не имеете права доступа к этой странице.', + notAllowedToPerformAction: 'У вас нет права на выполнение этого действия.', + notFound: 'Запрашиваемый ресурс не найден.', + previewing: 'При предварительном просмотре этого документа возникла проблема.', + problemUploadingFile: 'Возникла проблема при загрузке файла.', + tokenInvalidOrExpired: 'Токен либо недействителен, либо срок его действия истек.', + unPublishingDocument: 'При отмене публикации этого документа возникла проблема.', + unableToDeleteCount: 'Не удалось удалить {{count}} из {{total}} {{label}}.', + unableToUpdateCount: 'Не удалось обновить {{count}} из {{total}} {{label}}.', + unauthorized: 'Нет доступа, вы должны войти, чтобы сделать этот запрос.', + unknown: 'Произошла неизвестная ошибка.', + unspecific: 'Произошла ошибка.', + userLocked: + 'Этот пользователь заблокирован из-за слишком большого количества неудачных попыток входа.', + valueMustBeUnique: 'Значение должно быть уникальным', + verificationTokenInvalid: 'Проверочный токен недействителен.', + }, + fields: { + addLabel: 'Добавить {{label}}', + addLink: 'Добавить ссылку', + addNew: 'Добавить новый', + addNewLabel: 'Добавить {{label}}', + addRelationship: 'Добавить Отношения', + addUpload: 'Добавить загрузку', + block: 'Блок', + blockType: 'Тип Блока', + blocks: 'Блоки', + chooseBetweenCustomTextOrDocument: + 'Выберите между вводом пользовательского текстового URL и ссылкой на другой документ.', + chooseDocumentToLink: 'Выберите документ для ссылки', + chooseFromExisting: 'Выбрать из существующих', + chooseLabel: 'Выбрать {{label}}', + collapseAll: 'Свернуть все', + customURL: 'Пользовательский URL', + editLabelData: 'Редактировать данные {{label}}', + editLink: 'Редактировать ссылку', + editRelationship: 'Редактировать Отношения', + enterURL: 'Введите URL', + internalLink: 'Внутренняя ссылка', + itemsAndMore: '{{items}} и ещё {{count}}', + labelRelationship: '{{label}} Отношения', + latitude: 'Широта', + linkType: 'Тип ссылки', + linkedTo: 'Связано с <0>{{label}}', + longitude: 'Долгота', + newLabel: 'Новый {{label}}', + openInNewTab: 'Открывать в новой вкладке', + passwordsDoNotMatch: 'Пароли не совпадают.', + relatedDocument: 'Связанный документ', + relationTo: 'Отношение к', + removeRelationship: 'Удалить связь', + removeUpload: 'Удалить загруженное', + saveChanges: 'Сохранить изменения', + searchForBlock: 'Найти Блок', + selectExistingLabel: 'Выберите существующий {{label}}', + selectFieldsToEdit: 'Выберите поля для редактирования', + showAll: 'Показать все', + swapRelationship: 'Поменять отношения', + swapUpload: 'Заменить загруженное', + textToDisplay: 'Текст для отображения', + toggleBlock: 'Переключить Блок', + uploadNewLabel: 'Загрузить новый {{label}}', + }, + general: { + aboutToDelete: 'Вы собираетесь удалить {{label}} <1>{{title}}. Вы уверены?', + aboutToDeleteCount_many: 'Вы собираетесь удалить {{count}} {{label}}', + aboutToDeleteCount_one: 'Вы собираетесь удалить {{count}} {{label}}', + aboutToDeleteCount_other: 'Вы собираетесь удалить {{count}} {{label}}', + addBelow: 'Добавить ниже', + addFilter: 'Добавить фильтр', + adminTheme: 'Тема Панели', + and: 'А также', + applyChanges: 'Применить изменения', + ascending: 'Восходящий', + automatic: 'Автоматически', + backToDashboard: 'Назад к Панели', + cancel: 'Отмена', + changesNotSaved: + 'Ваши изменения не были сохранены. Если вы сейчас уйдете, то потеряете свои изменения.', + close: 'Закрыть', + collapse: 'Свернуть', + collections: 'Коллекции', + columnToSort: 'Колонка для сортировки', + columns: 'Колонки', + confirm: 'Подтвердить', + confirmDeletion: 'Подтвердить удаление', + confirmDuplication: 'Подтвердить копирование', + copied: 'Скопировано', + copy: 'Скопировать', + create: 'Создать', + createNew: 'Создать', + createNewLabel: 'Создать новый {{label}}', + created: 'Создано', + createdAt: 'Дата создания', + creating: 'Создание', + creatingNewLabel: 'Создание нового {{label}}', + dark: 'Тёмная', + dashboard: 'Панель', + delete: 'Удалить', + deletedCountSuccessfully: 'Удалено {{count}} {{label}} успешно.', + deletedSuccessfully: 'Удален успешно.', + deleting: 'Удаление...', + descending: 'Уменьшение', + deselectAllRows: 'Снять выделение со всех строк', + duplicate: 'Дублировать', + duplicateWithoutSaving: 'Дублирование без сохранения изменений', + edit: 'Редактировать', + editLabel: 'Редактировать {{label}}', + editing: 'Редактирование', + editingLabel_many: 'Редактирование {{count}} {{label}}', + editingLabel_one: 'Редактирование {{count}} {{label}}', + editingLabel_other: 'Редактирование {{count}} {{label}}', + email: 'Email', + emailAddress: 'Email', + enterAValue: 'Введите значение', + error: 'Ошибка', + errors: 'Ошибки', + fallbackToDefaultLocale: 'Возврат к локали по умолчанию', + filter: 'Фильтр', + filterWhere: 'Где фильтровать', + filters: 'Фильтры', + globals: 'Глобальные', + language: 'Язык', + lastModified: 'Последнее изменение', + leaveAnyway: 'Все равно уйти', + leaveWithoutSaving: 'Выход без сохранения', + light: 'Светлая', + livePreview: 'Предпросмотр', + loading: 'Загрузка', + locale: 'Локаль', + locales: 'Локали', + menu: 'Меню', + moveDown: 'Сдвинуть вниз', + moveUp: 'Сдвинуть вверх', + newPassword: 'Новый пароль', + noFiltersSet: 'Фильтры не установлены', + noLabel: 'Без метки', + noOptions: 'Нет вариантов', + noResults: + 'Не найдено ни одной {{label}}. Либо {{label}} еще не существует, либо ни одна из них не соответствует фильтрам, которые вы указали выше.', + noValue: 'Нет значения', + none: 'Никто', + notFound: 'Не найдено', + nothingFound: 'Ничего не найдено', + of: 'из', + open: 'Открыть', + or: 'Или же', + order: 'Порядок', + pageNotFound: 'Страница не найдена', + password: 'Пароль', + payloadSettings: 'Настройки Payload', + perPage: 'На странице: {{limit}}', + remove: 'Удалить', + reset: 'Сброс', + row: 'Строка', + rows: 'Строки', + save: 'Сохранить', + saving: 'Сохранение...', + searchBy: 'Искать по', + selectAll: 'Выбрать все {{count}} {{label}}', + selectAllRows: 'Выбрать все строки', + selectValue: 'Выбрать значение', + selectedCount: '{{count}} {{label}} выбрано', + showAllLabel: 'Показать все {{label}}', + sorryNotFound: 'К сожалению, ничего подходящего под ваш запрос нет.', + sort: 'Сортировать', + sortByLabelDirection: 'Сортировать по {{label}} {{direction}}', + stayOnThisPage: 'Остаться на этой странице', + submissionSuccessful: 'Успешно отправлено.', + submit: 'Отправить', + successfullyCreated: '{{label}} успешно создан.', + successfullyDuplicated: '{{label}} успешно продублирован.', + thisLanguage: 'Русский', + titleDeleted: '{{label}} {{title}} успешно удалено.', + unauthorized: 'Нет доступа', + unsavedChangesDuplicate: + 'У вас есть несохраненные изменения. Вы хотите продолжить дублирование?', + untitled: 'Без названия', + updatedAt: 'Дата правки', + updatedCountSuccessfully: 'Обновлено {{count}} {{label}} успешно.', + updatedSuccessfully: 'Успешно Обновлено.', + updating: 'Обновление', + uploading: 'Загрузка', + user: 'пользователь', + users: 'пользователи', + value: 'Значение', + welcome: 'Добро пожаловать', + }, + operators: { + contains: 'содержит', + equals: 'равно', + exists: 'существует', + isGreaterThan: 'больше чем', + isGreaterThanOrEqualTo: 'больше или равно', + isIn: 'находится', + isLessThan: 'меньше чем', + isLessThanOrEqualTo: 'меньше или равно', + isLike: 'похоже', + isNotEqualTo: 'не равно', + isNotIn: 'нет в', + near: 'рядом', + }, + upload: { + crop: 'Обрезать', + cropToolDescription: + 'Перетащите углы выбранной области, нарисуйте новую область или отрегулируйте значения ниже.', + dragAndDrop: 'Перетащите файл', + dragAndDropHere: 'или перетащите файл сюда', + editImage: 'Редактировать изображение', + fileName: 'Имя файла', + fileSize: 'Размер файла', + focalPoint: 'Центральная точка', + focalPointDescription: + 'Перетащите фокусное расстояние прямо на предварительный просмотр или отрегулируйте значения ниже.', + height: 'Высота', + lessInfo: 'Меньше информации', + moreInfo: 'Больше информации', + previewSizes: 'Предварительный просмотр размеров', + selectCollectionToBrowse: 'Выберите Коллекцию для просмотра', + selectFile: 'Выберите файл', + setCropArea: 'Установите область обрезки', + setFocalPoint: 'Установить фокусное расстояние', + sizes: 'Размеры', + sizesFor: 'Размеры для {{label}}', + width: 'Ширина', + }, + validation: { + emailAddress: 'Пожалуйста, введите корректный адрес email.', + enterNumber: 'Пожалуйста, введите корректный номер.', + fieldHasNo: 'У этого поля нет {{label}}', + greaterThanMax: '{{value}} больше максимально допустимого значения {{label}} {{max}}.', + invalidInput: 'Это поле имеет недопустимое значение.', + invalidSelection: 'В этом поле выбран недопустимый вариант.', + invalidSelections: "'Это поле содержит следующие неправильные варианты:'", + lessThanMin: '{{value}} меньше минимально допустимого значения {{label}} {{min}}.', + limitReached: 'Достигнут лимит, можно добавить только {{max}} элементов.', + longerThanMin: 'Это значение должно быть больше минимальной длины символов: {{minLength}}.', + notValidDate: '"{{value}}" это не действительная дата.', + required: 'Это обязательное поле.', + requiresAtLeast: 'Это поле требует не менее {{count}} {{label}}', + requiresNoMoreThan: 'Это поле требует не более {{count}} {{label}}', + requiresTwoNumbers: 'В этом поле требуется два числа.', + shorterThanMax: 'Это значение должно быть короче максимальной длины символов {{maxLength}}.', + trueOrFalse: 'Это поле может быть равно только true или false.', + validUploadID: "'Это поле не является действительным ID загрузки.'", + }, + version: { + type: 'Тип', + aboutToPublishSelection: 'Вы собираетесь опубликовать все {{label}} в выборе. Вы уверены?', + aboutToRestore: + 'Вы собираетесь восстановить этот документ {{label}} в состояние, в котором он находился {{versionDate}}.', + aboutToRestoreGlobal: + 'Вы собираетесь восстановить глобальную запись {{label}} в состояние, в котором она находилась {{versionDate}}.', + aboutToRevertToPublished: + 'Вы собираетесь вернуть изменения этого документа к его опубликованному состоянию. Вы уверены?', + aboutToUnpublish: 'Вы собираетесь отменить публикацию этого документа. Вы уверены?', + aboutToUnpublishSelection: + 'Вы собираетесь отменить публикацию всех выбранных {{label}}. Вы уверены?', + autosave: 'Автосохранение', + autosavedSuccessfully: 'Автосохранение успешно.', + autosavedVersion: 'Автоматически сохраненная версия', + changed: 'Изменено', + compareVersion: 'Сравнить версию с:', + confirmPublish: 'Подтвердить публикацию', + confirmRevertToSaved: 'Подтвердить возврат к сохраненному', + confirmUnpublish: 'Подтвердить отмену публикации', + confirmVersionRestoration: 'Подтвердить восстановление версии', + currentDocumentStatus: 'Текущий статус {{docStatus}} документа', + draft: 'Черновик', + draftSavedSuccessfully: 'Черновик успешно сохранен.', + lastSavedAgo: 'Последний раз сохранено {{distance}} назад', + noFurtherVersionsFound: 'Другие версии не найдены', + noRowsFound: 'Не найдено {{label}}', + preview: 'Предпросмотр', + problemRestoringVersion: 'Возникла проблема с восстановлением этой версии', + publish: 'Публиковать', + publishChanges: 'Опубликовать изменения', + published: 'Опубликовано', + publishing: 'Публикация', + restoreThisVersion: 'Восстановить эту версию', + restoredSuccessfully: 'Восстановлен успешно.', + restoring: 'Восстановление...', + revertToPublished: 'Вернуться к опубликованному', + reverting: 'Возврат...', + saveDraft: 'Сохранить черновик', + selectLocales: 'Выберите локали для отображения', + selectVersionToCompare: 'Выбрать версию для сравнения', + showLocales: 'Показать локали:', + showingVersionsFor: 'Показаны версии для:', + status: 'Статус', + unpublish: 'Отменить публикацию', + unpublishing: 'Отмена публикации...', + version: 'Версия', + versionCount_many: '{{count}} версий найдено', + versionCount_none: 'Версий не найдено', + versionCount_one: '{{count}} версия найдена', + versionCount_other: 'Найдено {{count}} версий', + versionCreatedOn: '{{version}} создана:', + versionID: 'ID версии', + versions: 'Версии', + viewingVersion: 'Просмотр версии для {{entityLabel}} {{documentTitle}}', + viewingVersionGlobal: '`Просмотр версии для глобальной Коллекции {{entityLabel}}', + viewingVersions: 'Просмотр версий для {{entityLabel}} {{documentTitle}}', + viewingVersionsGlobal: '`Просмотр версии для глобальной Коллекции {{entityLabel}}', + }, }, } diff --git a/packages/translations/src/languages/sv.ts b/packages/translations/src/languages/sv.ts index 7b57d832af..ef046a869d 100644 --- a/packages/translations/src/languages/sv.ts +++ b/packages/translations/src/languages/sv.ts @@ -1,390 +1,396 @@ -export default { - authentication: { - account: 'Konto', - accountOfCurrentUser: 'Konto för nuvarande användare', - alreadyActivated: 'Redan aktiverad', - alreadyLoggedIn: 'Redan inloggad', - apiKey: 'API Nyckel', - backToLogin: 'Tillbaka till inloggningen', - beginCreateFirstUser: 'För att börja, skapa din första användare.', - changePassword: 'Byt Lösenord', - checkYourEmailForPasswordReset: - 'Kontrollera din e-post efter en länk som gör att du säkert kan återställa ditt lösenord.', - confirmGeneration: 'Bekräfta Generering', - confirmPassword: 'Bekräfta Lösenord', - createFirstUser: 'Skapa första användaren', - emailNotValid: 'Angiven e-postadress är inte giltig', - emailSent: 'E-posten Skickad', - enableAPIKey: 'Aktivera API nyckel', - failedToUnlock: 'Det gick inte att låsa upp', - forceUnlock: 'Tvinga Upplåsning', - forgotPassword: 'Glömt Lösenord', - forgotPasswordEmailInstructions: - 'Vänligen ange din e-postadress nedan. Du kommer att få ett e-postmeddelande med instruktioner om hur du återställer ditt lösenord.', - forgotPasswordQuestion: 'Glömt lösenordet?', - generate: 'Generera', - generateNewAPIKey: 'Generera ny API nyckel', - generatingNewAPIKeyWillInvalidate: - 'Att generera en ny API nyckel kommer <1>ogiltigförklara föregående nyckel. Är du säker på att du vill fortsätta?', - lockUntil: 'Lås Tills', - logBackIn: 'Logga in igen', - logOut: 'Logga ut', - loggedIn: 'För att logga in med en annan användare, bör du <0>logga ut först.', - loggedInChangePassword: - 'För att ändra ditt lösenord, gå till ditt <0>konto och redigera ditt lösenord där.', - loggedOutInactivity: 'Du har blivit utloggad på grund av inaktivitet.', - loggedOutSuccessfully: 'Du har loggat ut framgångsrikt.', - login: 'Logga in', - loginAttempts: 'Inloggningsförsök', - loginUser: 'Logga in användare', - loginWithAnotherUser: 'För att logga in med en annan användare, bör du <0>logga ut först.', - logout: 'Logga ut', - logoutUser: 'Logga ut användare', - newAPIKeyGenerated: 'Ny API Nyckel Genererad.', - newAccountCreated: - 'Ett nytt konto har precis skapats som du kan komma åt {{serverURL}} Klicka på följande länk eller klistra in webbadressen nedan i din webbläsare för att verifiera din e-post: {{verificationURL}}
Efter att ha verifierat din e-post kommer du att kunna logga in framgångsrikt.', - newPassword: 'Nytt Lösenord', - resetPassword: 'Återställ Lösenord', - resetPasswordExpiration: 'Återställ Lösenordsutgång', - resetPasswordToken: 'Återställ Lösenord Token', - resetYourPassword: 'Återställ Ditt Lösenord', - stayLoggedIn: 'Stanna inloggad', - successfullyUnlocked: 'Låst upp framgångsrikt', - unableToVerify: 'Det går inte att Verifiera', - verified: 'Verifierad', - verifiedSuccessfully: 'Framgångsrikt Verifierad', - verify: 'Verifiera', - verifyUser: 'Verifiera Användare', - verifyYourEmail: 'Verifiera din epost', - youAreInactive: - 'Du har inte varit aktiv på ett tag och kommer inom kort att automatiskt loggas ut för din egen säkerhet. Vill du forsätta att vara inloggad?', - youAreReceivingResetPassword: - 'Du får detta för att du (eller någon annan) har begärt återställning av lösenordet för ditt konto. Klicka på följande länk eller klistra in den i din webbläsare för att slutföra processen:', - youDidNotRequestPassword: - 'Om du inte begärde detta, ignorera detta e-postmeddelande och ditt lösenord kommer att förbli oförändrat.', - }, - error: { - accountAlreadyActivated: 'Detta konto har redan aktiverats.', - autosaving: 'Det uppstod ett problem när det här dokumentet skulle sparas automatiskt.', - correctInvalidFields: 'Vänligen korrigera ogiltiga fält.', - deletingFile: 'Det gick inte att ta bort filen.', - deletingTitle: - 'Det uppstod ett fel vid borttagningen av {{title}}. Vänligen kontrollera din anslutning och försök igen.', - emailOrPasswordIncorrect: 'E-postadressen eller lösenordet som angivits är felaktigt.', - followingFieldsInvalid_one: 'Följande fält är ogiltigt:', - followingFieldsInvalid_other: 'Följande fält är ogiltiga:', - incorrectCollection: 'Felaktig Samling', - invalidFileType: 'Ogiltig filtyp', - invalidFileTypeValue: 'Ogiltig filtyp: {{value}}', - loadingDocument: 'Det gick inte att läsa in dokumentet med ID {{id}}.', - missingEmail: 'E-postadress saknas.', - missingIDOfDocument: 'Saknar ID för dokumentet som ska uppdateras.', - missingIDOfVersion: 'ID för versionen saknas.', - missingRequiredData: 'Obligatorisk data saknas.', - noFilesUploaded: 'Inga filer laddades upp.', - noMatchedField: 'Inget matchande fält hittades för "{{label}}"', - noUser: 'Ingen Användare', - notAllowedToAccessPage: 'Du får inte komma åt den här sidan.', - notAllowedToPerformAction: 'Du får inte utföra denna åtgärd.', - notFound: 'Den begärda resursen hittades inte.', - previewing: 'Det uppstod ett problem när det här dokumentet skulle förhandsgranskas.', - problemUploadingFile: 'Det uppstod ett problem när filen laddades upp.', - tokenInvalidOrExpired: 'Token är antingen ogiltig eller har löpt ut.', - unPublishingDocument: 'Det uppstod ett problem när det här dokumentet skulle avpubliceras.', - unableToDeleteCount: 'Det gick inte att ta bort {{count}} av {{total}} {{label}}.', - unableToUpdateCount: 'Det gick inte att uppdatera {{count}} av {{total}} {{label}}.', - unauthorized: 'Obehörig, du måste vara inloggad för att göra denna begäran.', - unknown: 'Ett okänt fel har uppstått.', - unspecific: 'Ett fel har uppstått.', - userLocked: 'Den här användaren är låst på grund av för många misslyckade inloggningsförsök.', - valueMustBeUnique: 'Värdet måste vara unikt', - verificationTokenInvalid: 'Verifieringstoken är ogiltig.', - }, - fields: { - addLabel: 'Lägg till {{label}}', - addLink: 'Lägg till Länk', - addNew: 'Lägg till ny', - addNewLabel: 'Lägg till ny {{label}}', - addRelationship: 'Lägg till Relation', - addUpload: 'Lägg till Uppladdning', - block: 'block', - blockType: 'Block Typ', - blocks: 'block', - chooseBetweenCustomTextOrDocument: - 'Välj mellan att ange en anpassad text-URL eller länka till ett annat dokument.', - chooseDocumentToLink: 'Välj ett dokument att länka till', - chooseFromExisting: 'Välj bland befintliga', - chooseLabel: 'Välj {{label}}', - collapseAll: 'kollapsa Alla', - customURL: 'Anpassad URL', - editLabelData: 'Redigera {{label}} data', - editLink: 'Redigera Länk', - editRelationship: 'Redigera Relation', - enterURL: 'Ange en URL', - internalLink: 'Intern länk', - itemsAndMore: '{{items}} och {{count}} mer', - labelRelationship: '{{label}} Relation', - latitude: 'Latitud', - linkType: 'Länktyp', - linkedTo: 'Länkad till <0>{{label}}', - longitude: 'Longitud', - newLabel: 'Ny {{label}}', - openInNewTab: 'Öppna i ny flik', - passwordsDoNotMatch: 'Lösenorden matchar inte.', - relatedDocument: 'Relaterat Dokument', - relationTo: 'Relation till', - removeRelationship: 'Ta Bort Relation', - removeUpload: 'Ta Bort Uppladdning', - saveChanges: 'Spara ändringar', - searchForBlock: 'Sök efter ett block', - selectExistingLabel: 'Välj befintlig {{label}}', - selectFieldsToEdit: 'Välj fält att redigera', - showAll: 'Visa Alla', - swapRelationship: 'Byt Förhållande', - swapUpload: 'Byt Uppladdning', - textToDisplay: 'Text att visa', - toggleBlock: 'Växla block', - uploadNewLabel: 'Ladda upp ny {{label}}', - }, - general: { - aboutToDelete: 'Du är på väg att ta bort {{label}} <1>{{title}}. Är du säker?', - aboutToDeleteCount_many: 'Du är på väg att ta bort {{count}} {{label}}', - aboutToDeleteCount_one: 'Du är på väg att ta bort {{count}} {{label}}', - aboutToDeleteCount_other: 'Du är på väg att ta bort {{count}} {{label}}', - addBelow: 'Lägg Till Nedanför', - addFilter: 'Lägg Till Filter', - adminTheme: 'Admin Tema', - and: 'Och', - applyChanges: 'Verkställ ändringar', - ascending: 'Stigande', - automatic: 'Automatisk', - backToDashboard: 'Tillbaka till Manöverpanelen', - cancel: 'Avbryt', - changesNotSaved: - 'Dina ändringar har inte sparats. Om du lämnar nu kommer du att förlora dina ändringar.', - close: 'Stänga', - collapse: 'Kollapsa', - collections: 'Samlingar', - columnToSort: 'Kolumn att Sortera', - columns: 'Kolumner', - confirm: 'Bekräfta', - confirmDeletion: 'Bekräfta radering', - confirmDuplication: 'Bekräfta dubblering', - copied: 'Kopierad', - copy: 'Kopiera', - create: 'Skapa', - createNew: 'Skapa Ny', - createNewLabel: 'Skapa ny {{label}}', - created: 'Skapad', - createdAt: 'Skapad Vid', - creating: 'Skapar', - creatingNewLabel: 'Skapar ny {{label}}', - dark: 'Mörk', - dashboard: 'Manöverpanel', - delete: 'Ta bort', - deletedCountSuccessfully: 'Raderade {{count}} {{label}} framgångsrikt.', - deletedSuccessfully: 'Togs bort framgångsrikt.', - deleting: 'Tar bort...', - descending: 'Fallande', - deselectAllRows: 'Avmarkera alla rader', - duplicate: 'Duplicera', - duplicateWithoutSaving: 'Duplicera utan att spara ändringar', - edit: 'Redigera', - editLabel: 'Redigera {{label}}', - editing: 'Redigerar', - editingLabel_many: 'Redigerar {{count}} {{label}}', - editingLabel_one: 'Redigerar {{count}} {{label}}', - editingLabel_other: 'Redigerar {{count}} {{label}}', - email: 'E-post', - emailAddress: 'E-postadress', - enterAValue: 'Ange ett värde', - error: 'Fel', - errors: 'Fel', - fallbackToDefaultLocale: 'Återgång till standardlokalspråk', - filter: 'Filter', - filterWhere: 'Filtrera {{label}} där', - filters: 'Filter', - globals: 'Globala', - language: 'Språk', - lastModified: 'Senast Ändrad', - leaveAnyway: 'Lämna ändå', - leaveWithoutSaving: 'Lämna utan att spara', - light: 'Ljus', - livePreview: 'Förhandsvisa', - loading: 'Läser in', - locale: 'Lokal', - locales: 'Språk', - menu: 'Meny', - moveDown: 'Flytta Ner', - moveUp: 'Flytta Upp', - newPassword: 'Nytt Lösenord', - noFiltersSet: 'Inga filter inställda', - noLabel: '', - noOptions: 'Inga alternativ', - noResults: - 'Inga {{label}} hittades. Antingen finns inga {{label}} ännu eller matchar ingen filtren du har angett ovan.', - noValue: 'Inget värde', - none: 'Ingen', - notFound: 'Hittades inte', - nothingFound: 'Inget hittades', - of: 'av', - open: 'Öppna', - or: 'Eller', - order: 'Ordning', - pageNotFound: 'Sidan hittas inte', - password: 'Lösenord', - payloadSettings: 'Payload Inställningar', - perPage: 'Per Sida: {{limit}}', - remove: 'Ta bort', - reset: 'Återställ', - row: 'Rad', - rows: 'Rader', - save: 'Spara', - saving: 'Sparar...', - searchBy: 'Sök efter {{label}}', - selectAll: 'Välj alla {{count}} {{label}}', - selectAllRows: 'Välj alla rader', - selectValue: 'Välj ett värde', - selectedCount: '{{count}} {{label}} har valts', - showAllLabel: 'Visa alla {{label}}', - sorryNotFound: 'Tyvärr–det finns inget som motsvarar din begäran.', - sort: 'Sortera', - sortByLabelDirection: 'Sortera efter {{label}} {{direction}}', - stayOnThisPage: 'Stanna på denna sida', - submissionSuccessful: 'Inlämningen Lyckades.', - submit: 'Lämna in', - successfullyCreated: '{{label}} skapades framgångsrikt.', - successfullyDuplicated: '{{label}} duplicerades framgångsrikt.', - thisLanguage: 'Svenska', - titleDeleted: '{{label}} "{{title}}" togs bort framgångsrikt.', - unauthorized: 'Obehörig', - unsavedChangesDuplicate: 'Du har osparade ändringar. Vill du fortsätta att duplicera?', - untitled: 'Namnlös', - updatedAt: 'Uppdaterades Vid', - updatedCountSuccessfully: 'Uppdaterade {{count}} {{label}} framgångsrikt.', - updatedSuccessfully: 'Uppdaterades framgångsrikt.', - updating: 'Uppdatering', - uploading: 'Uppladdning', - user: 'Användare', - users: 'Användare', - value: 'Värde', - welcome: 'Välkommen', - }, - operators: { - contains: 'innehåller', - equals: 'likar med', - exists: 'finns', - isGreaterThan: 'är större än', - isGreaterThanOrEqualTo: 'är större än eller lika med', - isIn: 'är med', - isLessThan: 'är mindre än', - isLessThanOrEqualTo: 'är mindre än eller lika med', - isLike: 'är som', - isNotEqualTo: 'är inte lika med', - isNotIn: 'är inte med', - near: 'nära', - }, - upload: { - crop: 'Skörd', - cropToolDescription: - 'Dra i hörnen på det valda området, rita ett nytt område eller justera värdena nedan.', - dragAndDrop: 'Dra och släpp en fil', - dragAndDropHere: 'eller dra och släpp en fil här', - editImage: 'Redigera bild', - fileName: 'Filnamn', - fileSize: 'Filstorlek', - focalPoint: 'Fokuspunkt', - focalPointDescription: - 'Dra fokuspunkten direkt på förhandsgranskningen eller justera värdena nedan.', - height: 'Höjd', - lessInfo: 'Mindre info', - moreInfo: 'Mer info', - previewSizes: 'Förhandsgranska Storlekar', - selectCollectionToBrowse: 'Välj en Samling att Bläddra i', - selectFile: 'Välj en fil', - setCropArea: 'Ange skärpområde', - setFocalPoint: 'Ställ in fokuspunkt', - sizes: 'Storlekar', - sizesFor: 'Storlekar för {{label}}', - width: 'Bredd', - }, - validation: { - emailAddress: 'Vänligen ange en giltig e-postadress.', - enterNumber: 'Vänligen skriv in ett giltigt nummer.', - fieldHasNo: 'Detta fält har ingen {{label}}', - greaterThanMax: '{{value}} är större än den maximalt tillåtna {{label}} av {{max}}.', - invalidInput: 'Det här fältet har en ogiltig inmatning.', - invalidSelection: 'Det här fältet har ett ogiltigt urval.', - invalidSelections: 'Det här fältet har följande ogiltiga val:', - lessThanMin: '{{value}} är mindre än den minst tillåtna {{label}} av {{min}}.', - limitReached: 'Gränsen nådd, endast {{max}} objekt kan läggas till.', - longerThanMin: 'Detta värde måste vara längre än minimilängden på {{minLength}} tecken.', - notValidDate: '"{{value}}" är inte ett giltigt datum.', - required: 'Detta fält är obligatoriskt.', - requiresAtLeast: 'Detta fält kräver minst {{count}} {{label}}.', - requiresNoMoreThan: 'Detta fält kräver inte mer än {{count}} {{label}}.', - requiresTwoNumbers: 'Detta fält kräver två nummer.', - shorterThanMax: 'Detta värde måste vara kortare än maxlängden på {{maxLength}} tecken.', - trueOrFalse: 'Detta fält kan bara vara lika med sant eller falskt.', - validUploadID: 'Det här fältet är inte ett giltigt uppladdnings-ID', - }, - version: { - aboutToPublishSelection: 'Du är på väg att publicera alla {{label}} i urvalet. Är du säker?', - aboutToRestore: - 'Du är på väg att återställa detta {{label}} dokumentet till det tillståndet som det var den {{versionDate}}.', - aboutToRestoreGlobal: - 'Du är på väg att återställa det globala {{label}} till det tillståndet som det var den {{versionDate}}.', - aboutToRevertToPublished: - 'Du är på väg att återställa det här dokumentets ändringar till dess publicerade tillstånd. Är du säker?', - aboutToUnpublish: 'Du håller på att avpublicera detta dokumentet. Är du säker?', - aboutToUnpublishSelection: - 'Du är på väg att avpublicera alla {{label}} i urvalet. Är du säker?', - autosave: 'Automatisk sparning', - autosavedSuccessfully: 'Autosparades framgångsrikt.', - autosavedVersion: 'Autosparad version', - changed: 'Ändrad', - compareVersion: 'Jämför version med:', - confirmPublish: 'Bekräfta publicering', - confirmRevertToSaved: 'Bekräfta återgång till sparad', - confirmUnpublish: 'Bekräfta avpublicering', - confirmVersionRestoration: 'Bekräfta Versionsåterställning', - currentDocumentStatus: 'Nuvarande {{docStatus}} dokument', - draft: 'Utkast', - draftSavedSuccessfully: 'Utkastet sparades framgångsrikt.', - lastSavedAgo: 'Senast sparad för {{distance}} sedan', - noFurtherVersionsFound: 'Inga fler versioner hittades', - noRowsFound: 'Inga {{label}} hittades', - preview: 'Förhandsvisa', - problemRestoringVersion: 'Det uppstod ett problem när den här versionen skulle återställas', - publish: 'Publicera', - publishChanges: 'Publicera ändringar', - published: 'Publicerad', - publishing: 'Publicering', - restoreThisVersion: 'Återställ den här versionen', - restoredSuccessfully: 'Återställd framgångsrikt.', - restoring: 'Återställer...', - revertToPublished: 'Återgå till publicerad', - reverting: 'Återgår...', - saveDraft: 'Spara Utkast', - selectLocales: 'Välj språk att visa', - selectVersionToCompare: 'Välj en version att jämföra', - showLocales: 'Visa språk:', - showingVersionsFor: 'Visar versioner för:', - status: 'Status', - type: 'Typ', - unpublish: 'Avpublicera', - unpublishing: 'Avpublicerar...', - version: 'Version', - versionCount_many: '{{count}} versioner hittades', - versionCount_none: 'Inga versioner hittades', - versionCount_one: '{{count}} version hittades', - versionCount_other: '{{count}} versioner hittades', - versionCreatedOn: '{{version}} skapad den:', - versionID: 'Versions-ID', - versions: 'Versioner', - viewingVersion: 'Visar version för {{entityLabel}} {{documentTitle}}', - viewingVersionGlobal: 'Visa version för den globala {{entityLabel}}', - viewingVersions: 'Visar versioner för {{entityLabel}} {{documentTitle}}', - viewingVersionsGlobal: 'Visa versioner för den globala {{entityLabel}}', +import type { Language } from '../types.js' + +export const sv: Language = { + dateFNSKey: 'sv', + translations: { + authentication: { + account: 'Konto', + accountOfCurrentUser: 'Konto för nuvarande användare', + alreadyActivated: 'Redan aktiverad', + alreadyLoggedIn: 'Redan inloggad', + apiKey: 'API Nyckel', + backToLogin: 'Tillbaka till inloggningen', + beginCreateFirstUser: 'För att börja, skapa din första användare.', + changePassword: 'Byt Lösenord', + checkYourEmailForPasswordReset: + 'Kontrollera din e-post efter en länk som gör att du säkert kan återställa ditt lösenord.', + confirmGeneration: 'Bekräfta Generering', + confirmPassword: 'Bekräfta Lösenord', + createFirstUser: 'Skapa första användaren', + emailNotValid: 'Angiven e-postadress är inte giltig', + emailSent: 'E-posten Skickad', + enableAPIKey: 'Aktivera API nyckel', + failedToUnlock: 'Det gick inte att låsa upp', + forceUnlock: 'Tvinga Upplåsning', + forgotPassword: 'Glömt Lösenord', + forgotPasswordEmailInstructions: + 'Vänligen ange din e-postadress nedan. Du kommer att få ett e-postmeddelande med instruktioner om hur du återställer ditt lösenord.', + forgotPasswordQuestion: 'Glömt lösenordet?', + generate: 'Generera', + generateNewAPIKey: 'Generera ny API nyckel', + generatingNewAPIKeyWillInvalidate: + 'Att generera en ny API nyckel kommer <1>ogiltigförklara föregående nyckel. Är du säker på att du vill fortsätta?', + lockUntil: 'Lås Tills', + logBackIn: 'Logga in igen', + logOut: 'Logga ut', + loggedIn: 'För att logga in med en annan användare, bör du <0>logga ut först.', + loggedInChangePassword: + 'För att ändra ditt lösenord, gå till ditt <0>konto och redigera ditt lösenord där.', + loggedOutInactivity: 'Du har blivit utloggad på grund av inaktivitet.', + loggedOutSuccessfully: 'Du har loggat ut framgångsrikt.', + login: 'Logga in', + loginAttempts: 'Inloggningsförsök', + loginUser: 'Logga in användare', + loginWithAnotherUser: + 'För att logga in med en annan användare, bör du <0>logga ut först.', + logout: 'Logga ut', + logoutUser: 'Logga ut användare', + newAPIKeyGenerated: 'Ny API Nyckel Genererad.', + newAccountCreated: + 'Ett nytt konto har precis skapats som du kan komma åt {{serverURL}} Klicka på följande länk eller klistra in webbadressen nedan i din webbläsare för att verifiera din e-post: {{verificationURL}}
Efter att ha verifierat din e-post kommer du att kunna logga in framgångsrikt.', + newPassword: 'Nytt Lösenord', + resetPassword: 'Återställ Lösenord', + resetPasswordExpiration: 'Återställ Lösenordsutgång', + resetPasswordToken: 'Återställ Lösenord Token', + resetYourPassword: 'Återställ Ditt Lösenord', + stayLoggedIn: 'Stanna inloggad', + successfullyUnlocked: 'Låst upp framgångsrikt', + unableToVerify: 'Det går inte att Verifiera', + verified: 'Verifierad', + verifiedSuccessfully: 'Framgångsrikt Verifierad', + verify: 'Verifiera', + verifyUser: 'Verifiera Användare', + verifyYourEmail: 'Verifiera din epost', + youAreInactive: + 'Du har inte varit aktiv på ett tag och kommer inom kort att automatiskt loggas ut för din egen säkerhet. Vill du forsätta att vara inloggad?', + youAreReceivingResetPassword: + 'Du får detta för att du (eller någon annan) har begärt återställning av lösenordet för ditt konto. Klicka på följande länk eller klistra in den i din webbläsare för att slutföra processen:', + youDidNotRequestPassword: + 'Om du inte begärde detta, ignorera detta e-postmeddelande och ditt lösenord kommer att förbli oförändrat.', + }, + error: { + accountAlreadyActivated: 'Detta konto har redan aktiverats.', + autosaving: 'Det uppstod ett problem när det här dokumentet skulle sparas automatiskt.', + correctInvalidFields: 'Vänligen korrigera ogiltiga fält.', + deletingFile: 'Det gick inte att ta bort filen.', + deletingTitle: + 'Det uppstod ett fel vid borttagningen av {{title}}. Vänligen kontrollera din anslutning och försök igen.', + emailOrPasswordIncorrect: 'E-postadressen eller lösenordet som angivits är felaktigt.', + followingFieldsInvalid_one: 'Följande fält är ogiltigt:', + followingFieldsInvalid_other: 'Följande fält är ogiltiga:', + incorrectCollection: 'Felaktig Samling', + invalidFileType: 'Ogiltig filtyp', + invalidFileTypeValue: 'Ogiltig filtyp: {{value}}', + loadingDocument: 'Det gick inte att läsa in dokumentet med ID {{id}}.', + missingEmail: 'E-postadress saknas.', + missingIDOfDocument: 'Saknar ID för dokumentet som ska uppdateras.', + missingIDOfVersion: 'ID för versionen saknas.', + missingRequiredData: 'Obligatorisk data saknas.', + noFilesUploaded: 'Inga filer laddades upp.', + noMatchedField: 'Inget matchande fält hittades för "{{label}}"', + noUser: 'Ingen Användare', + notAllowedToAccessPage: 'Du får inte komma åt den här sidan.', + notAllowedToPerformAction: 'Du får inte utföra denna åtgärd.', + notFound: 'Den begärda resursen hittades inte.', + previewing: 'Det uppstod ett problem när det här dokumentet skulle förhandsgranskas.', + problemUploadingFile: 'Det uppstod ett problem när filen laddades upp.', + tokenInvalidOrExpired: 'Token är antingen ogiltig eller har löpt ut.', + unPublishingDocument: 'Det uppstod ett problem när det här dokumentet skulle avpubliceras.', + unableToDeleteCount: 'Det gick inte att ta bort {{count}} av {{total}} {{label}}.', + unableToUpdateCount: 'Det gick inte att uppdatera {{count}} av {{total}} {{label}}.', + unauthorized: 'Obehörig, du måste vara inloggad för att göra denna begäran.', + unknown: 'Ett okänt fel har uppstått.', + unspecific: 'Ett fel har uppstått.', + userLocked: 'Den här användaren är låst på grund av för många misslyckade inloggningsförsök.', + valueMustBeUnique: 'Värdet måste vara unikt', + verificationTokenInvalid: 'Verifieringstoken är ogiltig.', + }, + fields: { + addLabel: 'Lägg till {{label}}', + addLink: 'Lägg till Länk', + addNew: 'Lägg till ny', + addNewLabel: 'Lägg till ny {{label}}', + addRelationship: 'Lägg till Relation', + addUpload: 'Lägg till Uppladdning', + block: 'block', + blockType: 'Block Typ', + blocks: 'block', + chooseBetweenCustomTextOrDocument: + 'Välj mellan att ange en anpassad text-URL eller länka till ett annat dokument.', + chooseDocumentToLink: 'Välj ett dokument att länka till', + chooseFromExisting: 'Välj bland befintliga', + chooseLabel: 'Välj {{label}}', + collapseAll: 'kollapsa Alla', + customURL: 'Anpassad URL', + editLabelData: 'Redigera {{label}} data', + editLink: 'Redigera Länk', + editRelationship: 'Redigera Relation', + enterURL: 'Ange en URL', + internalLink: 'Intern länk', + itemsAndMore: '{{items}} och {{count}} mer', + labelRelationship: '{{label}} Relation', + latitude: 'Latitud', + linkType: 'Länktyp', + linkedTo: 'Länkad till <0>{{label}}', + longitude: 'Longitud', + newLabel: 'Ny {{label}}', + openInNewTab: 'Öppna i ny flik', + passwordsDoNotMatch: 'Lösenorden matchar inte.', + relatedDocument: 'Relaterat Dokument', + relationTo: 'Relation till', + removeRelationship: 'Ta Bort Relation', + removeUpload: 'Ta Bort Uppladdning', + saveChanges: 'Spara ändringar', + searchForBlock: 'Sök efter ett block', + selectExistingLabel: 'Välj befintlig {{label}}', + selectFieldsToEdit: 'Välj fält att redigera', + showAll: 'Visa Alla', + swapRelationship: 'Byt Förhållande', + swapUpload: 'Byt Uppladdning', + textToDisplay: 'Text att visa', + toggleBlock: 'Växla block', + uploadNewLabel: 'Ladda upp ny {{label}}', + }, + general: { + aboutToDelete: 'Du är på väg att ta bort {{label}} <1>{{title}}. Är du säker?', + aboutToDeleteCount_many: 'Du är på väg att ta bort {{count}} {{label}}', + aboutToDeleteCount_one: 'Du är på väg att ta bort {{count}} {{label}}', + aboutToDeleteCount_other: 'Du är på väg att ta bort {{count}} {{label}}', + addBelow: 'Lägg Till Nedanför', + addFilter: 'Lägg Till Filter', + adminTheme: 'Admin Tema', + and: 'Och', + applyChanges: 'Verkställ ändringar', + ascending: 'Stigande', + automatic: 'Automatisk', + backToDashboard: 'Tillbaka till Manöverpanelen', + cancel: 'Avbryt', + changesNotSaved: + 'Dina ändringar har inte sparats. Om du lämnar nu kommer du att förlora dina ändringar.', + close: 'Stänga', + collapse: 'Kollapsa', + collections: 'Samlingar', + columnToSort: 'Kolumn att Sortera', + columns: 'Kolumner', + confirm: 'Bekräfta', + confirmDeletion: 'Bekräfta radering', + confirmDuplication: 'Bekräfta dubblering', + copied: 'Kopierad', + copy: 'Kopiera', + create: 'Skapa', + createNew: 'Skapa Ny', + createNewLabel: 'Skapa ny {{label}}', + created: 'Skapad', + createdAt: 'Skapad Vid', + creating: 'Skapar', + creatingNewLabel: 'Skapar ny {{label}}', + dark: 'Mörk', + dashboard: 'Manöverpanel', + delete: 'Ta bort', + deletedCountSuccessfully: 'Raderade {{count}} {{label}} framgångsrikt.', + deletedSuccessfully: 'Togs bort framgångsrikt.', + deleting: 'Tar bort...', + descending: 'Fallande', + deselectAllRows: 'Avmarkera alla rader', + duplicate: 'Duplicera', + duplicateWithoutSaving: 'Duplicera utan att spara ändringar', + edit: 'Redigera', + editLabel: 'Redigera {{label}}', + editing: 'Redigerar', + editingLabel_many: 'Redigerar {{count}} {{label}}', + editingLabel_one: 'Redigerar {{count}} {{label}}', + editingLabel_other: 'Redigerar {{count}} {{label}}', + email: 'E-post', + emailAddress: 'E-postadress', + enterAValue: 'Ange ett värde', + error: 'Fel', + errors: 'Fel', + fallbackToDefaultLocale: 'Återgång till standardlokalspråk', + filter: 'Filter', + filterWhere: 'Filtrera {{label}} där', + filters: 'Filter', + globals: 'Globala', + language: 'Språk', + lastModified: 'Senast Ändrad', + leaveAnyway: 'Lämna ändå', + leaveWithoutSaving: 'Lämna utan att spara', + light: 'Ljus', + livePreview: 'Förhandsvisa', + loading: 'Läser in', + locale: 'Lokal', + locales: 'Språk', + menu: 'Meny', + moveDown: 'Flytta Ner', + moveUp: 'Flytta Upp', + newPassword: 'Nytt Lösenord', + noFiltersSet: 'Inga filter inställda', + noLabel: '', + noOptions: 'Inga alternativ', + noResults: + 'Inga {{label}} hittades. Antingen finns inga {{label}} ännu eller matchar ingen filtren du har angett ovan.', + noValue: 'Inget värde', + none: 'Ingen', + notFound: 'Hittades inte', + nothingFound: 'Inget hittades', + of: 'av', + open: 'Öppna', + or: 'Eller', + order: 'Ordning', + pageNotFound: 'Sidan hittas inte', + password: 'Lösenord', + payloadSettings: 'Payload Inställningar', + perPage: 'Per Sida: {{limit}}', + remove: 'Ta bort', + reset: 'Återställ', + row: 'Rad', + rows: 'Rader', + save: 'Spara', + saving: 'Sparar...', + searchBy: 'Sök efter {{label}}', + selectAll: 'Välj alla {{count}} {{label}}', + selectAllRows: 'Välj alla rader', + selectValue: 'Välj ett värde', + selectedCount: '{{count}} {{label}} har valts', + showAllLabel: 'Visa alla {{label}}', + sorryNotFound: 'Tyvärr–det finns inget som motsvarar din begäran.', + sort: 'Sortera', + sortByLabelDirection: 'Sortera efter {{label}} {{direction}}', + stayOnThisPage: 'Stanna på denna sida', + submissionSuccessful: 'Inlämningen Lyckades.', + submit: 'Lämna in', + successfullyCreated: '{{label}} skapades framgångsrikt.', + successfullyDuplicated: '{{label}} duplicerades framgångsrikt.', + thisLanguage: 'Svenska', + titleDeleted: '{{label}} "{{title}}" togs bort framgångsrikt.', + unauthorized: 'Obehörig', + unsavedChangesDuplicate: 'Du har osparade ändringar. Vill du fortsätta att duplicera?', + untitled: 'Namnlös', + updatedAt: 'Uppdaterades Vid', + updatedCountSuccessfully: 'Uppdaterade {{count}} {{label}} framgångsrikt.', + updatedSuccessfully: 'Uppdaterades framgångsrikt.', + updating: 'Uppdatering', + uploading: 'Uppladdning', + user: 'Användare', + users: 'Användare', + value: 'Värde', + welcome: 'Välkommen', + }, + operators: { + contains: 'innehåller', + equals: 'likar med', + exists: 'finns', + isGreaterThan: 'är större än', + isGreaterThanOrEqualTo: 'är större än eller lika med', + isIn: 'är med', + isLessThan: 'är mindre än', + isLessThanOrEqualTo: 'är mindre än eller lika med', + isLike: 'är som', + isNotEqualTo: 'är inte lika med', + isNotIn: 'är inte med', + near: 'nära', + }, + upload: { + crop: 'Skörd', + cropToolDescription: + 'Dra i hörnen på det valda området, rita ett nytt område eller justera värdena nedan.', + dragAndDrop: 'Dra och släpp en fil', + dragAndDropHere: 'eller dra och släpp en fil här', + editImage: 'Redigera bild', + fileName: 'Filnamn', + fileSize: 'Filstorlek', + focalPoint: 'Fokuspunkt', + focalPointDescription: + 'Dra fokuspunkten direkt på förhandsgranskningen eller justera värdena nedan.', + height: 'Höjd', + lessInfo: 'Mindre info', + moreInfo: 'Mer info', + previewSizes: 'Förhandsgranska Storlekar', + selectCollectionToBrowse: 'Välj en Samling att Bläddra i', + selectFile: 'Välj en fil', + setCropArea: 'Ange skärpområde', + setFocalPoint: 'Ställ in fokuspunkt', + sizes: 'Storlekar', + sizesFor: 'Storlekar för {{label}}', + width: 'Bredd', + }, + validation: { + emailAddress: 'Vänligen ange en giltig e-postadress.', + enterNumber: 'Vänligen skriv in ett giltigt nummer.', + fieldHasNo: 'Detta fält har ingen {{label}}', + greaterThanMax: '{{value}} är större än den maximalt tillåtna {{label}} av {{max}}.', + invalidInput: 'Det här fältet har en ogiltig inmatning.', + invalidSelection: 'Det här fältet har ett ogiltigt urval.', + invalidSelections: 'Det här fältet har följande ogiltiga val:', + lessThanMin: '{{value}} är mindre än den minst tillåtna {{label}} av {{min}}.', + limitReached: 'Gränsen nådd, endast {{max}} objekt kan läggas till.', + longerThanMin: 'Detta värde måste vara längre än minimilängden på {{minLength}} tecken.', + notValidDate: '"{{value}}" är inte ett giltigt datum.', + required: 'Detta fält är obligatoriskt.', + requiresAtLeast: 'Detta fält kräver minst {{count}} {{label}}.', + requiresNoMoreThan: 'Detta fält kräver inte mer än {{count}} {{label}}.', + requiresTwoNumbers: 'Detta fält kräver två nummer.', + shorterThanMax: 'Detta värde måste vara kortare än maxlängden på {{maxLength}} tecken.', + trueOrFalse: 'Detta fält kan bara vara lika med sant eller falskt.', + validUploadID: 'Det här fältet är inte ett giltigt uppladdnings-ID', + }, + version: { + type: 'Typ', + aboutToPublishSelection: 'Du är på väg att publicera alla {{label}} i urvalet. Är du säker?', + aboutToRestore: + 'Du är på väg att återställa detta {{label}} dokumentet till det tillståndet som det var den {{versionDate}}.', + aboutToRestoreGlobal: + 'Du är på väg att återställa det globala {{label}} till det tillståndet som det var den {{versionDate}}.', + aboutToRevertToPublished: + 'Du är på väg att återställa det här dokumentets ändringar till dess publicerade tillstånd. Är du säker?', + aboutToUnpublish: 'Du håller på att avpublicera detta dokumentet. Är du säker?', + aboutToUnpublishSelection: + 'Du är på väg att avpublicera alla {{label}} i urvalet. Är du säker?', + autosave: 'Automatisk sparning', + autosavedSuccessfully: 'Autosparades framgångsrikt.', + autosavedVersion: 'Autosparad version', + changed: 'Ändrad', + compareVersion: 'Jämför version med:', + confirmPublish: 'Bekräfta publicering', + confirmRevertToSaved: 'Bekräfta återgång till sparad', + confirmUnpublish: 'Bekräfta avpublicering', + confirmVersionRestoration: 'Bekräfta Versionsåterställning', + currentDocumentStatus: 'Nuvarande {{docStatus}} dokument', + draft: 'Utkast', + draftSavedSuccessfully: 'Utkastet sparades framgångsrikt.', + lastSavedAgo: 'Senast sparad för {{distance}} sedan', + noFurtherVersionsFound: 'Inga fler versioner hittades', + noRowsFound: 'Inga {{label}} hittades', + preview: 'Förhandsvisa', + problemRestoringVersion: 'Det uppstod ett problem när den här versionen skulle återställas', + publish: 'Publicera', + publishChanges: 'Publicera ändringar', + published: 'Publicerad', + publishing: 'Publicering', + restoreThisVersion: 'Återställ den här versionen', + restoredSuccessfully: 'Återställd framgångsrikt.', + restoring: 'Återställer...', + revertToPublished: 'Återgå till publicerad', + reverting: 'Återgår...', + saveDraft: 'Spara Utkast', + selectLocales: 'Välj språk att visa', + selectVersionToCompare: 'Välj en version att jämföra', + showLocales: 'Visa språk:', + showingVersionsFor: 'Visar versioner för:', + status: 'Status', + unpublish: 'Avpublicera', + unpublishing: 'Avpublicerar...', + version: 'Version', + versionCount_many: '{{count}} versioner hittades', + versionCount_none: 'Inga versioner hittades', + versionCount_one: '{{count}} version hittades', + versionCount_other: '{{count}} versioner hittades', + versionCreatedOn: '{{version}} skapad den:', + versionID: 'Versions-ID', + versions: 'Versioner', + viewingVersion: 'Visar version för {{entityLabel}} {{documentTitle}}', + viewingVersionGlobal: 'Visa version för den globala {{entityLabel}}', + viewingVersions: 'Visar versioner för {{entityLabel}} {{documentTitle}}', + viewingVersionsGlobal: 'Visa versioner för den globala {{entityLabel}}', + }, }, } diff --git a/packages/translations/src/languages/th.ts b/packages/translations/src/languages/th.ts index d9ad021106..949901843f 100644 --- a/packages/translations/src/languages/th.ts +++ b/packages/translations/src/languages/th.ts @@ -1,383 +1,389 @@ -export default { - authentication: { - account: 'บัญชี', - accountOfCurrentUser: 'บัญชีปัจจุบัน', - alreadyActivated: 'เปิดใช้งานแล้ว', - alreadyLoggedIn: 'ลงชื่อเข้าใช้แล้ว', - apiKey: 'API Key', - backToLogin: 'กลับไปหน้าเข้าสู่ระบบ', - beginCreateFirstUser: 'สร้างผู้ใช้แรกเพื่อเริ่มใช้งาน', - changePassword: 'เปลี่ยนรหัสผ่าน', - checkYourEmailForPasswordReset: - 'ระบบได้ส่งอีเมลสำหรับรีเซ็ตรหัสผ่านไปที่อีเมลของคุณแล้ว โปรดเช็กอีเมลของคุณ', - confirmGeneration: 'ยืนยันการสร้าง', - confirmPassword: 'ยืนยันรหัสผ่าน', - createFirstUser: 'สร้างผู้ใช้แรก', - emailNotValid: 'อีเมลไม่ถูกต้อง', - emailSent: 'ส่งอีเมลเรียบร้อยแล้ว', - enableAPIKey: 'เปิดใช้ API Key', - failedToUnlock: 'ไม่สามารถปลดล็อกได้', - forceUnlock: 'ปลดล็อกบัญชี', - forgotPassword: 'ลืมรหัสผ่าน', - forgotPasswordEmailInstructions: - 'กรุณาใส่อีเมลของคุณ ระบบจะส่งวิธีการเปลี่ยนรหัสผ่านไปให้คุณทางอีเมล', - forgotPasswordQuestion: 'ลืมรหัสผ่าน?', - generate: 'สร้าง', - generateNewAPIKey: 'สร้าง API Key', - generatingNewAPIKeyWillInvalidate: - 'การสร้าง API Key ใหม่จะเป็นการ<1>ยกเลิก API Key เดิม คุณต้องการดำเนินการต่อหรือไม่?', - lockUntil: 'ล็อกบัญชีถึง', - logBackIn: 'เข้าสู่ระบบอีกครั้ง', - logOut: 'ออกจากระบบ', - loggedIn: 'หากต้องการเข้าสู่ระบบด้วยบัญชีอื่น กรุณา<0>ออกจากระบบก่อน', - loggedInChangePassword: 'หากต้องการเปลี่ยนรหัสผ่าน กรุณาแก้ไขที่หน้า<0>บัญชีของคุณ', - loggedOutInactivity: 'คุณได้ออกจากระบบเนื่องจากไม่มีการใช้งาน', - loggedOutSuccessfully: 'ออกจากระบบเรียบร้อยแล้ว', - login: 'เข้าสู่ระบบ', - loginAttempts: 'จำนวนครั้งการเข้าสู่ระบบ', - loginUser: 'เข้าสู่ระบบ', - loginWithAnotherUser: 'หากต้องการเข้าสู่ระบบด้วยบัญชีอื่น กรุณา<0>ออกจากระบบก่อน', - logout: 'ออกจากระบบ', - logoutUser: 'ออกจากระบบ', - newAPIKeyGenerated: 'สร้าง API Key ใหม่แล้ว', - newAccountCreated: - 'ระบบได้สร้างบัญชีผู้ใช้ให้คุณสำหรับเข้าใช้งาน {{serverURL}} เรียบร้อยแล้ว กรุณากดลิงก์ด้านล่างเพื่อยืนยันอีเมล หลังจากยืนยันอีเมลเสร็จสิ้น คุณจะสามารถเข้าใช้งานระบบได้', - newPassword: 'รหัสผ่านใหม่', - resetPassword: 'รีเซ็ตรหัสผ่าน', - resetPasswordExpiration: 'วันหมดอายุสำหรับการรีเซ็ตรหัสผ่าน', - resetPasswordToken: 'Token รีเซ็ตรหัสผ่าน', - resetYourPassword: 'รีเซ็ตรหัสผ่านของคุณ', - stayLoggedIn: 'เข้าสู่ระบบต่อไป', - successfullyUnlocked: 'ปลดล็อกบัญชีสำเร็จ', - unableToVerify: 'ไม่สามารถยืนยันบัญชีได้', - verified: 'ยืนยันบััญชีแล้ว', - verifiedSuccessfully: 'ยืนยันบัญชีสำเร็จ', - verify: 'ยืนยันบัญชี', - verifyUser: 'ยืนยันบัญชี', - verifyYourEmail: 'ยืนยันอีเมลของคุณ', - youAreInactive: - 'คุณกำลังจะถูกให้ออกจากระบบในเร็ว ๆ นี้เนื่องจากไม่มีการใช้งานระบบมาสักพักหนึ่ง คุณต้องการเข้าสู่ระบบต่อหรือไม่?', - youAreReceivingResetPassword: - 'คุณได้รับอีเมลนี้เนื่องจากคุณ (หรือคนอื่น) ได้ร้องขอให้รีเซ็ตรหัสผ่านของบัญชีของคุณ กรุณากดลิงก์ด้านล่างเพื่อดำเนินการรีเซ็ตรหัสผ่านต่อ:', - youDidNotRequestPassword: - 'หากคุณไม่ได้ร้องขอให้มีการรีเซ็ตรหัสผ่าน คุณสามารถเพิกเฉยข้อความนี้ได้ โดยรหัสผ่านของคุณจะคงอยู่เช่นเดิม', - }, - error: { - accountAlreadyActivated: 'บัญชีนี้ถูกเปิดใช้งานไปแล้ว', - autosaving: 'เกิดปัญหาระหว่างการบันทึกเอกสารอัตโนมัติ', - correctInvalidFields: 'โปรดแก้ไขช่องที่ไม่ถูกต้อง', - deletingFile: 'เกิดปัญหาระหว่างการลบไฟล์', - deletingTitle: 'เกิดปัญหาระหว่างการลบ {{title}} โปรดตรวจสอบการเชื่อมต่อของคุณแล้วลองอีกครั้ง', - emailOrPasswordIncorrect: 'อีเมลหรือรหัสผ่านไม่ถูกต้อง', - followingFieldsInvalid_one: 'ช่องต่อไปนี้ไม่ถูกต้อง:', - followingFieldsInvalid_other: 'ช่องต่อไปนี้ไม่ถูกต้อง:', - incorrectCollection: 'Collection ไม่ถูกต้อง', - invalidFileType: 'ประเภทของไฟล์ไม่ถูกต้อง', - invalidFileTypeValue: 'ประเภทของไฟล์ไม่ถูกต้อง: {{value}}', - loadingDocument: 'เกิดปัญหาระหว่างการโหลดเอกสารที่มี ID {{id}}', - missingEmail: 'ไม่พบอีเมล', - missingIDOfDocument: 'ไม่พบ ID ของเอกสารที่ต้องการแก้ไข', - missingIDOfVersion: 'ไม่พบ ID ของเวอร์ชัน', - missingRequiredData: 'ไม่พบข้อมูลที่จำเป็น', - noFilesUploaded: 'ไม่มีไฟล์ถูกอัปโหลด', - noMatchedField: 'ไม่พบช่อง "{{label}}"', - noUser: 'ไม่พบผู้ใช้', - notAllowedToAccessPage: 'คุณไม่ได้รับอนุญาตให้เข้าถึงหน้านี้', - notAllowedToPerformAction: 'คุณไม่ได้รับอนุญาตให้ดำเนินการสิ่งนี้', - notFound: 'ไม่พบหน้าที่คุณต้องการ', - previewing: 'เกิดปัญหาระหว่างการแสดงตัวอย่างเอกสาร', - problemUploadingFile: 'เกิดปัญหาระหว่างการอัปโหลดไฟล์', - tokenInvalidOrExpired: 'Token ไม่ถูกต้องหรือหมดอายุ', - unPublishingDocument: 'เกิดปัญหาระหว่างการยกเลิกการเผยแพร่เอกสารนี้', - unableToDeleteCount: 'ไม่สามารถลบ {{count}} จาก {{total}} {{label}}', - unableToUpdateCount: 'ไม่สามารถอัปเดต {{count}} จาก {{total}} {{label}}', - unauthorized: 'คุณไม่ได้รับอนุญาต กรุณาเข้าสู่ระบบเพื่อทำคำขอนี้', - unknown: 'เกิดปัญหาบางอย่างที่ไม่ทราบสาเหตุ', - unspecific: 'เกิดปัญหาบางอย่าง', - userLocked: 'บัญชีนี้ถูกล็อกเนื่องจากมีการพยายามเข้าสู่ระบบมากเกินไป', - valueMustBeUnique: 'ค่าต้องไม่ซ้ำกับเอกสารอื่น', - verificationTokenInvalid: 'Token ยืนยันตัวตนไม่ถูกต้อง', - }, - fields: { - addLabel: 'เพิ่ม {{label}}', - addLink: 'เพิ่มลิงค์', - addNew: 'เพิ่ม', - addNewLabel: 'เพิ่ม {{label}} ใหม่', - addRelationship: 'เพิ่มความสัมพันธ์', - addUpload: 'เพิ่มการอัปโหลด', - block: 'Block', - blockType: 'ประเภท Block', - blocks: 'Blocks', - chooseBetweenCustomTextOrDocument: 'เลือกระหว่างกำหนด URL เองหรือเชื่อมไปยังเอกสารอื่น', - chooseDocumentToLink: 'เลือกเอกสารที่จะเชื่อมโยง', - chooseFromExisting: 'เลือกจากที่มีอยู่', - chooseLabel: 'เลือก {{label}}', - collapseAll: 'ยุบทั้งหมด', - customURL: 'URL ที่กำหนดเอง', - editLabelData: 'แก้ไขข้อมูล {{label}}', - editLink: 'แก้ไขลิงก์', - editRelationship: 'แก้ไขความสัมพันธ์', - enterURL: 'ระบุ URL', - internalLink: 'ลิงก์ภายใน', - itemsAndMore: '{{items}} และเพิ่มเติมอีก {{count}}', - labelRelationship: 'ความสัมพันธ์กับ {{label}}', - latitude: 'ละติจูด', - linkType: 'ประเภทของลิงก์', - linkedTo: 'เชื่อมกับ <0>{{label}} สำเร็จ', - longitude: 'ลองติจูด', - newLabel: '{{label}} ใหม่', - openInNewTab: 'เปิดในแท็บใหม่', - passwordsDoNotMatch: 'รหัสผ่านไม่ตรงกัน', - relatedDocument: 'เอกสารที่เกี่ยวข้อง', - relationTo: 'เชื่อมกับ', - removeRelationship: 'ลบความสัมพันธ์', - removeUpload: 'ลบอัปโหลด', - saveChanges: 'บันทึก', - searchForBlock: 'ค้นหา Block', - selectExistingLabel: 'เลือก {{label}} ที่มีอยู่', - selectFieldsToEdit: 'เลือกช่องที่จะแก้ไข', - showAll: 'แสดงทั้งหมด', - swapRelationship: 'สลับความสัมพันธ์', - swapUpload: 'สลับอัปโหลด', - textToDisplay: 'ข้อความสำหรับแสดงผล', - toggleBlock: 'เปิด/ปิด Block', - uploadNewLabel: 'อัปโหลด {{label}} ใหม่', - }, - general: { - aboutToDelete: 'คุณกำลังจะลบ {{label}} <1>{{title}} ต้องการดำเนินการต่อหรือไม่?', - aboutToDeleteCount_many: 'คุณกำลังจะลบ {{count}} {{label}}', - aboutToDeleteCount_one: 'คุณกำลังจะลบ {{count}} {{label}}', - aboutToDeleteCount_other: 'คุณกำลังจะลบ {{count}} {{label}}', - addBelow: 'เพิ่มด้านล่าง', - addFilter: 'เพิ่มการกรอง', - adminTheme: 'ธีมผู้ดูแลระบบ', - and: 'และ', - applyChanges: 'ใช้การเปลี่ยนแปลง', - ascending: 'น้อยไปมาก', - automatic: 'อัตโนมัติ', - backToDashboard: 'กลับไปหน้าแดชบอร์ด', - cancel: 'ยกเลิก', - changesNotSaved: 'การเปลี่ยนแปลงยังไม่ได้ถูกบันทึก ถ้าคุณออกตอนนี้ สิ่งที่แก้ไขไว้จะหายไป', - close: 'ปิด', - collapse: 'ยุบ', - collections: 'Collections', - columnToSort: 'คอลัมน์ที่ต้องการเรียง', - columns: 'คอลัมน์', - confirm: 'ยืนยัน', - confirmDeletion: 'ยืนยันการลบ', - confirmDuplication: 'ยืนยันการสำเนา', - copied: 'คัดลอกแล้ว', - copy: 'คัดลอก', - create: 'สร้าง', - createNew: 'สร้างใหม่', - createNewLabel: 'สร้าง {{label}} ใหม่', - created: 'ถูกสร้างเมื่อ', - createdAt: 'สร้างเมื่อ', - creating: 'กำลังสร้าง', - creatingNewLabel: 'กำลังสร้าง {{label}} ใหม่', - dark: 'มืด', - dashboard: 'แดชบอร์ด', - delete: 'ลบ', - deletedCountSuccessfully: 'Deleted {{count}} {{label}} successfully.', - deletedSuccessfully: 'ลบสำเร็จ', - deleting: 'กำลังลบ...', - descending: 'มากไปน้อย', - deselectAllRows: 'ยกเลิกการเลือกทุกแถว', - duplicate: 'สำเนา', - duplicateWithoutSaving: 'สำเนาโดยไม่บันทึกการแก้ไข', - edit: 'แก้ไข', - editLabel: 'แก้ไข {{label}}', - editing: 'แก้ไข', - editingLabel_many: 'กำลังแก้ไข {{count}} {{label}}', - editingLabel_one: 'กำลังแก้ไข {{count}} {{label}}', - editingLabel_other: 'กำลังแก้ไข {{count}} {{label}}', - email: 'อีเมล', - emailAddress: 'อีเมล', - enterAValue: 'ระบุค่า', - error: 'ข้อผิดพลาด', - errors: 'ข้อผิดพลาด', - fallbackToDefaultLocale: 'สำรองไปยังตำแหน่งที่ตั้งเริ่มต้น', - filter: 'กรอง', - filterWhere: 'กรอง {{label}} เฉพาะ', - filters: 'กรอง', - globals: 'Globals', - language: 'ภาษา', - lastModified: 'แก้ไขล่าสุดเมื่อ', - leaveAnyway: 'ออกจากหน้านี้', - leaveWithoutSaving: 'ออกโดยไม่บันทึก', - light: 'สว่าง', - livePreview: 'แสดงตัวอย่าง', - loading: 'กำลังโหลด', - locale: 'ตำแหน่งที่ตั้ง', - locales: 'ภาษา', - menu: 'เมนู', - moveDown: 'ขยับขึ้น', - moveUp: 'ขยับลง', - newPassword: 'รหัสผ่านใหม่', - noFiltersSet: 'ไม่มีการกรอง', - noLabel: '<ไม่มี {{label}}>', - noOptions: 'ไม่มีตัวเลือก', - noResults: - 'ไม่พบ {{label}} เนื่องจากยังไม่มี {{label}} หรือไม่มี {{label}} ใดตรงกับการกรองด้านบน', - noValue: 'ไม่มีค่า', - none: 'ไม่มี', - notFound: 'ไม่พบ', - nothingFound: 'ไม่พบสิ่งใด', - of: 'จาก', - open: 'เปิด', - or: 'หรือ', - order: 'เรียงตาม', - pageNotFound: 'ไม่พบหน้าที่ต้องการ', - password: 'รหัสผ่าน', - payloadSettings: 'การตั้งค่า Payload', - perPage: 'จำนวนต่อหน้า: {{limit}}', - remove: 'ลบ', - reset: 'รีเซ็ต', - row: 'แถว', - rows: 'แถว', - save: 'บันทึก', - saving: 'กำลังบันทึก...', - searchBy: 'ค้นหาด้วย {{label}}', - selectAll: 'เลือกทั้งหมด {{count}} {{label}}', - selectAllRows: 'เลือกทุกแถว', - selectValue: 'เลือกค่า', - selectedCount: 'เลือก {{count}} {{label}} แล้ว', - showAllLabel: 'แสดง {{label}} ทั้งหมด', - sorryNotFound: 'ขออภัย ไม่สามารถทำตามคำขอของคุณได้', - sort: 'เรียง', - sortByLabelDirection: 'เรียงลำดับตาม {{label}} {{direction}}', - stayOnThisPage: 'อยู่หน้านี้ต่อ', - submissionSuccessful: 'ส่งสำเร็จ', - submit: 'ส่ง', - successfullyCreated: 'สร้าง {{label}} สำเร็จ', - successfullyDuplicated: 'สำเนา {{label}} สำเร็จ', - thisLanguage: 'ไทย', - titleDeleted: 'ลบ {{label}} "{{title}}" สำเร็จ', - unauthorized: 'ไม่ได้รับอนุญาต', - unsavedChangesDuplicate: 'คุณมีการแก้ไขที่ยังไม่ถูกบันทึก คุณต้องการทำสำเนาต่อหรือไม่?', - untitled: 'ไม่มีชื่อ', - updatedAt: 'แก้ไขเมื่อ', - updatedCountSuccessfully: 'อัปเดต {{count}} {{label}} เรียบร้อยแล้ว', - updatedSuccessfully: 'แก้ไขสำเร็จ', - updating: 'กำลังอัปเดต', - uploading: 'กำลังอัปโหลด', - user: 'ผู้ใช้', - users: 'ผู้ใช้', - value: 'ค่า', - welcome: 'ยินดีต้อนรับ', - }, - operators: { - contains: 'มี', - equals: 'เท่ากับ', - exists: 'มีอยู่', - isGreaterThan: 'มากกว่า', - isGreaterThanOrEqualTo: 'มากกว่าหรือเท่ากับ', - isIn: 'อยู่ใน', - isLessThan: 'น้อยกว่า', - isLessThanOrEqualTo: 'น้อยกว่าหรือเท่ากับ', - isLike: 'เหมือน', - isNotEqualTo: 'ไม่เท่ากับ', - isNotIn: 'ไม่ได้อยู่ใน', - near: 'ใกล้', - }, - upload: { - crop: 'พืชผล', - cropToolDescription: 'ลากมุมของพื้นที่ที่เลือก, วาดพื้นที่ใหม่หรือปรับค่าด้านล่าง', - dragAndDrop: 'ลากและวางไฟล์', - dragAndDropHere: 'หรือลากและวางไฟล์ที่นี่', - editImage: 'แก้ไขรูปภาพ', - fileName: 'ชื่อไฟล์', - fileSize: 'ขนาดไฟล์', - focalPoint: 'จุดสนใจ', - focalPointDescription: 'ลากจุดโฟกัสตรงบนภาพตัวอย่างหรือปรับค่าที่อยู่ด้านล่าง', - height: 'ความสูง', - lessInfo: 'ซ่อนข้อมูล', - moreInfo: 'แสดงข้อมูล', - previewSizes: 'ขนาดตัวอย่าง', - selectCollectionToBrowse: 'เลือก Collection ที่ต้องการค้นหา', - selectFile: 'เลือกไฟล์', - setCropArea: 'ตั้งค่าพื้นที่การครอบตัด', - setFocalPoint: 'ตั้งจุดโฟกัส', - sizes: 'ขนาด', - sizesFor: 'ขนาดสำหรับ {{label}}', - width: 'ความกว้าง', - }, - validation: { - emailAddress: 'กรุณาระบุอีเมลที่ถูกต้อง', - enterNumber: 'กรุณาระบุตัวเลขที่ถูกต้อง', - fieldHasNo: 'ช่องนี้ไม่มี {{label}}', - greaterThanMax: '{{value}} มากกว่าค่าสูงสุดที่อนุญาตของ {{label}} ซึ่งคือ {{max}}.', - invalidInput: 'ข้อมูลไม่ถูกต้อง', - invalidSelection: 'ค่าที่เลือกไม่ถูกต้อง', - invalidSelections: 'ค่าที่เลือกไม่ถูกต้องดังนี้:', - lessThanMin: '{{value}} น้อยกว่าค่าต่ำสุดที่อนุญาตของ {{label}} ซึ่งคือ {{min}}.', - limitReached: 'ถึงขีดจำกัดแล้ว, สามารถเพิ่มไอเทมได้เพียง {{max}} ไอเทมเท่านั้น', - longerThanMin: 'ค่าต้องมีความยาวมากกว่า {{minLength}} ตัวอักษร', - notValidDate: 'วันที่ "{{value}}" ไม่ถูกต้อง', - required: 'จำเป็นต้องระบุค่า', - requiresAtLeast: 'ต้องมีอย่างน้อย {{count}} {{label}}', - requiresNoMoreThan: 'ห้ามมีเกิน {{count}} {{label}}', - requiresTwoNumbers: 'ต้องมีตัวเลข 2 ค่า', - shorterThanMax: 'ค่าต้องมีความยาวน้อยกว่า {{maxLength}} ตัวอักษร', - trueOrFalse: 'เป็นได้แค่ "ใช่" หรือ "ไม่ใช่"', - validUploadID: 'ไม่ใช่ ID ของการอัปโหลดที่ถูกต้อง', - }, - version: { - aboutToPublishSelection: 'คุณกำลังจะเผยแพร่ {{label}} ทั้งหมดในส่วนที่เลือก คุณแน่ใจไหม?', - aboutToRestore: - 'คุณกำลังจะคืนค่าเอกสาร {{label}} นี้กลับไปอยู่ในเวอร์ชันเมื่อวันที่ {{versionDate}}', - aboutToRestoreGlobal: - 'คุณกำลังจะคืนค่า global {{label}} กลับไปอยู่ในเวอร์ชันเมื่อวันที่ {{versionDate}}.', - aboutToRevertToPublished: - 'คุณกำลังจะย้อนการเปลี่ยนแปลงของเอกสารนี้ไปยังเวอร์ชันที่เผยแพร่อยู่ คุณต้องการดำเนินการต่อหรือไม่?', - aboutToUnpublish: 'คุณกำลังจะยกเลิกเผยแพร่เอกสารนี้ คุณต้องการดำเนินการต่อหรือไม่?', - aboutToUnpublishSelection: 'คุณกำลังจะเลิกเผยแพร่ {{label}} ทั้งหมดในส่วนที่เลือก คุณแน่ใจไหม?', - autosave: 'บันทึกอัตโนมัติ', - autosavedSuccessfully: 'บันทึกอัตโนมัติสำเร็จ', - autosavedVersion: 'เวอร์ชันบันทึกอัตโนมัติ', - changed: 'มีการแก้ไข', - compareVersion: 'เปรียบเทียบเวอร์ชันกับ:', - confirmPublish: 'ยืนยันการเผยแพร่', - confirmRevertToSaved: 'ยืนยันย้อนการแก้ไข', - confirmUnpublish: 'ยืนยันการยกเลิกการเผยแพร่', - confirmVersionRestoration: 'ยืนยันการกู้คืนเวอร์ชัน', - currentDocumentStatus: 'เอกสารปัจจุบัน', - draft: 'ฉบับร่าง', - draftSavedSuccessfully: 'บันทึกร่างสำเร็จ', - lastSavedAgo: 'บันทึกครั้งล่าสุด {{distance}} ที่ผ่านมา', - noFurtherVersionsFound: 'ไม่พบเวอร์ชันอื่น ๆ', - noRowsFound: 'ไม่พบ {{label}}', - preview: 'ตัวอย่าง', - problemRestoringVersion: 'เกิดปัญหาระหว่างการกู้คืนเวอร์ชันนี้', - publish: 'เผยแพร่', - publishChanges: 'เผยแพร่การแก้ไข', - published: 'เผยแพร่แล้ว', - publishing: 'การเผยแพร่', - restoreThisVersion: 'กู้คืนเวอร์ชันนี้', - restoredSuccessfully: 'กู้คืนเวอร์ชันสำเร็จ', - restoring: 'กำลังกู้คืน...', - revertToPublished: 'ย้อนกลับไปเวอร์ชันที่เผยแพร่อยู่', - reverting: 'กำลังย้อน...', - saveDraft: 'บันทึกร่าง', - selectLocales: 'เลือกภาษาที่ต้องการแสดง', - selectVersionToCompare: 'เลือกเวอร์ชันที่ต้องการเปรียบเทียบ', - showLocales: 'แสดงภาษา:', - showingVersionsFor: 'กำลังแสดงเวอร์ชันของ:', - status: 'สถานะ', - type: 'ประเภท', - unpublish: 'หยุดเผยแพร่', - unpublishing: 'กำลังหยุดการเผยแพร่...', - version: 'เวอร์ชัน', - versionCount_many: 'พบ {{count}} เวอร์ชัน', - versionCount_none: 'ไม่พบเวอร์ชันอื่น', - versionCount_one: 'พบ {{count}} เวอร์ชัน', - versionCount_other: 'พบ {{count}} เวอร์ชัน', - versionCreatedOn: '{{version}} ถูกสร้างเมื่อ:', - versionID: 'ID ของเวอร์ชัน', - versions: 'เวอร์ชัน', - viewingVersion: 'กำลังดูเวอร์ชันของ {{entityLabel}} {{documentTitle}}', - viewingVersionGlobal: 'กำลังดูเวอร์ชันของ global {{entityLabel}}', - viewingVersions: 'กำลังดูเวอร์ชันของ {{entityLabel}} {{documentTitle}}', - viewingVersionsGlobal: 'กำลังดูเวอร์ชันของ global {{entityLabel}}', +import type { Language } from '../types.js' + +export const th: Language = { + dateFNSKey: 'th', + translations: { + authentication: { + account: 'บัญชี', + accountOfCurrentUser: 'บัญชีปัจจุบัน', + alreadyActivated: 'เปิดใช้งานแล้ว', + alreadyLoggedIn: 'ลงชื่อเข้าใช้แล้ว', + apiKey: 'API Key', + backToLogin: 'กลับไปหน้าเข้าสู่ระบบ', + beginCreateFirstUser: 'สร้างผู้ใช้แรกเพื่อเริ่มใช้งาน', + changePassword: 'เปลี่ยนรหัสผ่าน', + checkYourEmailForPasswordReset: + 'ระบบได้ส่งอีเมลสำหรับรีเซ็ตรหัสผ่านไปที่อีเมลของคุณแล้ว โปรดเช็กอีเมลของคุณ', + confirmGeneration: 'ยืนยันการสร้าง', + confirmPassword: 'ยืนยันรหัสผ่าน', + createFirstUser: 'สร้างผู้ใช้แรก', + emailNotValid: 'อีเมลไม่ถูกต้อง', + emailSent: 'ส่งอีเมลเรียบร้อยแล้ว', + enableAPIKey: 'เปิดใช้ API Key', + failedToUnlock: 'ไม่สามารถปลดล็อกได้', + forceUnlock: 'ปลดล็อกบัญชี', + forgotPassword: 'ลืมรหัสผ่าน', + forgotPasswordEmailInstructions: + 'กรุณาใส่อีเมลของคุณ ระบบจะส่งวิธีการเปลี่ยนรหัสผ่านไปให้คุณทางอีเมล', + forgotPasswordQuestion: 'ลืมรหัสผ่าน?', + generate: 'สร้าง', + generateNewAPIKey: 'สร้าง API Key', + generatingNewAPIKeyWillInvalidate: + 'การสร้าง API Key ใหม่จะเป็นการ<1>ยกเลิก API Key เดิม คุณต้องการดำเนินการต่อหรือไม่?', + lockUntil: 'ล็อกบัญชีถึง', + logBackIn: 'เข้าสู่ระบบอีกครั้ง', + logOut: 'ออกจากระบบ', + loggedIn: 'หากต้องการเข้าสู่ระบบด้วยบัญชีอื่น กรุณา<0>ออกจากระบบก่อน', + loggedInChangePassword: 'หากต้องการเปลี่ยนรหัสผ่าน กรุณาแก้ไขที่หน้า<0>บัญชีของคุณ', + loggedOutInactivity: 'คุณได้ออกจากระบบเนื่องจากไม่มีการใช้งาน', + loggedOutSuccessfully: 'ออกจากระบบเรียบร้อยแล้ว', + login: 'เข้าสู่ระบบ', + loginAttempts: 'จำนวนครั้งการเข้าสู่ระบบ', + loginUser: 'เข้าสู่ระบบ', + loginWithAnotherUser: 'หากต้องการเข้าสู่ระบบด้วยบัญชีอื่น กรุณา<0>ออกจากระบบก่อน', + logout: 'ออกจากระบบ', + logoutUser: 'ออกจากระบบ', + newAPIKeyGenerated: 'สร้าง API Key ใหม่แล้ว', + newAccountCreated: + 'ระบบได้สร้างบัญชีผู้ใช้ให้คุณสำหรับเข้าใช้งาน {{serverURL}} เรียบร้อยแล้ว กรุณากดลิงก์ด้านล่างเพื่อยืนยันอีเมล หลังจากยืนยันอีเมลเสร็จสิ้น คุณจะสามารถเข้าใช้งานระบบได้', + newPassword: 'รหัสผ่านใหม่', + resetPassword: 'รีเซ็ตรหัสผ่าน', + resetPasswordExpiration: 'วันหมดอายุสำหรับการรีเซ็ตรหัสผ่าน', + resetPasswordToken: 'Token รีเซ็ตรหัสผ่าน', + resetYourPassword: 'รีเซ็ตรหัสผ่านของคุณ', + stayLoggedIn: 'เข้าสู่ระบบต่อไป', + successfullyUnlocked: 'ปลดล็อกบัญชีสำเร็จ', + unableToVerify: 'ไม่สามารถยืนยันบัญชีได้', + verified: 'ยืนยันบััญชีแล้ว', + verifiedSuccessfully: 'ยืนยันบัญชีสำเร็จ', + verify: 'ยืนยันบัญชี', + verifyUser: 'ยืนยันบัญชี', + verifyYourEmail: 'ยืนยันอีเมลของคุณ', + youAreInactive: + 'คุณกำลังจะถูกให้ออกจากระบบในเร็ว ๆ นี้เนื่องจากไม่มีการใช้งานระบบมาสักพักหนึ่ง คุณต้องการเข้าสู่ระบบต่อหรือไม่?', + youAreReceivingResetPassword: + 'คุณได้รับอีเมลนี้เนื่องจากคุณ (หรือคนอื่น) ได้ร้องขอให้รีเซ็ตรหัสผ่านของบัญชีของคุณ กรุณากดลิงก์ด้านล่างเพื่อดำเนินการรีเซ็ตรหัสผ่านต่อ:', + youDidNotRequestPassword: + 'หากคุณไม่ได้ร้องขอให้มีการรีเซ็ตรหัสผ่าน คุณสามารถเพิกเฉยข้อความนี้ได้ โดยรหัสผ่านของคุณจะคงอยู่เช่นเดิม', + }, + error: { + accountAlreadyActivated: 'บัญชีนี้ถูกเปิดใช้งานไปแล้ว', + autosaving: 'เกิดปัญหาระหว่างการบันทึกเอกสารอัตโนมัติ', + correctInvalidFields: 'โปรดแก้ไขช่องที่ไม่ถูกต้อง', + deletingFile: 'เกิดปัญหาระหว่างการลบไฟล์', + deletingTitle: 'เกิดปัญหาระหว่างการลบ {{title}} โปรดตรวจสอบการเชื่อมต่อของคุณแล้วลองอีกครั้ง', + emailOrPasswordIncorrect: 'อีเมลหรือรหัสผ่านไม่ถูกต้อง', + followingFieldsInvalid_one: 'ช่องต่อไปนี้ไม่ถูกต้อง:', + followingFieldsInvalid_other: 'ช่องต่อไปนี้ไม่ถูกต้อง:', + incorrectCollection: 'Collection ไม่ถูกต้อง', + invalidFileType: 'ประเภทของไฟล์ไม่ถูกต้อง', + invalidFileTypeValue: 'ประเภทของไฟล์ไม่ถูกต้อง: {{value}}', + loadingDocument: 'เกิดปัญหาระหว่างการโหลดเอกสารที่มี ID {{id}}', + missingEmail: 'ไม่พบอีเมล', + missingIDOfDocument: 'ไม่พบ ID ของเอกสารที่ต้องการแก้ไข', + missingIDOfVersion: 'ไม่พบ ID ของเวอร์ชัน', + missingRequiredData: 'ไม่พบข้อมูลที่จำเป็น', + noFilesUploaded: 'ไม่มีไฟล์ถูกอัปโหลด', + noMatchedField: 'ไม่พบช่อง "{{label}}"', + noUser: 'ไม่พบผู้ใช้', + notAllowedToAccessPage: 'คุณไม่ได้รับอนุญาตให้เข้าถึงหน้านี้', + notAllowedToPerformAction: 'คุณไม่ได้รับอนุญาตให้ดำเนินการสิ่งนี้', + notFound: 'ไม่พบหน้าที่คุณต้องการ', + previewing: 'เกิดปัญหาระหว่างการแสดงตัวอย่างเอกสาร', + problemUploadingFile: 'เกิดปัญหาระหว่างการอัปโหลดไฟล์', + tokenInvalidOrExpired: 'Token ไม่ถูกต้องหรือหมดอายุ', + unPublishingDocument: 'เกิดปัญหาระหว่างการยกเลิกการเผยแพร่เอกสารนี้', + unableToDeleteCount: 'ไม่สามารถลบ {{count}} จาก {{total}} {{label}}', + unableToUpdateCount: 'ไม่สามารถอัปเดต {{count}} จาก {{total}} {{label}}', + unauthorized: 'คุณไม่ได้รับอนุญาต กรุณาเข้าสู่ระบบเพื่อทำคำขอนี้', + unknown: 'เกิดปัญหาบางอย่างที่ไม่ทราบสาเหตุ', + unspecific: 'เกิดปัญหาบางอย่าง', + userLocked: 'บัญชีนี้ถูกล็อกเนื่องจากมีการพยายามเข้าสู่ระบบมากเกินไป', + valueMustBeUnique: 'ค่าต้องไม่ซ้ำกับเอกสารอื่น', + verificationTokenInvalid: 'Token ยืนยันตัวตนไม่ถูกต้อง', + }, + fields: { + addLabel: 'เพิ่ม {{label}}', + addLink: 'เพิ่มลิงค์', + addNew: 'เพิ่ม', + addNewLabel: 'เพิ่ม {{label}} ใหม่', + addRelationship: 'เพิ่มความสัมพันธ์', + addUpload: 'เพิ่มการอัปโหลด', + block: 'Block', + blockType: 'ประเภท Block', + blocks: 'Blocks', + chooseBetweenCustomTextOrDocument: 'เลือกระหว่างกำหนด URL เองหรือเชื่อมไปยังเอกสารอื่น', + chooseDocumentToLink: 'เลือกเอกสารที่จะเชื่อมโยง', + chooseFromExisting: 'เลือกจากที่มีอยู่', + chooseLabel: 'เลือก {{label}}', + collapseAll: 'ยุบทั้งหมด', + customURL: 'URL ที่กำหนดเอง', + editLabelData: 'แก้ไขข้อมูล {{label}}', + editLink: 'แก้ไขลิงก์', + editRelationship: 'แก้ไขความสัมพันธ์', + enterURL: 'ระบุ URL', + internalLink: 'ลิงก์ภายใน', + itemsAndMore: '{{items}} และเพิ่มเติมอีก {{count}}', + labelRelationship: 'ความสัมพันธ์กับ {{label}}', + latitude: 'ละติจูด', + linkType: 'ประเภทของลิงก์', + linkedTo: 'เชื่อมกับ <0>{{label}} สำเร็จ', + longitude: 'ลองติจูด', + newLabel: '{{label}} ใหม่', + openInNewTab: 'เปิดในแท็บใหม่', + passwordsDoNotMatch: 'รหัสผ่านไม่ตรงกัน', + relatedDocument: 'เอกสารที่เกี่ยวข้อง', + relationTo: 'เชื่อมกับ', + removeRelationship: 'ลบความสัมพันธ์', + removeUpload: 'ลบอัปโหลด', + saveChanges: 'บันทึก', + searchForBlock: 'ค้นหา Block', + selectExistingLabel: 'เลือก {{label}} ที่มีอยู่', + selectFieldsToEdit: 'เลือกช่องที่จะแก้ไข', + showAll: 'แสดงทั้งหมด', + swapRelationship: 'สลับความสัมพันธ์', + swapUpload: 'สลับอัปโหลด', + textToDisplay: 'ข้อความสำหรับแสดงผล', + toggleBlock: 'เปิด/ปิด Block', + uploadNewLabel: 'อัปโหลด {{label}} ใหม่', + }, + general: { + aboutToDelete: 'คุณกำลังจะลบ {{label}} <1>{{title}} ต้องการดำเนินการต่อหรือไม่?', + aboutToDeleteCount_many: 'คุณกำลังจะลบ {{count}} {{label}}', + aboutToDeleteCount_one: 'คุณกำลังจะลบ {{count}} {{label}}', + aboutToDeleteCount_other: 'คุณกำลังจะลบ {{count}} {{label}}', + addBelow: 'เพิ่มด้านล่าง', + addFilter: 'เพิ่มการกรอง', + adminTheme: 'ธีมผู้ดูแลระบบ', + and: 'และ', + applyChanges: 'ใช้การเปลี่ยนแปลง', + ascending: 'น้อยไปมาก', + automatic: 'อัตโนมัติ', + backToDashboard: 'กลับไปหน้าแดชบอร์ด', + cancel: 'ยกเลิก', + changesNotSaved: 'การเปลี่ยนแปลงยังไม่ได้ถูกบันทึก ถ้าคุณออกตอนนี้ สิ่งที่แก้ไขไว้จะหายไป', + close: 'ปิด', + collapse: 'ยุบ', + collections: 'Collections', + columnToSort: 'คอลัมน์ที่ต้องการเรียง', + columns: 'คอลัมน์', + confirm: 'ยืนยัน', + confirmDeletion: 'ยืนยันการลบ', + confirmDuplication: 'ยืนยันการสำเนา', + copied: 'คัดลอกแล้ว', + copy: 'คัดลอก', + create: 'สร้าง', + createNew: 'สร้างใหม่', + createNewLabel: 'สร้าง {{label}} ใหม่', + created: 'ถูกสร้างเมื่อ', + createdAt: 'สร้างเมื่อ', + creating: 'กำลังสร้าง', + creatingNewLabel: 'กำลังสร้าง {{label}} ใหม่', + dark: 'มืด', + dashboard: 'แดชบอร์ด', + delete: 'ลบ', + deletedCountSuccessfully: 'Deleted {{count}} {{label}} successfully.', + deletedSuccessfully: 'ลบสำเร็จ', + deleting: 'กำลังลบ...', + descending: 'มากไปน้อย', + deselectAllRows: 'ยกเลิกการเลือกทุกแถว', + duplicate: 'สำเนา', + duplicateWithoutSaving: 'สำเนาโดยไม่บันทึกการแก้ไข', + edit: 'แก้ไข', + editLabel: 'แก้ไข {{label}}', + editing: 'แก้ไข', + editingLabel_many: 'กำลังแก้ไข {{count}} {{label}}', + editingLabel_one: 'กำลังแก้ไข {{count}} {{label}}', + editingLabel_other: 'กำลังแก้ไข {{count}} {{label}}', + email: 'อีเมล', + emailAddress: 'อีเมล', + enterAValue: 'ระบุค่า', + error: 'ข้อผิดพลาด', + errors: 'ข้อผิดพลาด', + fallbackToDefaultLocale: 'สำรองไปยังตำแหน่งที่ตั้งเริ่มต้น', + filter: 'กรอง', + filterWhere: 'กรอง {{label}} เฉพาะ', + filters: 'กรอง', + globals: 'Globals', + language: 'ภาษา', + lastModified: 'แก้ไขล่าสุดเมื่อ', + leaveAnyway: 'ออกจากหน้านี้', + leaveWithoutSaving: 'ออกโดยไม่บันทึก', + light: 'สว่าง', + livePreview: 'แสดงตัวอย่าง', + loading: 'กำลังโหลด', + locale: 'ตำแหน่งที่ตั้ง', + locales: 'ภาษา', + menu: 'เมนู', + moveDown: 'ขยับขึ้น', + moveUp: 'ขยับลง', + newPassword: 'รหัสผ่านใหม่', + noFiltersSet: 'ไม่มีการกรอง', + noLabel: '<ไม่มี {{label}}>', + noOptions: 'ไม่มีตัวเลือก', + noResults: + 'ไม่พบ {{label}} เนื่องจากยังไม่มี {{label}} หรือไม่มี {{label}} ใดตรงกับการกรองด้านบน', + noValue: 'ไม่มีค่า', + none: 'ไม่มี', + notFound: 'ไม่พบ', + nothingFound: 'ไม่พบสิ่งใด', + of: 'จาก', + open: 'เปิด', + or: 'หรือ', + order: 'เรียงตาม', + pageNotFound: 'ไม่พบหน้าที่ต้องการ', + password: 'รหัสผ่าน', + payloadSettings: 'การตั้งค่า Payload', + perPage: 'จำนวนต่อหน้า: {{limit}}', + remove: 'ลบ', + reset: 'รีเซ็ต', + row: 'แถว', + rows: 'แถว', + save: 'บันทึก', + saving: 'กำลังบันทึก...', + searchBy: 'ค้นหาด้วย {{label}}', + selectAll: 'เลือกทั้งหมด {{count}} {{label}}', + selectAllRows: 'เลือกทุกแถว', + selectValue: 'เลือกค่า', + selectedCount: 'เลือก {{count}} {{label}} แล้ว', + showAllLabel: 'แสดง {{label}} ทั้งหมด', + sorryNotFound: 'ขออภัย ไม่สามารถทำตามคำขอของคุณได้', + sort: 'เรียง', + sortByLabelDirection: 'เรียงลำดับตาม {{label}} {{direction}}', + stayOnThisPage: 'อยู่หน้านี้ต่อ', + submissionSuccessful: 'ส่งสำเร็จ', + submit: 'ส่ง', + successfullyCreated: 'สร้าง {{label}} สำเร็จ', + successfullyDuplicated: 'สำเนา {{label}} สำเร็จ', + thisLanguage: 'ไทย', + titleDeleted: 'ลบ {{label}} "{{title}}" สำเร็จ', + unauthorized: 'ไม่ได้รับอนุญาต', + unsavedChangesDuplicate: 'คุณมีการแก้ไขที่ยังไม่ถูกบันทึก คุณต้องการทำสำเนาต่อหรือไม่?', + untitled: 'ไม่มีชื่อ', + updatedAt: 'แก้ไขเมื่อ', + updatedCountSuccessfully: 'อัปเดต {{count}} {{label}} เรียบร้อยแล้ว', + updatedSuccessfully: 'แก้ไขสำเร็จ', + updating: 'กำลังอัปเดต', + uploading: 'กำลังอัปโหลด', + user: 'ผู้ใช้', + users: 'ผู้ใช้', + value: 'ค่า', + welcome: 'ยินดีต้อนรับ', + }, + operators: { + contains: 'มี', + equals: 'เท่ากับ', + exists: 'มีอยู่', + isGreaterThan: 'มากกว่า', + isGreaterThanOrEqualTo: 'มากกว่าหรือเท่ากับ', + isIn: 'อยู่ใน', + isLessThan: 'น้อยกว่า', + isLessThanOrEqualTo: 'น้อยกว่าหรือเท่ากับ', + isLike: 'เหมือน', + isNotEqualTo: 'ไม่เท่ากับ', + isNotIn: 'ไม่ได้อยู่ใน', + near: 'ใกล้', + }, + upload: { + crop: 'พืชผล', + cropToolDescription: 'ลากมุมของพื้นที่ที่เลือก, วาดพื้นที่ใหม่หรือปรับค่าด้านล่าง', + dragAndDrop: 'ลากและวางไฟล์', + dragAndDropHere: 'หรือลากและวางไฟล์ที่นี่', + editImage: 'แก้ไขรูปภาพ', + fileName: 'ชื่อไฟล์', + fileSize: 'ขนาดไฟล์', + focalPoint: 'จุดสนใจ', + focalPointDescription: 'ลากจุดโฟกัสตรงบนภาพตัวอย่างหรือปรับค่าที่อยู่ด้านล่าง', + height: 'ความสูง', + lessInfo: 'ซ่อนข้อมูล', + moreInfo: 'แสดงข้อมูล', + previewSizes: 'ขนาดตัวอย่าง', + selectCollectionToBrowse: 'เลือก Collection ที่ต้องการค้นหา', + selectFile: 'เลือกไฟล์', + setCropArea: 'ตั้งค่าพื้นที่การครอบตัด', + setFocalPoint: 'ตั้งจุดโฟกัส', + sizes: 'ขนาด', + sizesFor: 'ขนาดสำหรับ {{label}}', + width: 'ความกว้าง', + }, + validation: { + emailAddress: 'กรุณาระบุอีเมลที่ถูกต้อง', + enterNumber: 'กรุณาระบุตัวเลขที่ถูกต้อง', + fieldHasNo: 'ช่องนี้ไม่มี {{label}}', + greaterThanMax: '{{value}} มากกว่าค่าสูงสุดที่อนุญาตของ {{label}} ซึ่งคือ {{max}}.', + invalidInput: 'ข้อมูลไม่ถูกต้อง', + invalidSelection: 'ค่าที่เลือกไม่ถูกต้อง', + invalidSelections: 'ค่าที่เลือกไม่ถูกต้องดังนี้:', + lessThanMin: '{{value}} น้อยกว่าค่าต่ำสุดที่อนุญาตของ {{label}} ซึ่งคือ {{min}}.', + limitReached: 'ถึงขีดจำกัดแล้ว, สามารถเพิ่มไอเทมได้เพียง {{max}} ไอเทมเท่านั้น', + longerThanMin: 'ค่าต้องมีความยาวมากกว่า {{minLength}} ตัวอักษร', + notValidDate: 'วันที่ "{{value}}" ไม่ถูกต้อง', + required: 'จำเป็นต้องระบุค่า', + requiresAtLeast: 'ต้องมีอย่างน้อย {{count}} {{label}}', + requiresNoMoreThan: 'ห้ามมีเกิน {{count}} {{label}}', + requiresTwoNumbers: 'ต้องมีตัวเลข 2 ค่า', + shorterThanMax: 'ค่าต้องมีความยาวน้อยกว่า {{maxLength}} ตัวอักษร', + trueOrFalse: 'เป็นได้แค่ "ใช่" หรือ "ไม่ใช่"', + validUploadID: 'ไม่ใช่ ID ของการอัปโหลดที่ถูกต้อง', + }, + version: { + type: 'ประเภท', + aboutToPublishSelection: 'คุณกำลังจะเผยแพร่ {{label}} ทั้งหมดในส่วนที่เลือก คุณแน่ใจไหม?', + aboutToRestore: + 'คุณกำลังจะคืนค่าเอกสาร {{label}} นี้กลับไปอยู่ในเวอร์ชันเมื่อวันที่ {{versionDate}}', + aboutToRestoreGlobal: + 'คุณกำลังจะคืนค่า global {{label}} กลับไปอยู่ในเวอร์ชันเมื่อวันที่ {{versionDate}}.', + aboutToRevertToPublished: + 'คุณกำลังจะย้อนการเปลี่ยนแปลงของเอกสารนี้ไปยังเวอร์ชันที่เผยแพร่อยู่ คุณต้องการดำเนินการต่อหรือไม่?', + aboutToUnpublish: 'คุณกำลังจะยกเลิกเผยแพร่เอกสารนี้ คุณต้องการดำเนินการต่อหรือไม่?', + aboutToUnpublishSelection: + 'คุณกำลังจะเลิกเผยแพร่ {{label}} ทั้งหมดในส่วนที่เลือก คุณแน่ใจไหม?', + autosave: 'บันทึกอัตโนมัติ', + autosavedSuccessfully: 'บันทึกอัตโนมัติสำเร็จ', + autosavedVersion: 'เวอร์ชันบันทึกอัตโนมัติ', + changed: 'มีการแก้ไข', + compareVersion: 'เปรียบเทียบเวอร์ชันกับ:', + confirmPublish: 'ยืนยันการเผยแพร่', + confirmRevertToSaved: 'ยืนยันย้อนการแก้ไข', + confirmUnpublish: 'ยืนยันการยกเลิกการเผยแพร่', + confirmVersionRestoration: 'ยืนยันการกู้คืนเวอร์ชัน', + currentDocumentStatus: 'เอกสารปัจจุบัน', + draft: 'ฉบับร่าง', + draftSavedSuccessfully: 'บันทึกร่างสำเร็จ', + lastSavedAgo: 'บันทึกครั้งล่าสุด {{distance}} ที่ผ่านมา', + noFurtherVersionsFound: 'ไม่พบเวอร์ชันอื่น ๆ', + noRowsFound: 'ไม่พบ {{label}}', + preview: 'ตัวอย่าง', + problemRestoringVersion: 'เกิดปัญหาระหว่างการกู้คืนเวอร์ชันนี้', + publish: 'เผยแพร่', + publishChanges: 'เผยแพร่การแก้ไข', + published: 'เผยแพร่แล้ว', + publishing: 'การเผยแพร่', + restoreThisVersion: 'กู้คืนเวอร์ชันนี้', + restoredSuccessfully: 'กู้คืนเวอร์ชันสำเร็จ', + restoring: 'กำลังกู้คืน...', + revertToPublished: 'ย้อนกลับไปเวอร์ชันที่เผยแพร่อยู่', + reverting: 'กำลังย้อน...', + saveDraft: 'บันทึกร่าง', + selectLocales: 'เลือกภาษาที่ต้องการแสดง', + selectVersionToCompare: 'เลือกเวอร์ชันที่ต้องการเปรียบเทียบ', + showLocales: 'แสดงภาษา:', + showingVersionsFor: 'กำลังแสดงเวอร์ชันของ:', + status: 'สถานะ', + unpublish: 'หยุดเผยแพร่', + unpublishing: 'กำลังหยุดการเผยแพร่...', + version: 'เวอร์ชัน', + versionCount_many: 'พบ {{count}} เวอร์ชัน', + versionCount_none: 'ไม่พบเวอร์ชันอื่น', + versionCount_one: 'พบ {{count}} เวอร์ชัน', + versionCount_other: 'พบ {{count}} เวอร์ชัน', + versionCreatedOn: '{{version}} ถูกสร้างเมื่อ:', + versionID: 'ID ของเวอร์ชัน', + versions: 'เวอร์ชัน', + viewingVersion: 'กำลังดูเวอร์ชันของ {{entityLabel}} {{documentTitle}}', + viewingVersionGlobal: 'กำลังดูเวอร์ชันของ global {{entityLabel}}', + viewingVersions: 'กำลังดูเวอร์ชันของ {{entityLabel}} {{documentTitle}}', + viewingVersionsGlobal: 'กำลังดูเวอร์ชันของ global {{entityLabel}}', + }, }, } diff --git a/packages/translations/src/languages/tr.ts b/packages/translations/src/languages/tr.ts index 677d31c6ac..2af4f72a96 100644 --- a/packages/translations/src/languages/tr.ts +++ b/packages/translations/src/languages/tr.ts @@ -1,392 +1,398 @@ -export default { - authentication: { - account: 'Hesap', - accountOfCurrentUser: 'Şu anki kullanıcının hesabı', - alreadyActivated: 'Hesap zaten etkinleştirildi', - alreadyLoggedIn: 'Hesaba zaten giriş yapıldı', - apiKey: 'API Anahtarı', - backToLogin: 'Giriş ekranına geri dön', - beginCreateFirstUser: 'Başlamak için ilk kullanıcı hesabını oluşturun.', - changePassword: 'Parolayı Değiştir', - checkYourEmailForPasswordReset: - 'Parolanızı güvenli bir şekilde güncelleyebilmeniz için e-posta adresinize bir bağlantı gönderilmiştir.', - confirmGeneration: 'Oluştumayı Onayla', - confirmPassword: 'Parolayı Onayla', - createFirstUser: 'İlk kullanıcı oluştur', - emailNotValid: 'Girilen e-posta geçersiz', - emailSent: 'E-posta gönderildi', - enableAPIKey: 'Api anahtarını etkinleştir', - failedToUnlock: 'Hesabı aktifleştirme başarısız oldu', - forceUnlock: 'Hesabı Etkinleştir', - forgotPassword: 'Parolamı Unuttum', - forgotPasswordEmailInstructions: - 'Lütfen e-posta adresinizi aşağıdaki alana girin. Parolanızı nasıl sıfırlayacağınızı gösteren bir e-posta adresi alacaksınız.', - forgotPasswordQuestion: 'Parolanızı mı unuttunuz?', - generate: 'Oluştur', - generateNewAPIKey: 'Yeni bir API anahtarı oluştur', - generatingNewAPIKeyWillInvalidate: - 'Yeni bir API anahtarı oluşturmak önceckini <1>geçersiz kılacaktır. Devam etmek istiyor musunuz?', - lockUntil: 'Lock Until', - logBackIn: 'Tekrar giriş yapın', - logOut: 'Çıkış', - loggedIn: - 'Başka bir kullanıcı hesabıyla giriş yapabilmek için önce <0>çıkış yapmanız gerekmektedir.', - loggedInChangePassword: 'Parolanızı değiştirmek için <0>hesabınıza gidebilirsiniz.', - loggedOutInactivity: 'Uzun süre işlem yapmadığınız için oturumunuz kapatıldı.', - loggedOutSuccessfully: 'Başarıyla çıkış yaptınız.', - login: 'Giriş', - loginAttempts: 'Giriş Denemeleri', - loginUser: 'Kullanıcı girişi', - loginWithAnotherUser: - 'Başka bir kullanıcı hesabıyla giriş yapmak için önce <0>çıkış yapmalısınız.', - logout: 'Çıkış', - logoutUser: 'Kullanıcıyı çıkış yapmaya zorla', - newAPIKeyGenerated: 'Yeni API anahtarı oluşturuldu.', - newAccountCreated: - '<0>{{serverURL}} sitesinde adınıza yeni bir hesap oluşturuldu. E-postanızı doğrulamak için bağlantıya tıklayabilirsiniz: <1>{{verificationURL}}
E-postanızı doğruladıktan sonra siteye hesap bilgilerinizle giriş yapabilirsiniz.', - newPassword: 'Yeni Parola', - resetPassword: 'Parolayı Sıfırla', - resetPasswordExpiration: 'Parola Geçerlik Süresini Sıfırla', - resetPasswordToken: 'Parola tokenini sıfırla', - resetYourPassword: 'Parolanızı Sıfırlayın', - stayLoggedIn: 'Oturumu açık tut', - successfullyUnlocked: 'Hesabın kilidi başarıyla açıldı', - unableToVerify: 'Doğrulama başarısız', - verified: 'Doğrulandı', - verifiedSuccessfully: 'Hesap başarıyla doğrulandı', - verify: 'Doğrula', - verifyUser: 'Kullanıcıyı doğrula', - verifyYourEmail: 'E-postanızı doğrulayın', - youAreInactive: - 'Bir süredir işlem yapmadığınız için yakında oturumunuz kapatılacak. Oturumunuzun açık kalmasını istiyor musunuz?', - youAreReceivingResetPassword: - 'Siz veya bir başkası hesabınızın parolasını sıfırlama isteğinde bulunduğu için bu e-postayı alıyorsunuz. İşlemi tamamlamak için lütfen aşağıdaki bağlantıya tıklayın veya bağlantı adresini tarayıcınızın adres yazma bölümüne kopyalayın.', - youDidNotRequestPassword: - 'Eğer bu işlemi siz gerçekleştirmediyseniz bu e-postayı görmezden gelebilirsiniz.', - }, - error: { - accountAlreadyActivated: 'Hesap zaten etkinleştirildi.', - autosaving: 'Otomatik kaydetme başarısız oldu', - correctInvalidFields: 'Lütfen geçersiz alanları düzeltin.', - deletingFile: 'Dosya silinirken bir hatayla karşılaşıldı.', - deletingTitle: - '{{title}} silinirken bir sorun yaşandı. Lütfen internet bağlantınızı kontrol edip tekrar deneyin.', - emailOrPasswordIncorrect: 'Girilen e-posta veya parola hatalı', - followingFieldsInvalid_one: 'Lütfen geçersiz alanı düzeltin:', - followingFieldsInvalid_other: 'Lütfen geçersiz alanları düzeltin:', - incorrectCollection: 'Hatalı koleksiyon', - invalidFileType: 'Geçersiz dosya türü', - invalidFileTypeValue: 'Geçersiz dosya türü: {{value}}', - loadingDocument: "{{id}} ID'ye sahip döküman yüklenirken bir sorun oluştu.", - missingEmail: 'E-posta adresi girilmedi.', - missingIDOfDocument: "Güncellenecek döküman ID'si eksik.", - missingIDOfVersion: "Versiyon ID'si geçersiz.", - missingRequiredData: 'Gerekli veri eksik.', - noFilesUploaded: 'Yüklenen dosya yok', - noMatchedField: '"{{label}}" ile eşleşen alan bulunamadı.', - noUser: 'Kullanıcı yok', - notAllowedToAccessPage: 'Bu sayfaya erişim izniniz yok.', - notAllowedToPerformAction: 'Bu işlemi gerçekleştirmek için izniniz yok.', - notFound: 'Sayfa bulunamadı.', - previewing: 'Önizleme başarısız oldu', - problemUploadingFile: 'Dosya yüklenirken bir sorun oluştu.', - tokenInvalidOrExpired: 'Geçersiz veya süresi dolmuş token.', - unPublishingDocument: 'Geçerli döküman yayından kaldırılırken bir sorun oluştu.', - unableToDeleteCount: '{{total}} {{label}} içinden {{count}} silinemiyor.', - unableToUpdateCount: '{{total}} {{label}} içinden {{count}} güncellenemiyor.', - unauthorized: 'Bu işlemi gerçekleştirmek için lütfen giriş yapın.', - unknown: 'Bilinmeyen bir hata oluştu.', - unspecific: 'Bir hata oluştu.', - userLocked: - 'Hesabınız hatalı giriş denemeleri yüzünden geçici olarak kilitlendi. Lütfen daha sonra tekrar deneyin.', - valueMustBeUnique: 'Değer benzersiz olmalıdır', - verificationTokenInvalid: 'Doğrulama tokeni geçersiz.', - }, - fields: { - addLabel: '{{label}} ekle', - addLink: 'Link Ekle', - addNew: 'Yeni', - addNewLabel: 'Yeni {{label}}', - addRelationship: 'İlişki Ekle', - addUpload: 'Yükleme Ekle', - block: 'blok', - blockType: 'Blok tipi', - blocks: 'blok', - chooseBetweenCustomTextOrDocument: - 'Choose between entering a custom text URL or linking to another document.', - chooseDocumentToLink: 'Bağlantı verilecek bir döküman seçin.', - chooseFromExisting: 'Varolanlardan seç', - chooseLabel: '{{label}} seç', - collapseAll: 'Tümünü daralt', - customURL: 'Özel URL', - editLabelData: '{{label}} düzenle', - editLink: 'Bağlantıyı Düzenle', - editRelationship: 'İlişkiyi Ekle', - enterURL: 'Bir URL girin', - internalLink: 'İç bağlantı', - itemsAndMore: '{{items}} and {{count}} more', - labelRelationship: '{{label}} Relationship', - latitude: 'Enlem', - linkType: 'Bağlantı türü', - linkedTo: '<0>label için bağlantı verildi', - longitude: 'Boylam', - newLabel: 'Yeni {{label}}', - openInNewTab: 'Yeni sekmede aç', - passwordsDoNotMatch: 'Parolalar eşleşmiyor.', - relatedDocument: 'İlişkili döküman', - relationTo: 'Relation To', - removeRelationship: 'İlişkiyi Kaldır', - removeUpload: 'Dosyayı Sil', - saveChanges: 'Değişiklikleri kaydet', - searchForBlock: 'Blok ara', - selectExistingLabel: 'Varolan {{label}} seç', - selectFieldsToEdit: 'Düzenlenecek alanları seçin', - showAll: 'Tümünü göster', - swapRelationship: 'Takas Ilişkisi', - swapUpload: 'Karşıya Yüklemeyi Değiştir', - textToDisplay: 'Görüntülenecek metin', - toggleBlock: 'Bloğu aç/kapat', - uploadNewLabel: 'Karşıya {{label}} yükle', - }, - general: { - aboutToDelete: - '<1>{{title}} {{label}} silinmek üzere. Silme işlemine devam etmek istiyor musunuz?', - aboutToDeleteCount_many: '{{count}} {{label}} silmek üzeresiniz', - aboutToDeleteCount_one: '{{count}} {{label}} silmek üzeresiniz', - aboutToDeleteCount_other: '{{count}} {{label}} silmek üzeresiniz', - addBelow: 'Altına ekle', - addFilter: 'Filtre ekle', - adminTheme: 'Admin arayüzü', - and: 've', - applyChanges: 'Değişiklikleri Uygula', - ascending: 'artan', - automatic: 'Otomatik', - backToDashboard: 'Anasayfaya geri dön', - cancel: 'İptal', - changesNotSaved: - 'Değişiklikleriniz henüz kaydedilmedi. Eğer bu sayfayı terk ederseniz değişiklikleri kaybedeceksiniz.', - close: 'Kapat', - collapse: 'Daralt', - collections: 'Koleksiyonlar', - columnToSort: 'Sıralanacak Sütunlar', - columns: 'Sütunlar', - confirm: 'Onayla', - confirmDeletion: 'Silmeyi onayla', - confirmDuplication: 'Çoğaltmayı onayla', - copied: 'Kopyalandı', - copy: 'Kopyala', - create: 'Oluştur', - createNew: 'Yeni oluştur', - createNewLabel: 'Yeni bir {{label}} oluştur', - created: 'Oluşturma tarihi', - createdAt: 'Oluşturma tarihi', - creating: 'Oluşturuluyor', - creatingNewLabel: 'Yeni bir {{label}} oluşturuluyor', - dark: 'Karanlık', - dashboard: 'Anasayfa', - delete: 'Sil', - deletedCountSuccessfully: '{{count}} {{label}} başarıyla silindi.', - deletedSuccessfully: 'Başarıyla silindi.', - deleting: 'Siliniyor...', - descending: 'Azalan', - deselectAllRows: 'Tüm satırların seçimini kaldır', - duplicate: 'Çoğalt', - duplicateWithoutSaving: 'Ayarları kaydetmeden çoğalt', - edit: 'Düzenle', - editLabel: '{{label}} düzenle', - editing: 'Düzenleniyor', - editingLabel_many: '{{count}} {{label}} düzenleniyor', - editingLabel_one: '{{count}} {{label}} düzenleniyor', - editingLabel_other: '{{count}} {{label}} düzenleniyor', - email: 'E-posta', - emailAddress: 'E-posta adresi', - enterAValue: 'Değer girin', - error: 'Hata', - errors: 'Hatalar', - fallbackToDefaultLocale: 'Varsayılan yerel ayara geri dönme', - filter: 'Filtrele', - filterWhere: '{{label}} filtrele:', - filters: 'Filtreler', - globals: 'Globaller', - language: 'Dil', - lastModified: 'Son değiştirme', - leaveAnyway: 'Yine de ayrıl', - leaveWithoutSaving: 'Kaydetmeden ayrıl', - light: 'Aydınlık', - livePreview: 'Önizleme', - loading: 'Yükleniyor', - locale: 'Yerel ayar', - locales: 'Diller', - menu: 'Menü', - moveDown: 'Aşağı taşı', - moveUp: 'Yukarı taşı', - newPassword: 'Yeni parola', - noFiltersSet: 'Tanımlı filtre yok', - noLabel: '<{{label}} yok>', - noOptions: 'Seçenek yok', - noResults: - '{{label}} bulunamadı. Henüz bir {{label}} eklenmemiş olabilir veya seçtiğiniz filtrelerle eşleşen bir sonuç bulunamamış olabilir.', - noValue: 'Değer yok', - none: 'Hiç', - notFound: 'Bulunamadı', - nothingFound: 'Hiçbir şey bulunamadı', - of: 'of', - open: 'Aç', - or: 'Or', - order: 'Order', - pageNotFound: 'Sayfa bulunamadı', - password: 'Parola', - payloadSettings: 'Ayarlar', - perPage: 'Sayfa başına: {{limit}}', - remove: 'Kaldır', - reset: 'Sıfırla', - row: 'Satır', - rows: 'Satır', - save: 'Kaydet', - saving: 'Kaydediliyor...', - searchBy: 'Şuna göre sırala: {{label}}', - selectAll: "Tüm {{count}} {{label}}'ı seçin", - selectAllRows: 'Tüm satırları seçin', - selectValue: 'Bir değer seçin', - selectedCount: '{{count}} {{label}} seçildi', - showAllLabel: 'Tüm {{label}} göster', - sorryNotFound: 'Üzgünüz, isteğinizle eşleşen bir sonuç bulunamadı.', - sort: 'Sırala', - sortByLabelDirection: '{{label}} göre sırala {{direction}}', - stayOnThisPage: 'Bu sayfada kal', - submissionSuccessful: 'Gönderme başarılı', - submit: 'Gönder', - successfullyCreated: '{{label}} başarıyla oluşturuldu.', - successfullyDuplicated: '{{label}} başarıyla kopyalandı.', - thisLanguage: 'Türkçe', - titleDeleted: '{{label}} {{title}} başarıyla silindi.', - unauthorized: 'Yetkisiz', - unsavedChangesDuplicate: - 'Kaydedilmemiş değişiklikler var. Çoğaltma işlemine devam etmek istiyor musunuz?', - untitled: 'Başlıksız', - updatedAt: 'Güncellenme tarihi', - updatedCountSuccessfully: '{{count}} {{label}} başarıyla güncellendi.', - updatedSuccessfully: 'Başarıyla güncellendi.', - updating: 'Güncelleniyor', - uploading: 'Yükleniyor', - user: 'kullanıcı', - users: 'kullanıcı', - value: 'Değer', - welcome: 'Hoşgeldiniz', - }, - operators: { - contains: 'içerir', - equals: 'eşittir', - exists: 'var', - isGreaterThan: 'şundan büyüktür', - isGreaterThanOrEqualTo: 'büyüktür veya eşittir', - isIn: 'içinde', - isLessThan: 'küçüktür', - isLessThanOrEqualTo: 'küçüktür veya eşittir', - isLike: 'gibidir', - isNotEqualTo: 'eşit değildir', - isNotIn: 'içinde değil', - near: 'yakın', - }, - upload: { - crop: 'Mahsulat', - cropToolDescription: - 'Seçilen alanın köşelerini sürükleyin, yeni bir alan çizin ya da aşağıdaki değerleri ayarlayın.', - dragAndDrop: 'Bir dosya sürükleyip bırakabilirsiniz', - dragAndDropHere: 'veya buraya bir dosya sürükleyip bırakabilirsiniz', - editImage: 'Görüntüyü Düzenle', - fileName: 'Dosya adı', - fileSize: 'Dosya boyutu', - focalPoint: 'Odak Noktası', - focalPointDescription: - 'Önizlemeye odak noktasını doğrudan sürükleyin veya aşağıdaki değerleri ayarlayın.', - height: 'Yükseklik', - lessInfo: 'Daha az bilgi', - moreInfo: 'Daha fazla bilgi', - previewSizes: 'Önizleme Boyutları', - selectCollectionToBrowse: 'Görüntülenecek bir koleksiyon seçin', - selectFile: 'Dosya seç', - setCropArea: 'Mahsul alanını ayarla', - setFocalPoint: 'Odak noktasını ayarla', - sizes: 'Boyutlar', - sizesFor: '{{label}} için boyutlar', - width: 'Genişlik', - }, - validation: { - emailAddress: 'Lütfen geçerli bir e-posta adresi girin.', - enterNumber: 'Lütfen geçerli bir sayı girin.', - fieldHasNo: 'Bu alanda {{label}} girili değil.', - greaterThanMax: '{{value}} izin verilen maksimum {{label}} değerinden daha büyük.', - invalidInput: 'Bu alanda geçersiz bir giriş mevcut.', - invalidSelection: 'Bu alanda geçersiz bir seçim mevcut.', - invalidSelections: "'Bu alan şu geçersiz seçimlere sahip:'", - lessThanMin: '{{value}} izin verilen minimum {{label}} değerinden daha küçük.', - limitReached: 'Sınır aşıldı, yalnızca {{max}} öğe eklenebilir.', - longerThanMin: 'Bu değer minimum {{minLength}} karakterden uzun olmalıdır.', - notValidDate: '"{{value}}" geçerli bir tarih değil.', - required: 'Bu alan gereklidir.', - requiresAtLeast: 'Bu alan en az {{count}} adet {{label}} gerektirmektedir.', - requiresNoMoreThan: 'Bu alana {{count}} adetten fazla {{label}} girilemez.', - requiresTwoNumbers: 'Bu alana en az iki rakam girilmesi zorunludur.', - shorterThanMax: 'Bu alan {{maxLength}} karakterden daha kısa olmalıdır.', - trueOrFalse: 'Bu alan yalnızca doğru ve yanlış olabilir.', - validUploadID: "'Bu alan geçerli bir karşıya yükleme ID'sine sahip değil.'", - }, - version: { - aboutToPublishSelection: "Seçimdeki tüm {{label}}'i yayınlamak üzeresiniz. Emin misin?", - aboutToRestore: 'Döküman {{label}}, {{versionDate}} tarihindeki sürümüne geri döndürülecek.', - aboutToRestoreGlobal: - 'Global {{label}}, {{versionDate}} tarihindeki sürümüne geri döndürülecek.', - aboutToRevertToPublished: - 'Bu dökümanın değişikliklerini yayınladığı haline geri getirmek üzeresiniz. Devam etmek istiyor musunuz?', - aboutToUnpublish: 'Bu dökümanı yayından kaldırmak üzeresiniz. Devam etmek istiyor musunuz?', - aboutToUnpublishSelection: 'Seçimdeki tüm {{label}} yayınını kaldırmak üzeresiniz. Emin misin?', - autosave: 'Otomatik kaydet', - autosavedSuccessfully: 'Otomatik kaydetme başarılı', - autosavedVersion: 'Otomatik kayıtlı sürüm', - changed: 'Değişiklik yapıldı', - compareVersion: 'Sürümü şununla karşılaştır:', - confirmPublish: 'Yayınlamayı onayla', - confirmRevertToSaved: 'Confirm revert to saved', - confirmUnpublish: 'Yayından kaldırmayı onayla', - confirmVersionRestoration: 'Sürümü Geri Getirmeyi Onayla', - currentDocumentStatus: 'Şu an {{docStatus}} döküman', - draft: 'Taslak', - draftSavedSuccessfully: 'Taslak başarıyla kaydedildi.', - lastSavedAgo: 'Son kaydedildi {{distance}} önce', - noFurtherVersionsFound: 'Başka sürüm bulunamadı.', - noRowsFound: '{{label}} bulunamadı', - preview: 'Önizleme', - problemRestoringVersion: 'Bu sürüme geri döndürürken bir hatayla karşılaşıldı.', - publish: 'Yayınla', - publishChanges: 'Değişiklikleri yayınla', - published: 'Yayınlandı', - publishing: 'Yayınlama', - restoreThisVersion: 'Bu sürüme geri döndür', - restoredSuccessfully: 'Geri getirme başarılı.', - restoring: 'Geri döndürülüyor...', - revertToPublished: 'Yayınlanana geri döndür', - reverting: 'Değişiklikler geri alınıyor...', - saveDraft: 'Taslağı kaydet', - selectLocales: 'Görüntülenecek yerel ayarları seçin', - selectVersionToCompare: 'Karşılaştırılacak bir sürüm seçin', - showLocales: 'Yerel ayarları göster:', - showingVersionsFor: 'Şunun için sürümler gösteriliyor:', - status: 'Durum', - type: 'Tür', - unpublish: 'Yayından Kaldır', - unpublishing: 'Yayından kaldırılıyor...', - version: 'Sürüm', - versionCount_many: '{{count}} sürüm bulundu', - versionCount_none: 'Sürüm bulunamadı', - versionCount_one: '{{count}} sürüm bulundu', - versionCount_other: '{{count}} sürüm bulundu', - versionCreatedOn: '{{version}} oluşturma tarihi:', - versionID: 'Sürüm ID', - versions: 'Sürümler', - viewingVersion: '{{entityLabel}} {{documentTitle}} için sürümler gösteriliyor', - viewingVersionGlobal: '`Global {{entityLabel}} için sürümler gösteriliyor', - viewingVersions: '{{entityLabel}} {{documentTitle}} için sürümler gösteriliyor', - viewingVersionsGlobal: '`Global {{entityLabel}} için sürümler gösteriliyor', +import type { Language } from '../types.js' + +export const tr: Language = { + dateFNSKey: 'tr', + translations: { + authentication: { + account: 'Hesap', + accountOfCurrentUser: 'Şu anki kullanıcının hesabı', + alreadyActivated: 'Hesap zaten etkinleştirildi', + alreadyLoggedIn: 'Hesaba zaten giriş yapıldı', + apiKey: 'API Anahtarı', + backToLogin: 'Giriş ekranına geri dön', + beginCreateFirstUser: 'Başlamak için ilk kullanıcı hesabını oluşturun.', + changePassword: 'Parolayı Değiştir', + checkYourEmailForPasswordReset: + 'Parolanızı güvenli bir şekilde güncelleyebilmeniz için e-posta adresinize bir bağlantı gönderilmiştir.', + confirmGeneration: 'Oluştumayı Onayla', + confirmPassword: 'Parolayı Onayla', + createFirstUser: 'İlk kullanıcı oluştur', + emailNotValid: 'Girilen e-posta geçersiz', + emailSent: 'E-posta gönderildi', + enableAPIKey: 'Api anahtarını etkinleştir', + failedToUnlock: 'Hesabı aktifleştirme başarısız oldu', + forceUnlock: 'Hesabı Etkinleştir', + forgotPassword: 'Parolamı Unuttum', + forgotPasswordEmailInstructions: + 'Lütfen e-posta adresinizi aşağıdaki alana girin. Parolanızı nasıl sıfırlayacağınızı gösteren bir e-posta adresi alacaksınız.', + forgotPasswordQuestion: 'Parolanızı mı unuttunuz?', + generate: 'Oluştur', + generateNewAPIKey: 'Yeni bir API anahtarı oluştur', + generatingNewAPIKeyWillInvalidate: + 'Yeni bir API anahtarı oluşturmak önceckini <1>geçersiz kılacaktır. Devam etmek istiyor musunuz?', + lockUntil: 'Lock Until', + logBackIn: 'Tekrar giriş yapın', + logOut: 'Çıkış', + loggedIn: + 'Başka bir kullanıcı hesabıyla giriş yapabilmek için önce <0>çıkış yapmanız gerekmektedir.', + loggedInChangePassword: 'Parolanızı değiştirmek için <0>hesabınıza gidebilirsiniz.', + loggedOutInactivity: 'Uzun süre işlem yapmadığınız için oturumunuz kapatıldı.', + loggedOutSuccessfully: 'Başarıyla çıkış yaptınız.', + login: 'Giriş', + loginAttempts: 'Giriş Denemeleri', + loginUser: 'Kullanıcı girişi', + loginWithAnotherUser: + 'Başka bir kullanıcı hesabıyla giriş yapmak için önce <0>çıkış yapmalısınız.', + logout: 'Çıkış', + logoutUser: 'Kullanıcıyı çıkış yapmaya zorla', + newAPIKeyGenerated: 'Yeni API anahtarı oluşturuldu.', + newAccountCreated: + '<0>{{serverURL}} sitesinde adınıza yeni bir hesap oluşturuldu. E-postanızı doğrulamak için bağlantıya tıklayabilirsiniz: <1>{{verificationURL}}
E-postanızı doğruladıktan sonra siteye hesap bilgilerinizle giriş yapabilirsiniz.', + newPassword: 'Yeni Parola', + resetPassword: 'Parolayı Sıfırla', + resetPasswordExpiration: 'Parola Geçerlik Süresini Sıfırla', + resetPasswordToken: 'Parola tokenini sıfırla', + resetYourPassword: 'Parolanızı Sıfırlayın', + stayLoggedIn: 'Oturumu açık tut', + successfullyUnlocked: 'Hesabın kilidi başarıyla açıldı', + unableToVerify: 'Doğrulama başarısız', + verified: 'Doğrulandı', + verifiedSuccessfully: 'Hesap başarıyla doğrulandı', + verify: 'Doğrula', + verifyUser: 'Kullanıcıyı doğrula', + verifyYourEmail: 'E-postanızı doğrulayın', + youAreInactive: + 'Bir süredir işlem yapmadığınız için yakında oturumunuz kapatılacak. Oturumunuzun açık kalmasını istiyor musunuz?', + youAreReceivingResetPassword: + 'Siz veya bir başkası hesabınızın parolasını sıfırlama isteğinde bulunduğu için bu e-postayı alıyorsunuz. İşlemi tamamlamak için lütfen aşağıdaki bağlantıya tıklayın veya bağlantı adresini tarayıcınızın adres yazma bölümüne kopyalayın.', + youDidNotRequestPassword: + 'Eğer bu işlemi siz gerçekleştirmediyseniz bu e-postayı görmezden gelebilirsiniz.', + }, + error: { + accountAlreadyActivated: 'Hesap zaten etkinleştirildi.', + autosaving: 'Otomatik kaydetme başarısız oldu', + correctInvalidFields: 'Lütfen geçersiz alanları düzeltin.', + deletingFile: 'Dosya silinirken bir hatayla karşılaşıldı.', + deletingTitle: + '{{title}} silinirken bir sorun yaşandı. Lütfen internet bağlantınızı kontrol edip tekrar deneyin.', + emailOrPasswordIncorrect: 'Girilen e-posta veya parola hatalı', + followingFieldsInvalid_one: 'Lütfen geçersiz alanı düzeltin:', + followingFieldsInvalid_other: 'Lütfen geçersiz alanları düzeltin:', + incorrectCollection: 'Hatalı koleksiyon', + invalidFileType: 'Geçersiz dosya türü', + invalidFileTypeValue: 'Geçersiz dosya türü: {{value}}', + loadingDocument: "{{id}} ID'ye sahip döküman yüklenirken bir sorun oluştu.", + missingEmail: 'E-posta adresi girilmedi.', + missingIDOfDocument: "Güncellenecek döküman ID'si eksik.", + missingIDOfVersion: "Versiyon ID'si geçersiz.", + missingRequiredData: 'Gerekli veri eksik.', + noFilesUploaded: 'Yüklenen dosya yok', + noMatchedField: '"{{label}}" ile eşleşen alan bulunamadı.', + noUser: 'Kullanıcı yok', + notAllowedToAccessPage: 'Bu sayfaya erişim izniniz yok.', + notAllowedToPerformAction: 'Bu işlemi gerçekleştirmek için izniniz yok.', + notFound: 'Sayfa bulunamadı.', + previewing: 'Önizleme başarısız oldu', + problemUploadingFile: 'Dosya yüklenirken bir sorun oluştu.', + tokenInvalidOrExpired: 'Geçersiz veya süresi dolmuş token.', + unPublishingDocument: 'Geçerli döküman yayından kaldırılırken bir sorun oluştu.', + unableToDeleteCount: '{{total}} {{label}} içinden {{count}} silinemiyor.', + unableToUpdateCount: '{{total}} {{label}} içinden {{count}} güncellenemiyor.', + unauthorized: 'Bu işlemi gerçekleştirmek için lütfen giriş yapın.', + unknown: 'Bilinmeyen bir hata oluştu.', + unspecific: 'Bir hata oluştu.', + userLocked: + 'Hesabınız hatalı giriş denemeleri yüzünden geçici olarak kilitlendi. Lütfen daha sonra tekrar deneyin.', + valueMustBeUnique: 'Değer benzersiz olmalıdır', + verificationTokenInvalid: 'Doğrulama tokeni geçersiz.', + }, + fields: { + addLabel: '{{label}} ekle', + addLink: 'Link Ekle', + addNew: 'Yeni', + addNewLabel: 'Yeni {{label}}', + addRelationship: 'İlişki Ekle', + addUpload: 'Yükleme Ekle', + block: 'blok', + blockType: 'Blok tipi', + blocks: 'blok', + chooseBetweenCustomTextOrDocument: + 'Choose between entering a custom text URL or linking to another document.', + chooseDocumentToLink: 'Bağlantı verilecek bir döküman seçin.', + chooseFromExisting: 'Varolanlardan seç', + chooseLabel: '{{label}} seç', + collapseAll: 'Tümünü daralt', + customURL: 'Özel URL', + editLabelData: '{{label}} düzenle', + editLink: 'Bağlantıyı Düzenle', + editRelationship: 'İlişkiyi Ekle', + enterURL: 'Bir URL girin', + internalLink: 'İç bağlantı', + itemsAndMore: '{{items}} and {{count}} more', + labelRelationship: '{{label}} Relationship', + latitude: 'Enlem', + linkType: 'Bağlantı türü', + linkedTo: '<0>label için bağlantı verildi', + longitude: 'Boylam', + newLabel: 'Yeni {{label}}', + openInNewTab: 'Yeni sekmede aç', + passwordsDoNotMatch: 'Parolalar eşleşmiyor.', + relatedDocument: 'İlişkili döküman', + relationTo: 'Relation To', + removeRelationship: 'İlişkiyi Kaldır', + removeUpload: 'Dosyayı Sil', + saveChanges: 'Değişiklikleri kaydet', + searchForBlock: 'Blok ara', + selectExistingLabel: 'Varolan {{label}} seç', + selectFieldsToEdit: 'Düzenlenecek alanları seçin', + showAll: 'Tümünü göster', + swapRelationship: 'Takas Ilişkisi', + swapUpload: 'Karşıya Yüklemeyi Değiştir', + textToDisplay: 'Görüntülenecek metin', + toggleBlock: 'Bloğu aç/kapat', + uploadNewLabel: 'Karşıya {{label}} yükle', + }, + general: { + aboutToDelete: + '<1>{{title}} {{label}} silinmek üzere. Silme işlemine devam etmek istiyor musunuz?', + aboutToDeleteCount_many: '{{count}} {{label}} silmek üzeresiniz', + aboutToDeleteCount_one: '{{count}} {{label}} silmek üzeresiniz', + aboutToDeleteCount_other: '{{count}} {{label}} silmek üzeresiniz', + addBelow: 'Altına ekle', + addFilter: 'Filtre ekle', + adminTheme: 'Admin arayüzü', + and: 've', + applyChanges: 'Değişiklikleri Uygula', + ascending: 'artan', + automatic: 'Otomatik', + backToDashboard: 'Anasayfaya geri dön', + cancel: 'İptal', + changesNotSaved: + 'Değişiklikleriniz henüz kaydedilmedi. Eğer bu sayfayı terk ederseniz değişiklikleri kaybedeceksiniz.', + close: 'Kapat', + collapse: 'Daralt', + collections: 'Koleksiyonlar', + columnToSort: 'Sıralanacak Sütunlar', + columns: 'Sütunlar', + confirm: 'Onayla', + confirmDeletion: 'Silmeyi onayla', + confirmDuplication: 'Çoğaltmayı onayla', + copied: 'Kopyalandı', + copy: 'Kopyala', + create: 'Oluştur', + createNew: 'Yeni oluştur', + createNewLabel: 'Yeni bir {{label}} oluştur', + created: 'Oluşturma tarihi', + createdAt: 'Oluşturma tarihi', + creating: 'Oluşturuluyor', + creatingNewLabel: 'Yeni bir {{label}} oluşturuluyor', + dark: 'Karanlık', + dashboard: 'Anasayfa', + delete: 'Sil', + deletedCountSuccessfully: '{{count}} {{label}} başarıyla silindi.', + deletedSuccessfully: 'Başarıyla silindi.', + deleting: 'Siliniyor...', + descending: 'Azalan', + deselectAllRows: 'Tüm satırların seçimini kaldır', + duplicate: 'Çoğalt', + duplicateWithoutSaving: 'Ayarları kaydetmeden çoğalt', + edit: 'Düzenle', + editLabel: '{{label}} düzenle', + editing: 'Düzenleniyor', + editingLabel_many: '{{count}} {{label}} düzenleniyor', + editingLabel_one: '{{count}} {{label}} düzenleniyor', + editingLabel_other: '{{count}} {{label}} düzenleniyor', + email: 'E-posta', + emailAddress: 'E-posta adresi', + enterAValue: 'Değer girin', + error: 'Hata', + errors: 'Hatalar', + fallbackToDefaultLocale: 'Varsayılan yerel ayara geri dönme', + filter: 'Filtrele', + filterWhere: '{{label}} filtrele:', + filters: 'Filtreler', + globals: 'Globaller', + language: 'Dil', + lastModified: 'Son değiştirme', + leaveAnyway: 'Yine de ayrıl', + leaveWithoutSaving: 'Kaydetmeden ayrıl', + light: 'Aydınlık', + livePreview: 'Önizleme', + loading: 'Yükleniyor', + locale: 'Yerel ayar', + locales: 'Diller', + menu: 'Menü', + moveDown: 'Aşağı taşı', + moveUp: 'Yukarı taşı', + newPassword: 'Yeni parola', + noFiltersSet: 'Tanımlı filtre yok', + noLabel: '<{{label}} yok>', + noOptions: 'Seçenek yok', + noResults: + '{{label}} bulunamadı. Henüz bir {{label}} eklenmemiş olabilir veya seçtiğiniz filtrelerle eşleşen bir sonuç bulunamamış olabilir.', + noValue: 'Değer yok', + none: 'Hiç', + notFound: 'Bulunamadı', + nothingFound: 'Hiçbir şey bulunamadı', + of: 'of', + open: 'Aç', + or: 'Or', + order: 'Order', + pageNotFound: 'Sayfa bulunamadı', + password: 'Parola', + payloadSettings: 'Ayarlar', + perPage: 'Sayfa başına: {{limit}}', + remove: 'Kaldır', + reset: 'Sıfırla', + row: 'Satır', + rows: 'Satır', + save: 'Kaydet', + saving: 'Kaydediliyor...', + searchBy: 'Şuna göre sırala: {{label}}', + selectAll: "Tüm {{count}} {{label}}'ı seçin", + selectAllRows: 'Tüm satırları seçin', + selectValue: 'Bir değer seçin', + selectedCount: '{{count}} {{label}} seçildi', + showAllLabel: 'Tüm {{label}} göster', + sorryNotFound: 'Üzgünüz, isteğinizle eşleşen bir sonuç bulunamadı.', + sort: 'Sırala', + sortByLabelDirection: '{{label}} göre sırala {{direction}}', + stayOnThisPage: 'Bu sayfada kal', + submissionSuccessful: 'Gönderme başarılı', + submit: 'Gönder', + successfullyCreated: '{{label}} başarıyla oluşturuldu.', + successfullyDuplicated: '{{label}} başarıyla kopyalandı.', + thisLanguage: 'Türkçe', + titleDeleted: '{{label}} {{title}} başarıyla silindi.', + unauthorized: 'Yetkisiz', + unsavedChangesDuplicate: + 'Kaydedilmemiş değişiklikler var. Çoğaltma işlemine devam etmek istiyor musunuz?', + untitled: 'Başlıksız', + updatedAt: 'Güncellenme tarihi', + updatedCountSuccessfully: '{{count}} {{label}} başarıyla güncellendi.', + updatedSuccessfully: 'Başarıyla güncellendi.', + updating: 'Güncelleniyor', + uploading: 'Yükleniyor', + user: 'kullanıcı', + users: 'kullanıcı', + value: 'Değer', + welcome: 'Hoşgeldiniz', + }, + operators: { + contains: 'içerir', + equals: 'eşittir', + exists: 'var', + isGreaterThan: 'şundan büyüktür', + isGreaterThanOrEqualTo: 'büyüktür veya eşittir', + isIn: 'içinde', + isLessThan: 'küçüktür', + isLessThanOrEqualTo: 'küçüktür veya eşittir', + isLike: 'gibidir', + isNotEqualTo: 'eşit değildir', + isNotIn: 'içinde değil', + near: 'yakın', + }, + upload: { + crop: 'Mahsulat', + cropToolDescription: + 'Seçilen alanın köşelerini sürükleyin, yeni bir alan çizin ya da aşağıdaki değerleri ayarlayın.', + dragAndDrop: 'Bir dosya sürükleyip bırakabilirsiniz', + dragAndDropHere: 'veya buraya bir dosya sürükleyip bırakabilirsiniz', + editImage: 'Görüntüyü Düzenle', + fileName: 'Dosya adı', + fileSize: 'Dosya boyutu', + focalPoint: 'Odak Noktası', + focalPointDescription: + 'Önizlemeye odak noktasını doğrudan sürükleyin veya aşağıdaki değerleri ayarlayın.', + height: 'Yükseklik', + lessInfo: 'Daha az bilgi', + moreInfo: 'Daha fazla bilgi', + previewSizes: 'Önizleme Boyutları', + selectCollectionToBrowse: 'Görüntülenecek bir koleksiyon seçin', + selectFile: 'Dosya seç', + setCropArea: 'Mahsul alanını ayarla', + setFocalPoint: 'Odak noktasını ayarla', + sizes: 'Boyutlar', + sizesFor: '{{label}} için boyutlar', + width: 'Genişlik', + }, + validation: { + emailAddress: 'Lütfen geçerli bir e-posta adresi girin.', + enterNumber: 'Lütfen geçerli bir sayı girin.', + fieldHasNo: 'Bu alanda {{label}} girili değil.', + greaterThanMax: '{{value}} izin verilen maksimum {{label}} değerinden daha büyük.', + invalidInput: 'Bu alanda geçersiz bir giriş mevcut.', + invalidSelection: 'Bu alanda geçersiz bir seçim mevcut.', + invalidSelections: "'Bu alan şu geçersiz seçimlere sahip:'", + lessThanMin: '{{value}} izin verilen minimum {{label}} değerinden daha küçük.', + limitReached: 'Sınır aşıldı, yalnızca {{max}} öğe eklenebilir.', + longerThanMin: 'Bu değer minimum {{minLength}} karakterden uzun olmalıdır.', + notValidDate: '"{{value}}" geçerli bir tarih değil.', + required: 'Bu alan gereklidir.', + requiresAtLeast: 'Bu alan en az {{count}} adet {{label}} gerektirmektedir.', + requiresNoMoreThan: 'Bu alana {{count}} adetten fazla {{label}} girilemez.', + requiresTwoNumbers: 'Bu alana en az iki rakam girilmesi zorunludur.', + shorterThanMax: 'Bu alan {{maxLength}} karakterden daha kısa olmalıdır.', + trueOrFalse: 'Bu alan yalnızca doğru ve yanlış olabilir.', + validUploadID: "'Bu alan geçerli bir karşıya yükleme ID'sine sahip değil.'", + }, + version: { + type: 'Tür', + aboutToPublishSelection: "Seçimdeki tüm {{label}}'i yayınlamak üzeresiniz. Emin misin?", + aboutToRestore: 'Döküman {{label}}, {{versionDate}} tarihindeki sürümüne geri döndürülecek.', + aboutToRestoreGlobal: + 'Global {{label}}, {{versionDate}} tarihindeki sürümüne geri döndürülecek.', + aboutToRevertToPublished: + 'Bu dökümanın değişikliklerini yayınladığı haline geri getirmek üzeresiniz. Devam etmek istiyor musunuz?', + aboutToUnpublish: 'Bu dökümanı yayından kaldırmak üzeresiniz. Devam etmek istiyor musunuz?', + aboutToUnpublishSelection: + 'Seçimdeki tüm {{label}} yayınını kaldırmak üzeresiniz. Emin misin?', + autosave: 'Otomatik kaydet', + autosavedSuccessfully: 'Otomatik kaydetme başarılı', + autosavedVersion: 'Otomatik kayıtlı sürüm', + changed: 'Değişiklik yapıldı', + compareVersion: 'Sürümü şununla karşılaştır:', + confirmPublish: 'Yayınlamayı onayla', + confirmRevertToSaved: 'Confirm revert to saved', + confirmUnpublish: 'Yayından kaldırmayı onayla', + confirmVersionRestoration: 'Sürümü Geri Getirmeyi Onayla', + currentDocumentStatus: 'Şu an {{docStatus}} döküman', + draft: 'Taslak', + draftSavedSuccessfully: 'Taslak başarıyla kaydedildi.', + lastSavedAgo: 'Son kaydedildi {{distance}} önce', + noFurtherVersionsFound: 'Başka sürüm bulunamadı.', + noRowsFound: '{{label}} bulunamadı', + preview: 'Önizleme', + problemRestoringVersion: 'Bu sürüme geri döndürürken bir hatayla karşılaşıldı.', + publish: 'Yayınla', + publishChanges: 'Değişiklikleri yayınla', + published: 'Yayınlandı', + publishing: 'Yayınlama', + restoreThisVersion: 'Bu sürüme geri döndür', + restoredSuccessfully: 'Geri getirme başarılı.', + restoring: 'Geri döndürülüyor...', + revertToPublished: 'Yayınlanana geri döndür', + reverting: 'Değişiklikler geri alınıyor...', + saveDraft: 'Taslağı kaydet', + selectLocales: 'Görüntülenecek yerel ayarları seçin', + selectVersionToCompare: 'Karşılaştırılacak bir sürüm seçin', + showLocales: 'Yerel ayarları göster:', + showingVersionsFor: 'Şunun için sürümler gösteriliyor:', + status: 'Durum', + unpublish: 'Yayından Kaldır', + unpublishing: 'Yayından kaldırılıyor...', + version: 'Sürüm', + versionCount_many: '{{count}} sürüm bulundu', + versionCount_none: 'Sürüm bulunamadı', + versionCount_one: '{{count}} sürüm bulundu', + versionCount_other: '{{count}} sürüm bulundu', + versionCreatedOn: '{{version}} oluşturma tarihi:', + versionID: 'Sürüm ID', + versions: 'Sürümler', + viewingVersion: '{{entityLabel}} {{documentTitle}} için sürümler gösteriliyor', + viewingVersionGlobal: '`Global {{entityLabel}} için sürümler gösteriliyor', + viewingVersions: '{{entityLabel}} {{documentTitle}} için sürümler gösteriliyor', + viewingVersionsGlobal: '`Global {{entityLabel}} için sürümler gösteriliyor', + }, }, } diff --git a/packages/translations/src/languages/ua.ts b/packages/translations/src/languages/ua.ts index ee48d9c7cd..fe49d3bbd0 100644 --- a/packages/translations/src/languages/ua.ts +++ b/packages/translations/src/languages/ua.ts @@ -1,389 +1,396 @@ -export default { - authentication: { - account: 'Обліковий запис', - accountOfCurrentUser: 'Обліковий запис поточного користувача', - alreadyActivated: 'Вже активований', - alreadyLoggedIn: 'Вже увійшли в систему', - apiKey: 'API ключ', - backToLogin: 'Повернутися до входу', - beginCreateFirstUser: 'Щоб розпочати - створість першого користувача', - changePassword: 'Змінити пароль', - checkYourEmailForPasswordReset: - 'Перевірте вашу пошту на наявність посилання, яке дозволить вам безпечно скинути пароль', - confirmGeneration: 'Підтвердити генерацію', - confirmPassword: 'Підтвердження паролю', - createFirstUser: 'Створення першого користувача', - emailNotValid: 'Вказана адреса електронної пошти недійсна', - emailSent: 'Лист відправлено', - enableAPIKey: 'Активувати API ключ', - failedToUnlock: 'Не вдалось розблокувати', - forceUnlock: 'Примусове розблокування', - forgotPassword: 'Забули пароль', - forgotPasswordEmailInstructions: - 'Будь ласка, введіть вашу адресу електронної пошти нижче. Ви отримаєте повідомлення електронною поштою з інструкціями щодо скидання пароля.', - forgotPasswordQuestion: 'Забули пароль?', - generate: 'Згенерувати', - generateNewAPIKey: 'Згенерувати новий API ключ', - generatingNewAPIKeyWillInvalidate: - 'Генерація нового API ключа зробить попередній <1>недійсним. Ви впевнені, що хочете продовжити?', - lockUntil: 'Заблокувати до', - logBackIn: 'Увійти знову', - logOut: 'Вийти', - loggedIn: 'Щоб увійти в інший обліковий запис, спочатку <0>вийдіть з поточного.', - loggedInChangePassword: - 'Щоб змінити ваш пароль, перейдіть до <0>облікового запису і змініть ваш пароль там.', - loggedOutInactivity: 'Ви вийшли з системи через бездіяльність.', - loggedOutSuccessfully: 'Ви успішно вийшли з системи.', - login: 'Увійти', - loginAttempts: 'Спроби входу', - loginUser: 'Вхід користувача в систему', - loginWithAnotherUser: 'Щоб увйти в систему під іншим користувачем, спочатку <0>вийдіть.', - logout: 'Вийти', - logoutUser: 'Вийти з системи', - newAPIKeyGenerated: 'Новий API ключ згенеровано.', - newAccountCreated: - 'Новий обліковий запис було створено, щоб отримати доступ до {{serverURL}}, будь ласка, натисніть на наступне посилання, або вставте посилання в адресну строку вашого браузера, щоб підтвердити вашу пошту: {{verificationURL}}
Після Підтвердження вашої пошти, ви матимете змогу зайти в систему.', - newPassword: 'Новий пароль', - resetPassword: 'Скинути пароль', - resetPasswordExpiration: 'Скинути пароль після закінчення строку дії', - resetPasswordToken: 'Токет для скидання пароля', - resetYourPassword: 'Скинути ваш пароль', - stayLoggedIn: 'Залишатись в системі', - successfullyUnlocked: 'Успішно розблоковано', - unableToVerify: 'Неможливо підтвердити', - verified: 'Підтверджено', - verifiedSuccessfully: 'Успішно Підтверджено', - verify: 'Підтвердити', - verifyUser: 'Підтвердити користувача', - verifyYourEmail: 'Підтвердити пошту', - youAreInactive: - 'Ви були неактивні певний час і скоро, в цілях вашої безпеки, вас буде розлогінено. Чи бажаєте ви залишитись в системі?', - youAreReceivingResetPassword: - 'Ви отримали це повідомлення, бо ви (або хтось інший) створив запит на скидання пароля до вашого облікового запису. Будь ласка, натисніть на наступне посилання, або вставте посилання в адресний рядок вашого браузера, щоб завершити процес:', - youDidNotRequestPassword: - 'Якщо ви не сторювали запит на це, будь ласка, ігноруйте це повідомлення і пароль залишиться без змін', - }, - error: { - accountAlreadyActivated: 'Цей аккаунт вже активований', - autosaving: 'Виникла проблема під час автозбереження цього документа.', - correctInvalidFields: 'Будь ласка, виправте невірні поля.', - deletingFile: 'Виникла помилка під час видалення файлу', - deletingTitle: - "Виникла помилка під час видалення {{title}}, Будь ласка, перевірте ваше з'єднання та спробуйте ще раз.", - emailOrPasswordIncorrect: 'Вказаний email або пароль не є вірними', - followingFieldsInvalid_one: 'Наступне поле не є вірним:', - followingFieldsInvalid_other: 'Наступні поля не є вірними', - incorrectCollection: 'Неправильна колекція', - invalidFileType: 'Невіртий тип файлу', - invalidFileTypeValue: 'Невірний тип файлу: {{value}}', - loadingDocument: 'Виникла помилка під час завантаження документа з ID {{id}}.', - missingEmail: 'Відсутній email.', - missingIDOfDocument: 'Відсутній ID документа для оновлення.', - missingIDOfVersion: 'Відсутній ID версії.', - missingRequiredData: "Відсусті обов'язкові дані.", - noFilesUploaded: 'Не було загружено жодного файлу.', - noMatchedField: 'Не знайдено відповідного поля для "{{label}}"', - noUser: 'Немає користувача', - notAllowedToAccessPage: 'Ви не маєте доступу до цієї сторінки.', - notAllowedToPerformAction: 'Вам не дозволено виконувати цю дію.', - notFound: 'Запитуваний ресурс не знайдено.', - previewing: 'Виникла помилка під час попереднього перегляду цього документа.', - problemUploadingFile: 'Виникла помилка під час завантаження файлу.', - tokenInvalidOrExpired: 'Токен або не дійсний, або його строк дії закінчився.', - unPublishingDocument: 'Підчас відміни публікації даного документа, виникла помилка.', - unableToDeleteCount: 'Не вдалося видалити {{count}} із {{total}} {{label}}.', - unableToUpdateCount: 'Не вдалося оновити {{count}} із {{total}} {{label}}.', - unauthorized: 'Немає доступу, ви повинні увійти, щоб виконати цей запит.', - unknown: 'Виникла невідома помилка.', - unspecific: 'Виникла помилка.', - userLocked: 'Цей користувач заблокований через велику кількість невдалих спроб входу.', - valueMustBeUnique: 'Значення має бути унікальним.', - verificationTokenInvalid: 'Токен верифікації є недійсним.', - }, - fields: { - addLabel: 'Додати {{label}}', - addLink: 'Додати посилання', - addNew: 'Додати новий', - addNewLabel: 'Створити {{label}}', - addRelationship: "Додати взаємозв'язок", - addUpload: 'Додати завантаження', - block: 'блок', - blockType: 'Тип блока', - blocks: 'блоки', - chooseBetweenCustomTextOrDocument: - 'Виберіть між введенням власної текстової URL-адреси і посиланням на інший документ.', - chooseDocumentToLink: 'Виберіть документ, на який потрібно зробити посилання', - chooseFromExisting: 'Вибрати з існуючих', - chooseLabel: 'Вибрати {{label}}', - collapseAll: 'Згорнути все', - customURL: 'Власний URL', - editLabelData: 'Редагувати данні {{label}}', - editLink: 'Редагувати посилання', - editRelationship: "Редагувати взаємозв'язок", - enterURL: 'Введіть URL', - internalLink: 'Внутрішнє посилання', - itemsAndMore: '{{items}} і ще {{count}}', - labelRelationship: "{{label}} Зв'язок", - latitude: 'Широта', - linkType: 'Тип посилання', - linkedTo: "Зв'язано з <0>{{label}}", - longitude: 'Довгота', - newLabel: 'Новий {{label}}', - openInNewTab: 'Відкривати в новій вкладці', - passwordsDoNotMatch: 'Паролі не співпадають.', - relatedDocument: "Пов'язаний документ", - relationTo: "Зв'язано з", - removeRelationship: "Видалити зв'язок", - removeUpload: 'Видалити завантаження', - saveChanges: 'Зберегти зміни', - searchForBlock: 'Знайти блок', - selectExistingLabel: 'Вибрати існуючий {{label}}', - selectFieldsToEdit: 'Виберіть поля для редагування', - showAll: 'Показати все', - swapRelationship: "Замінити зв'язок", - swapUpload: 'Замінити завантаження', - textToDisplay: 'Текст для відображення', - toggleBlock: 'Перемкнути блок', - uploadNewLabel: 'Завантажити новий {{label}}', - }, - general: { - aboutToDelete: 'Ви бажаєте видалити {{label}} <1>{{title}}. Ви впевнені?', - aboutToDeleteCount_many: 'Ви збираєтеся видалити {{count}} {{label}}', - aboutToDeleteCount_one: 'Ви збираєтеся видалити {{count}} {{label}}', - aboutToDeleteCount_other: 'Ви збираєтеся видалити {{count}} {{label}}', - addBelow: 'Додати нижче', - addFilter: 'Додати фільтр', - adminTheme: 'Тема адмінки', - and: 'і', - applyChanges: 'Застосувати зміни', - ascending: 'В порядку зростання', - automatic: 'Автоматично', - backToDashboard: 'Повернутись до головної сторінки', - cancel: 'Скасувати', - changesNotSaved: 'Ваши зміни не були збережені. Якщо ви вийдете зараз, то втратите свої зміни.', - close: 'Закрити', - collapse: 'Згорнути', - collections: 'Колекції', - columnToSort: 'Колонка для сортування', - columns: 'Колонки', - confirm: 'Підтвердити', - confirmDeletion: 'Підтвердити видалення', - confirmDuplication: 'Підтвердити копіювання', - copied: 'Скопійовано', - copy: 'Скопіювати', - create: 'Створити', - createNew: 'Створити', - createNewLabel: 'Створити новий {{label}}', - created: 'Створено', - createdAt: 'Дата створення', - creating: 'Створення', - creatingNewLabel: 'Створення нового {{label}}', - dark: 'Темна', - dashboard: 'Головна', - delete: 'Видалити', - deletedCountSuccessfully: 'Успішно видалено {{count}} {{label}}.', - deletedSuccessfully: 'Успішно видалено.', - deleting: 'Видалення...', - descending: 'В порядку спадання', - deselectAllRows: 'Скасувати вибір всіх рядків', - duplicate: 'Дублювати', - duplicateWithoutSaving: 'Дублювання без збереження змін', - edit: 'Редагувати', - editLabel: 'Редагувати {{label}}', - editing: 'Редагування', - editingLabel_many: 'Редагування {{count}} {{label}}', - editingLabel_one: 'Редагування {{count}} {{label}}', - editingLabel_other: 'Редагування {{count}} {{label}}', - email: 'Email', - emailAddress: 'Email адреса', - enterAValue: 'Введіть значення', - error: 'Помилка', - errors: 'Помилки', - fallbackToDefaultLocale: 'Відновлення локалі за замовчуванням', - filter: 'Фільтрувати', - filterWhere: 'Де фільтрувати {{label}}', - filters: 'Фільтри', - globals: 'Глобальні', - language: 'Мова', - lastModified: 'Останні зміни', - leaveAnyway: 'Все одно вийти', - leaveWithoutSaving: 'Вийти без збереження', - light: 'Світла', - livePreview: 'Попередній перегляд', - loading: 'Загрузка', - locale: 'Локаль', - locales: 'Переклади', - menu: 'Меню', - moveDown: 'Перемістити нижче', - moveUp: 'Перемістити вище', - newPassword: 'Новий пароль', - noFiltersSet: 'Відсусті фільтри', - noLabel: '<без {{label}}>', - noOptions: 'Немає варіантів', - noResults: - 'Жодного {{label}} не знайдено. Або {{label}} ще не існує, або жодна з них не відповідає фільтрам, які ви задали више.', - noValue: 'Немає значення', - none: 'Ніхто', - notFound: 'Не знайдено', - nothingFound: 'Нічого не знайдено', - of: 'з', - open: 'Відкрити', - or: 'або', - order: 'Порядок', - pageNotFound: 'Сторінка не знайдена', - password: 'Пароль', - payloadSettings: 'Налаштування Payload', - perPage: 'На сторінці: {{limit}}', - remove: 'Видалити', - reset: 'Скидання', - row: 'Рядок', - rows: 'Рядки', - save: 'Зберегти', - saving: 'Збереження...', - searchBy: 'Шукати по {{label}}', - selectAll: 'Вибрати всі {{count}} {{label}}', - selectAllRows: 'Вибрати всі рядки', - selectValue: 'Вибрати значення', - selectedCount: 'Вибрано {{count}} {{label}}', - showAllLabel: 'Показати всі {{label}}', - sorryNotFound: 'Вибачте - немає нічого, що відповідало б Вашому запиту.', - sort: 'Сортувати', - sortByLabelDirection: 'Сортувати за {{label}} {{direction}}', - stayOnThisPage: 'Залишитись на цій сторінці', - submissionSuccessful: 'Успішно відправлено.', - submit: 'Відправити', - successfullyCreated: '{{label}} успішно створено.', - successfullyDuplicated: '{{label}} успішно продубльовано.', - thisLanguage: 'Українська', - titleDeleted: '{{label}} "{{title}}" успішно видалено.', - unauthorized: 'Немає доступу', - unsavedChangesDuplicate: 'Ви маєте не збережені зміни. Чи бажаєте ви продовжити дублювання?', - untitled: 'Без назви', - updatedAt: 'Змінено', - updatedCountSuccessfully: 'Успішно оновлено {{count}} {{label}}.', - updatedSuccessfully: 'Успішно відредаговано.', - updating: 'оновлення', - uploading: 'завантаження', - user: 'Користувач', - users: 'Користувачі', - value: 'Значення', - welcome: 'Вітаю', - }, - operators: { - contains: 'містить', - equals: 'дорівнює', - exists: 'існує', - isGreaterThan: 'більше ніж', - isGreaterThanOrEqualTo: 'більше або дорівнює', - isIn: 'є в', - isLessThan: 'менше ніж', - isLessThanOrEqualTo: 'менше або дорівнює', - isLike: 'схоже', - isNotEqualTo: 'не дорівнює', - isNotIn: 'не в', - near: 'поруч', - }, - upload: { - crop: 'Обрізати', - cropToolDescription: - 'Перетягніть кути обраної області, намалюйте нову область або скоригуйте значення нижче.', - dragAndDrop: 'Перемістіть файл', - dragAndDropHere: 'або перемістіть сюди файл', - editImage: 'Редагувати зображення', - fileName: 'Назва файлу', - fileSize: 'Розмір файлу', - focalPoint: 'Центральна точка', - focalPointDescription: - 'Перетягніть фокусний пункт безпосередньо на попередній перегляд або налаштуйте значення нижче.', - height: 'Висота', - lessInfo: 'Менше інформації', - moreInfo: 'Більше інформації', - previewSizes: 'Розміри попереднього перегляду', - selectCollectionToBrowse: 'Виберіть колекцію для перегляду', - selectFile: 'Виберіть файл', - setCropArea: 'Встановити область обрізки', - setFocalPoint: 'Встановити фокусний пункт', - sizes: 'Розміри', - sizesFor: 'Розміри для {{label}}', - width: 'Ширина', - }, - validation: { - emailAddress: 'Будь ласка, введіть валідну email адресу.', - enterNumber: 'Будь ласка, введіть валідний номер.', - fieldHasNo: 'В цього поля немає {{label}}', - greaterThanMax: '{{value}} більше, ніж дозволено максимуму {{label}} в {{max}}.', - invalidInput: 'У цьому полі введено некоректне значення.', - invalidSelection: 'Це поле має некоректний вибір.', - invalidSelections: 'Це поле має наступні невірні варіанти вибору:', - lessThanMin: '{{value}} менше, ніж дозволено мінімуму {{label}} в {{min}}.', - limitReached: 'Досягнуто межі, можна додати лише {{max}} елементів.', - longerThanMin: 'Це значення має бути більше, ніж мінімальна довжина {{minLength}} characters.', - notValidDate: '"{{value}}" - некоректна дата.', - required: "Це поле є обов'язковим.", - requiresAtLeast: 'Це поле потребує не менше {{count}} {{label}}.', - requiresNoMoreThan: 'Це поле потребує не більше {{count}} {{label}}.', - requiresTwoNumbers: 'У цьому полі потрібно ввести два числа.', - shorterThanMax: 'Це значення має бути меншим за максимальну довжину символів {{maxLength}}.', - trueOrFalse: 'Це поле може мати значення тільки true або false.', - validUploadID: 'Це поле не є дійсним ID завантаження.', - }, - version: { - aboutToPublishSelection: 'Ви збираєтеся опублікувати всі {{label}} у добірці. Ти впевнений?', - aboutToRestore: - 'Ви збираєтесь відновити цей документ {{label}} до стану, в якому він знаходився {{versionDate}}.', - aboutToRestoreGlobal: - 'Ви збираєтесь відновити глобальний запис {{label}} до стану, в якому він знаходився {{versionDate}}.', - aboutToRevertToPublished: - 'Ви збираєтесь вернути зміни цього документа до його опублікованого стану. Ви впевнені?', - aboutToUnpublish: 'Ви збираєтесь відмінити публікацю цього документа. Ви впевнені?', - aboutToUnpublishSelection: - 'Ви збираєтеся скасувати публікацію всіх {{label}} у вибраному. Ти впевнений?', - autosave: 'Автозбереження', - autosavedSuccessfully: 'Автозбереження успішно виконано.', - autosavedVersion: 'Автозбережена версія', - changed: 'Змінено', - compareVersion: 'Порівняти версію з:', - confirmPublish: 'Підтвердити публікацію', - confirmRevertToSaved: 'Підтвердити повернення до збереженого', - confirmUnpublish: 'Підвтердити відміну публікації', - confirmVersionRestoration: 'Підтвердити відновлення версії', - currentDocumentStatus: 'Поточний статус {{docStatus}} документа', - draft: 'Чернетка', - draftSavedSuccessfully: 'Чернетка успішно збережена.', - lastSavedAgo: 'Останній раз збережено {{distance}} тому', - noFurtherVersionsFound: 'Інших версій не знайдено', - noRowsFound: 'Не знайдено {{label}}', - preview: 'Попередній перегляд', - problemRestoringVersion: 'Виникла проблема з відновленням цієї версії', - publish: 'Опублікувати', - publishChanges: 'Опублікувати зміни', - published: 'Опубліковано', - publishing: 'Публікація', - restoreThisVersion: 'Відновити цю версію', - restoredSuccessfully: 'Відновлено успішно.', - restoring: 'Відеовлення...', - revertToPublished: 'Відновити до опублікованого', - reverting: 'Відновлення...', - saveDraft: 'Зберегти чернетку', - selectLocales: 'Виберіть переклад для відображення', - selectVersionToCompare: 'Виберіть версію для порівняння', - showLocales: 'Показати переклади:', - showingVersionsFor: 'Показані версії для:', - status: 'Статус', - type: 'Тип', - unpublish: 'Відмінити публікацію', - unpublishing: 'Відміна публікації...', - version: 'Версія', - versionCount_many: '{{count}} Версій знайдено', - versionCount_none: 'Версій не знайдено', - versionCount_one: '{{count}} версія знайдена', - versionCount_other: '{{count}} versions found', - versionCreatedOn: '{{version}} створена:', - versionID: 'ID версії', - versions: 'Версії', - viewingVersion: 'Огляд версії для {{entityLabel}} {{documentTitle}}', - viewingVersionGlobal: 'Огляд версій для глобальної колекці {{entityLabel}}', - viewingVersions: 'Огляд версій для {{entityLabel}} {{documentTitle}}', - viewingVersionsGlobal: 'Огляд версій для глобальної колекції {{entityLabel}}', +import type { Language } from '../types.js' + +export const ua: Language = { + dateFNSKey: 'ua', + translations: { + authentication: { + account: 'Обліковий запис', + accountOfCurrentUser: 'Обліковий запис поточного користувача', + alreadyActivated: 'Вже активований', + alreadyLoggedIn: 'Вже увійшли в систему', + apiKey: 'API ключ', + backToLogin: 'Повернутися до входу', + beginCreateFirstUser: 'Щоб розпочати - створість першого користувача', + changePassword: 'Змінити пароль', + checkYourEmailForPasswordReset: + 'Перевірте вашу пошту на наявність посилання, яке дозволить вам безпечно скинути пароль', + confirmGeneration: 'Підтвердити генерацію', + confirmPassword: 'Підтвердження паролю', + createFirstUser: 'Створення першого користувача', + emailNotValid: 'Вказана адреса електронної пошти недійсна', + emailSent: 'Лист відправлено', + enableAPIKey: 'Активувати API ключ', + failedToUnlock: 'Не вдалось розблокувати', + forceUnlock: 'Примусове розблокування', + forgotPassword: 'Забули пароль', + forgotPasswordEmailInstructions: + 'Будь ласка, введіть вашу адресу електронної пошти нижче. Ви отримаєте повідомлення електронною поштою з інструкціями щодо скидання пароля.', + forgotPasswordQuestion: 'Забули пароль?', + generate: 'Згенерувати', + generateNewAPIKey: 'Згенерувати новий API ключ', + generatingNewAPIKeyWillInvalidate: + 'Генерація нового API ключа зробить попередній <1>недійсним. Ви впевнені, що хочете продовжити?', + lockUntil: 'Заблокувати до', + logBackIn: 'Увійти знову', + logOut: 'Вийти', + loggedIn: 'Щоб увійти в інший обліковий запис, спочатку <0>вийдіть з поточного.', + loggedInChangePassword: + 'Щоб змінити ваш пароль, перейдіть до <0>облікового запису і змініть ваш пароль там.', + loggedOutInactivity: 'Ви вийшли з системи через бездіяльність.', + loggedOutSuccessfully: 'Ви успішно вийшли з системи.', + login: 'Увійти', + loginAttempts: 'Спроби входу', + loginUser: 'Вхід користувача в систему', + loginWithAnotherUser: 'Щоб увйти в систему під іншим користувачем, спочатку <0>вийдіть.', + logout: 'Вийти', + logoutUser: 'Вийти з системи', + newAPIKeyGenerated: 'Новий API ключ згенеровано.', + newAccountCreated: + 'Новий обліковий запис було створено, щоб отримати доступ до {{serverURL}}, будь ласка, натисніть на наступне посилання, або вставте посилання в адресну строку вашого браузера, щоб підтвердити вашу пошту: {{verificationURL}}
Після Підтвердження вашої пошти, ви матимете змогу зайти в систему.', + newPassword: 'Новий пароль', + resetPassword: 'Скинути пароль', + resetPasswordExpiration: 'Скинути пароль після закінчення строку дії', + resetPasswordToken: 'Токет для скидання пароля', + resetYourPassword: 'Скинути ваш пароль', + stayLoggedIn: 'Залишатись в системі', + successfullyUnlocked: 'Успішно розблоковано', + unableToVerify: 'Неможливо підтвердити', + verified: 'Підтверджено', + verifiedSuccessfully: 'Успішно Підтверджено', + verify: 'Підтвердити', + verifyUser: 'Підтвердити користувача', + verifyYourEmail: 'Підтвердити пошту', + youAreInactive: + 'Ви були неактивні певний час і скоро, в цілях вашої безпеки, вас буде розлогінено. Чи бажаєте ви залишитись в системі?', + youAreReceivingResetPassword: + 'Ви отримали це повідомлення, бо ви (або хтось інший) створив запит на скидання пароля до вашого облікового запису. Будь ласка, натисніть на наступне посилання, або вставте посилання в адресний рядок вашого браузера, щоб завершити процес:', + youDidNotRequestPassword: + 'Якщо ви не сторювали запит на це, будь ласка, ігноруйте це повідомлення і пароль залишиться без змін', + }, + error: { + accountAlreadyActivated: 'Цей аккаунт вже активований', + autosaving: 'Виникла проблема під час автозбереження цього документа.', + correctInvalidFields: 'Будь ласка, виправте невірні поля.', + deletingFile: 'Виникла помилка під час видалення файлу', + deletingTitle: + "Виникла помилка під час видалення {{title}}, Будь ласка, перевірте ваше з'єднання та спробуйте ще раз.", + emailOrPasswordIncorrect: 'Вказаний email або пароль не є вірними', + followingFieldsInvalid_one: 'Наступне поле не є вірним:', + followingFieldsInvalid_other: 'Наступні поля не є вірними', + incorrectCollection: 'Неправильна колекція', + invalidFileType: 'Невіртий тип файлу', + invalidFileTypeValue: 'Невірний тип файлу: {{value}}', + loadingDocument: 'Виникла помилка під час завантаження документа з ID {{id}}.', + missingEmail: 'Відсутній email.', + missingIDOfDocument: 'Відсутній ID документа для оновлення.', + missingIDOfVersion: 'Відсутній ID версії.', + missingRequiredData: "Відсусті обов'язкові дані.", + noFilesUploaded: 'Не було загружено жодного файлу.', + noMatchedField: 'Не знайдено відповідного поля для "{{label}}"', + noUser: 'Немає користувача', + notAllowedToAccessPage: 'Ви не маєте доступу до цієї сторінки.', + notAllowedToPerformAction: 'Вам не дозволено виконувати цю дію.', + notFound: 'Запитуваний ресурс не знайдено.', + previewing: 'Виникла помилка під час попереднього перегляду цього документа.', + problemUploadingFile: 'Виникла помилка під час завантаження файлу.', + tokenInvalidOrExpired: 'Токен або не дійсний, або його строк дії закінчився.', + unPublishingDocument: 'Підчас відміни публікації даного документа, виникла помилка.', + unableToDeleteCount: 'Не вдалося видалити {{count}} із {{total}} {{label}}.', + unableToUpdateCount: 'Не вдалося оновити {{count}} із {{total}} {{label}}.', + unauthorized: 'Немає доступу, ви повинні увійти, щоб виконати цей запит.', + unknown: 'Виникла невідома помилка.', + unspecific: 'Виникла помилка.', + userLocked: 'Цей користувач заблокований через велику кількість невдалих спроб входу.', + valueMustBeUnique: 'Значення має бути унікальним.', + verificationTokenInvalid: 'Токен верифікації є недійсним.', + }, + fields: { + addLabel: 'Додати {{label}}', + addLink: 'Додати посилання', + addNew: 'Додати новий', + addNewLabel: 'Створити {{label}}', + addRelationship: "Додати взаємозв'язок", + addUpload: 'Додати завантаження', + block: 'блок', + blockType: 'Тип блока', + blocks: 'блоки', + chooseBetweenCustomTextOrDocument: + 'Виберіть між введенням власної текстової URL-адреси і посиланням на інший документ.', + chooseDocumentToLink: 'Виберіть документ, на який потрібно зробити посилання', + chooseFromExisting: 'Вибрати з існуючих', + chooseLabel: 'Вибрати {{label}}', + collapseAll: 'Згорнути все', + customURL: 'Власний URL', + editLabelData: 'Редагувати данні {{label}}', + editLink: 'Редагувати посилання', + editRelationship: "Редагувати взаємозв'язок", + enterURL: 'Введіть URL', + internalLink: 'Внутрішнє посилання', + itemsAndMore: '{{items}} і ще {{count}}', + labelRelationship: "{{label}} Зв'язок", + latitude: 'Широта', + linkType: 'Тип посилання', + linkedTo: "Зв'язано з <0>{{label}}", + longitude: 'Довгота', + newLabel: 'Новий {{label}}', + openInNewTab: 'Відкривати в новій вкладці', + passwordsDoNotMatch: 'Паролі не співпадають.', + relatedDocument: "Пов'язаний документ", + relationTo: "Зв'язано з", + removeRelationship: "Видалити зв'язок", + removeUpload: 'Видалити завантаження', + saveChanges: 'Зберегти зміни', + searchForBlock: 'Знайти блок', + selectExistingLabel: 'Вибрати існуючий {{label}}', + selectFieldsToEdit: 'Виберіть поля для редагування', + showAll: 'Показати все', + swapRelationship: "Замінити зв'язок", + swapUpload: 'Замінити завантаження', + textToDisplay: 'Текст для відображення', + toggleBlock: 'Перемкнути блок', + uploadNewLabel: 'Завантажити новий {{label}}', + }, + general: { + aboutToDelete: 'Ви бажаєте видалити {{label}} <1>{{title}}. Ви впевнені?', + aboutToDeleteCount_many: 'Ви збираєтеся видалити {{count}} {{label}}', + aboutToDeleteCount_one: 'Ви збираєтеся видалити {{count}} {{label}}', + aboutToDeleteCount_other: 'Ви збираєтеся видалити {{count}} {{label}}', + addBelow: 'Додати нижче', + addFilter: 'Додати фільтр', + adminTheme: 'Тема адмінки', + and: 'і', + applyChanges: 'Застосувати зміни', + ascending: 'В порядку зростання', + automatic: 'Автоматично', + backToDashboard: 'Повернутись до головної сторінки', + cancel: 'Скасувати', + changesNotSaved: + 'Ваши зміни не були збережені. Якщо ви вийдете зараз, то втратите свої зміни.', + close: 'Закрити', + collapse: 'Згорнути', + collections: 'Колекції', + columnToSort: 'Колонка для сортування', + columns: 'Колонки', + confirm: 'Підтвердити', + confirmDeletion: 'Підтвердити видалення', + confirmDuplication: 'Підтвердити копіювання', + copied: 'Скопійовано', + copy: 'Скопіювати', + create: 'Створити', + createNew: 'Створити', + createNewLabel: 'Створити новий {{label}}', + created: 'Створено', + createdAt: 'Дата створення', + creating: 'Створення', + creatingNewLabel: 'Створення нового {{label}}', + dark: 'Темна', + dashboard: 'Головна', + delete: 'Видалити', + deletedCountSuccessfully: 'Успішно видалено {{count}} {{label}}.', + deletedSuccessfully: 'Успішно видалено.', + deleting: 'Видалення...', + descending: 'В порядку спадання', + deselectAllRows: 'Скасувати вибір всіх рядків', + duplicate: 'Дублювати', + duplicateWithoutSaving: 'Дублювання без збереження змін', + edit: 'Редагувати', + editLabel: 'Редагувати {{label}}', + editing: 'Редагування', + editingLabel_many: 'Редагування {{count}} {{label}}', + editingLabel_one: 'Редагування {{count}} {{label}}', + editingLabel_other: 'Редагування {{count}} {{label}}', + email: 'Email', + emailAddress: 'Email адреса', + enterAValue: 'Введіть значення', + error: 'Помилка', + errors: 'Помилки', + fallbackToDefaultLocale: 'Відновлення локалі за замовчуванням', + filter: 'Фільтрувати', + filterWhere: 'Де фільтрувати {{label}}', + filters: 'Фільтри', + globals: 'Глобальні', + language: 'Мова', + lastModified: 'Останні зміни', + leaveAnyway: 'Все одно вийти', + leaveWithoutSaving: 'Вийти без збереження', + light: 'Світла', + livePreview: 'Попередній перегляд', + loading: 'Загрузка', + locale: 'Локаль', + locales: 'Переклади', + menu: 'Меню', + moveDown: 'Перемістити нижче', + moveUp: 'Перемістити вище', + newPassword: 'Новий пароль', + noFiltersSet: 'Відсусті фільтри', + noLabel: '<без {{label}}>', + noOptions: 'Немає варіантів', + noResults: + 'Жодного {{label}} не знайдено. Або {{label}} ще не існує, або жодна з них не відповідає фільтрам, які ви задали више.', + noValue: 'Немає значення', + none: 'Ніхто', + notFound: 'Не знайдено', + nothingFound: 'Нічого не знайдено', + of: 'з', + open: 'Відкрити', + or: 'або', + order: 'Порядок', + pageNotFound: 'Сторінка не знайдена', + password: 'Пароль', + payloadSettings: 'Налаштування Payload', + perPage: 'На сторінці: {{limit}}', + remove: 'Видалити', + reset: 'Скидання', + row: 'Рядок', + rows: 'Рядки', + save: 'Зберегти', + saving: 'Збереження...', + searchBy: 'Шукати по {{label}}', + selectAll: 'Вибрати всі {{count}} {{label}}', + selectAllRows: 'Вибрати всі рядки', + selectValue: 'Вибрати значення', + selectedCount: 'Вибрано {{count}} {{label}}', + showAllLabel: 'Показати всі {{label}}', + sorryNotFound: 'Вибачте - немає нічого, що відповідало б Вашому запиту.', + sort: 'Сортувати', + sortByLabelDirection: 'Сортувати за {{label}} {{direction}}', + stayOnThisPage: 'Залишитись на цій сторінці', + submissionSuccessful: 'Успішно відправлено.', + submit: 'Відправити', + successfullyCreated: '{{label}} успішно створено.', + successfullyDuplicated: '{{label}} успішно продубльовано.', + thisLanguage: 'Українська', + titleDeleted: '{{label}} "{{title}}" успішно видалено.', + unauthorized: 'Немає доступу', + unsavedChangesDuplicate: 'Ви маєте не збережені зміни. Чи бажаєте ви продовжити дублювання?', + untitled: 'Без назви', + updatedAt: 'Змінено', + updatedCountSuccessfully: 'Успішно оновлено {{count}} {{label}}.', + updatedSuccessfully: 'Успішно відредаговано.', + updating: 'оновлення', + uploading: 'завантаження', + user: 'Користувач', + users: 'Користувачі', + value: 'Значення', + welcome: 'Вітаю', + }, + operators: { + contains: 'містить', + equals: 'дорівнює', + exists: 'існує', + isGreaterThan: 'більше ніж', + isGreaterThanOrEqualTo: 'більше або дорівнює', + isIn: 'є в', + isLessThan: 'менше ніж', + isLessThanOrEqualTo: 'менше або дорівнює', + isLike: 'схоже', + isNotEqualTo: 'не дорівнює', + isNotIn: 'не в', + near: 'поруч', + }, + upload: { + crop: 'Обрізати', + cropToolDescription: + 'Перетягніть кути обраної області, намалюйте нову область або скоригуйте значення нижче.', + dragAndDrop: 'Перемістіть файл', + dragAndDropHere: 'або перемістіть сюди файл', + editImage: 'Редагувати зображення', + fileName: 'Назва файлу', + fileSize: 'Розмір файлу', + focalPoint: 'Центральна точка', + focalPointDescription: + 'Перетягніть фокусний пункт безпосередньо на попередній перегляд або налаштуйте значення нижче.', + height: 'Висота', + lessInfo: 'Менше інформації', + moreInfo: 'Більше інформації', + previewSizes: 'Розміри попереднього перегляду', + selectCollectionToBrowse: 'Виберіть колекцію для перегляду', + selectFile: 'Виберіть файл', + setCropArea: 'Встановити область обрізки', + setFocalPoint: 'Встановити фокусний пункт', + sizes: 'Розміри', + sizesFor: 'Розміри для {{label}}', + width: 'Ширина', + }, + validation: { + emailAddress: 'Будь ласка, введіть валідну email адресу.', + enterNumber: 'Будь ласка, введіть валідний номер.', + fieldHasNo: 'В цього поля немає {{label}}', + greaterThanMax: '{{value}} більше, ніж дозволено максимуму {{label}} в {{max}}.', + invalidInput: 'У цьому полі введено некоректне значення.', + invalidSelection: 'Це поле має некоректний вибір.', + invalidSelections: 'Це поле має наступні невірні варіанти вибору:', + lessThanMin: '{{value}} менше, ніж дозволено мінімуму {{label}} в {{min}}.', + limitReached: 'Досягнуто межі, можна додати лише {{max}} елементів.', + longerThanMin: + 'Це значення має бути більше, ніж мінімальна довжина {{minLength}} characters.', + notValidDate: '"{{value}}" - некоректна дата.', + required: "Це поле є обов'язковим.", + requiresAtLeast: 'Це поле потребує не менше {{count}} {{label}}.', + requiresNoMoreThan: 'Це поле потребує не більше {{count}} {{label}}.', + requiresTwoNumbers: 'У цьому полі потрібно ввести два числа.', + shorterThanMax: 'Це значення має бути меншим за максимальну довжину символів {{maxLength}}.', + trueOrFalse: 'Це поле може мати значення тільки true або false.', + validUploadID: 'Це поле не є дійсним ID завантаження.', + }, + version: { + type: 'Тип', + aboutToPublishSelection: 'Ви збираєтеся опублікувати всі {{label}} у добірці. Ти впевнений?', + aboutToRestore: + 'Ви збираєтесь відновити цей документ {{label}} до стану, в якому він знаходився {{versionDate}}.', + aboutToRestoreGlobal: + 'Ви збираєтесь відновити глобальний запис {{label}} до стану, в якому він знаходився {{versionDate}}.', + aboutToRevertToPublished: + 'Ви збираєтесь вернути зміни цього документа до його опублікованого стану. Ви впевнені?', + aboutToUnpublish: 'Ви збираєтесь відмінити публікацю цього документа. Ви впевнені?', + aboutToUnpublishSelection: + 'Ви збираєтеся скасувати публікацію всіх {{label}} у вибраному. Ти впевнений?', + autosave: 'Автозбереження', + autosavedSuccessfully: 'Автозбереження успішно виконано.', + autosavedVersion: 'Автозбережена версія', + changed: 'Змінено', + compareVersion: 'Порівняти версію з:', + confirmPublish: 'Підтвердити публікацію', + confirmRevertToSaved: 'Підтвердити повернення до збереженого', + confirmUnpublish: 'Підвтердити відміну публікації', + confirmVersionRestoration: 'Підтвердити відновлення версії', + currentDocumentStatus: 'Поточний статус {{docStatus}} документа', + draft: 'Чернетка', + draftSavedSuccessfully: 'Чернетка успішно збережена.', + lastSavedAgo: 'Останній раз збережено {{distance}} тому', + noFurtherVersionsFound: 'Інших версій не знайдено', + noRowsFound: 'Не знайдено {{label}}', + preview: 'Попередній перегляд', + problemRestoringVersion: 'Виникла проблема з відновленням цієї версії', + publish: 'Опублікувати', + publishChanges: 'Опублікувати зміни', + published: 'Опубліковано', + publishing: 'Публікація', + restoreThisVersion: 'Відновити цю версію', + restoredSuccessfully: 'Відновлено успішно.', + restoring: 'Відеовлення...', + revertToPublished: 'Відновити до опублікованого', + reverting: 'Відновлення...', + saveDraft: 'Зберегти чернетку', + selectLocales: 'Виберіть переклад для відображення', + selectVersionToCompare: 'Виберіть версію для порівняння', + showLocales: 'Показати переклади:', + showingVersionsFor: 'Показані версії для:', + status: 'Статус', + unpublish: 'Відмінити публікацію', + unpublishing: 'Відміна публікації...', + version: 'Версія', + versionCount_many: '{{count}} Версій знайдено', + versionCount_none: 'Версій не знайдено', + versionCount_one: '{{count}} версія знайдена', + versionCount_other: '{{count}} versions found', + versionCreatedOn: '{{version}} створена:', + versionID: 'ID версії', + versions: 'Версії', + viewingVersion: 'Огляд версії для {{entityLabel}} {{documentTitle}}', + viewingVersionGlobal: 'Огляд версій для глобальної колекці {{entityLabel}}', + viewingVersions: 'Огляд версій для {{entityLabel}} {{documentTitle}}', + viewingVersionsGlobal: 'Огляд версій для глобальної колекції {{entityLabel}}', + }, }, } diff --git a/packages/translations/src/languages/vi.ts b/packages/translations/src/languages/vi.ts index b97383e05b..9dd95a9238 100644 --- a/packages/translations/src/languages/vi.ts +++ b/packages/translations/src/languages/vi.ts @@ -1,385 +1,391 @@ -export default { - authentication: { - account: 'Tài khoản', - accountOfCurrentUser: 'Tài khoản của người dùng hiện tại', - alreadyActivated: 'Đã được kích hoạt', - alreadyLoggedIn: 'Đã đăng nhập', - apiKey: 'API Key', - backToLogin: 'Quay lại đăng nhập.', - beginCreateFirstUser: 'Để bắt đầu, hãy tạo người dùng đầu tiên.', - changePassword: 'Đổi mật khẩu', - checkYourEmailForPasswordReset: 'Hãy kiểm tra email của bạn để lấy đường dẫn tạo lại mật khẩu.', - confirmGeneration: 'Xác nhận, tạo API Key', - confirmPassword: 'Xác nhận mật khẩu', - createFirstUser: 'Tạo người dùng đầu tiên', - emailNotValid: 'Email không chính xác', - emailSent: 'Email đã được gửi', - enableAPIKey: 'Kích hoạt API Key', - failedToUnlock: 'Mở khóa thất bại', - forceUnlock: 'Mở khóa tài khoản', - forgotPassword: 'Quên mật khẩu', - forgotPasswordEmailInstructions: 'Nhập email của bạn để nhận hướng dẫn tạo lại mật khẩu.', - forgotPasswordQuestion: 'Quên mật khẩu?', - generate: 'Tạo', - generateNewAPIKey: 'Tạo API Key mới', - generatingNewAPIKeyWillInvalidate: - 'Việc tạo API Key mới sẽ <1>vô hiệu hóa API Key cũ. Bạn có muốn tiếp tục không?', - lockUntil: 'Khóa lại cho tới thời điểm sau', - logBackIn: 'Đăng nhập lại', - logOut: 'Đăng xuất', - loggedIn: - 'Để đăng nhập dưới tên người dùng khác, bạn phải <0>đăng xuất người dùng hiện tại.', - loggedInChangePassword: 'Để đổi mật khẩu, hãy truy cập cài đặt <0>tài khoản.', - loggedOutInactivity: 'Bạn đã tự động đăng xuất sau một khoản thời gian dài không thao tác.', - loggedOutSuccessfully: 'Đăng xuất thành công.', - login: 'Đăng nhập', - loginAttempts: 'Lần đăng nhập', - loginUser: 'Đăng nhập người dùng', - loginWithAnotherUser: - 'Để đăng nhập dưới tên người dùng khác, bạn phải <0>đăng xuất người dùng hiện tại.', - logout: 'Đăng xuất', - logoutUser: 'Đăng xuất người dùng', - newAPIKeyGenerated: 'API Key mới đã được tạo', - newAccountCreated: - 'Một tài khoản mới đã được tạo cho bạn. Tài khoản này được dùng để truy cập {{serverURL}} Hãy nhấp chuột hoặc sao chép đường dẫn sau vào trình duyệt của bạn để xác thực email: {{verificationURL}}
Sau khi email được xác thực, bạn sẽ có thể đăng nhập.', - newPassword: 'Mật khẩu mới', - resetPassword: 'Tạo lại mật khẩu', - resetPasswordExpiration: 'Hạn tạo lại mật khẩu ', - resetPasswordToken: 'Tạo lại token cho mật khẩu', - resetYourPassword: 'Tạo lại mật khẩu', - stayLoggedIn: 'Duy trì đăng nhập', - successfullyUnlocked: 'Mở khóa thành công', - unableToVerify: 'Không thể xác thực', - verified: 'Đã xác thực', - verifiedSuccessfully: 'Đã xác thực thành công', - verify: 'Tiến hành xác thực', - verifyUser: 'Tiến hành xác thực người dùng', - verifyYourEmail: 'Tiến hành xác thực email', - youAreInactive: - 'Bạn đã không thao tác trong một khoảng thời gian, và sẽ bị tự động đăng xuất vì lý do bảo mật. Bạn có muốn tiếp tục phiên đăng nhập.', - youAreReceivingResetPassword: - 'Bạn nhận được tin nhắn này vì bạn (hoặc một người nào khác) đã gửi yêu cầu thay đổi mật khẩu tài khoản của bạn. Xin hãy nhấp chuột vào đường dẫn sau, hoặc sao chép vào trình duyệt của bạn để hoàn tất quá trình:', - youDidNotRequestPassword: - 'Nếu bạn không phải là người yêu cầu thay đổi mật khẩu, xin hãy bỏ qua tin nhắn này và mật khẩu của bạn sẽ được giữ nguyên.', - }, - error: { - accountAlreadyActivated: 'Lỗi - Tài khoản này đã được kích hoạt.', - autosaving: 'Lỗi - Đã xảy ra vấn đề khi tự động sao lưu bản tài liệu này.', - correctInvalidFields: 'Lỗi - Xin hãy sửa lại những fields không hợp lệ.', - deletingFile: 'Lỗi - Đã xảy ra vấn đề khi xóa tệp này.', - deletingTitle: - 'Lỗi - Đã xảy ra vấn đề khi xóa {{title}}. Hãy kiểm tra kết nối mạng và thử lại.', - emailOrPasswordIncorrect: 'Lỗi - Email hoặc mật khẩu không chính xác.', - followingFieldsInvalid_one: 'Lỗi - Field sau không hợp lệ:', - followingFieldsInvalid_other: 'Lỗi - Những fields sau không hợp lệ:', - incorrectCollection: 'Lỗi - Collection không hợp lệ.', - invalidFileType: 'Lỗi - Định dạng tệp không hợp lệ.', - invalidFileTypeValue: 'Lỗi - Định dạng tệp không hợp lệ: {{value}}.', - loadingDocument: 'Lỗi - Đã xảy ra vấn để khi tải bản tài liệu với ID {{id}}.', - missingEmail: 'Lỗi - Thiếu email.', - missingIDOfDocument: 'Lỗi - Thiếu ID của bản tài liệu cần cập nhật.', - missingIDOfVersion: 'Lỗi - Thiếu ID của phiên bản.', - missingRequiredData: 'Lỗi - Thiếu dữ liệu cần thiết.', - noFilesUploaded: 'Lỗi - File chưa được tải lên.', - noMatchedField: 'Lỗi - Không tìm thấy field trùng với "{{label}}".', - noUser: 'Lỗi - Request thiếu thông tin người dùng.', - notAllowedToAccessPage: 'Lỗi - Bạn không có quyền truy cập trang này.', - notAllowedToPerformAction: 'Lỗi - Bạn không có quyền thực hiện lệnh này.', - notFound: 'Lỗi - Không thể tìm thấy.', - previewing: 'Lỗi - Đã xảy ra vấn đề khi xem trước bản tài liệu này.', - problemUploadingFile: 'Lỗi - Đã xảy ra vấn để khi tải lên file sau.', - tokenInvalidOrExpired: 'Lỗi - Token không hợp lệ hoặc đã hết hạn.', - unPublishingDocument: 'Lỗi - Đã xảy ra vấn để khi ẩn bản tài liệu.', - unableToDeleteCount: 'Không thể xóa {{count}} trong số {{total}} {{label}}.', - unableToUpdateCount: 'Không thể cập nhật {{count}} trên {{total}} {{label}}.', - unauthorized: 'Lỗi - Bạn cần phải đăng nhập trước khi gửi request sau.', - unknown: 'Lỗi - Không xác định (unknown error).', - unspecific: 'Lỗi - Đã xảy ra (unspecific error).', - userLocked: 'Lỗi- Tài khoản đã bị khóa do đăng nhập thất bại nhiều lần.', - valueMustBeUnique: 'Lỗi - Giá trị không được trùng lặp.', - verificationTokenInvalid: 'Lỗi - Token dùng để xác thực không hợp lệ.', - }, - fields: { - addLabel: 'Thêm: {{label}}', - addLink: 'Thêm liên kết', - addNew: 'Thêm mới', - addNewLabel: 'Thêm mới: {{label}}', - addRelationship: 'Thêm mối quan hệ (relationship)', - addUpload: 'Thêm tải lên (upload)', - block: 'block', - blockType: 'Block Type', - blocks: 'blocks', - chooseBetweenCustomTextOrDocument: - 'Chọn giữa nhập URL văn bản tùy chỉnh hoặc liên kết đến tài liệu khác.', - chooseDocumentToLink: 'Chọn một tài liệu để liên kết đến', - chooseFromExisting: 'Chọn từ thư viện', - chooseLabel: 'Chọn: {{label}}', - collapseAll: 'Ẩn toàn bộ', - customURL: 'URL tùy chỉnh', - editLabelData: 'Chỉnh sửa nội dung của: {{label}}', - editLink: 'Chỉnh sửa liên kết', - editRelationship: 'Chỉnh sửa mối quan hệ', - enterURL: 'Nhập một URL', - internalLink: 'Liên kết nội bộ', - itemsAndMore: '{{items}} và {{count}} món nữa', - labelRelationship: 'Mối quan hệ của {{label}} (Relationship)', - latitude: 'Vĩ độ', - linkType: 'Loại liên kết', - linkedTo: 'Được nối với <0>{{label}}', - longitude: 'Kinh độ', - newLabel: 'Tạo {{label}} mới', - openInNewTab: 'Mở trong trang mới', - passwordsDoNotMatch: 'Mật khẩu không trùng.', - relatedDocument: 'bản tài liệu liên quan', - relationTo: 'Có quan hệ với', - removeRelationship: 'Xóa Mối quan hệ', - removeUpload: 'Xóa bản tải lên', - saveChanges: 'Luu thay đổi', - searchForBlock: 'Tìm block', - selectExistingLabel: 'Chọn một {{label}} có sẵn', - selectFieldsToEdit: 'Chọn các trường để chỉnh sửa', - showAll: 'Hiển thị toàn bộ', - swapRelationship: 'Đổi quan hệ', - swapUpload: 'Đổi bản tải lên', - textToDisplay: 'Văn bản để hiển thị', - toggleBlock: 'Bật/tắt block', - uploadNewLabel: 'Tải lên bản mới: {{label}}', - }, - general: { - aboutToDelete: 'Chuẩn bị xóa {{label}} <1>{{title}}. Bạn có muốn tiếp tục không?', - aboutToDeleteCount_many: 'Bạn sắp xóa {{count}} {{label}}', - aboutToDeleteCount_one: 'Bạn sắp xóa {{count}} {{label}}', - aboutToDeleteCount_other: 'Bạn sắp xóa {{count}} {{label}}', - addBelow: 'Thêm bên dưới', - addFilter: 'Thêm bộ lọc', - adminTheme: 'Giao diện bảng điều khiển', - and: 'Và', - applyChanges: 'Áp dụng Thay đổi', - ascending: 'Sắp xếp theo thứ tự tăng dần', - automatic: 'Tự động', - backToDashboard: 'Quay lại bảng điều khiển', - cancel: 'Hủy', - changesNotSaved: 'Thay đổi chưa được lưu lại. Bạn sẽ mất bản chỉnh sửa nếu thoát bây giờ.', - close: 'Gần', - collapse: 'Thu gọn', - collections: 'Collections', - columnToSort: 'Sắp xếp cột', - columns: 'Hiển thị cột', - confirm: 'Xác nhận', - confirmDeletion: 'Xác nhận xóa', - confirmDuplication: 'Xác nhận tạo bản sao', - copied: 'Đâ sao chép', - copy: 'Sao chép', - create: 'Tạo', - createNew: 'Tạo mới', - createNewLabel: 'Tạo mới {{label}}', - created: 'Đã tạo', - createdAt: 'Ngày tạo', - creating: 'Đang tạo', - creatingNewLabel: 'Đang tạo mới {{label}}', - dark: 'Nền tối', - dashboard: 'Bảng điều khiển', - delete: 'Xóa', - deletedCountSuccessfully: 'Đã xóa thành công {{count}} {{label}}.', - deletedSuccessfully: 'Đã xoá thành công.', - deleting: 'Đang xóa...', - descending: 'Xếp theo thứ tự giảm dần', - deselectAllRows: 'Bỏ chọn tất cả các hàng', - duplicate: 'Tạo bản sao', - duplicateWithoutSaving: 'Không lưu dữ liệu và tạo bản sao', - edit: 'Chỉnh sửa', - editLabel: 'Chỉnh sửa: {{label}}', - editing: 'Đang chỉnh sửa', - editingLabel_many: 'Đang chỉnh sửa {{count}} {{label}}', - editingLabel_one: 'Đang chỉnh sửa {{count}} {{label}}', - editingLabel_other: 'Đang chỉnh sửa {{count}} {{label}}', - email: 'Email', - emailAddress: 'Địa chỉ Email', - enterAValue: 'Nhập một giá trị', - error: 'Lỗi', - errors: 'Lỗi', - fallbackToDefaultLocale: 'Ngôn ngữ mặc định', - filter: 'Lọc', - filterWhere: 'Lọc {{label}} với điều kiện:', - filters: 'Bộ lọc', - globals: 'Toàn thể (globals)', - language: 'Ngôn ngữ', - lastModified: 'Chỉnh sửa lần cuối vào lúc', - leaveAnyway: 'Tiếp tục thoát', - leaveWithoutSaving: 'Thay đổi chưa được lưu', - light: 'Nền sáng', - livePreview: 'Xem trước', - loading: 'Đang tải', - locale: 'Ngôn ngữ', - locales: 'Khu vực', - menu: 'Thực đơn', - moveDown: 'Di chuyển xuống', - moveUp: 'Di chuyển lên', - newPassword: 'Mật khảu mới', - noFiltersSet: 'Không có bộ lọc nào được áp dụng', - noLabel: '', - noOptions: 'Không có lựa chọn', - noResults: - 'Danh sách rỗng: {{label}}. Có thể {{label}} chưa tồn tại hoặc không có dữ kiện trùng với bộ lọc hiện tại.', - noValue: 'Không có giá trị', - none: 'Không có', - notFound: 'Không tìm thấy', - nothingFound: 'Không tìm thấy', - of: 'trong số', - open: 'Mở', - or: 'hoặc', - order: 'Thứ tự', - pageNotFound: 'Không tìm thấy trang', - password: 'Mật khẩu', - payloadSettings: 'Cài đặt', - perPage: 'Hiển thị mỗi trang: {{limit}}', - remove: 'Loại bỏ', - reset: 'Đặt lại', - row: 'Hàng', - rows: 'Những hàng', - save: 'Luu', - saving: 'Đang lưu...', - searchBy: 'Tìm với {{label}}', - selectAll: 'Chọn tất cả {{count}} {{label}}', - selectAllRows: 'Chọn tất cả các hàng', - selectValue: 'Chọn một giá trị', - selectedCount: 'Đã chọn {{count}} {{label}}', - showAllLabel: 'Hiển thị tất cả {{label}}', - sorryNotFound: 'Xin lỗi, không có kết quả nào tương ứng với request của bạn.', - sort: 'Sắp xếp', - sortByLabelDirection: 'Sắp xếp theo {{label}} {{direction}}', - stayOnThisPage: 'Ở lại trang này', - submissionSuccessful: 'Gửi thành công.', - submit: 'Gửi', - successfullyCreated: '{{label}} đã được tạo thành công.', - successfullyDuplicated: '{{label}} đã được sao chép thành công.', - thisLanguage: 'Vietnamese (Tiếng Việt)', - titleDeleted: '{{label}} {{title}} đã được xóa thành công.', - unauthorized: 'Không có quyền truy cập.', - unsavedChangesDuplicate: 'Bạn chưa lưu các thay đổi. Bạn có muốn tiếp tục tạo bản sao?', - untitled: 'Chưa có tiêu đề', - updatedAt: 'Ngày cập nhật', - updatedCountSuccessfully: 'Đã cập nhật thành công {{count}} {{label}}.', - updatedSuccessfully: 'Cập nhật thành công.', - updating: 'Đang cập nhật', - uploading: 'Đang tải lên', - user: 'Người dùng', - users: 'Người dùng', - value: 'Giá trị', - welcome: 'Xin chào', - }, - operators: { - contains: 'có chứa', - equals: 'bằng', - exists: 'tồn tại', - isGreaterThan: 'lớn hơn', - isGreaterThanOrEqualTo: 'lớn hơn hoặc bằng', - isIn: 'có trong', - isLessThan: 'nhỏ hơn', - isLessThanOrEqualTo: 'nhỏ hơn hoặc bằng', - isLike: 'gần giống', - isNotEqualTo: 'không bằng', - isNotIn: 'không có trong', - near: 'gần', - }, - upload: { - crop: 'Mùa vụ', - cropToolDescription: - 'Kéo các góc của khu vực đã chọn, vẽ một khu vực mới hoặc điều chỉnh các giá trị dưới đây.', - dragAndDrop: 'Kéo và thả một tập tin', - dragAndDropHere: 'hoặc kéo và thả file vào đây', - editImage: 'Chỉnh sửa hình ảnh', - fileName: 'Tên file', - fileSize: 'Dung lượng file', - focalPoint: 'Điểm trọng tâm', - focalPointDescription: - 'Kéo điểm tiêu cực trực tiếp trên trình xem trước hoặc điều chỉnh các giá trị bên dưới.', - height: 'Chiều cao', - lessInfo: 'Hiển thị ít hơn', - moreInfo: 'Thêm', - previewSizes: 'Kích cỡ xem trước', - selectCollectionToBrowse: 'Chọn một Collection để tìm', - selectFile: 'Chọn một file', - setCropArea: 'Đặt khu vực cắt', - setFocalPoint: 'Đặt điểm tiêu điểm', - sizes: 'Các độ phân giải', - sizesFor: 'Kích thước cho {{label}}', - width: 'Chiều rộng', - }, - validation: { - emailAddress: 'Địa chỉ email không hợp lệ.', - enterNumber: 'Vui lòng nhập số.', - fieldHasNo: 'Field này không có: {{label}}', - greaterThanMax: '{{value}} lớn hơn giá trị tối đa cho phép của {{label}} là {{max}}.', - invalidInput: 'Dữ liệu nhập vào không hợp lệ.', - invalidSelection: 'Lựa chọn ở field này không hợp lệ.', - invalidSelections: "'Field này có những lựa chọn không hợp lệ sau:'", - lessThanMin: '{{value}} nhỏ hơn giá trị tối thiểu cho phép của {{label}} là {{min}}.', - limitReached: 'Đã đạt giới hạn, chỉ có thể thêm {{max}} mục.', - longerThanMin: 'Giá trị này cần có độ dài tối thiểu {{minLength}} ký tự.', - notValidDate: '"{{value}}" không phải là một ngày (date) hợp lệ.', - required: 'Field này cần được diền.', - requiresAtLeast: 'Field này cần tối thiểu {{count}} {{label}}.', - requiresNoMoreThan: 'Field này không thể vượt quá {{count}} {{label}}.', - requiresTwoNumbers: 'Field này cần tối thiểu 2 chữ số.', - shorterThanMax: 'Giá trị phải ngắn hơn hoặc bằng {{maxLength}} ký tự.', - trueOrFalse: 'Field này chỉ có thể chứa giá trị true hoặc false.', - validUploadID: "'Field này không chứa ID tải lên hợp lệ.'", - }, - version: { - aboutToPublishSelection: 'Bạn có muốn xuất bản tất cả {{label}} không?', - aboutToRestore: 'Bạn chuẩn bị khôi phục lại {{label}} về phiên bản {{versionDate}}.', - aboutToRestoreGlobal: - 'Bạn chuẩn bị khôi phục lại bản toàn thể (global) của {{label}} về phiên bản {{versionDate}}.', - aboutToRevertToPublished: 'Bạn có muốn tái xuất bản bản nháp này không?', - aboutToUnpublish: 'Bạn có muốn ngưng xuất bản?', - aboutToUnpublishSelection: 'Bạn có muốn ngưng xuất bản tất cả {{label}} không?', - autosave: 'Tự động lưu dữ liệu', - autosavedSuccessfully: 'Đã tự động lưu thành công.', - autosavedVersion: 'Các phiên bản từ việc tự động lưu dữ liệu', - changed: 'Đã thay đổi', - compareVersion: 'So sánh phiên bản này với:', - confirmPublish: 'Xác nhận xuất bản', - confirmRevertToSaved: 'Xác nhận, quay về trạng thái đã lưu', - confirmUnpublish: 'Xác nhận, ngưng xuất bản', - confirmVersionRestoration: 'Xác nhận, khôi phục về phiên bản trước', - currentDocumentStatus: 'Trạng thái tài liệu hiện tại: {{docStatus}}', - draft: 'Bản nháp', - draftSavedSuccessfully: 'Bản nháp đã được lưu thành công.', - lastSavedAgo: 'Lần lưu cuối cùng {{distance}} trước đây', - noFurtherVersionsFound: 'Không tìm thấy phiên bản cũ hơn', - noRowsFound: 'Không tìm thấy: {{label}}', - preview: 'Bản xem trước', - problemRestoringVersion: 'Đã xảy ra vấn đề khi khôi phục phiên bản này', - publish: 'Công bố', - publishChanges: 'Xuất bản tài liệu', - published: 'Đã xuất bản', - publishing: 'Xuất bản', - restoreThisVersion: 'Khôi phục về phiên bản này', - restoredSuccessfully: 'Đã khôi phục thành công.', - restoring: 'Đang khôi phục...', - revertToPublished: 'Quay về trạng thái đã xuất bản', - reverting: 'Đang về trạng thái cũ...', - saveDraft: 'Lưu bản nháp', - selectLocales: 'Chọn mã khu vực để hiện thị', - selectVersionToCompare: 'Chọn phiên bản để so sánh', - showLocales: 'Hiển thị mã khu vực:', - showingVersionsFor: 'Hiển thị các phiên bản cho:', - status: 'Trạng thái', - type: 'Loại', - unpublish: 'Ẩn tài liệu', - unpublishing: 'Đang ẩn tài liệu...', - version: 'Phiên bản', - versionCount_many: '{{count}} phiên bản được tìm thấy', - versionCount_none: 'Không có phiên bản nào được tìm thấy', - versionCount_one: '{{count}} phiên bản được tìm thấy', - versionCount_other: 'Đã tìm thấy {{count}} phiên bản', - versionCreatedOn: 'Phiên bản {{version}} được tạo vào lúc:', - versionID: 'ID của phiên bản', - versions: 'Danh sách phiên bản', - viewingVersion: 'Xem phiên bản của {{entityLabel}} {{documentTitle}}', - viewingVersionGlobal: '`Xem phiên bản toàn thể (global) của {{entityLabel}}', - viewingVersions: 'Xem những phiên bản của {{entityLabel}} {{documentTitle}}', - viewingVersionsGlobal: '`Xem những phiên bản toàn thể (global) của {{entityLabel}}', +import type { Language } from '../types.js' + +export const vi: Language = { + dateFNSKey: 'vi', + translations: { + authentication: { + account: 'Tài khoản', + accountOfCurrentUser: 'Tài khoản của người dùng hiện tại', + alreadyActivated: 'Đã được kích hoạt', + alreadyLoggedIn: 'Đã đăng nhập', + apiKey: 'API Key', + backToLogin: 'Quay lại đăng nhập.', + beginCreateFirstUser: 'Để bắt đầu, hãy tạo người dùng đầu tiên.', + changePassword: 'Đổi mật khẩu', + checkYourEmailForPasswordReset: + 'Hãy kiểm tra email của bạn để lấy đường dẫn tạo lại mật khẩu.', + confirmGeneration: 'Xác nhận, tạo API Key', + confirmPassword: 'Xác nhận mật khẩu', + createFirstUser: 'Tạo người dùng đầu tiên', + emailNotValid: 'Email không chính xác', + emailSent: 'Email đã được gửi', + enableAPIKey: 'Kích hoạt API Key', + failedToUnlock: 'Mở khóa thất bại', + forceUnlock: 'Mở khóa tài khoản', + forgotPassword: 'Quên mật khẩu', + forgotPasswordEmailInstructions: 'Nhập email của bạn để nhận hướng dẫn tạo lại mật khẩu.', + forgotPasswordQuestion: 'Quên mật khẩu?', + generate: 'Tạo', + generateNewAPIKey: 'Tạo API Key mới', + generatingNewAPIKeyWillInvalidate: + 'Việc tạo API Key mới sẽ <1>vô hiệu hóa API Key cũ. Bạn có muốn tiếp tục không?', + lockUntil: 'Khóa lại cho tới thời điểm sau', + logBackIn: 'Đăng nhập lại', + logOut: 'Đăng xuất', + loggedIn: + 'Để đăng nhập dưới tên người dùng khác, bạn phải <0>đăng xuất người dùng hiện tại.', + loggedInChangePassword: 'Để đổi mật khẩu, hãy truy cập cài đặt <0>tài khoản.', + loggedOutInactivity: 'Bạn đã tự động đăng xuất sau một khoản thời gian dài không thao tác.', + loggedOutSuccessfully: 'Đăng xuất thành công.', + login: 'Đăng nhập', + loginAttempts: 'Lần đăng nhập', + loginUser: 'Đăng nhập người dùng', + loginWithAnotherUser: + 'Để đăng nhập dưới tên người dùng khác, bạn phải <0>đăng xuất người dùng hiện tại.', + logout: 'Đăng xuất', + logoutUser: 'Đăng xuất người dùng', + newAPIKeyGenerated: 'API Key mới đã được tạo', + newAccountCreated: + 'Một tài khoản mới đã được tạo cho bạn. Tài khoản này được dùng để truy cập {{serverURL}} Hãy nhấp chuột hoặc sao chép đường dẫn sau vào trình duyệt của bạn để xác thực email: {{verificationURL}}
Sau khi email được xác thực, bạn sẽ có thể đăng nhập.', + newPassword: 'Mật khẩu mới', + resetPassword: 'Tạo lại mật khẩu', + resetPasswordExpiration: 'Hạn tạo lại mật khẩu ', + resetPasswordToken: 'Tạo lại token cho mật khẩu', + resetYourPassword: 'Tạo lại mật khẩu', + stayLoggedIn: 'Duy trì đăng nhập', + successfullyUnlocked: 'Mở khóa thành công', + unableToVerify: 'Không thể xác thực', + verified: 'Đã xác thực', + verifiedSuccessfully: 'Đã xác thực thành công', + verify: 'Tiến hành xác thực', + verifyUser: 'Tiến hành xác thực người dùng', + verifyYourEmail: 'Tiến hành xác thực email', + youAreInactive: + 'Bạn đã không thao tác trong một khoảng thời gian, và sẽ bị tự động đăng xuất vì lý do bảo mật. Bạn có muốn tiếp tục phiên đăng nhập.', + youAreReceivingResetPassword: + 'Bạn nhận được tin nhắn này vì bạn (hoặc một người nào khác) đã gửi yêu cầu thay đổi mật khẩu tài khoản của bạn. Xin hãy nhấp chuột vào đường dẫn sau, hoặc sao chép vào trình duyệt của bạn để hoàn tất quá trình:', + youDidNotRequestPassword: + 'Nếu bạn không phải là người yêu cầu thay đổi mật khẩu, xin hãy bỏ qua tin nhắn này và mật khẩu của bạn sẽ được giữ nguyên.', + }, + error: { + accountAlreadyActivated: 'Lỗi - Tài khoản này đã được kích hoạt.', + autosaving: 'Lỗi - Đã xảy ra vấn đề khi tự động sao lưu bản tài liệu này.', + correctInvalidFields: 'Lỗi - Xin hãy sửa lại những fields không hợp lệ.', + deletingFile: 'Lỗi - Đã xảy ra vấn đề khi xóa tệp này.', + deletingTitle: + 'Lỗi - Đã xảy ra vấn đề khi xóa {{title}}. Hãy kiểm tra kết nối mạng và thử lại.', + emailOrPasswordIncorrect: 'Lỗi - Email hoặc mật khẩu không chính xác.', + followingFieldsInvalid_one: 'Lỗi - Field sau không hợp lệ:', + followingFieldsInvalid_other: 'Lỗi - Những fields sau không hợp lệ:', + incorrectCollection: 'Lỗi - Collection không hợp lệ.', + invalidFileType: 'Lỗi - Định dạng tệp không hợp lệ.', + invalidFileTypeValue: 'Lỗi - Định dạng tệp không hợp lệ: {{value}}.', + loadingDocument: 'Lỗi - Đã xảy ra vấn để khi tải bản tài liệu với ID {{id}}.', + missingEmail: 'Lỗi - Thiếu email.', + missingIDOfDocument: 'Lỗi - Thiếu ID của bản tài liệu cần cập nhật.', + missingIDOfVersion: 'Lỗi - Thiếu ID của phiên bản.', + missingRequiredData: 'Lỗi - Thiếu dữ liệu cần thiết.', + noFilesUploaded: 'Lỗi - File chưa được tải lên.', + noMatchedField: 'Lỗi - Không tìm thấy field trùng với "{{label}}".', + noUser: 'Lỗi - Request thiếu thông tin người dùng.', + notAllowedToAccessPage: 'Lỗi - Bạn không có quyền truy cập trang này.', + notAllowedToPerformAction: 'Lỗi - Bạn không có quyền thực hiện lệnh này.', + notFound: 'Lỗi - Không thể tìm thấy.', + previewing: 'Lỗi - Đã xảy ra vấn đề khi xem trước bản tài liệu này.', + problemUploadingFile: 'Lỗi - Đã xảy ra vấn để khi tải lên file sau.', + tokenInvalidOrExpired: 'Lỗi - Token không hợp lệ hoặc đã hết hạn.', + unPublishingDocument: 'Lỗi - Đã xảy ra vấn để khi ẩn bản tài liệu.', + unableToDeleteCount: 'Không thể xóa {{count}} trong số {{total}} {{label}}.', + unableToUpdateCount: 'Không thể cập nhật {{count}} trên {{total}} {{label}}.', + unauthorized: 'Lỗi - Bạn cần phải đăng nhập trước khi gửi request sau.', + unknown: 'Lỗi - Không xác định (unknown error).', + unspecific: 'Lỗi - Đã xảy ra (unspecific error).', + userLocked: 'Lỗi- Tài khoản đã bị khóa do đăng nhập thất bại nhiều lần.', + valueMustBeUnique: 'Lỗi - Giá trị không được trùng lặp.', + verificationTokenInvalid: 'Lỗi - Token dùng để xác thực không hợp lệ.', + }, + fields: { + addLabel: 'Thêm: {{label}}', + addLink: 'Thêm liên kết', + addNew: 'Thêm mới', + addNewLabel: 'Thêm mới: {{label}}', + addRelationship: 'Thêm mối quan hệ (relationship)', + addUpload: 'Thêm tải lên (upload)', + block: 'block', + blockType: 'Block Type', + blocks: 'blocks', + chooseBetweenCustomTextOrDocument: + 'Chọn giữa nhập URL văn bản tùy chỉnh hoặc liên kết đến tài liệu khác.', + chooseDocumentToLink: 'Chọn một tài liệu để liên kết đến', + chooseFromExisting: 'Chọn từ thư viện', + chooseLabel: 'Chọn: {{label}}', + collapseAll: 'Ẩn toàn bộ', + customURL: 'URL tùy chỉnh', + editLabelData: 'Chỉnh sửa nội dung của: {{label}}', + editLink: 'Chỉnh sửa liên kết', + editRelationship: 'Chỉnh sửa mối quan hệ', + enterURL: 'Nhập một URL', + internalLink: 'Liên kết nội bộ', + itemsAndMore: '{{items}} và {{count}} món nữa', + labelRelationship: 'Mối quan hệ của {{label}} (Relationship)', + latitude: 'Vĩ độ', + linkType: 'Loại liên kết', + linkedTo: 'Được nối với <0>{{label}}', + longitude: 'Kinh độ', + newLabel: 'Tạo {{label}} mới', + openInNewTab: 'Mở trong trang mới', + passwordsDoNotMatch: 'Mật khẩu không trùng.', + relatedDocument: 'bản tài liệu liên quan', + relationTo: 'Có quan hệ với', + removeRelationship: 'Xóa Mối quan hệ', + removeUpload: 'Xóa bản tải lên', + saveChanges: 'Luu thay đổi', + searchForBlock: 'Tìm block', + selectExistingLabel: 'Chọn một {{label}} có sẵn', + selectFieldsToEdit: 'Chọn các trường để chỉnh sửa', + showAll: 'Hiển thị toàn bộ', + swapRelationship: 'Đổi quan hệ', + swapUpload: 'Đổi bản tải lên', + textToDisplay: 'Văn bản để hiển thị', + toggleBlock: 'Bật/tắt block', + uploadNewLabel: 'Tải lên bản mới: {{label}}', + }, + general: { + aboutToDelete: 'Chuẩn bị xóa {{label}} <1>{{title}}. Bạn có muốn tiếp tục không?', + aboutToDeleteCount_many: 'Bạn sắp xóa {{count}} {{label}}', + aboutToDeleteCount_one: 'Bạn sắp xóa {{count}} {{label}}', + aboutToDeleteCount_other: 'Bạn sắp xóa {{count}} {{label}}', + addBelow: 'Thêm bên dưới', + addFilter: 'Thêm bộ lọc', + adminTheme: 'Giao diện bảng điều khiển', + and: 'Và', + applyChanges: 'Áp dụng Thay đổi', + ascending: 'Sắp xếp theo thứ tự tăng dần', + automatic: 'Tự động', + backToDashboard: 'Quay lại bảng điều khiển', + cancel: 'Hủy', + changesNotSaved: 'Thay đổi chưa được lưu lại. Bạn sẽ mất bản chỉnh sửa nếu thoát bây giờ.', + close: 'Gần', + collapse: 'Thu gọn', + collections: 'Collections', + columnToSort: 'Sắp xếp cột', + columns: 'Hiển thị cột', + confirm: 'Xác nhận', + confirmDeletion: 'Xác nhận xóa', + confirmDuplication: 'Xác nhận tạo bản sao', + copied: 'Đâ sao chép', + copy: 'Sao chép', + create: 'Tạo', + createNew: 'Tạo mới', + createNewLabel: 'Tạo mới {{label}}', + created: 'Đã tạo', + createdAt: 'Ngày tạo', + creating: 'Đang tạo', + creatingNewLabel: 'Đang tạo mới {{label}}', + dark: 'Nền tối', + dashboard: 'Bảng điều khiển', + delete: 'Xóa', + deletedCountSuccessfully: 'Đã xóa thành công {{count}} {{label}}.', + deletedSuccessfully: 'Đã xoá thành công.', + deleting: 'Đang xóa...', + descending: 'Xếp theo thứ tự giảm dần', + deselectAllRows: 'Bỏ chọn tất cả các hàng', + duplicate: 'Tạo bản sao', + duplicateWithoutSaving: 'Không lưu dữ liệu và tạo bản sao', + edit: 'Chỉnh sửa', + editLabel: 'Chỉnh sửa: {{label}}', + editing: 'Đang chỉnh sửa', + editingLabel_many: 'Đang chỉnh sửa {{count}} {{label}}', + editingLabel_one: 'Đang chỉnh sửa {{count}} {{label}}', + editingLabel_other: 'Đang chỉnh sửa {{count}} {{label}}', + email: 'Email', + emailAddress: 'Địa chỉ Email', + enterAValue: 'Nhập một giá trị', + error: 'Lỗi', + errors: 'Lỗi', + fallbackToDefaultLocale: 'Ngôn ngữ mặc định', + filter: 'Lọc', + filterWhere: 'Lọc {{label}} với điều kiện:', + filters: 'Bộ lọc', + globals: 'Toàn thể (globals)', + language: 'Ngôn ngữ', + lastModified: 'Chỉnh sửa lần cuối vào lúc', + leaveAnyway: 'Tiếp tục thoát', + leaveWithoutSaving: 'Thay đổi chưa được lưu', + light: 'Nền sáng', + livePreview: 'Xem trước', + loading: 'Đang tải', + locale: 'Ngôn ngữ', + locales: 'Khu vực', + menu: 'Thực đơn', + moveDown: 'Di chuyển xuống', + moveUp: 'Di chuyển lên', + newPassword: 'Mật khảu mới', + noFiltersSet: 'Không có bộ lọc nào được áp dụng', + noLabel: '', + noOptions: 'Không có lựa chọn', + noResults: + 'Danh sách rỗng: {{label}}. Có thể {{label}} chưa tồn tại hoặc không có dữ kiện trùng với bộ lọc hiện tại.', + noValue: 'Không có giá trị', + none: 'Không có', + notFound: 'Không tìm thấy', + nothingFound: 'Không tìm thấy', + of: 'trong số', + open: 'Mở', + or: 'hoặc', + order: 'Thứ tự', + pageNotFound: 'Không tìm thấy trang', + password: 'Mật khẩu', + payloadSettings: 'Cài đặt', + perPage: 'Hiển thị mỗi trang: {{limit}}', + remove: 'Loại bỏ', + reset: 'Đặt lại', + row: 'Hàng', + rows: 'Những hàng', + save: 'Luu', + saving: 'Đang lưu...', + searchBy: 'Tìm với {{label}}', + selectAll: 'Chọn tất cả {{count}} {{label}}', + selectAllRows: 'Chọn tất cả các hàng', + selectValue: 'Chọn một giá trị', + selectedCount: 'Đã chọn {{count}} {{label}}', + showAllLabel: 'Hiển thị tất cả {{label}}', + sorryNotFound: 'Xin lỗi, không có kết quả nào tương ứng với request của bạn.', + sort: 'Sắp xếp', + sortByLabelDirection: 'Sắp xếp theo {{label}} {{direction}}', + stayOnThisPage: 'Ở lại trang này', + submissionSuccessful: 'Gửi thành công.', + submit: 'Gửi', + successfullyCreated: '{{label}} đã được tạo thành công.', + successfullyDuplicated: '{{label}} đã được sao chép thành công.', + thisLanguage: 'Vietnamese (Tiếng Việt)', + titleDeleted: '{{label}} {{title}} đã được xóa thành công.', + unauthorized: 'Không có quyền truy cập.', + unsavedChangesDuplicate: 'Bạn chưa lưu các thay đổi. Bạn có muốn tiếp tục tạo bản sao?', + untitled: 'Chưa có tiêu đề', + updatedAt: 'Ngày cập nhật', + updatedCountSuccessfully: 'Đã cập nhật thành công {{count}} {{label}}.', + updatedSuccessfully: 'Cập nhật thành công.', + updating: 'Đang cập nhật', + uploading: 'Đang tải lên', + user: 'Người dùng', + users: 'Người dùng', + value: 'Giá trị', + welcome: 'Xin chào', + }, + operators: { + contains: 'có chứa', + equals: 'bằng', + exists: 'tồn tại', + isGreaterThan: 'lớn hơn', + isGreaterThanOrEqualTo: 'lớn hơn hoặc bằng', + isIn: 'có trong', + isLessThan: 'nhỏ hơn', + isLessThanOrEqualTo: 'nhỏ hơn hoặc bằng', + isLike: 'gần giống', + isNotEqualTo: 'không bằng', + isNotIn: 'không có trong', + near: 'gần', + }, + upload: { + crop: 'Mùa vụ', + cropToolDescription: + 'Kéo các góc của khu vực đã chọn, vẽ một khu vực mới hoặc điều chỉnh các giá trị dưới đây.', + dragAndDrop: 'Kéo và thả một tập tin', + dragAndDropHere: 'hoặc kéo và thả file vào đây', + editImage: 'Chỉnh sửa hình ảnh', + fileName: 'Tên file', + fileSize: 'Dung lượng file', + focalPoint: 'Điểm trọng tâm', + focalPointDescription: + 'Kéo điểm tiêu cực trực tiếp trên trình xem trước hoặc điều chỉnh các giá trị bên dưới.', + height: 'Chiều cao', + lessInfo: 'Hiển thị ít hơn', + moreInfo: 'Thêm', + previewSizes: 'Kích cỡ xem trước', + selectCollectionToBrowse: 'Chọn một Collection để tìm', + selectFile: 'Chọn một file', + setCropArea: 'Đặt khu vực cắt', + setFocalPoint: 'Đặt điểm tiêu điểm', + sizes: 'Các độ phân giải', + sizesFor: 'Kích thước cho {{label}}', + width: 'Chiều rộng', + }, + validation: { + emailAddress: 'Địa chỉ email không hợp lệ.', + enterNumber: 'Vui lòng nhập số.', + fieldHasNo: 'Field này không có: {{label}}', + greaterThanMax: '{{value}} lớn hơn giá trị tối đa cho phép của {{label}} là {{max}}.', + invalidInput: 'Dữ liệu nhập vào không hợp lệ.', + invalidSelection: 'Lựa chọn ở field này không hợp lệ.', + invalidSelections: "'Field này có những lựa chọn không hợp lệ sau:'", + lessThanMin: '{{value}} nhỏ hơn giá trị tối thiểu cho phép của {{label}} là {{min}}.', + limitReached: 'Đã đạt giới hạn, chỉ có thể thêm {{max}} mục.', + longerThanMin: 'Giá trị này cần có độ dài tối thiểu {{minLength}} ký tự.', + notValidDate: '"{{value}}" không phải là một ngày (date) hợp lệ.', + required: 'Field này cần được diền.', + requiresAtLeast: 'Field này cần tối thiểu {{count}} {{label}}.', + requiresNoMoreThan: 'Field này không thể vượt quá {{count}} {{label}}.', + requiresTwoNumbers: 'Field này cần tối thiểu 2 chữ số.', + shorterThanMax: 'Giá trị phải ngắn hơn hoặc bằng {{maxLength}} ký tự.', + trueOrFalse: 'Field này chỉ có thể chứa giá trị true hoặc false.', + validUploadID: "'Field này không chứa ID tải lên hợp lệ.'", + }, + version: { + type: 'Loại', + aboutToPublishSelection: 'Bạn có muốn xuất bản tất cả {{label}} không?', + aboutToRestore: 'Bạn chuẩn bị khôi phục lại {{label}} về phiên bản {{versionDate}}.', + aboutToRestoreGlobal: + 'Bạn chuẩn bị khôi phục lại bản toàn thể (global) của {{label}} về phiên bản {{versionDate}}.', + aboutToRevertToPublished: 'Bạn có muốn tái xuất bản bản nháp này không?', + aboutToUnpublish: 'Bạn có muốn ngưng xuất bản?', + aboutToUnpublishSelection: 'Bạn có muốn ngưng xuất bản tất cả {{label}} không?', + autosave: 'Tự động lưu dữ liệu', + autosavedSuccessfully: 'Đã tự động lưu thành công.', + autosavedVersion: 'Các phiên bản từ việc tự động lưu dữ liệu', + changed: 'Đã thay đổi', + compareVersion: 'So sánh phiên bản này với:', + confirmPublish: 'Xác nhận xuất bản', + confirmRevertToSaved: 'Xác nhận, quay về trạng thái đã lưu', + confirmUnpublish: 'Xác nhận, ngưng xuất bản', + confirmVersionRestoration: 'Xác nhận, khôi phục về phiên bản trước', + currentDocumentStatus: 'Trạng thái tài liệu hiện tại: {{docStatus}}', + draft: 'Bản nháp', + draftSavedSuccessfully: 'Bản nháp đã được lưu thành công.', + lastSavedAgo: 'Lần lưu cuối cùng {{distance}} trước đây', + noFurtherVersionsFound: 'Không tìm thấy phiên bản cũ hơn', + noRowsFound: 'Không tìm thấy: {{label}}', + preview: 'Bản xem trước', + problemRestoringVersion: 'Đã xảy ra vấn đề khi khôi phục phiên bản này', + publish: 'Công bố', + publishChanges: 'Xuất bản tài liệu', + published: 'Đã xuất bản', + publishing: 'Xuất bản', + restoreThisVersion: 'Khôi phục về phiên bản này', + restoredSuccessfully: 'Đã khôi phục thành công.', + restoring: 'Đang khôi phục...', + revertToPublished: 'Quay về trạng thái đã xuất bản', + reverting: 'Đang về trạng thái cũ...', + saveDraft: 'Lưu bản nháp', + selectLocales: 'Chọn mã khu vực để hiện thị', + selectVersionToCompare: 'Chọn phiên bản để so sánh', + showLocales: 'Hiển thị mã khu vực:', + showingVersionsFor: 'Hiển thị các phiên bản cho:', + status: 'Trạng thái', + unpublish: 'Ẩn tài liệu', + unpublishing: 'Đang ẩn tài liệu...', + version: 'Phiên bản', + versionCount_many: '{{count}} phiên bản được tìm thấy', + versionCount_none: 'Không có phiên bản nào được tìm thấy', + versionCount_one: '{{count}} phiên bản được tìm thấy', + versionCount_other: 'Đã tìm thấy {{count}} phiên bản', + versionCreatedOn: 'Phiên bản {{version}} được tạo vào lúc:', + versionID: 'ID của phiên bản', + versions: 'Danh sách phiên bản', + viewingVersion: 'Xem phiên bản của {{entityLabel}} {{documentTitle}}', + viewingVersionGlobal: '`Xem phiên bản toàn thể (global) của {{entityLabel}}', + viewingVersions: 'Xem những phiên bản của {{entityLabel}} {{documentTitle}}', + viewingVersionsGlobal: '`Xem những phiên bản toàn thể (global) của {{entityLabel}}', + }, }, } diff --git a/packages/translations/src/languages/zh.ts b/packages/translations/src/languages/zh.ts index 65962f06a3..e55b8e3002 100644 --- a/packages/translations/src/languages/zh.ts +++ b/packages/translations/src/languages/zh.ts @@ -1,376 +1,382 @@ -export default { - authentication: { - account: '帐户', - accountOfCurrentUser: '当前用户的帐户', - alreadyActivated: '已经激活了', - alreadyLoggedIn: '已经登入了', - apiKey: 'API密钥', - backToLogin: '回到登录页面', - beginCreateFirstUser: '首先,请创建您的第一个用户。', - changePassword: '更改密码', - checkYourEmailForPasswordReset: '请查看您的电子邮件,以取得安全重置密码的链接。', - confirmGeneration: '确认生成', - confirmPassword: '确认密码', - createFirstUser: '创建第一个用户', - emailNotValid: '所提供的电子邮件时无效的', - emailSent: '电子邮件已发送', - enableAPIKey: '启用API密钥', - failedToUnlock: '解锁失败', - forceUnlock: '强制解锁', - forgotPassword: '忘记密码', - forgotPasswordEmailInstructions: - '请在下方输入您的电子邮件。您将会收到一封有关如何重置密码说明的电子邮件。', - forgotPasswordQuestion: '忘记密码?', - generate: '生成', - generateNewAPIKey: '生成新的API密钥', - generatingNewAPIKeyWillInvalidate: '生成新的API密钥将使之前的密钥<1>失效。您确定要继续吗?', - lockUntil: '锁定至', - logBackIn: '重新登入', - logOut: '登出', - loggedIn: '要使用另一个用户登录前,您需要先<0>登出。', - loggedInChangePassword: '要更改您的密码,请到您的<0>帐户页面并在那里编辑您的密码。', - loggedOutInactivity: '您由于不活跃而被登出了。', - loggedOutSuccessfully: '您已成功登出。', - login: '登录', - loginAttempts: '登录次数', - loginUser: '登录用户', - loginWithAnotherUser: '要使用另一个用户登录前,您需要先<0>登出。', - logout: '登出', - logoutUser: '登出用户', - newAPIKeyGenerated: '新的API密钥已经生成。', - newAccountCreated: - '刚刚为您创建了一个可以访问 {{serverURL}} 的新帐户 请点击以下链接或在浏览器中粘贴以下网址,以验证您的电子邮件: {{verificationURL}}
验证您的电子邮件后,您将能够成功登录。', - newPassword: '新的密码', - resetPassword: '重置密码', - resetPasswordExpiration: '重置密码的有效期', - resetPasswordToken: '重置密码令牌', - resetYourPassword: '重置您的密码', - stayLoggedIn: '保持登录状态', - successfullyUnlocked: '已成功解锁', - unableToVerify: '无法验证', - verified: '已验证', - verifiedSuccessfully: '成功验证', - verify: '验证', - verifyUser: '验证用户', - verifyYourEmail: '验证您的电子邮件', - youAreInactive: - '您已经有一段时间没有活动了,为了您的安全,很快就会自动登出。您想保持登录状态吗?', - youAreReceivingResetPassword: - '您收到此邮件是因为您(或其他人)已请求重置您帐户的密码。请点击以下链接,或将其粘贴到您的浏览器中以完成该过程:', - youDidNotRequestPassword: '如果您没有要求这样做,请忽略这封邮件,您的密码将保持不变。', - }, - error: { - accountAlreadyActivated: '该帐户已被激活。', - autosaving: '自动保存该文件时出现了问题。', - correctInvalidFields: '请更正无效字段。', - deletingFile: '删除文件时出现了错误。', - deletingTitle: '删除{{title}}时出现了错误。请检查您的连接并重试。', - emailOrPasswordIncorrect: '提供的电子邮件或密码不正确。', - followingFieldsInvalid_one: '下面的字段是无效的:', - followingFieldsInvalid_other: '以下字段是无效的:', - incorrectCollection: '不正确的集合', - invalidFileType: '无效的文件类型', - invalidFileTypeValue: '无效的文件类型: {{value}}', - loadingDocument: '加载ID为{{id}}的文件时出现了问题。', - missingEmail: '缺少电子邮件。', - missingIDOfDocument: '缺少需要更新的文档的ID。', - missingIDOfVersion: '缺少版本的ID。', - missingRequiredData: '缺少必要的数据。', - noFilesUploaded: '没有上传文件。', - noMatchedField: '找不到与"{{label}}"匹配的字段', - noUser: '没有该用户', - notAllowedToAccessPage: '您无权访问此页面。', - notAllowedToPerformAction: '您不被允许执行此操作。', - notFound: '没有找到请求的资源。', - previewing: '预览文件时出现了问题。', - problemUploadingFile: '上传文件时出现了问题。', - tokenInvalidOrExpired: '令牌无效或已过期。', - unPublishingDocument: '取消发布此文件时出现了问题。', - unableToDeleteCount: '无法从 {{total}} {{label}} 中删除 {{count}}。', - unableToUpdateCount: '无法更新 {{count}} 个,共 {{total}} 个 {{label}}。', - unauthorized: '未经授权,您必须登录才能提出这个请求。', - unknown: '发生了一个未知的错误。', - unspecific: '发生了一个错误。', - userLocked: '该用户由于有太多次失败的登录尝试而被锁定。', - valueMustBeUnique: '值必须是唯一的', - verificationTokenInvalid: '验证令牌无效。', - }, - fields: { - addLabel: '添加{{label}}', - addLink: '添加链接', - addNew: '添加新的', - addNewLabel: '添加新的{{label}}', - addRelationship: '添加关系', - addUpload: '添加上传', - block: '区块', - blockType: '区块类型', - blocks: '区块', - chooseBetweenCustomTextOrDocument: '选择输入一个自定义的文本URL或链接到另一个文档。', - chooseDocumentToLink: '选择一个要链接的文档', - chooseFromExisting: '从现有中选择', - chooseLabel: '选择{{label}}', - collapseAll: '全部折叠', - customURL: '自定义URL', - editLabelData: '编辑{{label}}数据', - editLink: '编辑链接', - editRelationship: '编辑关系', - enterURL: '输入一个URL', - internalLink: '内部链接', - itemsAndMore: '{{items}}和{{count}}更多', - labelRelationship: '{{label}}关系', - latitude: '纬度', - linkType: '链接类型', - linkedTo: '链接到<0>{{label}}', - longitude: '经度', - newLabel: '新的{{label}}', - openInNewTab: '在新标签中打开', - passwordsDoNotMatch: '密码不匹配。', - relatedDocument: '相关文件', - relationTo: '关系到', - removeRelationship: '移除关系', - removeUpload: '移除上传', - saveChanges: '保存更改', - searchForBlock: '搜索一个区块', - selectExistingLabel: '选择现有的{{label}}', - selectFieldsToEdit: '选择要编辑的字段', - showAll: '显示全部', - swapRelationship: '交换关系', - swapUpload: '交换上传', - textToDisplay: '要显示的文本', - toggleBlock: '切换块', - uploadNewLabel: '上传新的{{label}}', - }, - general: { - aboutToDelete: '您即将删除{{label}} <1>{{title}}。您确定要继续吗?', - aboutToDeleteCount_many: '您即将删除 {{count}} {{label}}', - aboutToDeleteCount_one: '您即将删除 {{count}} {{label}}', - aboutToDeleteCount_other: '您即将删除 {{count}} {{label}}', - addBelow: '添加到下面', - addFilter: '添加过滤器', - adminTheme: '管理页面主题', - and: '和', - applyChanges: '应用更改', - ascending: '升序', - automatic: '自动', - backToDashboard: '返回到仪表板', - cancel: '取消', - changesNotSaved: '您的更改尚未保存。您确定要离开吗?', - close: '关闭', - collapse: '折叠', - collections: '集合', - columnToSort: '要排序的列', - columns: '列', - confirm: '确认', - confirmDeletion: '确认删除', - confirmDuplication: '确认重复', - copied: '已复制', - copy: '复制', - create: '创建', - createNew: '创建新的', - createNewLabel: '创建新的{{label}}', - created: '已创建', - createdAt: '创建于', - creating: '创建中', - creatingNewLabel: '正在创建新的{{label}}', - dark: '深色', - dashboard: '仪表板', - delete: '删除', - deletedCountSuccessfully: '已成功删除 {{count}} {{label}}。', - deletedSuccessfully: '已成功删除。', - deleting: '删除中...', - descending: '降序', - deselectAllRows: '取消选择所有行', - duplicate: '重复', - duplicateWithoutSaving: '重复而不保存更改。', - edit: '编辑', - editLabel: '编辑{{label}}', - editing: '编辑中', - editingLabel_many: '编辑 {{count}} {{label}}', - editingLabel_one: '编辑 {{count}} {{label}}', - editingLabel_other: '编辑 {{count}} {{label}}', - email: '电子邮件', - emailAddress: '电子邮件地址', - enterAValue: '输入一个值', - error: '错误', - errors: '错误', - fallbackToDefaultLocale: '回退到默认语言环境', - filter: '过滤器', - filterWhere: '过滤{{label}}', - filters: '过滤器', - globals: '全局', - language: '语言', - lastModified: '最后修改', - leaveAnyway: '无论如何都要离开', - leaveWithoutSaving: '离开而不保存', - light: '亮色', - livePreview: '预览', - loading: '加载中...', - locale: '语言环境', - locales: '语言环境', - menu: '菜单', - moveDown: '向下移动', - moveUp: '向上移动', - newPassword: '新密码', - noFiltersSet: '没有设置过滤器', - noLabel: '<没有{{label}}>', - noOptions: '没有选项', - noResults: '没有找到{{label}}。{{label}}并不存在或没有符合您上面所指定的过滤器。', - noValue: '没有值', - none: '无', - notFound: '未找到', - nothingFound: '没有找到任何东西', - of: '的', - open: '打开', - or: '或', - order: '排序', - pageNotFound: '未找到页面', - password: '密码', - payloadSettings: 'Payload设置', - perPage: '每一页: {{limit}}', - remove: '移除', - reset: '重置', - row: '行', - rows: '行', - save: '保存', - saving: '保存中...', - searchBy: '搜索{{label}}', - selectAll: '选择所有 {{count}} {{label}}', - selectAllRows: '选择所有行', - selectValue: '选择一个值', - selectedCount: '已选择 {{count}} {{label}}', - showAllLabel: '显示所有{{label}}', - sorryNotFound: '对不起,没有与您的请求相对应的东西。', - sort: '排序', - sortByLabelDirection: '按{{label}} {{direction}}排序', - stayOnThisPage: '停留在此页面', - submissionSuccessful: '提交成功。', - submit: '提交', - successfullyCreated: '成功创建{{label}}', - successfullyDuplicated: '成功复制{{label}}', - thisLanguage: '中文 (简体)', - titleDeleted: '{{label}} "{{title}}"已被成功删除。', - unauthorized: '未经授权', - unsavedChangesDuplicate: '您有未保存的修改。您确定要继续重复吗?', - untitled: '无标题', - updatedAt: '更新于', - updatedCountSuccessfully: '已成功更新 {{count}} {{label}}。', - updatedSuccessfully: '更新成功。', - updating: '更新中', - uploading: '上传中', - user: '用户', - users: '用户', - value: '值', - welcome: '欢迎', - }, - operators: { - contains: '包含', - equals: '等于', - exists: '存在', - isGreaterThan: '大于', - isGreaterThanOrEqualTo: '大于等于', - isIn: '在', - isLessThan: '小于', - isLessThanOrEqualTo: '小于或等于', - isLike: '就像', - isNotEqualTo: '不等于', - isNotIn: '不在', - near: '附近', - }, - upload: { - crop: '作物', - cropToolDescription: '拖动所选区域的角落,绘制一个新区域或调整以下的值。', - dragAndDrop: '拖放一个文件', - dragAndDropHere: '或在这里拖放一个文件', - editImage: '编辑图像', - fileName: '文件名', - fileSize: '文件大小', - focalPoint: '焦点', - focalPointDescription: '直接在预览中拖动焦点或调整下面的值。', - height: '高度', - lessInfo: '更少信息', - moreInfo: '更多信息', - previewSizes: '预览尺寸', - selectCollectionToBrowse: '选择一个要浏览的集合', - selectFile: '选择一个文件', - setCropArea: '设置裁剪区域', - setFocalPoint: '设置焦点', - sizes: '尺寸', - sizesFor: '{{label}}的尺寸', - width: '宽度', - }, - validation: { - emailAddress: '请输入一个有效的电子邮件地址。', - enterNumber: '请输入一个有效的号码。', - fieldHasNo: '这个字段没有{{label}}', - greaterThanMax: '{{value}}超过了允许的最大{{label}},该最大值为{{max}}。', - invalidInput: '这个字段有一个无效的输入。', - invalidSelection: '这个字段有一个无效的选择。', - invalidSelections: '这个字段有以下无效的选择:', - lessThanMin: '{{value}}小于允许的最小{{label}},该最小值为{{min}}。', - limitReached: '已达限制,只能添加{{max}}个项目。', - longerThanMin: '该值必须大于{{minLength}}字符的最小长度', - notValidDate: '"{{value}}"不是一个有效的日期。', - required: '该字段为必填项目。', - requiresAtLeast: '该字段至少需要{{count}} {{label}}。', - requiresNoMoreThan: '该字段要求不超过{{count}} {{label}。', - requiresTwoNumbers: '该字段需要两个数字。', - shorterThanMax: '该值必须小于{{maxLength}}字符的最大长度', - trueOrFalse: '该字段只能等于真或伪。', - validUploadID: '该字段不是有效的上传ID。', - }, - version: { - aboutToPublishSelection: '您即将发布所选内容中的所有 {{label}}。 你确定吗?', - aboutToRestore: '您将把这个{{label}}文档恢复到{{versionDate}}时的状态', - aboutToRestoreGlobal: '您要将全局的{{label}}恢复到{{versionDate}}时的状态', - aboutToRevertToPublished: '您将要把这个文档的内容还原到它的发布状态。您确定吗?', - aboutToUnpublish: '你即将取消发布这个文档。你确定吗?', - aboutToUnpublishSelection: '您即将取消发布所选内容中的所有 {{label}}。 你确定吗?', - autosave: '自动保存', - autosavedSuccessfully: '自动保存成功。', - autosavedVersion: '自动保存的版本', - changed: '已更改', - compareVersion: '对比版本:', - confirmPublish: '确认发布', - confirmRevertToSaved: '确认恢复到保存状态', - confirmUnpublish: '确认取消发布', - confirmVersionRestoration: '确认版本恢复', - currentDocumentStatus: '当前{{docStatus}}文件', - draft: '草稿', - draftSavedSuccessfully: '草稿成功保存。', - lastSavedAgo: '上次保存{{distance}}之前', - noFurtherVersionsFound: '没有发现其他版本', - noRowsFound: '没有发现{{label}}', - preview: '预览', - problemRestoringVersion: '恢复这个版本时发生了问题', - publish: '发布', - publishChanges: '发布修改', - published: '已发布', - publishing: '发布', - restoreThisVersion: '恢复此版本', - restoredSuccessfully: '恢复成功。', - restoring: '恢复中...', - revertToPublished: '还原到已发布的版本', - reverting: '还原中...', - saveDraft: '保存草稿', - selectLocales: '选择要显示的语言', - selectVersionToCompare: '选择要比较的版本', - showLocales: '显示语言:', - showingVersionsFor: '显示版本为:', - status: '状态', - type: '类型', - unpublish: '取消发布', - unpublishing: '取消发布中...', - version: '版本', - versionCount_many: '发现{{count}}版本', - versionCount_none: '没有发现任何版本', - versionCount_one: '找到{{count}}版本', - versionCount_other: '找到{{count}}版本', - versionCreatedOn: '{{version}}创建于:', - versionID: '版本ID', - versions: '版本', - viewingVersion: '正在查看{{entityLabel}} {{documentTitle}}的版本', - viewingVersionGlobal: '正在查看全局{{entityLabel}}的版本', - viewingVersions: '正在查看{{entityLabel}} {{documentTitle}}的版本', - viewingVersionsGlobal: '正在查看全局{{entityLabel}}的版本', +import type { Language } from '../types.js' + +export const zh: Language = { + dateFNSKey: 'zh', + translations: { + authentication: { + account: '帐户', + accountOfCurrentUser: '当前用户的帐户', + alreadyActivated: '已经激活了', + alreadyLoggedIn: '已经登入了', + apiKey: 'API密钥', + backToLogin: '回到登录页面', + beginCreateFirstUser: '首先,请创建您的第一个用户。', + changePassword: '更改密码', + checkYourEmailForPasswordReset: '请查看您的电子邮件,以取得安全重置密码的链接。', + confirmGeneration: '确认生成', + confirmPassword: '确认密码', + createFirstUser: '创建第一个用户', + emailNotValid: '所提供的电子邮件时无效的', + emailSent: '电子邮件已发送', + enableAPIKey: '启用API密钥', + failedToUnlock: '解锁失败', + forceUnlock: '强制解锁', + forgotPassword: '忘记密码', + forgotPasswordEmailInstructions: + '请在下方输入您的电子邮件。您将会收到一封有关如何重置密码说明的电子邮件。', + forgotPasswordQuestion: '忘记密码?', + generate: '生成', + generateNewAPIKey: '生成新的API密钥', + generatingNewAPIKeyWillInvalidate: + '生成新的API密钥将使之前的密钥<1>失效。您确定要继续吗?', + lockUntil: '锁定至', + logBackIn: '重新登入', + logOut: '登出', + loggedIn: '要使用另一个用户登录前,您需要先<0>登出。', + loggedInChangePassword: '要更改您的密码,请到您的<0>帐户页面并在那里编辑您的密码。', + loggedOutInactivity: '您由于不活跃而被登出了。', + loggedOutSuccessfully: '您已成功登出。', + login: '登录', + loginAttempts: '登录次数', + loginUser: '登录用户', + loginWithAnotherUser: '要使用另一个用户登录前,您需要先<0>登出。', + logout: '登出', + logoutUser: '登出用户', + newAPIKeyGenerated: '新的API密钥已经生成。', + newAccountCreated: + '刚刚为您创建了一个可以访问 {{serverURL}} 的新帐户 请点击以下链接或在浏览器中粘贴以下网址,以验证您的电子邮件: {{verificationURL}}
验证您的电子邮件后,您将能够成功登录。', + newPassword: '新的密码', + resetPassword: '重置密码', + resetPasswordExpiration: '重置密码的有效期', + resetPasswordToken: '重置密码令牌', + resetYourPassword: '重置您的密码', + stayLoggedIn: '保持登录状态', + successfullyUnlocked: '已成功解锁', + unableToVerify: '无法验证', + verified: '已验证', + verifiedSuccessfully: '成功验证', + verify: '验证', + verifyUser: '验证用户', + verifyYourEmail: '验证您的电子邮件', + youAreInactive: + '您已经有一段时间没有活动了,为了您的安全,很快就会自动登出。您想保持登录状态吗?', + youAreReceivingResetPassword: + '您收到此邮件是因为您(或其他人)已请求重置您帐户的密码。请点击以下链接,或将其粘贴到您的浏览器中以完成该过程:', + youDidNotRequestPassword: '如果您没有要求这样做,请忽略这封邮件,您的密码将保持不变。', + }, + error: { + accountAlreadyActivated: '该帐户已被激活。', + autosaving: '自动保存该文件时出现了问题。', + correctInvalidFields: '请更正无效字段。', + deletingFile: '删除文件时出现了错误。', + deletingTitle: '删除{{title}}时出现了错误。请检查您的连接并重试。', + emailOrPasswordIncorrect: '提供的电子邮件或密码不正确。', + followingFieldsInvalid_one: '下面的字段是无效的:', + followingFieldsInvalid_other: '以下字段是无效的:', + incorrectCollection: '不正确的集合', + invalidFileType: '无效的文件类型', + invalidFileTypeValue: '无效的文件类型: {{value}}', + loadingDocument: '加载ID为{{id}}的文件时出现了问题。', + missingEmail: '缺少电子邮件。', + missingIDOfDocument: '缺少需要更新的文档的ID。', + missingIDOfVersion: '缺少版本的ID。', + missingRequiredData: '缺少必要的数据。', + noFilesUploaded: '没有上传文件。', + noMatchedField: '找不到与"{{label}}"匹配的字段', + noUser: '没有该用户', + notAllowedToAccessPage: '您无权访问此页面。', + notAllowedToPerformAction: '您不被允许执行此操作。', + notFound: '没有找到请求的资源。', + previewing: '预览文件时出现了问题。', + problemUploadingFile: '上传文件时出现了问题。', + tokenInvalidOrExpired: '令牌无效或已过期。', + unPublishingDocument: '取消发布此文件时出现了问题。', + unableToDeleteCount: '无法从 {{total}} {{label}} 中删除 {{count}}。', + unableToUpdateCount: '无法更新 {{count}} 个,共 {{total}} 个 {{label}}。', + unauthorized: '未经授权,您必须登录才能提出这个请求。', + unknown: '发生了一个未知的错误。', + unspecific: '发生了一个错误。', + userLocked: '该用户由于有太多次失败的登录尝试而被锁定。', + valueMustBeUnique: '值必须是唯一的', + verificationTokenInvalid: '验证令牌无效。', + }, + fields: { + addLabel: '添加{{label}}', + addLink: '添加链接', + addNew: '添加新的', + addNewLabel: '添加新的{{label}}', + addRelationship: '添加关系', + addUpload: '添加上传', + block: '区块', + blockType: '区块类型', + blocks: '区块', + chooseBetweenCustomTextOrDocument: '选择输入一个自定义的文本URL或链接到另一个文档。', + chooseDocumentToLink: '选择一个要链接的文档', + chooseFromExisting: '从现有中选择', + chooseLabel: '选择{{label}}', + collapseAll: '全部折叠', + customURL: '自定义URL', + editLabelData: '编辑{{label}}数据', + editLink: '编辑链接', + editRelationship: '编辑关系', + enterURL: '输入一个URL', + internalLink: '内部链接', + itemsAndMore: '{{items}}和{{count}}更多', + labelRelationship: '{{label}}关系', + latitude: '纬度', + linkType: '链接类型', + linkedTo: '链接到<0>{{label}}', + longitude: '经度', + newLabel: '新的{{label}}', + openInNewTab: '在新标签中打开', + passwordsDoNotMatch: '密码不匹配。', + relatedDocument: '相关文件', + relationTo: '关系到', + removeRelationship: '移除关系', + removeUpload: '移除上传', + saveChanges: '保存更改', + searchForBlock: '搜索一个区块', + selectExistingLabel: '选择现有的{{label}}', + selectFieldsToEdit: '选择要编辑的字段', + showAll: '显示全部', + swapRelationship: '交换关系', + swapUpload: '交换上传', + textToDisplay: '要显示的文本', + toggleBlock: '切换块', + uploadNewLabel: '上传新的{{label}}', + }, + general: { + aboutToDelete: '您即将删除{{label}} <1>{{title}}。您确定要继续吗?', + aboutToDeleteCount_many: '您即将删除 {{count}} {{label}}', + aboutToDeleteCount_one: '您即将删除 {{count}} {{label}}', + aboutToDeleteCount_other: '您即将删除 {{count}} {{label}}', + addBelow: '添加到下面', + addFilter: '添加过滤器', + adminTheme: '管理页面主题', + and: '和', + applyChanges: '应用更改', + ascending: '升序', + automatic: '自动', + backToDashboard: '返回到仪表板', + cancel: '取消', + changesNotSaved: '您的更改尚未保存。您确定要离开吗?', + close: '关闭', + collapse: '折叠', + collections: '集合', + columnToSort: '要排序的列', + columns: '列', + confirm: '确认', + confirmDeletion: '确认删除', + confirmDuplication: '确认重复', + copied: '已复制', + copy: '复制', + create: '创建', + createNew: '创建新的', + createNewLabel: '创建新的{{label}}', + created: '已创建', + createdAt: '创建于', + creating: '创建中', + creatingNewLabel: '正在创建新的{{label}}', + dark: '深色', + dashboard: '仪表板', + delete: '删除', + deletedCountSuccessfully: '已成功删除 {{count}} {{label}}。', + deletedSuccessfully: '已成功删除。', + deleting: '删除中...', + descending: '降序', + deselectAllRows: '取消选择所有行', + duplicate: '重复', + duplicateWithoutSaving: '重复而不保存更改。', + edit: '编辑', + editLabel: '编辑{{label}}', + editing: '编辑中', + editingLabel_many: '编辑 {{count}} {{label}}', + editingLabel_one: '编辑 {{count}} {{label}}', + editingLabel_other: '编辑 {{count}} {{label}}', + email: '电子邮件', + emailAddress: '电子邮件地址', + enterAValue: '输入一个值', + error: '错误', + errors: '错误', + fallbackToDefaultLocale: '回退到默认语言环境', + filter: '过滤器', + filterWhere: '过滤{{label}}', + filters: '过滤器', + globals: '全局', + language: '语言', + lastModified: '最后修改', + leaveAnyway: '无论如何都要离开', + leaveWithoutSaving: '离开而不保存', + light: '亮色', + livePreview: '预览', + loading: '加载中...', + locale: '语言环境', + locales: '语言环境', + menu: '菜单', + moveDown: '向下移动', + moveUp: '向上移动', + newPassword: '新密码', + noFiltersSet: '没有设置过滤器', + noLabel: '<没有{{label}}>', + noOptions: '没有选项', + noResults: '没有找到{{label}}。{{label}}并不存在或没有符合您上面所指定的过滤器。', + noValue: '没有值', + none: '无', + notFound: '未找到', + nothingFound: '没有找到任何东西', + of: '的', + open: '打开', + or: '或', + order: '排序', + pageNotFound: '未找到页面', + password: '密码', + payloadSettings: 'Payload设置', + perPage: '每一页: {{limit}}', + remove: '移除', + reset: '重置', + row: '行', + rows: '行', + save: '保存', + saving: '保存中...', + searchBy: '搜索{{label}}', + selectAll: '选择所有 {{count}} {{label}}', + selectAllRows: '选择所有行', + selectValue: '选择一个值', + selectedCount: '已选择 {{count}} {{label}}', + showAllLabel: '显示所有{{label}}', + sorryNotFound: '对不起,没有与您的请求相对应的东西。', + sort: '排序', + sortByLabelDirection: '按{{label}} {{direction}}排序', + stayOnThisPage: '停留在此页面', + submissionSuccessful: '提交成功。', + submit: '提交', + successfullyCreated: '成功创建{{label}}', + successfullyDuplicated: '成功复制{{label}}', + thisLanguage: '中文 (简体)', + titleDeleted: '{{label}} "{{title}}"已被成功删除。', + unauthorized: '未经授权', + unsavedChangesDuplicate: '您有未保存的修改。您确定要继续重复吗?', + untitled: '无标题', + updatedAt: '更新于', + updatedCountSuccessfully: '已成功更新 {{count}} {{label}}。', + updatedSuccessfully: '更新成功。', + updating: '更新中', + uploading: '上传中', + user: '用户', + users: '用户', + value: '值', + welcome: '欢迎', + }, + operators: { + contains: '包含', + equals: '等于', + exists: '存在', + isGreaterThan: '大于', + isGreaterThanOrEqualTo: '大于等于', + isIn: '在', + isLessThan: '小于', + isLessThanOrEqualTo: '小于或等于', + isLike: '就像', + isNotEqualTo: '不等于', + isNotIn: '不在', + near: '附近', + }, + upload: { + crop: '作物', + cropToolDescription: '拖动所选区域的角落,绘制一个新区域或调整以下的值。', + dragAndDrop: '拖放一个文件', + dragAndDropHere: '或在这里拖放一个文件', + editImage: '编辑图像', + fileName: '文件名', + fileSize: '文件大小', + focalPoint: '焦点', + focalPointDescription: '直接在预览中拖动焦点或调整下面的值。', + height: '高度', + lessInfo: '更少信息', + moreInfo: '更多信息', + previewSizes: '预览尺寸', + selectCollectionToBrowse: '选择一个要浏览的集合', + selectFile: '选择一个文件', + setCropArea: '设置裁剪区域', + setFocalPoint: '设置焦点', + sizes: '尺寸', + sizesFor: '{{label}}的尺寸', + width: '宽度', + }, + validation: { + emailAddress: '请输入一个有效的电子邮件地址。', + enterNumber: '请输入一个有效的号码。', + fieldHasNo: '这个字段没有{{label}}', + greaterThanMax: '{{value}}超过了允许的最大{{label}},该最大值为{{max}}。', + invalidInput: '这个字段有一个无效的输入。', + invalidSelection: '这个字段有一个无效的选择。', + invalidSelections: '这个字段有以下无效的选择:', + lessThanMin: '{{value}}小于允许的最小{{label}},该最小值为{{min}}。', + limitReached: '已达限制,只能添加{{max}}个项目。', + longerThanMin: '该值必须大于{{minLength}}字符的最小长度', + notValidDate: '"{{value}}"不是一个有效的日期。', + required: '该字段为必填项目。', + requiresAtLeast: '该字段至少需要{{count}} {{label}}。', + requiresNoMoreThan: '该字段要求不超过{{count}} {{label}。', + requiresTwoNumbers: '该字段需要两个数字。', + shorterThanMax: '该值必须小于{{maxLength}}字符的最大长度', + trueOrFalse: '该字段只能等于真或伪。', + validUploadID: '该字段不是有效的上传ID。', + }, + version: { + type: '类型', + aboutToPublishSelection: '您即将发布所选内容中的所有 {{label}}。 你确定吗?', + aboutToRestore: '您将把这个{{label}}文档恢复到{{versionDate}}时的状态', + aboutToRestoreGlobal: '您要将全局的{{label}}恢复到{{versionDate}}时的状态', + aboutToRevertToPublished: '您将要把这个文档的内容还原到它的发布状态。您确定吗?', + aboutToUnpublish: '你即将取消发布这个文档。你确定吗?', + aboutToUnpublishSelection: '您即将取消发布所选内容中的所有 {{label}}。 你确定吗?', + autosave: '自动保存', + autosavedSuccessfully: '自动保存成功。', + autosavedVersion: '自动保存的版本', + changed: '已更改', + compareVersion: '对比版本:', + confirmPublish: '确认发布', + confirmRevertToSaved: '确认恢复到保存状态', + confirmUnpublish: '确认取消发布', + confirmVersionRestoration: '确认版本恢复', + currentDocumentStatus: '当前{{docStatus}}文件', + draft: '草稿', + draftSavedSuccessfully: '草稿成功保存。', + lastSavedAgo: '上次保存{{distance}}之前', + noFurtherVersionsFound: '没有发现其他版本', + noRowsFound: '没有发现{{label}}', + preview: '预览', + problemRestoringVersion: '恢复这个版本时发生了问题', + publish: '发布', + publishChanges: '发布修改', + published: '已发布', + publishing: '发布', + restoreThisVersion: '恢复此版本', + restoredSuccessfully: '恢复成功。', + restoring: '恢复中...', + revertToPublished: '还原到已发布的版本', + reverting: '还原中...', + saveDraft: '保存草稿', + selectLocales: '选择要显示的语言', + selectVersionToCompare: '选择要比较的版本', + showLocales: '显示语言:', + showingVersionsFor: '显示版本为:', + status: '状态', + unpublish: '取消发布', + unpublishing: '取消发布中...', + version: '版本', + versionCount_many: '发现{{count}}版本', + versionCount_none: '没有发现任何版本', + versionCount_one: '找到{{count}}版本', + versionCount_other: '找到{{count}}版本', + versionCreatedOn: '{{version}}创建于:', + versionID: '版本ID', + versions: '版本', + viewingVersion: '正在查看{{entityLabel}} {{documentTitle}}的版本', + viewingVersionGlobal: '正在查看全局{{entityLabel}}的版本', + viewingVersions: '正在查看{{entityLabel}} {{documentTitle}}的版本', + viewingVersionsGlobal: '正在查看全局{{entityLabel}}的版本', + }, }, } diff --git a/packages/translations/src/languages/zhTw.ts b/packages/translations/src/languages/zhTw.ts index 7afb6f1f9a..03a60ee7a7 100644 --- a/packages/translations/src/languages/zhTw.ts +++ b/packages/translations/src/languages/zhTw.ts @@ -1,376 +1,382 @@ -export default { - authentication: { - account: '帳戶', - accountOfCurrentUser: '目前使用者的帳戶', - alreadyActivated: '已經啟用了', - alreadyLoggedIn: '已經登入了', - apiKey: 'API金鑰', - backToLogin: '返回登入頁面', - beginCreateFirstUser: '首先,請建立您的第一個使用者。', - changePassword: '更改密碼', - checkYourEmailForPasswordReset: '請檢查您的電子郵件以獲取安全重設密碼的連結。', - confirmGeneration: '確認生成', - confirmPassword: '確認密碼', - createFirstUser: '建立第一個使用者', - emailNotValid: '提供的電子郵件無效', - emailSent: '電子郵件已寄出', - enableAPIKey: '啟用API金鑰', - failedToUnlock: '解鎖失敗', - forceUnlock: '強制解鎖', - forgotPassword: '忘記密碼', - forgotPasswordEmailInstructions: - '請在下方輸入您的電子郵件。您將收到一封有關如何重設密碼的說明電子郵件。', - forgotPasswordQuestion: '忘記密碼?', - generate: '生成', - generateNewAPIKey: '生成新的API金鑰', - generatingNewAPIKeyWillInvalidate: '生成新的API金鑰將使之前的金鑰<1>失效。您確定要繼續嗎?', - lockUntil: '鎖定直到', - logBackIn: '重新登入', - logOut: '登出', - loggedIn: '要使用另一個使用者登入前,您需要先<0>登出。', - loggedInChangePassword: '要更改您的密碼,請前往您的<0>帳戶頁面並在那裡編輯您的密碼。', - loggedOutInactivity: '您由於不活躍而被登出了。', - loggedOutSuccessfully: '您已成功登出。', - login: '登入', - loginAttempts: '登入次數', - loginUser: '登入使用者', - loginWithAnotherUser: '要使用另一個使用者登入前,您需要先<0>登出。', - logout: '登出', - logoutUser: '登出使用者', - newAPIKeyGenerated: '新的API金鑰已生成。', - newAccountCreated: - '剛剛為您建立了一個可以存取 {{serverURL}} 的新帳戶。請點擊以下連結或在瀏覽器中貼上以下網址以驗證您的電子郵件:{{verificationURL}}
驗證您的電子郵件後,您將能夠成功登入。', - newPassword: '新的密碼', - resetPassword: '重設密碼', - resetPasswordExpiration: '重設密碼的有效期', - resetPasswordToken: '重設密碼令牌', - resetYourPassword: '重設您的密碼', - stayLoggedIn: '保持登入狀態', - successfullyUnlocked: '已成功解鎖', - unableToVerify: '無法驗證', - verified: '已驗證', - verifiedSuccessfully: '成功驗證', - verify: '驗證', - verifyUser: '驗證使用者', - verifyYourEmail: '驗證您的電子郵件', - youAreInactive: - '您已經有一段時間沒有活動了,為了您的安全,很快就會自動登出。您想保持登入狀態嗎?', - youAreReceivingResetPassword: - '您收到此郵件是因為您(或其他人)已請求重設您帳戶的密碼。請點擊以下連結,或將其貼上到您的瀏覽器中以完成該過程:', - youDidNotRequestPassword: '如果您沒有要求這樣做,請忽略這封郵件,您的密碼將保持不變。', - }, - error: { - accountAlreadyActivated: '該帳戶已被啟用。', - autosaving: '自動儲存該文件時出現了問題。', - correctInvalidFields: '請更正無效區塊。', - deletingFile: '刪除文件時出現了錯誤。', - deletingTitle: '刪除{{title}}時出現了錯誤。請檢查您的網路連線並重試。', - emailOrPasswordIncorrect: '提供的電子郵件或密碼不正確。', - followingFieldsInvalid_one: '下面的字串是無效的:', - followingFieldsInvalid_other: '以下字串是無效的:', - incorrectCollection: '不正確的集合', - invalidFileType: '無效的文件類型', - invalidFileTypeValue: '無效的文件類型: {{value}}', - loadingDocument: '加載ID為{{id}}的文件時出現了問題。', - missingEmail: '缺少電子郵件。', - missingIDOfDocument: '缺少需要更新的文檔的ID。', - missingIDOfVersion: '缺少版本的ID。', - missingRequiredData: '缺少必要的數據。', - noFilesUploaded: '沒有上傳文件。', - noMatchedField: '找不到與"{{label}}"匹配的字串', - noUser: '沒有該使用者', - notAllowedToAccessPage: '您沒有權限訪問此頁面。', - notAllowedToPerformAction: '您不被允許執行此操作。', - notFound: '沒有找到請求的資源。', - previewing: '預覽文件時出現了問題。', - problemUploadingFile: '上傳文件時出現了問題。', - tokenInvalidOrExpired: '令牌無效或已過期。', - unPublishingDocument: '取消發布此文件時出現了問題。', - unableToDeleteCount: '無法從 {{total}} 個中刪除 {{count}} 個 {{label}}。', - unableToUpdateCount: '無法從 {{total}} 個中更新 {{count}} 個 {{label}}。', - unauthorized: '未經授權,您必須登錄才能提出這個請求。', - unknown: '發生了一個未知的錯誤。', - unspecific: '發生了一個錯誤。', - userLocked: '該使用者由於有太多次失敗的登錄嘗試而被鎖定。', - valueMustBeUnique: '數值必須是唯一的', - verificationTokenInvalid: '驗證令牌無效。', - }, - fields: { - addLabel: '新增{{label}}', - addLink: '新增連結', - addNew: '新增', - addNewLabel: '新增{{label}}', - addRelationship: '新增關聯', - addUpload: '上傳', - block: '區塊', - blockType: '區塊類型', - blocks: '區塊', - chooseBetweenCustomTextOrDocument: '選擇自定義文件或連結到另一個文件。', - chooseDocumentToLink: '選擇要連結的文件', - chooseFromExisting: '從現有的選擇', - chooseLabel: '選擇{{label}}', - collapseAll: '全部折疊', - customURL: '自定義連結', - editLabelData: '編輯{{label}}資料', - editLink: '編輯連結', - editRelationship: '編輯關聯', - enterURL: '輸入連結', - internalLink: '內部連結', - itemsAndMore: '{{items}} 個,還有 {{count}} 個', - labelRelationship: '{{label}}關聯', - latitude: '緯度', - linkType: '連結類型', - linkedTo: '連結到<0>{{label}}', - longitude: '經度', - newLabel: '新的{{label}}', - openInNewTab: '在新標籤中打開', - passwordsDoNotMatch: '密碼不匹配。', - relatedDocument: '相關文件', - relationTo: '關聯到', - removeRelationship: '移除關聯', - removeUpload: '移除上傳', - saveChanges: '儲存變更', - searchForBlock: '搜尋一個區塊', - selectExistingLabel: '選擇現有的{{label}}', - selectFieldsToEdit: '選擇要編輯的字串', - showAll: '顯示全部', - swapRelationship: '替換關聯', - swapUpload: '替換上傳', - textToDisplay: '要顯示的文字', - toggleBlock: '切換區塊', - uploadNewLabel: '上傳新的{{label}}', - }, - general: { - aboutToDelete: '您即將刪除{{label}} <1>{{title}}。您確定要繼續嗎?', - aboutToDeleteCount_many: '您即將刪除 {{count}} 個 {{label}}', - aboutToDeleteCount_one: '您即將刪除 {{count}} 個 {{label}}', - aboutToDeleteCount_other: '您即將刪除 {{count}} 個 {{label}}', - addBelow: '新增到下方', - addFilter: '新增過濾器', - adminTheme: '管理頁面主題', - and: '和', - applyChanges: '套用更改', - ascending: '升冪', - automatic: '自動', - backToDashboard: '返回到控制面板', - cancel: '取消', - changesNotSaved: '您還有尚未儲存的變更。您確定要離開嗎?', - close: '關閉', - collapse: '折疊', - collections: '集合', - columnToSort: '要排序的欄位', - columns: '欄位', - confirm: '確認', - confirmDeletion: '確認刪除', - confirmDuplication: '確認複製', - copied: '已複製', - copy: '複製', - create: '建立', - createNew: '建立新的', - createNewLabel: '建立新的{{label}}', - created: '已建立', - createdAt: '建立於', - creating: '建立中', - creatingNewLabel: '正在建立新的{{label}}', - dark: '深色', - dashboard: '控制面板', - delete: '刪除', - deletedCountSuccessfully: '已成功刪除 {{count}} 個 {{label}}。', - deletedSuccessfully: '已成功刪除。', - deleting: '刪除中...', - descending: '降冪', - deselectAllRows: '取消選擇全部', - duplicate: '複製', - duplicateWithoutSaving: '複製而不儲存變更。', - edit: '編輯', - editLabel: '編輯{{label}}', - editing: '編輯中', - editingLabel_many: '編輯 {{count}} 個 {{label}}', - editingLabel_one: '編輯 {{count}} 個 {{label}}', - editingLabel_other: '編輯 {{count}} 個 {{label}}', - email: '電子郵件', - emailAddress: '電子郵件地址', - enterAValue: '輸入一個值', - error: '錯誤', - errors: '錯誤', - fallbackToDefaultLocale: '回到預設的語言', - filter: '過濾器', - filterWhere: '過濾{{label}}', - filters: '過濾器', - globals: '全域', - language: '語言', - lastModified: '最後修改', - leaveAnyway: '無論如何都要離開', - leaveWithoutSaving: '不儲存直接離開', - light: '亮色', - livePreview: '預覽', - loading: '載入中...', - locale: '語言環境', - locales: '語言環境', - menu: '菜單', - moveDown: '向下移動', - moveUp: '向上移動', - newPassword: '新密碼', - noFiltersSet: '沒有設定過濾器', - noLabel: '<沒有{{label}}>', - noOptions: '沒有選項', - noResults: '沒有找到{{label}}。{{label}}並不存在或沒有符合您上面所指定的過濾器。', - noValue: '沒有數值', - none: '無', - notFound: '未找到', - nothingFound: '沒有找到任何東西', - of: '的', - open: '打開', - or: '或', - order: '排序', - pageNotFound: '未找到頁面', - password: '密碼', - payloadSettings: 'Payload設定', - perPage: '每一頁: {{limit}} 個', - remove: '移除', - reset: '重設', - row: '行', - rows: '行', - save: '儲存', - saving: '儲存中...', - searchBy: '搜尋{{label}}', - selectAll: '選擇所有 {{count}} 個 {{label}}', - selectAllRows: '選擇所有行', - selectValue: '選擇一個值', - selectedCount: '已選擇 {{count}} 個 {{label}}', - showAllLabel: '顯示所有{{label}}', - sorryNotFound: '對不起,沒有找到您請求的東西。', - sort: '排序', - sortByLabelDirection: '按{{label}} {{direction}}排序', - stayOnThisPage: '停留在此頁面', - submissionSuccessful: '成功送出。', - submit: '送出', - successfullyCreated: '成功建立{{label}}', - successfullyDuplicated: '成功複製{{label}}', - thisLanguage: '中文 (繁體)', - titleDeleted: '{{label}} "{{title}}"已被成功刪除。', - unauthorized: '未經授權', - unsavedChangesDuplicate: '您有還沒儲存的修改,確定要繼續複製嗎?', - untitled: '無標題', - updatedAt: '更新於', - updatedCountSuccessfully: '已成功更新 {{count}} 個 {{label}}。', - updatedSuccessfully: '更新成功。', - updating: '更新中', - uploading: '上傳中', - user: '使用者', - users: '使用者', - value: '值', - welcome: '歡迎', - }, - operators: { - contains: '包含', - equals: '等於', - exists: '存在', - isGreaterThan: '大於', - isGreaterThanOrEqualTo: '大於等於', - isIn: '在', - isLessThan: '小於', - isLessThanOrEqualTo: '小於或等於', - isLike: '就像', - isNotEqualTo: '不等於', - isNotIn: '不在', - near: '附近', - }, - upload: { - crop: '裁剪', - cropToolDescription: '拖動所選區域的角落,繪製一個新區域或調整以下的值。', - dragAndDrop: '拖放一個檔案', - dragAndDropHere: '或在這裡拖放一個檔案', - editImage: '編輯圖像', - fileName: '檔案名稱', - fileSize: '檔案大小', - focalPoint: '焦點', - focalPointDescription: '直接在預覽中拖動焦點或調整下面的值。', - height: '高度', - lessInfo: '更少資訊', - moreInfo: '更多資訊', - previewSizes: '預覽尺寸', - selectCollectionToBrowse: '選擇一個要瀏覽的集合', - selectFile: '選擇一個文件', - setCropArea: '設置裁剪區域', - setFocalPoint: '設置焦點', - sizes: '尺寸', - sizesFor: '{{label}}的尺寸', - width: '寬度', - }, - validation: { - emailAddress: '請輸入一個有效的電子郵件地址。', - enterNumber: '請輸入一個有效的數字。', - fieldHasNo: '這個字串沒有{{label}}', - greaterThanMax: '{{value}}超過了允許的最大{{label}},該最大值為{{max}}。', - invalidInput: '這個字串有一個無效的輸入。', - invalidSelection: '這個字串有一個無效的選擇。', - invalidSelections: '這個字串有以下無效的選擇:', - lessThanMin: '{{value}}小於允許的最小{{label}},該最小值為{{min}}。', - limitReached: '已達限制,只能添加{{max}}個項目。', - longerThanMin: '該值必須大於{{minLength}}字串的最小長度', - notValidDate: '"{{value}}"不是一個有效的日期。', - required: '該字串為必填項目。', - requiresAtLeast: '該字串至少需要 {{count}} 個 {{label}}。', - requiresNoMoreThan: '該字串要求不超過 {{count}} 個 {{label}。', - requiresTwoNumbers: '該字串需要兩個數字。', - shorterThanMax: '該值長度必須小於{{maxLength}}個字元', - trueOrFalse: '該字串只能等於是或否。', - validUploadID: '該字串不是有效的上傳ID。', - }, - version: { - aboutToPublishSelection: '您確定即將發佈所選的 {{label}} 嗎?', - aboutToRestore: '您將把這個文件{{label}}回復到{{versionDate}}時的狀態', - aboutToRestoreGlobal: '您要將痊域的{{label}}回復到{{versionDate}}時的狀態', - aboutToRevertToPublished: '您將要將這個文件的內容還原到它的發佈狀態。您確定嗎?', - aboutToUnpublish: '您即將取消發佈這個文件。您確定嗎?', - aboutToUnpublishSelection: '您即將取消發佈所選內容中的所有 {{label}}。您確定嗎?', - autosave: '自動儲存', - autosavedSuccessfully: '自動儲存成功。', - autosavedVersion: '自動儲存的版本', - changed: '已更改', - compareVersion: '對比版本:', - confirmPublish: '確認發佈', - confirmRevertToSaved: '確認回復到儲存狀態', - confirmUnpublish: '確認取消發佈', - confirmVersionRestoration: '確認版本回復', - currentDocumentStatus: '目前{{docStatus}}文件', - draft: '草稿', - draftSavedSuccessfully: '草稿儲存成功。', - lastSavedAgo: '上次儲存在{{distance}}之前', - noFurtherVersionsFound: '沒有發現其他版本', - noRowsFound: '沒有發現{{label}}', - preview: '預覽', - problemRestoringVersion: '回復這個版本時發生了問題', - publish: '發佈', - publishChanges: '發佈修改', - published: '已發佈', - publishing: '發布', - restoreThisVersion: '回復此版本', - restoredSuccessfully: '回復成功。', - restoring: '回復中...', - revertToPublished: '還原到已發佈的版本', - reverting: '還原中...', - saveDraft: '儲存草稿', - selectLocales: '選擇要顯示的語言', - selectVersionToCompare: '選擇要比較的版本', - showLocales: '顯示語言:', - showingVersionsFor: '顯示版本為:', - status: '狀態', - type: '類型', - unpublish: '取消發佈', - unpublishing: '取消發佈中...', - version: '版本', - versionCount_many: '發現 {{count}}個版本', - versionCount_none: '沒有發現任何版本', - versionCount_one: '找到 {{count}} 個版本', - versionCount_other: '找到 {{count}} 個版本', - versionCreatedOn: '版本 {{version}} 建立於:', - versionID: '版本ID', - versions: '版本', - viewingVersion: '正在查看{{entityLabel}} {{documentTitle}}的版本', - viewingVersionGlobal: '正在查看全域{{entityLabel}}的版本', - viewingVersions: '正在查看{{entityLabel}} {{documentTitle}}的版本', - viewingVersionsGlobal: '正在查看全域{{entityLabel}}的版本', +import type { Language } from '../types.js' + +export const zhTw: Language = { + dateFNSKey: 'zh-TW', + translations: { + authentication: { + account: '帳戶', + accountOfCurrentUser: '目前使用者的帳戶', + alreadyActivated: '已經啟用了', + alreadyLoggedIn: '已經登入了', + apiKey: 'API金鑰', + backToLogin: '返回登入頁面', + beginCreateFirstUser: '首先,請建立您的第一個使用者。', + changePassword: '更改密碼', + checkYourEmailForPasswordReset: '請檢查您的電子郵件以獲取安全重設密碼的連結。', + confirmGeneration: '確認生成', + confirmPassword: '確認密碼', + createFirstUser: '建立第一個使用者', + emailNotValid: '提供的電子郵件無效', + emailSent: '電子郵件已寄出', + enableAPIKey: '啟用API金鑰', + failedToUnlock: '解鎖失敗', + forceUnlock: '強制解鎖', + forgotPassword: '忘記密碼', + forgotPasswordEmailInstructions: + '請在下方輸入您的電子郵件。您將收到一封有關如何重設密碼的說明電子郵件。', + forgotPasswordQuestion: '忘記密碼?', + generate: '生成', + generateNewAPIKey: '生成新的API金鑰', + generatingNewAPIKeyWillInvalidate: + '生成新的API金鑰將使之前的金鑰<1>失效。您確定要繼續嗎?', + lockUntil: '鎖定直到', + logBackIn: '重新登入', + logOut: '登出', + loggedIn: '要使用另一個使用者登入前,您需要先<0>登出。', + loggedInChangePassword: '要更改您的密碼,請前往您的<0>帳戶頁面並在那裡編輯您的密碼。', + loggedOutInactivity: '您由於不活躍而被登出了。', + loggedOutSuccessfully: '您已成功登出。', + login: '登入', + loginAttempts: '登入次數', + loginUser: '登入使用者', + loginWithAnotherUser: '要使用另一個使用者登入前,您需要先<0>登出。', + logout: '登出', + logoutUser: '登出使用者', + newAPIKeyGenerated: '新的API金鑰已生成。', + newAccountCreated: + '剛剛為您建立了一個可以存取 {{serverURL}} 的新帳戶。請點擊以下連結或在瀏覽器中貼上以下網址以驗證您的電子郵件:{{verificationURL}}
驗證您的電子郵件後,您將能夠成功登入。', + newPassword: '新的密碼', + resetPassword: '重設密碼', + resetPasswordExpiration: '重設密碼的有效期', + resetPasswordToken: '重設密碼令牌', + resetYourPassword: '重設您的密碼', + stayLoggedIn: '保持登入狀態', + successfullyUnlocked: '已成功解鎖', + unableToVerify: '無法驗證', + verified: '已驗證', + verifiedSuccessfully: '成功驗證', + verify: '驗證', + verifyUser: '驗證使用者', + verifyYourEmail: '驗證您的電子郵件', + youAreInactive: + '您已經有一段時間沒有活動了,為了您的安全,很快就會自動登出。您想保持登入狀態嗎?', + youAreReceivingResetPassword: + '您收到此郵件是因為您(或其他人)已請求重設您帳戶的密碼。請點擊以下連結,或將其貼上到您的瀏覽器中以完成該過程:', + youDidNotRequestPassword: '如果您沒有要求這樣做,請忽略這封郵件,您的密碼將保持不變。', + }, + error: { + accountAlreadyActivated: '該帳戶已被啟用。', + autosaving: '自動儲存該文件時出現了問題。', + correctInvalidFields: '請更正無效區塊。', + deletingFile: '刪除文件時出現了錯誤。', + deletingTitle: '刪除{{title}}時出現了錯誤。請檢查您的網路連線並重試。', + emailOrPasswordIncorrect: '提供的電子郵件或密碼不正確。', + followingFieldsInvalid_one: '下面的字串是無效的:', + followingFieldsInvalid_other: '以下字串是無效的:', + incorrectCollection: '不正確的集合', + invalidFileType: '無效的文件類型', + invalidFileTypeValue: '無效的文件類型: {{value}}', + loadingDocument: '加載ID為{{id}}的文件時出現了問題。', + missingEmail: '缺少電子郵件。', + missingIDOfDocument: '缺少需要更新的文檔的ID。', + missingIDOfVersion: '缺少版本的ID。', + missingRequiredData: '缺少必要的數據。', + noFilesUploaded: '沒有上傳文件。', + noMatchedField: '找不到與"{{label}}"匹配的字串', + noUser: '沒有該使用者', + notAllowedToAccessPage: '您沒有權限訪問此頁面。', + notAllowedToPerformAction: '您不被允許執行此操作。', + notFound: '沒有找到請求的資源。', + previewing: '預覽文件時出現了問題。', + problemUploadingFile: '上傳文件時出現了問題。', + tokenInvalidOrExpired: '令牌無效或已過期。', + unPublishingDocument: '取消發布此文件時出現了問題。', + unableToDeleteCount: '無法從 {{total}} 個中刪除 {{count}} 個 {{label}}。', + unableToUpdateCount: '無法從 {{total}} 個中更新 {{count}} 個 {{label}}。', + unauthorized: '未經授權,您必須登錄才能提出這個請求。', + unknown: '發生了一個未知的錯誤。', + unspecific: '發生了一個錯誤。', + userLocked: '該使用者由於有太多次失敗的登錄嘗試而被鎖定。', + valueMustBeUnique: '數值必須是唯一的', + verificationTokenInvalid: '驗證令牌無效。', + }, + fields: { + addLabel: '新增{{label}}', + addLink: '新增連結', + addNew: '新增', + addNewLabel: '新增{{label}}', + addRelationship: '新增關聯', + addUpload: '上傳', + block: '區塊', + blockType: '區塊類型', + blocks: '區塊', + chooseBetweenCustomTextOrDocument: '選擇自定義文件或連結到另一個文件。', + chooseDocumentToLink: '選擇要連結的文件', + chooseFromExisting: '從現有的選擇', + chooseLabel: '選擇{{label}}', + collapseAll: '全部折疊', + customURL: '自定義連結', + editLabelData: '編輯{{label}}資料', + editLink: '編輯連結', + editRelationship: '編輯關聯', + enterURL: '輸入連結', + internalLink: '內部連結', + itemsAndMore: '{{items}} 個,還有 {{count}} 個', + labelRelationship: '{{label}}關聯', + latitude: '緯度', + linkType: '連結類型', + linkedTo: '連結到<0>{{label}}', + longitude: '經度', + newLabel: '新的{{label}}', + openInNewTab: '在新標籤中打開', + passwordsDoNotMatch: '密碼不匹配。', + relatedDocument: '相關文件', + relationTo: '關聯到', + removeRelationship: '移除關聯', + removeUpload: '移除上傳', + saveChanges: '儲存變更', + searchForBlock: '搜尋一個區塊', + selectExistingLabel: '選擇現有的{{label}}', + selectFieldsToEdit: '選擇要編輯的字串', + showAll: '顯示全部', + swapRelationship: '替換關聯', + swapUpload: '替換上傳', + textToDisplay: '要顯示的文字', + toggleBlock: '切換區塊', + uploadNewLabel: '上傳新的{{label}}', + }, + general: { + aboutToDelete: '您即將刪除{{label}} <1>{{title}}。您確定要繼續嗎?', + aboutToDeleteCount_many: '您即將刪除 {{count}} 個 {{label}}', + aboutToDeleteCount_one: '您即將刪除 {{count}} 個 {{label}}', + aboutToDeleteCount_other: '您即將刪除 {{count}} 個 {{label}}', + addBelow: '新增到下方', + addFilter: '新增過濾器', + adminTheme: '管理頁面主題', + and: '和', + applyChanges: '套用更改', + ascending: '升冪', + automatic: '自動', + backToDashboard: '返回到控制面板', + cancel: '取消', + changesNotSaved: '您還有尚未儲存的變更。您確定要離開嗎?', + close: '關閉', + collapse: '折疊', + collections: '集合', + columnToSort: '要排序的欄位', + columns: '欄位', + confirm: '確認', + confirmDeletion: '確認刪除', + confirmDuplication: '確認複製', + copied: '已複製', + copy: '複製', + create: '建立', + createNew: '建立新的', + createNewLabel: '建立新的{{label}}', + created: '已建立', + createdAt: '建立於', + creating: '建立中', + creatingNewLabel: '正在建立新的{{label}}', + dark: '深色', + dashboard: '控制面板', + delete: '刪除', + deletedCountSuccessfully: '已成功刪除 {{count}} 個 {{label}}。', + deletedSuccessfully: '已成功刪除。', + deleting: '刪除中...', + descending: '降冪', + deselectAllRows: '取消選擇全部', + duplicate: '複製', + duplicateWithoutSaving: '複製而不儲存變更。', + edit: '編輯', + editLabel: '編輯{{label}}', + editing: '編輯中', + editingLabel_many: '編輯 {{count}} 個 {{label}}', + editingLabel_one: '編輯 {{count}} 個 {{label}}', + editingLabel_other: '編輯 {{count}} 個 {{label}}', + email: '電子郵件', + emailAddress: '電子郵件地址', + enterAValue: '輸入一個值', + error: '錯誤', + errors: '錯誤', + fallbackToDefaultLocale: '回到預設的語言', + filter: '過濾器', + filterWhere: '過濾{{label}}', + filters: '過濾器', + globals: '全域', + language: '語言', + lastModified: '最後修改', + leaveAnyway: '無論如何都要離開', + leaveWithoutSaving: '不儲存直接離開', + light: '亮色', + livePreview: '預覽', + loading: '載入中...', + locale: '語言環境', + locales: '語言環境', + menu: '菜單', + moveDown: '向下移動', + moveUp: '向上移動', + newPassword: '新密碼', + noFiltersSet: '沒有設定過濾器', + noLabel: '<沒有{{label}}>', + noOptions: '沒有選項', + noResults: '沒有找到{{label}}。{{label}}並不存在或沒有符合您上面所指定的過濾器。', + noValue: '沒有數值', + none: '無', + notFound: '未找到', + nothingFound: '沒有找到任何東西', + of: '的', + open: '打開', + or: '或', + order: '排序', + pageNotFound: '未找到頁面', + password: '密碼', + payloadSettings: 'Payload設定', + perPage: '每一頁: {{limit}} 個', + remove: '移除', + reset: '重設', + row: '行', + rows: '行', + save: '儲存', + saving: '儲存中...', + searchBy: '搜尋{{label}}', + selectAll: '選擇所有 {{count}} 個 {{label}}', + selectAllRows: '選擇所有行', + selectValue: '選擇一個值', + selectedCount: '已選擇 {{count}} 個 {{label}}', + showAllLabel: '顯示所有{{label}}', + sorryNotFound: '對不起,沒有找到您請求的東西。', + sort: '排序', + sortByLabelDirection: '按{{label}} {{direction}}排序', + stayOnThisPage: '停留在此頁面', + submissionSuccessful: '成功送出。', + submit: '送出', + successfullyCreated: '成功建立{{label}}', + successfullyDuplicated: '成功複製{{label}}', + thisLanguage: '中文 (繁體)', + titleDeleted: '{{label}} "{{title}}"已被成功刪除。', + unauthorized: '未經授權', + unsavedChangesDuplicate: '您有還沒儲存的修改,確定要繼續複製嗎?', + untitled: '無標題', + updatedAt: '更新於', + updatedCountSuccessfully: '已成功更新 {{count}} 個 {{label}}。', + updatedSuccessfully: '更新成功。', + updating: '更新中', + uploading: '上傳中', + user: '使用者', + users: '使用者', + value: '值', + welcome: '歡迎', + }, + operators: { + contains: '包含', + equals: '等於', + exists: '存在', + isGreaterThan: '大於', + isGreaterThanOrEqualTo: '大於等於', + isIn: '在', + isLessThan: '小於', + isLessThanOrEqualTo: '小於或等於', + isLike: '就像', + isNotEqualTo: '不等於', + isNotIn: '不在', + near: '附近', + }, + upload: { + crop: '裁剪', + cropToolDescription: '拖動所選區域的角落,繪製一個新區域或調整以下的值。', + dragAndDrop: '拖放一個檔案', + dragAndDropHere: '或在這裡拖放一個檔案', + editImage: '編輯圖像', + fileName: '檔案名稱', + fileSize: '檔案大小', + focalPoint: '焦點', + focalPointDescription: '直接在預覽中拖動焦點或調整下面的值。', + height: '高度', + lessInfo: '更少資訊', + moreInfo: '更多資訊', + previewSizes: '預覽尺寸', + selectCollectionToBrowse: '選擇一個要瀏覽的集合', + selectFile: '選擇一個文件', + setCropArea: '設置裁剪區域', + setFocalPoint: '設置焦點', + sizes: '尺寸', + sizesFor: '{{label}}的尺寸', + width: '寬度', + }, + validation: { + emailAddress: '請輸入一個有效的電子郵件地址。', + enterNumber: '請輸入一個有效的數字。', + fieldHasNo: '這個字串沒有{{label}}', + greaterThanMax: '{{value}}超過了允許的最大{{label}},該最大值為{{max}}。', + invalidInput: '這個字串有一個無效的輸入。', + invalidSelection: '這個字串有一個無效的選擇。', + invalidSelections: '這個字串有以下無效的選擇:', + lessThanMin: '{{value}}小於允許的最小{{label}},該最小值為{{min}}。', + limitReached: '已達限制,只能添加{{max}}個項目。', + longerThanMin: '該值必須大於{{minLength}}字串的最小長度', + notValidDate: '"{{value}}"不是一個有效的日期。', + required: '該字串為必填項目。', + requiresAtLeast: '該字串至少需要 {{count}} 個 {{label}}。', + requiresNoMoreThan: '該字串要求不超過 {{count}} 個 {{label}。', + requiresTwoNumbers: '該字串需要兩個數字。', + shorterThanMax: '該值長度必須小於{{maxLength}}個字元', + trueOrFalse: '該字串只能等於是或否。', + validUploadID: '該字串不是有效的上傳ID。', + }, + version: { + type: '類型', + aboutToPublishSelection: '您確定即將發佈所選的 {{label}} 嗎?', + aboutToRestore: '您將把這個文件{{label}}回復到{{versionDate}}時的狀態', + aboutToRestoreGlobal: '您要將痊域的{{label}}回復到{{versionDate}}時的狀態', + aboutToRevertToPublished: '您將要將這個文件的內容還原到它的發佈狀態。您確定嗎?', + aboutToUnpublish: '您即將取消發佈這個文件。您確定嗎?', + aboutToUnpublishSelection: '您即將取消發佈所選內容中的所有 {{label}}。您確定嗎?', + autosave: '自動儲存', + autosavedSuccessfully: '自動儲存成功。', + autosavedVersion: '自動儲存的版本', + changed: '已更改', + compareVersion: '對比版本:', + confirmPublish: '確認發佈', + confirmRevertToSaved: '確認回復到儲存狀態', + confirmUnpublish: '確認取消發佈', + confirmVersionRestoration: '確認版本回復', + currentDocumentStatus: '目前{{docStatus}}文件', + draft: '草稿', + draftSavedSuccessfully: '草稿儲存成功。', + lastSavedAgo: '上次儲存在{{distance}}之前', + noFurtherVersionsFound: '沒有發現其他版本', + noRowsFound: '沒有發現{{label}}', + preview: '預覽', + problemRestoringVersion: '回復這個版本時發生了問題', + publish: '發佈', + publishChanges: '發佈修改', + published: '已發佈', + publishing: '發布', + restoreThisVersion: '回復此版本', + restoredSuccessfully: '回復成功。', + restoring: '回復中...', + revertToPublished: '還原到已發佈的版本', + reverting: '還原中...', + saveDraft: '儲存草稿', + selectLocales: '選擇要顯示的語言', + selectVersionToCompare: '選擇要比較的版本', + showLocales: '顯示語言:', + showingVersionsFor: '顯示版本為:', + status: '狀態', + unpublish: '取消發佈', + unpublishing: '取消發佈中...', + version: '版本', + versionCount_many: '發現 {{count}}個版本', + versionCount_none: '沒有發現任何版本', + versionCount_one: '找到 {{count}} 個版本', + versionCount_other: '找到 {{count}} 個版本', + versionCreatedOn: '版本 {{version}} 建立於:', + versionID: '版本ID', + versions: '版本', + viewingVersion: '正在查看{{entityLabel}} {{documentTitle}}的版本', + viewingVersionGlobal: '正在查看全域{{entityLabel}}的版本', + viewingVersions: '正在查看{{entityLabel}} {{documentTitle}}的版本', + viewingVersionsGlobal: '正在查看全域{{entityLabel}}的版本', + }, }, } From 35f59a47cc51554d08903ce36eda0f63f59386e7 Mon Sep 17 00:00:00 2001 From: Jarrod Flesch Date: Tue, 9 Apr 2024 11:38:38 -0400 Subject: [PATCH 028/177] chore: corrects dateFNS keys, stricter types --- packages/next/src/layouts/Root/index.tsx | 19 +- packages/next/src/utilities/getNextI18n.ts | 4 +- .../next/src/utilities/getRequestLanguage.ts | 4 +- packages/translations/README.md | 118 +++++++++++++ packages/translations/src/exports/all.ts | 2 +- packages/translations/src/languages/fa.ts | 2 +- packages/translations/src/languages/rs.ts | 2 +- .../translations/src/languages/rsLatin.ts | 2 +- packages/translations/src/languages/zh.ts | 2 +- packages/translations/src/types.ts | 41 ++++- .../src/utilities/getTranslationsByContext.ts | 6 +- packages/translations/src/utilities/init.ts | 72 +------- .../translations/src/utilities/languages.ts | 165 ++++++++++++++++++ test/buildConfigWithDefaults.ts | 15 +- 14 files changed, 354 insertions(+), 100 deletions(-) create mode 100644 packages/translations/src/utilities/languages.ts diff --git a/packages/next/src/layouts/Root/index.tsx b/packages/next/src/layouts/Root/index.tsx index 9565b78af7..059920498b 100644 --- a/packages/next/src/layouts/Root/index.tsx +++ b/packages/next/src/layouts/Root/index.tsx @@ -1,5 +1,7 @@ +import type { AcceptedLanguages } from '@payloadcms/translations' import type { SanitizedConfig } from 'payload/types' +import { rtlLanguages } from '@payloadcms/translations' import { initI18n } from '@payloadcms/translations' import { RootProvider } from '@payloadcms/ui/providers/Root' import '@payloadcms/ui/scss/app.scss' @@ -19,8 +21,6 @@ export const metadata = { title: 'Next.js', } -const rtlLanguages = ['ar', 'fa', 'ha', 'ku', 'ur', 'ps', 'dv', 'ks', 'khw', 'he', 'yi'] - export const RootLayout = async ({ children, config: configPromise, @@ -33,17 +33,18 @@ export const RootLayout = async ({ const headers = getHeaders() const cookies = parseCookies(headers) - const languageCode = - getRequestLanguage({ - config, - cookies, - headers, - }) ?? config.i18n.fallbackLanguage + const languageCode = getRequestLanguage({ + config, + cookies, + headers, + }) const i18n = await initI18n({ config: config.i18n, context: 'client', language: languageCode }) const clientConfig = await createClientConfig({ config, t: i18n.t }) - const dir = rtlLanguages.includes(languageCode) ? 'RTL' : 'LTR' + const dir = (rtlLanguages as unknown as AcceptedLanguages[]).includes(languageCode) + ? 'RTL' + : 'LTR' const languageOptions = Object.entries(config.i18n.supportedLanguages || {}).reduce( (acc, [language, languageConfig]) => { diff --git a/packages/next/src/utilities/getNextI18n.ts b/packages/next/src/utilities/getNextI18n.ts index 82c488c644..e93b50fa2a 100644 --- a/packages/next/src/utilities/getNextI18n.ts +++ b/packages/next/src/utilities/getNextI18n.ts @@ -1,4 +1,4 @@ -import type { I18n } from '@payloadcms/translations' +import type { AcceptedLanguages, I18n } from '@payloadcms/translations' import type { SanitizedConfig } from 'payload/types' import { initI18n } from '@payloadcms/translations' @@ -11,7 +11,7 @@ export const getNextI18n = async ({ language, }: { config: SanitizedConfig - language?: string + language?: AcceptedLanguages }): Promise => initI18n({ config: config.i18n, diff --git a/packages/next/src/utilities/getRequestLanguage.ts b/packages/next/src/utilities/getRequestLanguage.ts index 6c6c77c70c..6ca0b8b1aa 100644 --- a/packages/next/src/utilities/getRequestLanguage.ts +++ b/packages/next/src/utilities/getRequestLanguage.ts @@ -1,3 +1,4 @@ +import type { AcceptedLanguages } from '@payloadcms/translations' import type { ReadonlyRequestCookies } from 'next/dist/server/web/spec-extension/adapters/request-cookies.js' import type { SanitizedConfig } from 'payload/config' @@ -15,13 +16,14 @@ export const getRequestLanguage = ({ cookies, defaultLanguage = 'en', headers, -}: GetRequestLanguageArgs): string => { +}: GetRequestLanguageArgs): AcceptedLanguages => { const acceptLanguage = headers.get('Accept-Language') const cookieLanguage = cookies.get(`${config.cookiePrefix || 'payload'}-lng`) const reqLanguage = (typeof cookieLanguage === 'string' ? cookieLanguage : cookieLanguage?.value) || acceptLanguage || + config.i18n.fallbackLanguage || defaultLanguage return matchLanguage(reqLanguage) diff --git a/packages/translations/README.md b/packages/translations/README.md index 5f069af5fd..22c328f79d 100644 --- a/packages/translations/README.md +++ b/packages/translations/README.md @@ -43,3 +43,121 @@ These are the translations for Payload. Translations are used on both the server // or pnpm build ``` + +Here is a full list of language keys. Note that these are not all implemented, but if you would like to contribute and add a new language, you can use this list as a reference: + +| Language Code | Language Name | +| -------------- | ------------------------------------------ | +| af | Afrikaans | +| am | Amharic | +| ar-sa | Arabic (Saudi Arabia) | +| as | Assamese | +| az-Latn | Azerbaijani (Latin) | +| be | Belarusian | +| bg | Bulgarian | +| bn-BD | Bangla (Bangladesh) | +| bn-IN | Bangla (India) | +| bs | Bosnian (Latin) | +| ca | Catalan Spanish | +| ca-ES-valencia | Valencian | +| cs | Czech | +| cy | Welsh | +| da | Danish | +| de | German (Germany) | +| el | Greek | +| en-GB | English (United Kingdom) | +| en-US | English (United States) | +| es | Spanish (Spain) | +| es-ES | Spanish (Spain) | +| es-US | Spanish (United States) | +| es-MX | Spanish (Mexico) | +| et | Estonian | +| eu | Basque | +| fa | Persian | +| fi | Finnish | +| fil-Latn | Filipino | +| fr | French (France) | +| fr-FR | French (France) | +| fr-CA | French (Canada) | +| ga | Irish | +| gd-Latn | Scottish Gaelic | +| gl | Galician | +| gu | Gujarati | +| ha-Latn | Hausa (Latin) | +| he | Hebrew | +| hi | Hindi | +| hr | Croatian | +| hu | Hungarian | +| hy | Armenian | +| id | Indonesian | +| ig-Latn | Igbo | +| is | Icelandic | +| it | Italian (Italy) | +| it-it | Italian (Italy) | +| ja | Japanese | +| ka | Georgian | +| kk | Kazakh | +| km | Khmer | +| kn | Kannada | +| ko | Korean | +| kok | Konkani | +| ku-Arab | Central Kurdish | +| ky-Cyrl | Kyrgyz | +| lb | Luxembourgish | +| lt | Lithuanian | +| lv | Latvian | +| mi-Latn | Maori | +| mk | Macedonian | +| ml | Malayalam | +| mn-Cyrl | Mongolian (Cyrillic) | +| mr | Marathi | +| ms | Malay (Malaysia) | +| mt | Maltese | +| nb | Norwegian (Bokmål) | +| ne | Nepali (Nepal) | +| nl | Dutch (Netherlands) | +| nl-BE | Dutch (Netherlands) | +| nn | Norwegian (Nynorsk) | +| nso | Sesotho sa Leboa | +| or | Odia | +| pa | Punjabi (Gurmukhi) | +| pa-Arab | Punjabi (Arabic) | +| pl | Polish | +| prs-Arab | Dari | +| pt-BR | Portuguese (Brazil) | +| pt-PT | Portuguese (Portugal) | +| qut-Latn | K’iche’ | +| quz | Quechua (Peru) | +| ro | Romanian (Romania) | +| ru | Russian | +| rw | Kinyarwanda | +| sd-Arab | Sindhi (Arabic) | +| si | Sinhala | +| sk | Slovak | +| sl | Slovenian | +| sq | Albanian | +| sr-Cyrl-BA | Serbian (Cyrillic, Bosnia and Herzegovina) | +| sr-Cyrl-RS | Serbian (Cyrillic, Serbia) | +| sr-Latn-RS | Serbian (Latin, Serbia) | +| sv | Swedish (Sweden) | +| sw | Kiswahili | +| ta | Tamil | +| te | Telugu | +| tg-Cyrl | Tajik (Cyrillic) | +| th | Thai | +| ti | Tigrinya | +| tk-Latn | Turkmen (Latin) | +| tn | Setswana | +| tr | Turkish | +| tt-Cyrl | Tatar (Cyrillic) | +| ug-Arab | Uyghur | +| uk | Ukrainian | +| ur | Urdu | +| uz-Latn | Uzbek (Latin) | +| vi | Vietnamese | +| wo | Wolof | +| xh | isiXhosa | +| yo-Latn | Yoruba | +| zh-Hans | Chinese (Simplified) | +| zh-Hant | Chinese (Traditional) | +| zu | isiZulu | diff --git a/packages/translations/src/exports/all.ts b/packages/translations/src/exports/all.ts index fc651f4ce9..04919e7bd2 100644 --- a/packages/translations/src/exports/all.ts +++ b/packages/translations/src/exports/all.ts @@ -61,5 +61,5 @@ export const translations = { ua, vi, zh, - 'zh-tw': zhTw, + 'zh-TW': zhTw, } as SupportedLanguages diff --git a/packages/translations/src/languages/fa.ts b/packages/translations/src/languages/fa.ts index 914b9ff468..e05e44d545 100644 --- a/packages/translations/src/languages/fa.ts +++ b/packages/translations/src/languages/fa.ts @@ -1,7 +1,7 @@ import type { Language } from '../types.js' export const fa: Language = { - dateFNSKey: 'fa', + dateFNSKey: 'fa-IR', translations: { authentication: { account: 'نمایه', diff --git a/packages/translations/src/languages/rs.ts b/packages/translations/src/languages/rs.ts index 81017cb28f..4a0cbc891c 100644 --- a/packages/translations/src/languages/rs.ts +++ b/packages/translations/src/languages/rs.ts @@ -1,7 +1,7 @@ import type { Language } from '../types.js' export const rs: Language = { - dateFNSKey: 'rs', + dateFNSKey: 'en-US', translations: { authentication: { account: 'Налог', diff --git a/packages/translations/src/languages/rsLatin.ts b/packages/translations/src/languages/rsLatin.ts index b9433a9fdd..145c65e8b7 100644 --- a/packages/translations/src/languages/rsLatin.ts +++ b/packages/translations/src/languages/rsLatin.ts @@ -1,7 +1,7 @@ import type { Language } from '../types.js' export const rsLatin: Language = { - dateFNSKey: 'rs-latin', + dateFNSKey: 'en-US', translations: { authentication: { account: 'Nalog', diff --git a/packages/translations/src/languages/zh.ts b/packages/translations/src/languages/zh.ts index e55b8e3002..4e4aba7148 100644 --- a/packages/translations/src/languages/zh.ts +++ b/packages/translations/src/languages/zh.ts @@ -1,7 +1,7 @@ import type { Language } from '../types.js' export const zh: Language = { - dateFNSKey: 'zh', + dateFNSKey: 'zh-CN', translations: { authentication: { account: '帐户', diff --git a/packages/translations/src/types.ts b/packages/translations/src/types.ts index cac0ddbd74..937b252b43 100644 --- a/packages/translations/src/types.ts +++ b/packages/translations/src/types.ts @@ -1,9 +1,37 @@ import type { Locale } from 'date-fns' -import type { acceptedLanguages } from './utilities/init.js' +import type { acceptedLanguages } from './utilities/languages.js' + +type DateFNSKeys = + | 'ar' + | 'az' + | 'bg' + | 'cs' + | 'de' + | 'en-US' + | 'es' + | 'fa-IR' + | 'fr' + | 'hr' + | 'hu' + | 'it' + | 'ja' + | 'ko' + | 'nb' + | 'nl' + | 'pl' + | 'pt' + | 'ro' + | 'ru' + | 'sv' + | 'th' + | 'tr' + | 'vi' + | 'zh-CN' + | 'zh-TW' export type Language = { - dateFNSKey: string + dateFNSKey: DateFNSKeys translations: { [namespace: string]: { [key: string]: string @@ -22,7 +50,7 @@ export type TFunction = (key: string, options?: Record) => string export type I18n = { dateFNS: Locale /** Corresponding dateFNS key */ - dateFNSKey: string + dateFNSKey: DateFNSKeys /** The fallback language */ fallbackLanguage: string /** The language of the request */ @@ -52,5 +80,10 @@ export type InitTFunction = (args: { export type InitI18n = (args: { config: I18nOptions context: 'api' | 'client' - language?: string + language?: AcceptedLanguages }) => Promise + +export type LanguagePreference = { + language: AcceptedLanguages + quality?: number +} diff --git a/packages/translations/src/utilities/getTranslationsByContext.ts b/packages/translations/src/utilities/getTranslationsByContext.ts index a8126d1814..952bb971d3 100644 --- a/packages/translations/src/utilities/getTranslationsByContext.ts +++ b/packages/translations/src/utilities/getTranslationsByContext.ts @@ -54,10 +54,10 @@ function sortObject(obj) { return sortedObject } -export const getTranslationsByContext = (translations: Language, context: 'api' | 'client') => { +export const getTranslationsByContext = (selectedLanguage: Language, context: 'api' | 'client') => { if (context === 'client') { - return sortObject(filterKeys(translations, '', clientTranslationKeys)) + return sortObject(filterKeys(selectedLanguage.translations, '', clientTranslationKeys)) } else { - return translations + return selectedLanguage.translations } } diff --git a/packages/translations/src/utilities/init.ts b/packages/translations/src/utilities/init.ts index 7101203dbf..5d84dbd214 100644 --- a/packages/translations/src/utilities/init.ts +++ b/packages/translations/src/utilities/init.ts @@ -130,74 +130,9 @@ export const t: TFunctionConstructor = ({ key, translations, vars }) => { return translationString } -type LanguagePreference = { - language: string - quality?: number -} - -function parseAcceptLanguage(header: string): LanguagePreference[] { - return header - .split(',') - .map((lang) => { - const [language, quality] = lang.trim().split(';q=') - return { - language, - quality: quality ? parseFloat(quality) : 1, - } - }) - .sort((a, b) => b.quality - a.quality) // Sort by quality, highest to lowest -} - -export const acceptedLanguages = [ - 'ar', - 'az', - 'bg', - 'cs', - 'de', - 'en', - 'es', - 'fa', - 'fr', - 'hr', - 'hu', - 'it', - 'ja', - 'ko', - 'my', - 'nb', - 'nl', - 'pl', - 'pt', - 'ro', - 'rs', - 'rsLatin', - 'ru', - 'sv', - 'th', - 'tr', - 'ua', - 'vi', - 'zh', - 'zhTw', -] as const - -export function matchLanguage(header: string): string | undefined { - const parsedHeader = parseAcceptLanguage(header) - - for (const { language } of parsedHeader) { - for (const acceptedLanguage of acceptedLanguages) { - if (language.startsWith(acceptedLanguage)) { - return acceptedLanguage - } - } - } - - return undefined -} - const initTFunction: InitTFunction = (args) => { const { config, language, translations } = args - const mergedTranslations = deepMerge(config?.translations?.[language] ?? {}, translations) + const mergedTranslations = deepMerge(translations, config?.translations?.[language] ?? {}) return { t: (key, vars) => { @@ -230,10 +165,7 @@ function memoize(fn: (args: unknown) => Promise, keys: string[]) { export const initI18n: InitI18n = memoize( async ({ config, context, language = 'en' }: Parameters[0]) => { - const translations = getTranslationsByContext( - config.supportedLanguages[language].translations, - context, - ) + const translations = getTranslationsByContext(config.supportedLanguages[language], context) const { t, translations: mergedTranslations } = initTFunction({ config, diff --git a/packages/translations/src/utilities/languages.ts b/packages/translations/src/utilities/languages.ts new file mode 100644 index 0000000000..4e04274004 --- /dev/null +++ b/packages/translations/src/utilities/languages.ts @@ -0,0 +1,165 @@ +import type { AcceptedLanguages, LanguagePreference } from '../types.js' + +export const rtlLanguages = ['ar', 'fa'] as const + +export const acceptedLanguages = [ + 'ar', + 'az', + 'bg', + 'cs', + 'de', + 'en', + 'es', + 'fa', + 'fr', + 'hr', + 'hu', + 'it', + 'ja', + 'ko', + 'my', + 'nb', + 'nl', + 'pl', + 'pt', + 'ro', + 'rs', + 'rsLatin', + 'ru', + 'sv', + 'th', + 'tr', + 'ua', + 'vi', + 'zh', + 'zh-TW', + + /** + * Languages not implemented: + * + * 'af', + * 'am', + * 'ar-sa', + * 'as', + * 'az-latin', + * 'be', + * 'bn-BD', + * 'bn-IN', + * 'bs', + * 'ca', + * 'ca-ES-valencia', + * 'cy', + * 'da', + * 'el', + * 'en-GB', + * 'en-US', + * 'es-ES', + * 'es-US', + * 'es-MX', + * 'et', + * 'eu', + * 'fi', + * 'fil-Latn', + * 'fr-FR', + * 'fr-CA', + * 'ga', + * 'gd-Latn', + * 'gl', + * 'gu', + * 'ha-Latn', + * 'he', + * 'hi', + * 'hr', + * 'hy', + * 'id', + * 'ig-Latn', + * 'is', + * 'it-it', + * 'ka', + * 'kk', + * 'km', + * 'kn', + * 'kok', + * 'ku-Arab', + * 'ky-Cyrl', + * 'lb', + * 'lt', + * 'lv', + * 'mi-Latn', + * 'mk', + * 'ml', + * 'mn-Cyrl', + * 'mr', + * 'ms', + * 'mt', + * 'ne', + * 'nl-BE', + * 'nn', + * 'nso', + * 'or', + * 'pa', + * 'pa-Arab', + * 'prs-Arab', + * 'pt-BR', + * 'pt-PT', + * 'qut-Latn', + * 'quz', + * 'rw', + * 'sd-Arab', + * 'si', + * 'sk', + * 'sl', + * 'sq', + * 'sr-Cyrl-BA', + * 'sr-Cyrl-RS', + * 'sr-Latn-RS', + * 'sw', + * 'ta', + * 'te', + * 'tg-Cyrl', + * 'ti', + * 'tk-Latn', + * 'tn', + * 'tt-Cyrl', + * 'ug-Arab', + * 'uk', + * 'ur', + * 'uz-Latn', + * 'wo', + * 'xh', + * 'yo-Latn', + * 'zh-Hans', + * 'zh-Hant', + * 'zu', + */ +] as const + +function parseAcceptLanguage(acceptLanguageHeader: string): LanguagePreference[] { + return acceptLanguageHeader + .split(',') + .map((lang) => { + const [language, quality] = lang.trim().split(';q=') as [ + AcceptedLanguages, + string | undefined, + ] + return { + language, + quality: quality ? parseFloat(quality) : 1, + } + }) + .sort((a, b) => b.quality - a.quality) // Sort by quality, highest to lowest +} + +export function matchLanguage(acceptLanguageHeader: string): AcceptedLanguages | undefined { + const parsedHeader = parseAcceptLanguage(acceptLanguageHeader) + + let matchedLanguage: AcceptedLanguages + + for (const { language } of parsedHeader) { + if (!matchedLanguage && acceptedLanguages.includes(language)) { + matchedLanguage = language + } + } + + return matchedLanguage +} diff --git a/test/buildConfigWithDefaults.ts b/test/buildConfigWithDefaults.ts index faaf1ed889..c10b1d8313 100644 --- a/test/buildConfigWithDefaults.ts +++ b/test/buildConfigWithDefaults.ts @@ -27,6 +27,7 @@ import { } from '@payloadcms/richtext-lexical' import { de } from '@payloadcms/translations/languages/de' import { en } from '@payloadcms/translations/languages/en' +import { es } from '@payloadcms/translations/languages/es' // import { slateEditor } from '@payloadcms/richtext-slate' import { type Config, buildConfig } from 'payload/config' import sharp from 'sharp' @@ -173,16 +174,18 @@ export async function buildConfigWithDefaults( }), sharp, telemetry: false, - i18n: { - supportedLanguages: { - en, - de, - }, - }, typescript: { declare: false, }, ...testConfig, + i18n: { + supportedLanguages: { + en, + es, + de, + }, + ...(testConfig?.i18n || {}), + }, } config.admin = { From a56d2842fbfb8eed48514a51b8698d5389c68952 Mon Sep 17 00:00:00 2001 From: Jarrod Flesch Date: Tue, 9 Apr 2024 11:44:34 -0400 Subject: [PATCH 029/177] chore: converts ua to uk --- packages/translations/src/exports/all.ts | 4 ++-- packages/translations/src/languages/my.ts | 2 +- packages/translations/src/languages/{ua.ts => uk.ts} | 4 ++-- packages/translations/src/utilities/languages.ts | 3 +-- 4 files changed, 6 insertions(+), 7 deletions(-) rename packages/translations/src/languages/{ua.ts => uk.ts} (99%) diff --git a/packages/translations/src/exports/all.ts b/packages/translations/src/exports/all.ts index 04919e7bd2..4e6b32043c 100644 --- a/packages/translations/src/exports/all.ts +++ b/packages/translations/src/exports/all.ts @@ -26,7 +26,7 @@ import { ru } from '../languages/ru.js' import { sv } from '../languages/sv.js' import { th } from '../languages/th.js' import { tr } from '../languages/tr.js' -import { ua } from '../languages/ua.js' +import { uk } from '../languages/uk.js' import { vi } from '../languages/vi.js' import { zh } from '../languages/zh.js' import { zhTw } from '../languages/zhTw.js' @@ -58,7 +58,7 @@ export const translations = { sv, th, tr, - ua, + uk, vi, zh, 'zh-TW': zhTw, diff --git a/packages/translations/src/languages/my.ts b/packages/translations/src/languages/my.ts index fa054496c4..cd0d2efecb 100644 --- a/packages/translations/src/languages/my.ts +++ b/packages/translations/src/languages/my.ts @@ -1,7 +1,7 @@ import type { Language } from '../types.js' export const my: Language = { - dateFNSKey: 'my', + dateFNSKey: 'en-US', translations: { authentication: { account: 'အကောင့်', diff --git a/packages/translations/src/languages/ua.ts b/packages/translations/src/languages/uk.ts similarity index 99% rename from packages/translations/src/languages/ua.ts rename to packages/translations/src/languages/uk.ts index fe49d3bbd0..25b2d934b5 100644 --- a/packages/translations/src/languages/ua.ts +++ b/packages/translations/src/languages/uk.ts @@ -1,7 +1,7 @@ import type { Language } from '../types.js' -export const ua: Language = { - dateFNSKey: 'ua', +export const uk: Language = { + dateFNSKey: 'en-US', translations: { authentication: { account: 'Обліковий запис', diff --git a/packages/translations/src/utilities/languages.ts b/packages/translations/src/utilities/languages.ts index 4e04274004..2822170741 100644 --- a/packages/translations/src/utilities/languages.ts +++ b/packages/translations/src/utilities/languages.ts @@ -29,7 +29,7 @@ export const acceptedLanguages = [ 'sv', 'th', 'tr', - 'ua', + 'uk', 'vi', 'zh', 'zh-TW', @@ -122,7 +122,6 @@ export const acceptedLanguages = [ * 'tn', * 'tt-Cyrl', * 'ug-Arab', - * 'uk', * 'ur', * 'uz-Latn', * 'wo', From 30fddde066018a43d95d0e677d3ea7bd48b590be Mon Sep 17 00:00:00 2001 From: Jarrod Flesch Date: Tue, 9 Apr 2024 11:51:40 -0400 Subject: [PATCH 030/177] chore: corrects type for getLocalI18n --- .../payload/src/translations/getLocalI18n.ts | 4 +- pnpm-lock.yaml | 4233 ++++++++--------- 2 files changed, 2116 insertions(+), 2121 deletions(-) diff --git a/packages/payload/src/translations/getLocalI18n.ts b/packages/payload/src/translations/getLocalI18n.ts index a96ebdd26c..9397797751 100644 --- a/packages/payload/src/translations/getLocalI18n.ts +++ b/packages/payload/src/translations/getLocalI18n.ts @@ -1,3 +1,5 @@ +import type { AcceptedLanguages } from '@payloadcms/translations' + import { initI18n } from '@payloadcms/translations' import type { SanitizedConfig } from '../config/types.js' @@ -7,7 +9,7 @@ export const getLocalI18n = async ({ language = 'en', }: { config: SanitizedConfig - language?: string + language?: AcceptedLanguages }) => initI18n({ config: config.i18n, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 51286c9745..62136a1675 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -26,20 +26,20 @@ importers: dependencies: '@sentry/react': specifier: ^7.77.0 - version: 7.103.0(react@18.2.0) + version: 7.109.0(react@18.2.0) passport-strategy: specifier: 1.0.0 version: 1.0.0 devDependencies: '@aws-sdk/client-s3': specifier: ^3.525.0 - version: 3.525.0 + version: 3.550.0 '@next/bundle-analyzer': specifier: ^14.1.0 - version: 14.1.0 + version: 14.1.4 '@octokit/core': specifier: ^5.1.0 - version: 5.1.0 + version: 5.2.0 '@payloadcms/eslint-config': specifier: workspace:* version: link:packages/eslint-config-payload @@ -51,10 +51,10 @@ importers: version: 1.43.0 '@swc/cli': specifier: ^0.1.62 - version: 0.1.65(@swc/core@1.4.2) + version: 0.1.65(@swc/core@1.4.13) '@swc/jest': specifier: 0.2.36 - version: 0.2.36(@swc/core@1.4.2) + version: 0.2.36(@swc/core@1.4.13) '@testing-library/jest-dom': specifier: 6.4.2 version: 6.4.2(@types/jest@29.5.12)(jest@29.7.0) @@ -144,7 +144,7 @@ importers: version: 0.20.14-1f2c838 drizzle-orm: specifier: 0.29.4 - version: 0.29.4(@libsql/client@0.5.2)(@types/pg@8.10.2)(@types/react@18.2.74)(pg@8.11.3)(react@18.2.0) + version: 0.29.4(@libsql/client@0.5.6)(@types/pg@8.10.2)(@types/react@18.2.74)(pg@8.11.3)(react@18.2.0) escape-html: specifier: ^1.0.3 version: 1.0.3 @@ -198,10 +198,10 @@ importers: version: 1.2.8 mongodb-memory-server: specifier: ^9.0 - version: 9.1.7 + version: 9.1.8 next: specifier: 14.2.0-canary.22 - version: 14.2.0-canary.22(@babel/core@7.24.0)(react-dom@18.2.0)(react@18.2.0) + version: 14.2.0-canary.22(@babel/core@7.24.4)(react-dom@18.2.0)(react@18.2.0) node-mocks-http: specifier: ^1.14.1 version: 1.14.1 @@ -276,10 +276,10 @@ importers: version: 1.0.1 ts-node: specifier: 10.9.1 - version: 10.9.1(@swc/core@1.4.2)(@types/node@20.12.5)(typescript@5.4.4) + version: 10.9.1(@swc/core@1.4.13)(@types/node@20.12.5)(typescript@5.4.4) tsx: specifier: ^4.7.1 - version: 4.7.1 + version: 4.7.2 turbo: specifier: ^1.13.2 version: 1.13.2 @@ -395,7 +395,7 @@ importers: version: 4.17.1 mongodb-memory-server: specifier: ^9.0 - version: 9.1.7 + version: 9.1.8 payload: specifier: workspace:* version: link:../payload @@ -404,7 +404,7 @@ importers: dependencies: '@libsql/client': specifier: ^0.5.2 - version: 0.5.2 + version: 0.5.6 console-table-printer: specifier: 2.11.2 version: 2.11.2 @@ -413,7 +413,7 @@ importers: version: 0.20.14-1f2c838 drizzle-orm: specifier: 0.29.4 - version: 0.29.4(@libsql/client@0.5.2)(@types/pg@8.10.2)(@types/react@18.2.74)(pg@8.11.3)(react@18.2.0) + version: 0.29.4(@libsql/client@0.5.6)(@types/pg@8.10.2)(@types/react@18.2.74)(pg@8.11.3)(react@18.2.0) pg: specifier: 8.11.3 version: 8.11.3 @@ -629,10 +629,10 @@ importers: version: 1.6.2 next: specifier: 14.2.0-canary.23 - version: 14.2.0-canary.23(@babel/core@7.24.0)(react-dom@18.2.0)(react@18.2.0)(sass@1.71.1) + version: 14.2.0-canary.23(@babel/core@7.24.4)(react-dom@18.2.0)(react@18.2.0)(sass@1.74.1) path-to-regexp: specifier: ^6.2.1 - version: 6.2.1 + version: 6.2.2 qs: specifier: 6.11.2 version: 6.11.2 @@ -644,14 +644,14 @@ importers: version: 8.2.0(react-dom@18.2.0)(react@18.2.0) sass: specifier: ^1.71.1 - version: 1.71.1 + version: 1.74.1 ws: specifier: ^8.16.0 version: 8.16.0 devDependencies: '@next/eslint-plugin-next': specifier: ^14.1.0 - version: 14.1.0 + version: 14.1.4 '@payloadcms/eslint-config': specifier: workspace:* version: link:../eslint-config-payload @@ -666,40 +666,40 @@ importers: version: 8.5.10 css-loader: specifier: ^6.10.0 - version: 6.10.0(webpack@5.90.3) + version: 6.11.0(webpack@5.91.0) css-minimizer-webpack-plugin: specifier: ^6.0.0 - version: 6.0.0(esbuild@0.19.12)(webpack@5.90.3) + version: 6.0.0(esbuild@0.19.12)(webpack@5.91.0) mini-css-extract-plugin: specifier: 1.6.2 - version: 1.6.2(webpack@5.90.3) + version: 1.6.2(webpack@5.91.0) payload: specifier: workspace:* version: link:../payload postcss-loader: specifier: ^8.1.1 - version: 8.1.1(postcss@8.4.35)(typescript@5.4.4)(webpack@5.90.3) + version: 8.1.1(postcss@8.4.38)(typescript@5.4.4)(webpack@5.91.0) postcss-preset-env: specifier: ^9.5.0 - version: 9.5.0(postcss@8.4.35) + version: 9.5.4(postcss@8.4.38) sass-loader: specifier: ^14.1.1 - version: 14.1.1(sass@1.71.1)(webpack@5.90.3) + version: 14.1.1(sass@1.74.1)(webpack@5.91.0) swc-loader: specifier: ^0.2.6 - version: 0.2.6(@swc/core@1.4.2)(webpack@5.90.3) + version: 0.2.6(@swc/core@1.4.13)(webpack@5.91.0) swc-plugin-transform-remove-imports: specifier: ^1.12.1 version: 1.12.1 terser-webpack-plugin: specifier: ^5.3.10 - version: 5.3.10(@swc/core@1.4.2)(esbuild@0.19.12)(webpack@5.90.3) + version: 5.3.10(@swc/core@1.4.13)(esbuild@0.19.12)(webpack@5.91.0) webpack: specifier: ^5.78.0 - version: 5.90.3(@swc/core@1.4.2)(esbuild@0.19.12)(webpack-cli@5.1.4) + version: 5.91.0(@swc/core@1.4.13)(esbuild@0.19.12)(webpack-cli@5.1.4) webpack-cli: specifier: ^5.1.4 - version: 5.1.4(webpack@5.90.3) + version: 5.1.4(webpack@5.91.0) packages/payload: dependencies: @@ -708,7 +708,7 @@ importers: version: link:../translations '@swc-node/core': specifier: ^1.13.0 - version: 1.13.0(@swc/core@1.4.2)(@swc/types@0.1.5) + version: 1.13.0(@swc/core@1.4.13)(@swc/types@0.1.6) '@swc-node/sourcemap-support': specifier: ^0.5.0 version: 0.5.0 @@ -741,13 +741,13 @@ importers: version: 4.1.0 get-tsconfig: specifier: ^4.7.2 - version: 4.7.2 + version: 4.7.3 http-status: specifier: 1.6.2 version: 1.6.2 joi: specifier: ^17.12.1 - version: 17.12.2 + version: 17.12.3 json-schema-to-typescript: specifier: 11.0.3 version: 11.0.3 @@ -877,7 +877,7 @@ importers: version: 7.0.3 file-loader: specifier: 6.2.0 - version: 6.2.0(webpack@5.90.3) + version: 6.2.0(webpack@5.91.0) form-data: specifier: 3.0.1 version: 3.0.1 @@ -892,7 +892,7 @@ importers: version: 1.22.0(graphql@16.8.1) mini-css-extract-plugin: specifier: 1.6.2 - version: 1.6.2(webpack@5.90.3) + version: 1.6.2(webpack@5.91.0) nodemon: specifier: 3.0.3 version: 3.0.3 @@ -922,19 +922,19 @@ importers: dependencies: '@aws-sdk/client-cognito-identity': specifier: ^3.525.0 - version: 3.525.0 + version: 3.549.0 '@aws-sdk/client-s3': specifier: ^3.525.0 - version: 3.525.0 + version: 3.550.0 '@aws-sdk/credential-providers': specifier: ^3.525.0 - version: 3.525.0 + version: 3.549.0 '@aws-sdk/lib-storage': specifier: ^3.525.0 - version: 3.525.1(@aws-sdk/client-s3@3.525.0) + version: 3.550.0(@aws-sdk/client-s3@3.550.0) amazon-cognito-identity-js: specifier: ^6.1.2 - version: 6.3.7 + version: 6.3.12 nodemailer: specifier: 6.9.10 version: 6.9.10 @@ -944,7 +944,7 @@ importers: devDependencies: '@types/jest': specifier: ^29.5.1 - version: 29.5.7 + version: 29.5.12 '@types/nodemailer': specifier: 6.4.14 version: 6.4.14 @@ -953,7 +953,7 @@ importers: version: link:../payload ts-jest: specifier: ^29.1.0 - version: 29.1.2(@babel/core@7.24.0)(esbuild@0.19.12)(jest@29.7.0)(typescript@5.4.4) + version: 29.1.2(@babel/core@7.24.4)(esbuild@0.19.12)(jest@29.7.0)(typescript@5.4.4) packages/plugin-cloud-storage: dependencies: @@ -969,16 +969,16 @@ importers: devDependencies: '@aws-sdk/client-s3': specifier: ^3.525.0 - version: 3.525.0 + version: 3.550.0 '@aws-sdk/lib-storage': specifier: ^3.525.0 - version: 3.525.1(@aws-sdk/client-s3@3.525.0) + version: 3.550.0(@aws-sdk/client-s3@3.550.0) '@azure/storage-blob': specifier: ^12.11.0 version: 12.17.0 '@google-cloud/storage': specifier: ^7.7.0 - version: 7.7.0 + version: 7.9.0 '@types/find-node-modules': specifier: ^2.1.2 version: 2.1.2 @@ -1027,7 +1027,7 @@ importers: version: 18.2.0 ts-node: specifier: 10.9.1 - version: 10.9.1(@swc/core@1.4.2)(@types/node@20.12.5)(typescript@5.4.4) + version: 10.9.1(@swc/core@1.4.13)(@types/node@20.12.5)(typescript@5.4.4) packages/plugin-nested-docs: devDependencies: @@ -1085,13 +1085,13 @@ importers: dependencies: '@sentry/node': specifier: ^7.55.2 - version: 7.103.0 + version: 7.109.0 '@sentry/types': specifier: ^7.54.0 - version: 7.103.0 + version: 7.109.0 express: specifier: ^4.18.2 - version: 4.18.2 + version: 4.19.2 react: specifier: ^18.2.0 version: 18.2.0 @@ -1104,7 +1104,7 @@ importers: version: 4.17.21 '@types/jest': specifier: ^29.5.2 - version: 29.5.7 + version: 29.5.12 '@types/node': specifier: 20.12.5 version: 20.12.5 @@ -1131,10 +1131,10 @@ importers: version: link:../payload ts-jest: specifier: ^29.1.0 - version: 29.1.2(@babel/core@7.24.0)(esbuild@0.19.12)(jest@29.7.0)(typescript@5.4.4) + version: 29.1.2(@babel/core@7.24.4)(esbuild@0.19.12)(jest@29.7.0)(typescript@5.4.4) webpack: specifier: ^5.78.0 - version: 5.90.3(@swc/core@1.4.2)(esbuild@0.19.12)(webpack-cli@5.1.4) + version: 5.91.0(@swc/core@1.4.13)(esbuild@0.19.12)(webpack-cli@5.1.4) packages/plugin-seo: devDependencies: @@ -1198,7 +1198,7 @@ importers: version: 18.2.0 webpack: specifier: ^5.78.0 - version: 5.90.3(@swc/core@1.4.2)(esbuild@0.19.12)(webpack-cli@5.1.4) + version: 5.91.0(@swc/core@1.4.13)(esbuild@0.19.12)(webpack-cli@5.1.4) packages/richtext-lexical: dependencies: @@ -1222,7 +1222,7 @@ importers: version: 0.13.1(@lexical/clipboard@0.13.1)(@lexical/selection@0.13.1)(lexical@0.13.1) '@lexical/react': specifier: 0.13.1 - version: 0.13.1(lexical@0.13.1)(react-dom@18.2.0)(react@18.2.0)(yjs@13.6.12) + version: 0.13.1(lexical@0.13.1)(react-dom@18.2.0)(react@18.2.0)(yjs@13.6.14) '@lexical/rich-text': specifier: 0.13.1 version: 0.13.1(@lexical/clipboard@0.13.1)(@lexical/selection@0.13.1)(@lexical/utils@0.13.1)(lexical@0.13.1) @@ -1341,7 +1341,7 @@ importers: version: link:../eslint-config-payload '@swc/core': specifier: ^1.3.102 - version: 1.4.2 + version: 1.4.13 '@types/react': specifier: 18.2.74 version: 18.2.74 @@ -1395,7 +1395,7 @@ importers: version: 2.3.0 next: specifier: 14.2.0-canary.23 - version: 14.2.0-canary.23(@babel/core@7.24.0)(react-dom@18.2.0)(react@18.2.0)(sass@1.71.1) + version: 14.2.0-canary.23(@babel/core@7.24.4)(react-dom@18.2.0)(react@18.2.0)(sass@1.74.1) object-to-formdata: specifier: 4.5.1 version: 4.5.1 @@ -1450,40 +1450,40 @@ importers: version: 8.3.4 css-loader: specifier: ^6.10.0 - version: 6.10.0(webpack@5.90.3) + version: 6.11.0(webpack@5.91.0) css-minimizer-webpack-plugin: specifier: ^6.0.0 - version: 6.0.0(esbuild@0.19.12)(webpack@5.90.3) + version: 6.0.0(esbuild@0.19.12)(webpack@5.91.0) mini-css-extract-plugin: specifier: 1.6.2 - version: 1.6.2(webpack@5.90.3) + version: 1.6.2(webpack@5.91.0) payload: specifier: workspace:* version: link:../payload postcss-loader: specifier: ^8.1.1 - version: 8.1.1(postcss@8.4.35)(typescript@5.4.4)(webpack@5.90.3) + version: 8.1.1(postcss@8.4.38)(typescript@5.4.4)(webpack@5.91.0) postcss-preset-env: specifier: ^9.5.0 - version: 9.5.0(postcss@8.4.35) + version: 9.5.4(postcss@8.4.38) sass-loader: specifier: ^14.1.1 - version: 14.1.1(sass@1.71.1)(webpack@5.90.3) + version: 14.1.1(sass@1.74.1)(webpack@5.91.0) swc-loader: specifier: ^0.2.6 - version: 0.2.6(@swc/core@1.4.2)(webpack@5.90.3) + version: 0.2.6(@swc/core@1.4.13)(webpack@5.91.0) swc-plugin-transform-remove-imports: specifier: ^1.12.1 version: 1.12.1 terser-webpack-plugin: specifier: ^5.3.10 - version: 5.3.10(@swc/core@1.4.2)(esbuild@0.19.12)(webpack@5.90.3) + version: 5.3.10(@swc/core@1.4.13)(esbuild@0.19.12)(webpack@5.91.0) webpack: specifier: ^5.78.0 - version: 5.90.3(@swc/core@1.4.2)(esbuild@0.19.12)(webpack-cli@5.1.4) + version: 5.91.0(@swc/core@1.4.13)(esbuild@0.19.12)(webpack-cli@5.1.4) webpack-cli: specifier: ^5.1.4 - version: 5.1.4(webpack@5.90.3) + version: 5.1.4(webpack@5.91.0) test: devDependencies: @@ -1588,31 +1588,29 @@ packages: resolution: {integrity: sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ==} dev: true - /@ampproject/remapping@2.2.1: - resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} + /@ampproject/remapping@2.3.0: + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} dependencies: - '@jridgewell/gen-mapping': 0.3.4 - '@jridgewell/trace-mapping': 0.3.23 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 /@aws-crypto/crc32@3.0.0: resolution: {integrity: sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==} - requiresBuild: true dependencies: '@aws-crypto/util': 3.0.0 - '@aws-sdk/types': 3.523.0 + '@aws-sdk/types': 3.535.0 tslib: 1.14.1 /@aws-crypto/crc32c@3.0.0: resolution: {integrity: sha512-ENNPPManmnVJ4BTXlOjAgD7URidbAznURqD0KvfREyc4o20DPYdEldU1f5cQ7Jbj0CJJSPaMIk/9ZshdB3210w==} dependencies: '@aws-crypto/util': 3.0.0 - '@aws-sdk/types': 3.523.0 + '@aws-sdk/types': 3.535.0 tslib: 1.14.1 /@aws-crypto/ie11-detection@3.0.0: resolution: {integrity: sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==} - requiresBuild: true dependencies: tslib: 1.14.1 @@ -1622,21 +1620,20 @@ packages: '@aws-crypto/ie11-detection': 3.0.0 '@aws-crypto/supports-web-crypto': 3.0.0 '@aws-crypto/util': 3.0.0 - '@aws-sdk/types': 3.523.0 - '@aws-sdk/util-locate-window': 3.495.0 + '@aws-sdk/types': 3.535.0 + '@aws-sdk/util-locate-window': 3.535.0 '@aws-sdk/util-utf8-browser': 3.259.0 tslib: 1.14.1 /@aws-crypto/sha256-browser@3.0.0: resolution: {integrity: sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==} - requiresBuild: true dependencies: '@aws-crypto/ie11-detection': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 '@aws-crypto/supports-web-crypto': 3.0.0 '@aws-crypto/util': 3.0.0 - '@aws-sdk/types': 3.523.0 - '@aws-sdk/util-locate-window': 3.495.0 + '@aws-sdk/types': 3.535.0 + '@aws-sdk/util-locate-window': 3.535.0 '@aws-sdk/util-utf8-browser': 3.259.0 tslib: 1.14.1 @@ -1644,689 +1641,659 @@ packages: resolution: {integrity: sha512-Nr1QJIbW/afYYGzYvrF70LtaHrIRtd4TNAglX8BvlfxJLZ45SAmueIKYl5tWoNBPzp65ymXGFK0Bb1vZUpuc9g==} dependencies: '@aws-crypto/util': 1.2.2 - '@aws-sdk/types': 3.523.0 + '@aws-sdk/types': 3.535.0 tslib: 1.14.1 dev: false /@aws-crypto/sha256-js@3.0.0: resolution: {integrity: sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==} - requiresBuild: true dependencies: '@aws-crypto/util': 3.0.0 - '@aws-sdk/types': 3.523.0 + '@aws-sdk/types': 3.535.0 tslib: 1.14.1 /@aws-crypto/supports-web-crypto@3.0.0: resolution: {integrity: sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==} - requiresBuild: true dependencies: tslib: 1.14.1 /@aws-crypto/util@1.2.2: resolution: {integrity: sha512-H8PjG5WJ4wz0UXAFXeJjWCW1vkvIJ3qUUD+rGRwJ2/hj+xT58Qle2MTql/2MGzkU+1JLAFuR6aJpLAjHwhmwwg==} dependencies: - '@aws-sdk/types': 3.523.0 + '@aws-sdk/types': 3.535.0 '@aws-sdk/util-utf8-browser': 3.259.0 tslib: 1.14.1 dev: false /@aws-crypto/util@3.0.0: resolution: {integrity: sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==} - requiresBuild: true dependencies: - '@aws-sdk/types': 3.523.0 + '@aws-sdk/types': 3.535.0 '@aws-sdk/util-utf8-browser': 3.259.0 tslib: 1.14.1 - /@aws-sdk/client-cognito-identity@3.525.0: - resolution: {integrity: sha512-LxI9rfn6Vy/EX6I7as14PAKqAhUwVQviaMV/xCLQIubgdVj1xfexVURdiSk7GQshpcwtrs+GQWV21yP+3AX/7A==} + /@aws-sdk/client-cognito-identity@3.549.0: + resolution: {integrity: sha512-KrmjksANuWZTLx8JGtHXsHJ8bA72DoH5rMXhAUQSeSwGYlJKQWeBN9um4XtOOP6fMO9FtEorsG9cxJRk92M7Yw==} engines: {node: '>=14.0.0'} - requiresBuild: true dependencies: '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/client-sts': 3.525.0(@aws-sdk/credential-provider-node@3.525.0) - '@aws-sdk/core': 3.525.0 - '@aws-sdk/credential-provider-node': 3.525.0 - '@aws-sdk/middleware-host-header': 3.523.0 - '@aws-sdk/middleware-logger': 3.523.0 - '@aws-sdk/middleware-recursion-detection': 3.523.0 - '@aws-sdk/middleware-user-agent': 3.525.0 - '@aws-sdk/region-config-resolver': 3.525.0 - '@aws-sdk/types': 3.523.0 - '@aws-sdk/util-endpoints': 3.525.0 - '@aws-sdk/util-user-agent-browser': 3.523.0 - '@aws-sdk/util-user-agent-node': 3.525.0 - '@smithy/config-resolver': 2.1.4 - '@smithy/core': 1.3.5 - '@smithy/fetch-http-handler': 2.4.3 - '@smithy/hash-node': 2.1.3 - '@smithy/invalid-dependency': 2.1.3 - '@smithy/middleware-content-length': 2.1.3 - '@smithy/middleware-endpoint': 2.4.4 - '@smithy/middleware-retry': 2.1.4 - '@smithy/middleware-serde': 2.1.3 - '@smithy/middleware-stack': 2.1.3 - '@smithy/node-config-provider': 2.2.4 - '@smithy/node-http-handler': 2.4.1 - '@smithy/protocol-http': 3.2.1 - '@smithy/smithy-client': 2.4.2 - '@smithy/types': 2.10.1 - '@smithy/url-parser': 2.1.3 - '@smithy/util-base64': 2.1.1 - '@smithy/util-body-length-browser': 2.1.1 - '@smithy/util-body-length-node': 2.2.1 - '@smithy/util-defaults-mode-browser': 2.1.4 - '@smithy/util-defaults-mode-node': 2.2.3 - '@smithy/util-endpoints': 1.1.4 - '@smithy/util-middleware': 2.1.3 - '@smithy/util-retry': 2.1.3 - '@smithy/util-utf8': 2.1.1 + '@aws-sdk/client-sts': 3.549.0(@aws-sdk/credential-provider-node@3.549.0) + '@aws-sdk/core': 3.549.0 + '@aws-sdk/credential-provider-node': 3.549.0 + '@aws-sdk/middleware-host-header': 3.535.0 + '@aws-sdk/middleware-logger': 3.535.0 + '@aws-sdk/middleware-recursion-detection': 3.535.0 + '@aws-sdk/middleware-user-agent': 3.540.0 + '@aws-sdk/region-config-resolver': 3.535.0 + '@aws-sdk/types': 3.535.0 + '@aws-sdk/util-endpoints': 3.540.0 + '@aws-sdk/util-user-agent-browser': 3.535.0 + '@aws-sdk/util-user-agent-node': 3.535.0 + '@smithy/config-resolver': 2.2.0 + '@smithy/core': 1.4.2 + '@smithy/fetch-http-handler': 2.5.0 + '@smithy/hash-node': 2.2.0 + '@smithy/invalid-dependency': 2.2.0 + '@smithy/middleware-content-length': 2.2.0 + '@smithy/middleware-endpoint': 2.5.1 + '@smithy/middleware-retry': 2.3.1 + '@smithy/middleware-serde': 2.3.0 + '@smithy/middleware-stack': 2.2.0 + '@smithy/node-config-provider': 2.3.0 + '@smithy/node-http-handler': 2.5.0 + '@smithy/protocol-http': 3.3.0 + '@smithy/smithy-client': 2.5.1 + '@smithy/types': 2.12.0 + '@smithy/url-parser': 2.2.0 + '@smithy/util-base64': 2.3.0 + '@smithy/util-body-length-browser': 2.2.0 + '@smithy/util-body-length-node': 2.3.0 + '@smithy/util-defaults-mode-browser': 2.2.1 + '@smithy/util-defaults-mode-node': 2.3.1 + '@smithy/util-endpoints': 1.2.0 + '@smithy/util-middleware': 2.2.0 + '@smithy/util-retry': 2.2.0 + '@smithy/util-utf8': 2.3.0 tslib: 2.6.2 transitivePeerDependencies: - aws-crt - /@aws-sdk/client-s3@3.525.0: - resolution: {integrity: sha512-hoMGH8G9rezZDiJPsMjsyRVNfVHHa4u6lcZ09SQMmtFHWK0FUcC0DIKR5ripV5qGDbnV54i2JotXlLzAv0aNCQ==} + /@aws-sdk/client-s3@3.550.0: + resolution: {integrity: sha512-45jjDQI0Q37PIteWhywhlExxYaiUeOsTsbE62b+U/FOjYV8tirC8uBY9eHeHaP4IPVGHeQWvEYrFJHNU+qsQLQ==} engines: {node: '>=14.0.0'} dependencies: '@aws-crypto/sha1-browser': 3.0.0 '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/client-sts': 3.525.0(@aws-sdk/credential-provider-node@3.525.0) - '@aws-sdk/core': 3.525.0 - '@aws-sdk/credential-provider-node': 3.525.0 - '@aws-sdk/middleware-bucket-endpoint': 3.525.0 - '@aws-sdk/middleware-expect-continue': 3.523.0 - '@aws-sdk/middleware-flexible-checksums': 3.523.0 - '@aws-sdk/middleware-host-header': 3.523.0 - '@aws-sdk/middleware-location-constraint': 3.523.0 - '@aws-sdk/middleware-logger': 3.523.0 - '@aws-sdk/middleware-recursion-detection': 3.523.0 - '@aws-sdk/middleware-sdk-s3': 3.525.0 - '@aws-sdk/middleware-signing': 3.523.0 - '@aws-sdk/middleware-ssec': 3.523.0 - '@aws-sdk/middleware-user-agent': 3.525.0 - '@aws-sdk/region-config-resolver': 3.525.0 - '@aws-sdk/signature-v4-multi-region': 3.525.0 - '@aws-sdk/types': 3.523.0 - '@aws-sdk/util-endpoints': 3.525.0 - '@aws-sdk/util-user-agent-browser': 3.523.0 - '@aws-sdk/util-user-agent-node': 3.525.0 - '@aws-sdk/xml-builder': 3.523.0 - '@smithy/config-resolver': 2.1.4 - '@smithy/core': 1.3.5 - '@smithy/eventstream-serde-browser': 2.1.3 - '@smithy/eventstream-serde-config-resolver': 2.1.3 - '@smithy/eventstream-serde-node': 2.1.3 - '@smithy/fetch-http-handler': 2.4.3 - '@smithy/hash-blob-browser': 2.1.3 - '@smithy/hash-node': 2.1.3 - '@smithy/hash-stream-node': 2.1.3 - '@smithy/invalid-dependency': 2.1.3 - '@smithy/md5-js': 2.1.3 - '@smithy/middleware-content-length': 2.1.3 - '@smithy/middleware-endpoint': 2.4.4 - '@smithy/middleware-retry': 2.1.4 - '@smithy/middleware-serde': 2.1.3 - '@smithy/middleware-stack': 2.1.3 - '@smithy/node-config-provider': 2.2.4 - '@smithy/node-http-handler': 2.4.1 - '@smithy/protocol-http': 3.2.1 - '@smithy/smithy-client': 2.4.2 - '@smithy/types': 2.10.1 - '@smithy/url-parser': 2.1.3 - '@smithy/util-base64': 2.1.1 - '@smithy/util-body-length-browser': 2.1.1 - '@smithy/util-body-length-node': 2.2.1 - '@smithy/util-defaults-mode-browser': 2.1.4 - '@smithy/util-defaults-mode-node': 2.2.3 - '@smithy/util-endpoints': 1.1.4 - '@smithy/util-retry': 2.1.3 - '@smithy/util-stream': 2.1.3 - '@smithy/util-utf8': 2.1.1 - '@smithy/util-waiter': 2.1.3 + '@aws-sdk/client-sts': 3.549.0(@aws-sdk/credential-provider-node@3.549.0) + '@aws-sdk/core': 3.549.0 + '@aws-sdk/credential-provider-node': 3.549.0 + '@aws-sdk/middleware-bucket-endpoint': 3.535.0 + '@aws-sdk/middleware-expect-continue': 3.535.0 + '@aws-sdk/middleware-flexible-checksums': 3.535.0 + '@aws-sdk/middleware-host-header': 3.535.0 + '@aws-sdk/middleware-location-constraint': 3.535.0 + '@aws-sdk/middleware-logger': 3.535.0 + '@aws-sdk/middleware-recursion-detection': 3.535.0 + '@aws-sdk/middleware-sdk-s3': 3.535.0 + '@aws-sdk/middleware-signing': 3.535.0 + '@aws-sdk/middleware-ssec': 3.537.0 + '@aws-sdk/middleware-user-agent': 3.540.0 + '@aws-sdk/region-config-resolver': 3.535.0 + '@aws-sdk/signature-v4-multi-region': 3.535.0 + '@aws-sdk/types': 3.535.0 + '@aws-sdk/util-endpoints': 3.540.0 + '@aws-sdk/util-user-agent-browser': 3.535.0 + '@aws-sdk/util-user-agent-node': 3.535.0 + '@aws-sdk/xml-builder': 3.535.0 + '@smithy/config-resolver': 2.2.0 + '@smithy/core': 1.4.2 + '@smithy/eventstream-serde-browser': 2.2.0 + '@smithy/eventstream-serde-config-resolver': 2.2.0 + '@smithy/eventstream-serde-node': 2.2.0 + '@smithy/fetch-http-handler': 2.5.0 + '@smithy/hash-blob-browser': 2.2.0 + '@smithy/hash-node': 2.2.0 + '@smithy/hash-stream-node': 2.2.0 + '@smithy/invalid-dependency': 2.2.0 + '@smithy/md5-js': 2.2.0 + '@smithy/middleware-content-length': 2.2.0 + '@smithy/middleware-endpoint': 2.5.1 + '@smithy/middleware-retry': 2.3.1 + '@smithy/middleware-serde': 2.3.0 + '@smithy/middleware-stack': 2.2.0 + '@smithy/node-config-provider': 2.3.0 + '@smithy/node-http-handler': 2.5.0 + '@smithy/protocol-http': 3.3.0 + '@smithy/smithy-client': 2.5.1 + '@smithy/types': 2.12.0 + '@smithy/url-parser': 2.2.0 + '@smithy/util-base64': 2.3.0 + '@smithy/util-body-length-browser': 2.2.0 + '@smithy/util-body-length-node': 2.3.0 + '@smithy/util-defaults-mode-browser': 2.2.1 + '@smithy/util-defaults-mode-node': 2.3.1 + '@smithy/util-endpoints': 1.2.0 + '@smithy/util-retry': 2.2.0 + '@smithy/util-stream': 2.2.0 + '@smithy/util-utf8': 2.3.0 + '@smithy/util-waiter': 2.2.0 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + + /@aws-sdk/client-sso-oidc@3.549.0(@aws-sdk/credential-provider-node@3.549.0): + resolution: {integrity: sha512-FbB4A78ILAb8sM4TfBd+3CrQcfZIhe0gtVZNbaxpq5cJZh1K7oZ8vPfKw4do9JWkDUXPLsD9Bwz12f8/JpAb6Q==} + engines: {node: '>=14.0.0'} + peerDependencies: + '@aws-sdk/credential-provider-node': ^3.549.0 + dependencies: + '@aws-crypto/sha256-browser': 3.0.0 + '@aws-crypto/sha256-js': 3.0.0 + '@aws-sdk/client-sts': 3.549.0(@aws-sdk/credential-provider-node@3.549.0) + '@aws-sdk/core': 3.549.0 + '@aws-sdk/credential-provider-node': 3.549.0 + '@aws-sdk/middleware-host-header': 3.535.0 + '@aws-sdk/middleware-logger': 3.535.0 + '@aws-sdk/middleware-recursion-detection': 3.535.0 + '@aws-sdk/middleware-user-agent': 3.540.0 + '@aws-sdk/region-config-resolver': 3.535.0 + '@aws-sdk/types': 3.535.0 + '@aws-sdk/util-endpoints': 3.540.0 + '@aws-sdk/util-user-agent-browser': 3.535.0 + '@aws-sdk/util-user-agent-node': 3.535.0 + '@smithy/config-resolver': 2.2.0 + '@smithy/core': 1.4.2 + '@smithy/fetch-http-handler': 2.5.0 + '@smithy/hash-node': 2.2.0 + '@smithy/invalid-dependency': 2.2.0 + '@smithy/middleware-content-length': 2.2.0 + '@smithy/middleware-endpoint': 2.5.1 + '@smithy/middleware-retry': 2.3.1 + '@smithy/middleware-serde': 2.3.0 + '@smithy/middleware-stack': 2.2.0 + '@smithy/node-config-provider': 2.3.0 + '@smithy/node-http-handler': 2.5.0 + '@smithy/protocol-http': 3.3.0 + '@smithy/smithy-client': 2.5.1 + '@smithy/types': 2.12.0 + '@smithy/url-parser': 2.2.0 + '@smithy/util-base64': 2.3.0 + '@smithy/util-body-length-browser': 2.2.0 + '@smithy/util-body-length-node': 2.3.0 + '@smithy/util-defaults-mode-browser': 2.2.1 + '@smithy/util-defaults-mode-node': 2.3.1 + '@smithy/util-endpoints': 1.2.0 + '@smithy/util-middleware': 2.2.0 + '@smithy/util-retry': 2.2.0 + '@smithy/util-utf8': 2.3.0 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + + /@aws-sdk/client-sso@3.549.0: + resolution: {integrity: sha512-lz+yflOAj5Q263FlCsKpNqttaCb2NPh8jC76gVCqCt7TPxRDBYVaqg0OZYluDaETIDNJi4DwN2Azcck7ilwuPw==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-crypto/sha256-browser': 3.0.0 + '@aws-crypto/sha256-js': 3.0.0 + '@aws-sdk/core': 3.549.0 + '@aws-sdk/middleware-host-header': 3.535.0 + '@aws-sdk/middleware-logger': 3.535.0 + '@aws-sdk/middleware-recursion-detection': 3.535.0 + '@aws-sdk/middleware-user-agent': 3.540.0 + '@aws-sdk/region-config-resolver': 3.535.0 + '@aws-sdk/types': 3.535.0 + '@aws-sdk/util-endpoints': 3.540.0 + '@aws-sdk/util-user-agent-browser': 3.535.0 + '@aws-sdk/util-user-agent-node': 3.535.0 + '@smithy/config-resolver': 2.2.0 + '@smithy/core': 1.4.2 + '@smithy/fetch-http-handler': 2.5.0 + '@smithy/hash-node': 2.2.0 + '@smithy/invalid-dependency': 2.2.0 + '@smithy/middleware-content-length': 2.2.0 + '@smithy/middleware-endpoint': 2.5.1 + '@smithy/middleware-retry': 2.3.1 + '@smithy/middleware-serde': 2.3.0 + '@smithy/middleware-stack': 2.2.0 + '@smithy/node-config-provider': 2.3.0 + '@smithy/node-http-handler': 2.5.0 + '@smithy/protocol-http': 3.3.0 + '@smithy/smithy-client': 2.5.1 + '@smithy/types': 2.12.0 + '@smithy/url-parser': 2.2.0 + '@smithy/util-base64': 2.3.0 + '@smithy/util-body-length-browser': 2.2.0 + '@smithy/util-body-length-node': 2.3.0 + '@smithy/util-defaults-mode-browser': 2.2.1 + '@smithy/util-defaults-mode-node': 2.3.1 + '@smithy/util-endpoints': 1.2.0 + '@smithy/util-middleware': 2.2.0 + '@smithy/util-retry': 2.2.0 + '@smithy/util-utf8': 2.3.0 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + + /@aws-sdk/client-sts@3.549.0(@aws-sdk/credential-provider-node@3.549.0): + resolution: {integrity: sha512-63IreJ598Dzvpb+6sy81KfIX5iQxnrWSEtlyeCdC2GO6gmSQVwJzc9kr5pAC83lHmlZcm/Q3KZr3XBhRQqP0og==} + engines: {node: '>=14.0.0'} + peerDependencies: + '@aws-sdk/credential-provider-node': ^3.549.0 + dependencies: + '@aws-crypto/sha256-browser': 3.0.0 + '@aws-crypto/sha256-js': 3.0.0 + '@aws-sdk/core': 3.549.0 + '@aws-sdk/credential-provider-node': 3.549.0 + '@aws-sdk/middleware-host-header': 3.535.0 + '@aws-sdk/middleware-logger': 3.535.0 + '@aws-sdk/middleware-recursion-detection': 3.535.0 + '@aws-sdk/middleware-user-agent': 3.540.0 + '@aws-sdk/region-config-resolver': 3.535.0 + '@aws-sdk/types': 3.535.0 + '@aws-sdk/util-endpoints': 3.540.0 + '@aws-sdk/util-user-agent-browser': 3.535.0 + '@aws-sdk/util-user-agent-node': 3.535.0 + '@smithy/config-resolver': 2.2.0 + '@smithy/core': 1.4.2 + '@smithy/fetch-http-handler': 2.5.0 + '@smithy/hash-node': 2.2.0 + '@smithy/invalid-dependency': 2.2.0 + '@smithy/middleware-content-length': 2.2.0 + '@smithy/middleware-endpoint': 2.5.1 + '@smithy/middleware-retry': 2.3.1 + '@smithy/middleware-serde': 2.3.0 + '@smithy/middleware-stack': 2.2.0 + '@smithy/node-config-provider': 2.3.0 + '@smithy/node-http-handler': 2.5.0 + '@smithy/protocol-http': 3.3.0 + '@smithy/smithy-client': 2.5.1 + '@smithy/types': 2.12.0 + '@smithy/url-parser': 2.2.0 + '@smithy/util-base64': 2.3.0 + '@smithy/util-body-length-browser': 2.2.0 + '@smithy/util-body-length-node': 2.3.0 + '@smithy/util-defaults-mode-browser': 2.2.1 + '@smithy/util-defaults-mode-node': 2.3.1 + '@smithy/util-endpoints': 1.2.0 + '@smithy/util-middleware': 2.2.0 + '@smithy/util-retry': 2.2.0 + '@smithy/util-utf8': 2.3.0 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + + /@aws-sdk/core@3.549.0: + resolution: {integrity: sha512-jC61OxJn72r/BbuDRCcluiw05Xw9eVLG0CwxQpF3RocxfxyZqlrGYaGecZ8Wy+7g/3sqGRC/Ar5eUhU1YcLx7w==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/core': 1.4.2 + '@smithy/protocol-http': 3.3.0 + '@smithy/signature-v4': 2.2.1 + '@smithy/smithy-client': 2.5.1 + '@smithy/types': 2.12.0 fast-xml-parser: 4.2.5 tslib: 2.6.2 - transitivePeerDependencies: - - aws-crt - /@aws-sdk/client-sso-oidc@3.525.0(@aws-sdk/credential-provider-node@3.525.0): - resolution: {integrity: sha512-zz13k/6RkjPSLmReSeGxd8wzGiiZa4Odr2Tv3wTcxClM4wOjD+zOgGv4Fe32b9AMqaueiCdjbvdu7AKcYxFA4A==} + /@aws-sdk/credential-provider-cognito-identity@3.549.0: + resolution: {integrity: sha512-EADYw4JimdZ3mGhxtAXSdARNunw/4T7Vd82vvsvqavqL3S9jt5+2SrZ2/PYrweJHLRFggMHcBs82FRql1efMaA==} engines: {node: '>=14.0.0'} - requiresBuild: true - peerDependencies: - '@aws-sdk/credential-provider-node': ^3.525.0 dependencies: - '@aws-crypto/sha256-browser': 3.0.0 - '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/client-sts': 3.525.0(@aws-sdk/credential-provider-node@3.525.0) - '@aws-sdk/core': 3.525.0 - '@aws-sdk/credential-provider-node': 3.525.0 - '@aws-sdk/middleware-host-header': 3.523.0 - '@aws-sdk/middleware-logger': 3.523.0 - '@aws-sdk/middleware-recursion-detection': 3.523.0 - '@aws-sdk/middleware-user-agent': 3.525.0 - '@aws-sdk/region-config-resolver': 3.525.0 - '@aws-sdk/types': 3.523.0 - '@aws-sdk/util-endpoints': 3.525.0 - '@aws-sdk/util-user-agent-browser': 3.523.0 - '@aws-sdk/util-user-agent-node': 3.525.0 - '@smithy/config-resolver': 2.1.4 - '@smithy/core': 1.3.5 - '@smithy/fetch-http-handler': 2.4.3 - '@smithy/hash-node': 2.1.3 - '@smithy/invalid-dependency': 2.1.3 - '@smithy/middleware-content-length': 2.1.3 - '@smithy/middleware-endpoint': 2.4.4 - '@smithy/middleware-retry': 2.1.4 - '@smithy/middleware-serde': 2.1.3 - '@smithy/middleware-stack': 2.1.3 - '@smithy/node-config-provider': 2.2.4 - '@smithy/node-http-handler': 2.4.1 - '@smithy/protocol-http': 3.2.1 - '@smithy/smithy-client': 2.4.2 - '@smithy/types': 2.10.1 - '@smithy/url-parser': 2.1.3 - '@smithy/util-base64': 2.1.1 - '@smithy/util-body-length-browser': 2.1.1 - '@smithy/util-body-length-node': 2.2.1 - '@smithy/util-defaults-mode-browser': 2.1.4 - '@smithy/util-defaults-mode-node': 2.2.3 - '@smithy/util-endpoints': 1.1.4 - '@smithy/util-middleware': 2.1.3 - '@smithy/util-retry': 2.1.3 - '@smithy/util-utf8': 2.1.1 + '@aws-sdk/client-cognito-identity': 3.549.0 + '@aws-sdk/types': 3.535.0 + '@smithy/property-provider': 2.2.0 + '@smithy/types': 2.12.0 tslib: 2.6.2 transitivePeerDependencies: - aws-crt - /@aws-sdk/client-sso@3.525.0: - resolution: {integrity: sha512-6KwGQWFoNLH1UupdWPFdKPfTgjSz1kN8/r8aCzuvvXBe4Pz+iDUZ6FEJzGWNc9AapjvZDNO1hs23slomM9rTaA==} + /@aws-sdk/credential-provider-env@3.535.0: + resolution: {integrity: sha512-XppwO8c0GCGSAvdzyJOhbtktSEaShg14VJKg8mpMa1XcgqzmcqqHQjtDWbx5rZheY1VdpXZhpEzJkB6LpQejpA==} engines: {node: '>=14.0.0'} - requiresBuild: true dependencies: - '@aws-crypto/sha256-browser': 3.0.0 - '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/core': 3.525.0 - '@aws-sdk/middleware-host-header': 3.523.0 - '@aws-sdk/middleware-logger': 3.523.0 - '@aws-sdk/middleware-recursion-detection': 3.523.0 - '@aws-sdk/middleware-user-agent': 3.525.0 - '@aws-sdk/region-config-resolver': 3.525.0 - '@aws-sdk/types': 3.523.0 - '@aws-sdk/util-endpoints': 3.525.0 - '@aws-sdk/util-user-agent-browser': 3.523.0 - '@aws-sdk/util-user-agent-node': 3.525.0 - '@smithy/config-resolver': 2.1.4 - '@smithy/core': 1.3.5 - '@smithy/fetch-http-handler': 2.4.3 - '@smithy/hash-node': 2.1.3 - '@smithy/invalid-dependency': 2.1.3 - '@smithy/middleware-content-length': 2.1.3 - '@smithy/middleware-endpoint': 2.4.4 - '@smithy/middleware-retry': 2.1.4 - '@smithy/middleware-serde': 2.1.3 - '@smithy/middleware-stack': 2.1.3 - '@smithy/node-config-provider': 2.2.4 - '@smithy/node-http-handler': 2.4.1 - '@smithy/protocol-http': 3.2.1 - '@smithy/smithy-client': 2.4.2 - '@smithy/types': 2.10.1 - '@smithy/url-parser': 2.1.3 - '@smithy/util-base64': 2.1.1 - '@smithy/util-body-length-browser': 2.1.1 - '@smithy/util-body-length-node': 2.2.1 - '@smithy/util-defaults-mode-browser': 2.1.4 - '@smithy/util-defaults-mode-node': 2.2.3 - '@smithy/util-endpoints': 1.1.4 - '@smithy/util-middleware': 2.1.3 - '@smithy/util-retry': 2.1.3 - '@smithy/util-utf8': 2.1.1 - tslib: 2.6.2 - transitivePeerDependencies: - - aws-crt - - /@aws-sdk/client-sts@3.525.0(@aws-sdk/credential-provider-node@3.525.0): - resolution: {integrity: sha512-a8NUGRvO6rkfTZCbMaCsjDjLbERCwIUU9dIywFYcRgbFhkupJ7fSaZz3Het98U51M9ZbTEpaTa3fz0HaJv8VJw==} - engines: {node: '>=14.0.0'} - requiresBuild: true - peerDependencies: - '@aws-sdk/credential-provider-node': ^3.525.0 - dependencies: - '@aws-crypto/sha256-browser': 3.0.0 - '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/core': 3.525.0 - '@aws-sdk/credential-provider-node': 3.525.0 - '@aws-sdk/middleware-host-header': 3.523.0 - '@aws-sdk/middleware-logger': 3.523.0 - '@aws-sdk/middleware-recursion-detection': 3.523.0 - '@aws-sdk/middleware-user-agent': 3.525.0 - '@aws-sdk/region-config-resolver': 3.525.0 - '@aws-sdk/types': 3.523.0 - '@aws-sdk/util-endpoints': 3.525.0 - '@aws-sdk/util-user-agent-browser': 3.523.0 - '@aws-sdk/util-user-agent-node': 3.525.0 - '@smithy/config-resolver': 2.1.4 - '@smithy/core': 1.3.5 - '@smithy/fetch-http-handler': 2.4.3 - '@smithy/hash-node': 2.1.3 - '@smithy/invalid-dependency': 2.1.3 - '@smithy/middleware-content-length': 2.1.3 - '@smithy/middleware-endpoint': 2.4.4 - '@smithy/middleware-retry': 2.1.4 - '@smithy/middleware-serde': 2.1.3 - '@smithy/middleware-stack': 2.1.3 - '@smithy/node-config-provider': 2.2.4 - '@smithy/node-http-handler': 2.4.1 - '@smithy/protocol-http': 3.2.1 - '@smithy/smithy-client': 2.4.2 - '@smithy/types': 2.10.1 - '@smithy/url-parser': 2.1.3 - '@smithy/util-base64': 2.1.1 - '@smithy/util-body-length-browser': 2.1.1 - '@smithy/util-body-length-node': 2.2.1 - '@smithy/util-defaults-mode-browser': 2.1.4 - '@smithy/util-defaults-mode-node': 2.2.3 - '@smithy/util-endpoints': 1.1.4 - '@smithy/util-middleware': 2.1.3 - '@smithy/util-retry': 2.1.3 - '@smithy/util-utf8': 2.1.1 - fast-xml-parser: 4.2.5 - tslib: 2.6.2 - transitivePeerDependencies: - - aws-crt - - /@aws-sdk/core@3.525.0: - resolution: {integrity: sha512-E3LtEtMWCriQOFZpVKpLYzbdw/v2PAOEAMhn2VRRZ1g0/g1TXzQrfhEU2yd8l/vQEJaCJ82ooGGg7YECviBUxA==} - engines: {node: '>=14.0.0'} - requiresBuild: true - dependencies: - '@smithy/core': 1.3.5 - '@smithy/protocol-http': 3.2.1 - '@smithy/signature-v4': 2.1.3 - '@smithy/smithy-client': 2.4.2 - '@smithy/types': 2.10.1 + '@aws-sdk/types': 3.535.0 + '@smithy/property-provider': 2.2.0 + '@smithy/types': 2.12.0 tslib: 2.6.2 - /@aws-sdk/credential-provider-cognito-identity@3.525.0: - resolution: {integrity: sha512-0djjCN/zN6QFQt1xU64VBOSRP4wJckU6U7FjLPrGpL6w03hF0dUmVUXjhQZe5WKNPCicVc2S3BYPohl/PzCx1w==} + /@aws-sdk/credential-provider-http@3.535.0: + resolution: {integrity: sha512-kdj1wCmOMZ29jSlUskRqN04S6fJ4dvt0Nq9Z32SA6wO7UG8ht6Ot9h/au/eTWJM3E1somZ7D771oK7dQt9b8yw==} engines: {node: '>=14.0.0'} - requiresBuild: true dependencies: - '@aws-sdk/client-cognito-identity': 3.525.0 - '@aws-sdk/types': 3.523.0 - '@smithy/property-provider': 2.1.3 - '@smithy/types': 2.10.1 - tslib: 2.6.2 - transitivePeerDependencies: - - aws-crt - - /@aws-sdk/credential-provider-env@3.523.0: - resolution: {integrity: sha512-Y6DWdH6/OuMDoNKVzZlNeBc6f1Yjk1lYMjANKpIhMbkRCvLJw/PYZKOZa8WpXbTYdgg9XLjKybnLIb3ww3uuzA==} - engines: {node: '>=14.0.0'} - requiresBuild: true - dependencies: - '@aws-sdk/types': 3.523.0 - '@smithy/property-provider': 2.1.3 - '@smithy/types': 2.10.1 + '@aws-sdk/types': 3.535.0 + '@smithy/fetch-http-handler': 2.5.0 + '@smithy/node-http-handler': 2.5.0 + '@smithy/property-provider': 2.2.0 + '@smithy/protocol-http': 3.3.0 + '@smithy/smithy-client': 2.5.1 + '@smithy/types': 2.12.0 + '@smithy/util-stream': 2.2.0 tslib: 2.6.2 - /@aws-sdk/credential-provider-http@3.525.0: - resolution: {integrity: sha512-RNWQGuSBQZhl3iqklOslUEfQ4br1V3DCPboMpeqFtddUWJV3m2u2extFur9/4Uy+1EHVF120IwZUKtd8dF+ibw==} + /@aws-sdk/credential-provider-ini@3.549.0(@aws-sdk/credential-provider-node@3.549.0): + resolution: {integrity: sha512-k6IIrluZjQpzui5Din8fW3bFFhHaJ64XrsfYx0Ks1mb7xan84dJxmYP3tdDDmLzUeJv5h95ag88taHfjY9rakA==} engines: {node: '>=14.0.0'} - requiresBuild: true dependencies: - '@aws-sdk/types': 3.523.0 - '@smithy/fetch-http-handler': 2.4.3 - '@smithy/node-http-handler': 2.4.1 - '@smithy/property-provider': 2.1.3 - '@smithy/protocol-http': 3.2.1 - '@smithy/smithy-client': 2.4.2 - '@smithy/types': 2.10.1 - '@smithy/util-stream': 2.1.3 - tslib: 2.6.2 - - /@aws-sdk/credential-provider-ini@3.525.0(@aws-sdk/credential-provider-node@3.525.0): - resolution: {integrity: sha512-JDnccfK5JRb9jcgpc9lirL9PyCwGIqY0nKdw3LlX5WL5vTpTG4E1q7rLAlpNh7/tFD1n66Itarfv2tsyHMIqCw==} - engines: {node: '>=14.0.0'} - requiresBuild: true - dependencies: - '@aws-sdk/client-sts': 3.525.0(@aws-sdk/credential-provider-node@3.525.0) - '@aws-sdk/credential-provider-env': 3.523.0 - '@aws-sdk/credential-provider-process': 3.523.0 - '@aws-sdk/credential-provider-sso': 3.525.0(@aws-sdk/credential-provider-node@3.525.0) - '@aws-sdk/credential-provider-web-identity': 3.525.0(@aws-sdk/credential-provider-node@3.525.0) - '@aws-sdk/types': 3.523.0 - '@smithy/credential-provider-imds': 2.2.4 - '@smithy/property-provider': 2.1.3 - '@smithy/shared-ini-file-loader': 2.3.4 - '@smithy/types': 2.10.1 + '@aws-sdk/client-sts': 3.549.0(@aws-sdk/credential-provider-node@3.549.0) + '@aws-sdk/credential-provider-env': 3.535.0 + '@aws-sdk/credential-provider-process': 3.535.0 + '@aws-sdk/credential-provider-sso': 3.549.0(@aws-sdk/credential-provider-node@3.549.0) + '@aws-sdk/credential-provider-web-identity': 3.549.0(@aws-sdk/credential-provider-node@3.549.0) + '@aws-sdk/types': 3.535.0 + '@smithy/credential-provider-imds': 2.3.0 + '@smithy/property-provider': 2.2.0 + '@smithy/shared-ini-file-loader': 2.4.0 + '@smithy/types': 2.12.0 tslib: 2.6.2 transitivePeerDependencies: - '@aws-sdk/credential-provider-node' - aws-crt - /@aws-sdk/credential-provider-node@3.525.0: - resolution: {integrity: sha512-RJXlO8goGXpnoHQAyrCcJ0QtWEOFa34LSbfdqBIjQX/fwnjUuEmiGdXTV3AZmwYQ7juk49tfBneHbtOP3AGqsQ==} + /@aws-sdk/credential-provider-node@3.549.0: + resolution: {integrity: sha512-f3YgalsMuywEAVX4AUm9tojqrBdfpAac0+D320ePzas0Ntbp7ItYu9ceKIhgfzXO3No7P3QK0rCrOxL+ABTn8Q==} engines: {node: '>=14.0.0'} - requiresBuild: true dependencies: - '@aws-sdk/credential-provider-env': 3.523.0 - '@aws-sdk/credential-provider-http': 3.525.0 - '@aws-sdk/credential-provider-ini': 3.525.0(@aws-sdk/credential-provider-node@3.525.0) - '@aws-sdk/credential-provider-process': 3.523.0 - '@aws-sdk/credential-provider-sso': 3.525.0(@aws-sdk/credential-provider-node@3.525.0) - '@aws-sdk/credential-provider-web-identity': 3.525.0(@aws-sdk/credential-provider-node@3.525.0) - '@aws-sdk/types': 3.523.0 - '@smithy/credential-provider-imds': 2.2.4 - '@smithy/property-provider': 2.1.3 - '@smithy/shared-ini-file-loader': 2.3.4 - '@smithy/types': 2.10.1 + '@aws-sdk/credential-provider-env': 3.535.0 + '@aws-sdk/credential-provider-http': 3.535.0 + '@aws-sdk/credential-provider-ini': 3.549.0(@aws-sdk/credential-provider-node@3.549.0) + '@aws-sdk/credential-provider-process': 3.535.0 + '@aws-sdk/credential-provider-sso': 3.549.0(@aws-sdk/credential-provider-node@3.549.0) + '@aws-sdk/credential-provider-web-identity': 3.549.0(@aws-sdk/credential-provider-node@3.549.0) + '@aws-sdk/types': 3.535.0 + '@smithy/credential-provider-imds': 2.3.0 + '@smithy/property-provider': 2.2.0 + '@smithy/shared-ini-file-loader': 2.4.0 + '@smithy/types': 2.12.0 tslib: 2.6.2 transitivePeerDependencies: - aws-crt - /@aws-sdk/credential-provider-process@3.523.0: - resolution: {integrity: sha512-f0LP9KlFmMvPWdKeUKYlZ6FkQAECUeZMmISsv6NKtvPCI9e4O4cLTeR09telwDK8P0HrgcRuZfXM7E30m8re0Q==} + /@aws-sdk/credential-provider-process@3.535.0: + resolution: {integrity: sha512-9O1OaprGCnlb/kYl8RwmH7Mlg8JREZctB8r9sa1KhSsWFq/SWO0AuJTyowxD7zL5PkeS4eTvzFFHWCa3OO5epA==} engines: {node: '>=14.0.0'} - requiresBuild: true dependencies: - '@aws-sdk/types': 3.523.0 - '@smithy/property-provider': 2.1.3 - '@smithy/shared-ini-file-loader': 2.3.4 - '@smithy/types': 2.10.1 + '@aws-sdk/types': 3.535.0 + '@smithy/property-provider': 2.2.0 + '@smithy/shared-ini-file-loader': 2.4.0 + '@smithy/types': 2.12.0 tslib: 2.6.2 - /@aws-sdk/credential-provider-sso@3.525.0(@aws-sdk/credential-provider-node@3.525.0): - resolution: {integrity: sha512-7V7ybtufxdD3plxeIeB6aqHZeFIUlAyPphXIUgXrGY10iNcosL970rQPBeggsohe4gCM6UvY2TfMeEcr+ZE8FA==} + /@aws-sdk/credential-provider-sso@3.549.0(@aws-sdk/credential-provider-node@3.549.0): + resolution: {integrity: sha512-BGopRKHs7W8zkoH8qmSHrjudj263kXbhVkAUPxVUz0I28+CZNBgJC/RfVCbOpzmysIQEpwSqvOv1y0k+DQzIJQ==} engines: {node: '>=14.0.0'} - requiresBuild: true dependencies: - '@aws-sdk/client-sso': 3.525.0 - '@aws-sdk/token-providers': 3.525.0(@aws-sdk/credential-provider-node@3.525.0) - '@aws-sdk/types': 3.523.0 - '@smithy/property-provider': 2.1.3 - '@smithy/shared-ini-file-loader': 2.3.4 - '@smithy/types': 2.10.1 + '@aws-sdk/client-sso': 3.549.0 + '@aws-sdk/token-providers': 3.549.0(@aws-sdk/credential-provider-node@3.549.0) + '@aws-sdk/types': 3.535.0 + '@smithy/property-provider': 2.2.0 + '@smithy/shared-ini-file-loader': 2.4.0 + '@smithy/types': 2.12.0 tslib: 2.6.2 transitivePeerDependencies: - '@aws-sdk/credential-provider-node' - aws-crt - /@aws-sdk/credential-provider-web-identity@3.525.0(@aws-sdk/credential-provider-node@3.525.0): - resolution: {integrity: sha512-sAukOjR1oKb2JXG4nPpuBFpSwGUhrrY17PG/xbTy8NAoLLhrqRwnErcLfdTfmj6tH+3094k6ws/Sh8a35ae7fA==} + /@aws-sdk/credential-provider-web-identity@3.549.0(@aws-sdk/credential-provider-node@3.549.0): + resolution: {integrity: sha512-QzclVXPxuwSI7515l34sdvliVq5leroO8P7RQFKRgfyQKO45o1psghierwG3PgV6jlMiv78FIAGJBr/n4qZ7YA==} engines: {node: '>=14.0.0'} - requiresBuild: true dependencies: - '@aws-sdk/client-sts': 3.525.0(@aws-sdk/credential-provider-node@3.525.0) - '@aws-sdk/types': 3.523.0 - '@smithy/property-provider': 2.1.3 - '@smithy/types': 2.10.1 + '@aws-sdk/client-sts': 3.549.0(@aws-sdk/credential-provider-node@3.549.0) + '@aws-sdk/types': 3.535.0 + '@smithy/property-provider': 2.2.0 + '@smithy/types': 2.12.0 tslib: 2.6.2 transitivePeerDependencies: - '@aws-sdk/credential-provider-node' - aws-crt - /@aws-sdk/credential-providers@3.525.0: - resolution: {integrity: sha512-zj439Ok1s44nahIJKpBM4jhAxnSw20flXQpMD2aeGdvUuKm2xmzZP0lX5z9a+XQWFtNh251ZcSt2p+RwtLKtiw==} + /@aws-sdk/credential-providers@3.549.0: + resolution: {integrity: sha512-icbw8zCX2eSGPGBZLD6HKSgUMnpL95KzUikr94sVN81UuP1EnueaWj6gnErqP2Dr05ZEF9wMZxwd91qu8kVTNw==} engines: {node: '>=14.0.0'} - requiresBuild: true dependencies: - '@aws-sdk/client-cognito-identity': 3.525.0 - '@aws-sdk/client-sso': 3.525.0 - '@aws-sdk/client-sts': 3.525.0(@aws-sdk/credential-provider-node@3.525.0) - '@aws-sdk/credential-provider-cognito-identity': 3.525.0 - '@aws-sdk/credential-provider-env': 3.523.0 - '@aws-sdk/credential-provider-http': 3.525.0 - '@aws-sdk/credential-provider-ini': 3.525.0(@aws-sdk/credential-provider-node@3.525.0) - '@aws-sdk/credential-provider-node': 3.525.0 - '@aws-sdk/credential-provider-process': 3.523.0 - '@aws-sdk/credential-provider-sso': 3.525.0(@aws-sdk/credential-provider-node@3.525.0) - '@aws-sdk/credential-provider-web-identity': 3.525.0(@aws-sdk/credential-provider-node@3.525.0) - '@aws-sdk/types': 3.523.0 - '@smithy/credential-provider-imds': 2.2.4 - '@smithy/property-provider': 2.1.3 - '@smithy/types': 2.10.1 + '@aws-sdk/client-cognito-identity': 3.549.0 + '@aws-sdk/client-sso': 3.549.0 + '@aws-sdk/client-sts': 3.549.0(@aws-sdk/credential-provider-node@3.549.0) + '@aws-sdk/credential-provider-cognito-identity': 3.549.0 + '@aws-sdk/credential-provider-env': 3.535.0 + '@aws-sdk/credential-provider-http': 3.535.0 + '@aws-sdk/credential-provider-ini': 3.549.0(@aws-sdk/credential-provider-node@3.549.0) + '@aws-sdk/credential-provider-node': 3.549.0 + '@aws-sdk/credential-provider-process': 3.535.0 + '@aws-sdk/credential-provider-sso': 3.549.0(@aws-sdk/credential-provider-node@3.549.0) + '@aws-sdk/credential-provider-web-identity': 3.549.0(@aws-sdk/credential-provider-node@3.549.0) + '@aws-sdk/types': 3.535.0 + '@smithy/credential-provider-imds': 2.3.0 + '@smithy/property-provider': 2.2.0 + '@smithy/types': 2.12.0 tslib: 2.6.2 transitivePeerDependencies: - aws-crt - /@aws-sdk/lib-storage@3.525.1(@aws-sdk/client-s3@3.525.0): - resolution: {integrity: sha512-q0y4+bc5GsE10F1HyA1D24maRyy2H3Ph3o+1eK7/kzKrk0nBbISLGbZ8XNqtWwi+9KdsqWNKMoN9+zsDaE6d/w==} + /@aws-sdk/lib-storage@3.550.0(@aws-sdk/client-s3@3.550.0): + resolution: {integrity: sha512-zDUM4hV/t148DCXschwDusH9tzg7U1MpuUaUPJlklx9Va+NnjrjtWHwL/JeZ5sfGR/1wTZIg3sKho/4P2oAYrQ==} engines: {node: '>=14.0.0'} peerDependencies: '@aws-sdk/client-s3': ^3.0.0 dependencies: - '@aws-sdk/client-s3': 3.525.0 - '@smithy/abort-controller': 2.1.3 - '@smithy/middleware-endpoint': 2.4.4 - '@smithy/smithy-client': 2.4.2 + '@aws-sdk/client-s3': 3.550.0 + '@smithy/abort-controller': 2.2.0 + '@smithy/middleware-endpoint': 2.5.1 + '@smithy/smithy-client': 2.5.1 buffer: 5.6.0 events: 3.3.0 stream-browserify: 3.0.0 tslib: 2.6.2 - /@aws-sdk/middleware-bucket-endpoint@3.525.0: - resolution: {integrity: sha512-nYfQ2Xspfef7j8mZO7varUWLPH6HQlXateH7tBVtBNUAazyQE4UJEvC0fbQ+Y01e+FKlirim/m2umkdMXqAlTg==} + /@aws-sdk/middleware-bucket-endpoint@3.535.0: + resolution: {integrity: sha512-7sijlfQsc4UO9Fsl11mU26Y5f9E7g6UoNg/iJUBpC5pgvvmdBRO5UEhbB/gnqvOEPsBXyhmfzbstebq23Qdz7A==} engines: {node: '>=14.0.0'} dependencies: - '@aws-sdk/types': 3.523.0 - '@aws-sdk/util-arn-parser': 3.495.0 - '@smithy/node-config-provider': 2.2.4 - '@smithy/protocol-http': 3.2.1 - '@smithy/types': 2.10.1 - '@smithy/util-config-provider': 2.2.1 + '@aws-sdk/types': 3.535.0 + '@aws-sdk/util-arn-parser': 3.535.0 + '@smithy/node-config-provider': 2.3.0 + '@smithy/protocol-http': 3.3.0 + '@smithy/types': 2.12.0 + '@smithy/util-config-provider': 2.3.0 tslib: 2.6.2 - /@aws-sdk/middleware-expect-continue@3.523.0: - resolution: {integrity: sha512-E5DyRAHU39VHaAlQLqXYS/IKpgk3vsryuU6kkOcIIK8Dgw0a2tjoh5AOCaNa8pD+KgAGrFp35JIMSX1zui5diA==} + /@aws-sdk/middleware-expect-continue@3.535.0: + resolution: {integrity: sha512-hFKyqUBky0NWCVku8iZ9+PACehx0p6vuMw5YnZf8FVgHP0fode0b/NwQY6UY7oor/GftvRsAlRUAWGNFEGUpwA==} engines: {node: '>=14.0.0'} dependencies: - '@aws-sdk/types': 3.523.0 - '@smithy/protocol-http': 3.2.1 - '@smithy/types': 2.10.1 + '@aws-sdk/types': 3.535.0 + '@smithy/protocol-http': 3.3.0 + '@smithy/types': 2.12.0 tslib: 2.6.2 - /@aws-sdk/middleware-flexible-checksums@3.523.0: - resolution: {integrity: sha512-lIa1TdWY9q4zsDFarfSnYcdrwPR+nypaU4n6hb95i620/1F5M5s6H8P0hYtwTNNvx+slrR8F3VBML9pjBtzAHw==} + /@aws-sdk/middleware-flexible-checksums@3.535.0: + resolution: {integrity: sha512-rBIzldY9jjRATxICDX7t77aW6ctqmVDgnuAOgbVT5xgHftt4o7PGWKoMvl/45hYqoQgxVFnCBof9bxkqSBebVA==} engines: {node: '>=14.0.0'} dependencies: '@aws-crypto/crc32': 3.0.0 '@aws-crypto/crc32c': 3.0.0 - '@aws-sdk/types': 3.523.0 - '@smithy/is-array-buffer': 2.1.1 - '@smithy/protocol-http': 3.2.1 - '@smithy/types': 2.10.1 - '@smithy/util-utf8': 2.1.1 + '@aws-sdk/types': 3.535.0 + '@smithy/is-array-buffer': 2.2.0 + '@smithy/protocol-http': 3.3.0 + '@smithy/types': 2.12.0 + '@smithy/util-utf8': 2.3.0 tslib: 2.6.2 - /@aws-sdk/middleware-host-header@3.523.0: - resolution: {integrity: sha512-4g3q7Ta9sdD9TMUuohBAkbx/e3I/juTqfKi7TPgP+8jxcYX72MOsgemAMHuP6CX27eyj4dpvjH+w4SIVDiDSmg==} + /@aws-sdk/middleware-host-header@3.535.0: + resolution: {integrity: sha512-0h6TWjBWtDaYwHMQJI9ulafeS4lLaw1vIxRjbpH0svFRt6Eve+Sy8NlVhECfTU2hNz/fLubvrUxsXoThaLBIew==} engines: {node: '>=14.0.0'} - requiresBuild: true dependencies: - '@aws-sdk/types': 3.523.0 - '@smithy/protocol-http': 3.2.1 - '@smithy/types': 2.10.1 + '@aws-sdk/types': 3.535.0 + '@smithy/protocol-http': 3.3.0 + '@smithy/types': 2.12.0 tslib: 2.6.2 - /@aws-sdk/middleware-location-constraint@3.523.0: - resolution: {integrity: sha512-1QAUXX3U0jkARnU0yyjk81EO4Uw5dCeQOtvUY5s3bUOHatR3ThosQeIr6y9BCsbXHzNnDe1ytCjqAPyo8r/bYw==} + /@aws-sdk/middleware-location-constraint@3.535.0: + resolution: {integrity: sha512-SxfS9wfidUZZ+WnlKRTCRn3h+XTsymXRXPJj8VV6hNRNeOwzNweoG3YhQbTowuuNfXf89m9v6meYkBBtkdacKw==} engines: {node: '>=14.0.0'} dependencies: - '@aws-sdk/types': 3.523.0 - '@smithy/types': 2.10.1 + '@aws-sdk/types': 3.535.0 + '@smithy/types': 2.12.0 tslib: 2.6.2 - /@aws-sdk/middleware-logger@3.523.0: - resolution: {integrity: sha512-PeDNJNhfiaZx54LBaLTXzUaJ9LXFwDFFIksipjqjvxMafnoVcQwKbkoPUWLe5ytT4nnL1LogD3s55mERFUsnwg==} + /@aws-sdk/middleware-logger@3.535.0: + resolution: {integrity: sha512-huNHpONOrEDrdRTvSQr1cJiRMNf0S52NDXtaPzdxiubTkP+vni2MohmZANMOai/qT0olmEVX01LhZ0ZAOgmg6A==} engines: {node: '>=14.0.0'} - requiresBuild: true dependencies: - '@aws-sdk/types': 3.523.0 - '@smithy/types': 2.10.1 + '@aws-sdk/types': 3.535.0 + '@smithy/types': 2.12.0 tslib: 2.6.2 - /@aws-sdk/middleware-recursion-detection@3.523.0: - resolution: {integrity: sha512-nZ3Vt7ehfSDYnrcg/aAfjjvpdE+61B3Zk68i6/hSUIegT3IH9H1vSW67NDKVp+50hcEfzWwM2HMPXxlzuyFyrw==} + /@aws-sdk/middleware-recursion-detection@3.535.0: + resolution: {integrity: sha512-am2qgGs+gwqmR4wHLWpzlZ8PWhm4ktj5bYSgDrsOfjhdBlWNxvPoID9/pDAz5RWL48+oH7I6SQzMqxXsFDikrw==} engines: {node: '>=14.0.0'} - requiresBuild: true dependencies: - '@aws-sdk/types': 3.523.0 - '@smithy/protocol-http': 3.2.1 - '@smithy/types': 2.10.1 + '@aws-sdk/types': 3.535.0 + '@smithy/protocol-http': 3.3.0 + '@smithy/types': 2.12.0 tslib: 2.6.2 - /@aws-sdk/middleware-sdk-s3@3.525.0: - resolution: {integrity: sha512-ewFyyFM6wdFTOqCiId5GQNi7owDdLEonQhB4h8tF6r3HV52bRlDvZA4aDos+ft6N/XY2J6L0qlFTFq+/oiurXw==} + /@aws-sdk/middleware-sdk-s3@3.535.0: + resolution: {integrity: sha512-/dLG/E3af6ohxkQ5GBHT8tZfuPIg6eItKxCXuulvYj0Tqgf3Mb+xTsvSkxQsJF06RS4sH7Qsg/PnB8ZfrJrXpg==} engines: {node: '>=14.0.0'} dependencies: - '@aws-sdk/types': 3.523.0 - '@aws-sdk/util-arn-parser': 3.495.0 - '@smithy/node-config-provider': 2.2.4 - '@smithy/protocol-http': 3.2.1 - '@smithy/signature-v4': 2.1.3 - '@smithy/smithy-client': 2.4.2 - '@smithy/types': 2.10.1 - '@smithy/util-config-provider': 2.2.1 + '@aws-sdk/types': 3.535.0 + '@aws-sdk/util-arn-parser': 3.535.0 + '@smithy/node-config-provider': 2.3.0 + '@smithy/protocol-http': 3.3.0 + '@smithy/signature-v4': 2.2.1 + '@smithy/smithy-client': 2.5.1 + '@smithy/types': 2.12.0 + '@smithy/util-config-provider': 2.3.0 tslib: 2.6.2 - /@aws-sdk/middleware-signing@3.523.0: - resolution: {integrity: sha512-pFXV4don6qcmew/OvEjLUr2foVjzoJ8o5k57Oz9yAHz8INx3RHK8MP/K4mVhHo6n0SquRcWrm4kY/Tw+89gkEA==} + /@aws-sdk/middleware-signing@3.535.0: + resolution: {integrity: sha512-Rb4sfus1Gc5paRl9JJgymJGsb/i3gJKK/rTuFZICdd1PBBE5osIOHP5CpzWYBtc5LlyZE1a2QoxPMCyG+QUGPw==} engines: {node: '>=14.0.0'} dependencies: - '@aws-sdk/types': 3.523.0 - '@smithy/property-provider': 2.1.3 - '@smithy/protocol-http': 3.2.1 - '@smithy/signature-v4': 2.1.3 - '@smithy/types': 2.10.1 - '@smithy/util-middleware': 2.1.3 + '@aws-sdk/types': 3.535.0 + '@smithy/property-provider': 2.2.0 + '@smithy/protocol-http': 3.3.0 + '@smithy/signature-v4': 2.2.1 + '@smithy/types': 2.12.0 + '@smithy/util-middleware': 2.2.0 tslib: 2.6.2 - /@aws-sdk/middleware-ssec@3.523.0: - resolution: {integrity: sha512-FaqAZQeF5cQzZLOIboIJRaWVOQ2F2pJZAXGF5D7nJsxYNFChotA0O0iWimBRxU35RNn7yirVxz35zQzs20ddIw==} + /@aws-sdk/middleware-ssec@3.537.0: + resolution: {integrity: sha512-2QWMrbwd5eBy5KCYn9a15JEWBgrK2qFEKQN2lqb/6z0bhtevIOxIRfC99tzvRuPt6nixFQ+ynKuBjcfT4ZFrdQ==} engines: {node: '>=14.0.0'} dependencies: - '@aws-sdk/types': 3.523.0 - '@smithy/types': 2.10.1 + '@aws-sdk/types': 3.535.0 + '@smithy/types': 2.12.0 tslib: 2.6.2 - /@aws-sdk/middleware-user-agent@3.525.0: - resolution: {integrity: sha512-4al/6uO+t/QIYXK2OgqzDKQzzLAYJza1vWFS+S0lJ3jLNGyLB5BMU5KqWjDzevYZ4eCnz2Nn7z0FveUTNz8YdQ==} + /@aws-sdk/middleware-user-agent@3.540.0: + resolution: {integrity: sha512-8Rd6wPeXDnOYzWj1XCmOKcx/Q87L0K1/EHqOBocGjLVbN3gmRxBvpmR1pRTjf7IsWfnnzN5btqtcAkfDPYQUMQ==} engines: {node: '>=14.0.0'} - requiresBuild: true dependencies: - '@aws-sdk/types': 3.523.0 - '@aws-sdk/util-endpoints': 3.525.0 - '@smithy/protocol-http': 3.2.1 - '@smithy/types': 2.10.1 + '@aws-sdk/types': 3.535.0 + '@aws-sdk/util-endpoints': 3.540.0 + '@smithy/protocol-http': 3.3.0 + '@smithy/types': 2.12.0 tslib: 2.6.2 - /@aws-sdk/region-config-resolver@3.525.0: - resolution: {integrity: sha512-8kFqXk6UyKgTMi7N7QlhA6qM4pGPWbiUXqEY2RgUWngtxqNFGeM9JTexZeuavQI+qLLe09VPShPNX71fEDcM6w==} + /@aws-sdk/region-config-resolver@3.535.0: + resolution: {integrity: sha512-IXOznDiaItBjsQy4Fil0kzX/J3HxIOknEphqHbOfUf+LpA5ugcsxuQQONrbEQusCBnfJyymrldBvBhFmtlU9Wg==} engines: {node: '>=14.0.0'} - requiresBuild: true dependencies: - '@aws-sdk/types': 3.523.0 - '@smithy/node-config-provider': 2.2.4 - '@smithy/types': 2.10.1 - '@smithy/util-config-provider': 2.2.1 - '@smithy/util-middleware': 2.1.3 + '@aws-sdk/types': 3.535.0 + '@smithy/node-config-provider': 2.3.0 + '@smithy/types': 2.12.0 + '@smithy/util-config-provider': 2.3.0 + '@smithy/util-middleware': 2.2.0 tslib: 2.6.2 - /@aws-sdk/signature-v4-multi-region@3.525.0: - resolution: {integrity: sha512-j8gkdfiokaherRgokfZBl2azYBMHlegT7pOnR/3Y79TSz6G+bJeIkuNk8aUbJArr6R8nvAM1j4dt1rBM+efolQ==} + /@aws-sdk/signature-v4-multi-region@3.535.0: + resolution: {integrity: sha512-tqCsEsEj8icW0SAh3NvyhRUq54Gz2pu4NM2tOSrFp7SO55heUUaRLSzYteNZCTOupH//AAaZvbN/UUTO/DrOog==} engines: {node: '>=14.0.0'} dependencies: - '@aws-sdk/middleware-sdk-s3': 3.525.0 - '@aws-sdk/types': 3.523.0 - '@smithy/protocol-http': 3.2.1 - '@smithy/signature-v4': 2.1.3 - '@smithy/types': 2.10.1 + '@aws-sdk/middleware-sdk-s3': 3.535.0 + '@aws-sdk/types': 3.535.0 + '@smithy/protocol-http': 3.3.0 + '@smithy/signature-v4': 2.2.1 + '@smithy/types': 2.12.0 tslib: 2.6.2 - /@aws-sdk/token-providers@3.525.0(@aws-sdk/credential-provider-node@3.525.0): - resolution: {integrity: sha512-puVjbxuK0Dq7PTQ2HdddHy2eQjOH8GZbump74yWJa6JVpRW84LlOcNmP+79x4Kscvz2ldWB8XDFw/pcCiSDe5A==} + /@aws-sdk/token-providers@3.549.0(@aws-sdk/credential-provider-node@3.549.0): + resolution: {integrity: sha512-rJyeXkXknLukRFGuMQOgKnPBa+kLODJtOqEBf929SpQ96f1I6ytdndmWbB5B/OQN5Fu5DOOQUQqJypDQVl5ibQ==} engines: {node: '>=14.0.0'} - requiresBuild: true dependencies: - '@aws-sdk/client-sso-oidc': 3.525.0(@aws-sdk/credential-provider-node@3.525.0) - '@aws-sdk/types': 3.523.0 - '@smithy/property-provider': 2.1.3 - '@smithy/shared-ini-file-loader': 2.3.4 - '@smithy/types': 2.10.1 + '@aws-sdk/client-sso-oidc': 3.549.0(@aws-sdk/credential-provider-node@3.549.0) + '@aws-sdk/types': 3.535.0 + '@smithy/property-provider': 2.2.0 + '@smithy/shared-ini-file-loader': 2.4.0 + '@smithy/types': 2.12.0 tslib: 2.6.2 transitivePeerDependencies: - '@aws-sdk/credential-provider-node' - aws-crt - /@aws-sdk/types@3.523.0: - resolution: {integrity: sha512-AqGIu4u+SxPiUuNBp2acCVcq80KDUFjxe6e3cMTvKWTzCbrVk1AXv0dAaJnCmdkWIha6zJDWxpIk/aL4EGhZ9A==} + /@aws-sdk/types@3.535.0: + resolution: {integrity: sha512-aY4MYfduNj+sRR37U7XxYR8wemfbKP6lx00ze2M2uubn7mZotuVrWYAafbMSXrdEMSToE5JDhr28vArSOoLcSg==} engines: {node: '>=14.0.0'} - requiresBuild: true dependencies: - '@smithy/types': 2.10.1 + '@smithy/types': 2.12.0 tslib: 2.6.2 - /@aws-sdk/util-arn-parser@3.495.0: - resolution: {integrity: sha512-hwdA3XAippSEUxs7jpznwD63YYFR+LtQvlEcebPTgWR9oQgG9TfS+39PUfbnEeje1ICuOrN3lrFqFbmP9uzbMg==} + /@aws-sdk/util-arn-parser@3.535.0: + resolution: {integrity: sha512-smVo29nUPAOprp8Z5Y3GHuhiOtw6c8/EtLCm5AVMtRsTPw4V414ZXL2H66tzmb5kEeSzQlbfBSBEdIFZoxO9kg==} engines: {node: '>=14.0.0'} dependencies: tslib: 2.6.2 - /@aws-sdk/util-endpoints@3.525.0: - resolution: {integrity: sha512-DIW7WWU5tIGkeeKX6NJUyrEIdWMiqjLQG3XBzaUj+ufIENwNjdAHhlD8l2vX7Yr3JZRT6yN/84wBCj7Tw1xd1g==} + /@aws-sdk/util-endpoints@3.540.0: + resolution: {integrity: sha512-1kMyQFAWx6f8alaI6UT65/5YW/7pDWAKAdNwL6vuJLea03KrZRX3PMoONOSJpAS5m3Ot7HlWZvf3wZDNTLELZw==} engines: {node: '>=14.0.0'} - requiresBuild: true dependencies: - '@aws-sdk/types': 3.523.0 - '@smithy/types': 2.10.1 - '@smithy/util-endpoints': 1.1.4 + '@aws-sdk/types': 3.535.0 + '@smithy/types': 2.12.0 + '@smithy/util-endpoints': 1.2.0 tslib: 2.6.2 - /@aws-sdk/util-locate-window@3.495.0: - resolution: {integrity: sha512-MfaPXT0kLX2tQaR90saBT9fWQq2DHqSSJRzW+MZWsmF+y5LGCOhO22ac/2o6TKSQm7h0HRc2GaADqYYYor62yg==} + /@aws-sdk/util-locate-window@3.535.0: + resolution: {integrity: sha512-PHJ3SL6d2jpcgbqdgiPxkXpu7Drc2PYViwxSIqvvMKhDwzSB1W3mMvtpzwKM4IE7zLFodZo0GKjJ9AsoXndXhA==} engines: {node: '>=14.0.0'} - requiresBuild: true dependencies: tslib: 2.6.2 - /@aws-sdk/util-user-agent-browser@3.523.0: - resolution: {integrity: sha512-6ZRNdGHX6+HQFqTbIA5+i8RWzxFyxsZv8D3soRfpdyWIKkzhSz8IyRKXRciwKBJDaC7OX2jzGE90wxRQft27nA==} - requiresBuild: true + /@aws-sdk/util-user-agent-browser@3.535.0: + resolution: {integrity: sha512-RWMcF/xV5n+nhaA/Ff5P3yNP3Kur/I+VNZngog4TEs92oB/nwOdAg/2JL8bVAhUbMrjTjpwm7PItziYFQoqyig==} dependencies: - '@aws-sdk/types': 3.523.0 - '@smithy/types': 2.10.1 + '@aws-sdk/types': 3.535.0 + '@smithy/types': 2.12.0 bowser: 2.11.0 tslib: 2.6.2 - /@aws-sdk/util-user-agent-node@3.525.0: - resolution: {integrity: sha512-88Wjt4efyUSBGcyIuh1dvoMqY1k15jpJc5A/3yi67clBQEFsu9QCodQCQPqmRjV3VRcMtBOk+jeCTiUzTY5dRQ==} + /@aws-sdk/util-user-agent-node@3.535.0: + resolution: {integrity: sha512-dRek0zUuIT25wOWJlsRm97nTkUlh1NDcLsQZIN2Y8KxhwoXXWtJs5vaDPT+qAg+OpcNj80i1zLR/CirqlFg/TQ==} engines: {node: '>=14.0.0'} - requiresBuild: true peerDependencies: aws-crt: '>=1.0.0' peerDependenciesMeta: aws-crt: optional: true dependencies: - '@aws-sdk/types': 3.523.0 - '@smithy/node-config-provider': 2.2.4 - '@smithy/types': 2.10.1 + '@aws-sdk/types': 3.535.0 + '@smithy/node-config-provider': 2.3.0 + '@smithy/types': 2.12.0 tslib: 2.6.2 /@aws-sdk/util-utf8-browser@3.259.0: resolution: {integrity: sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==} - requiresBuild: true dependencies: tslib: 2.6.2 - /@aws-sdk/xml-builder@3.523.0: - resolution: {integrity: sha512-wfvyVymj2TUw7SuDor9IuFcAzJZvWRBZotvY/wQJOlYa3UP3Oezzecy64N4FWfBJEsZdrTN+HOZFl+IzTWWnUA==} + /@aws-sdk/xml-builder@3.535.0: + resolution: {integrity: sha512-VXAq/Jz8KIrU84+HqsOJhIKZqG0PNTdi6n6PFQ4xJf44ZQHD/5C7ouH4qCFX5XgZXcgbRIcMVVYGC6Jye0dRng==} engines: {node: '>=14.0.0'} dependencies: - '@smithy/types': 2.10.1 + '@smithy/types': 2.12.0 tslib: 2.6.2 /@azure/abort-controller@1.1.0: @@ -2335,19 +2302,19 @@ packages: dependencies: tslib: 2.6.2 - /@azure/abort-controller@2.0.0: - resolution: {integrity: sha512-RP/mR/WJchR+g+nQFJGOec+nzeN/VvjlwbinccoqfhTsTHbb8X5+mLDp48kHT0ueyum0BNSwGm0kX0UZuIqTGg==} + /@azure/abort-controller@2.1.1: + resolution: {integrity: sha512-NhzeNm5zu2fPlwGXPUjzsRCRuPx5demaZyNcyNYJDqpa/Sbxzvo/RYt9IwUaAOnDW5+r7J9UOE6f22TQnb9nhQ==} engines: {node: '>=18.0.0'} dependencies: tslib: 2.6.2 dev: true - /@azure/core-auth@1.6.0: - resolution: {integrity: sha512-3X9wzaaGgRaBCwhLQZDtFp5uLIXCPrGbwJNWPPugvL4xbIGgScv77YzzxToKGLAKvG9amDoofMoP+9hsH1vs1w==} + /@azure/core-auth@1.7.1: + resolution: {integrity: sha512-dyeQwvgthqs/SlPVQbZQetpslXceHd4i5a7M/7z/lGEAVwnSluabnQOjF2/dk/hhWgMISusv1Ytp4mQ8JNy62A==} engines: {node: '>=18.0.0'} dependencies: - '@azure/abort-controller': 2.0.0 - '@azure/core-util': 1.7.0 + '@azure/abort-controller': 2.1.1 + '@azure/core-util': 1.8.1 tslib: 2.6.2 dev: true @@ -2356,10 +2323,10 @@ packages: engines: {node: '>=14.0.0'} dependencies: '@azure/abort-controller': 1.1.0 - '@azure/core-auth': 1.6.0 + '@azure/core-auth': 1.7.1 '@azure/core-tracing': 1.0.0-preview.13 - '@azure/core-util': 1.7.0 - '@azure/logger': 1.0.4 + '@azure/core-util': 1.8.1 + '@azure/logger': 1.1.1 '@types/node-fetch': 2.6.4 '@types/tunnel': 0.0.3 form-data: 4.0.0 @@ -2373,19 +2340,19 @@ packages: - encoding dev: true - /@azure/core-lro@2.6.0: - resolution: {integrity: sha512-PyRNcaIOfMgoUC01/24NoG+k8O81VrKxYARnDlo+Q2xji0/0/j2nIt8BwQh294pb1c5QnXTDPbNR4KzoDKXEoQ==} + /@azure/core-lro@2.7.1: + resolution: {integrity: sha512-kXSlrNHOCTVZMxpXNRqzgh9/j4cnNXU5Hf2YjMyjddRhCXFiFRzmNaqwN+XO9rGTsCOIaaG7M67zZdyliXZG9g==} engines: {node: '>=18.0.0'} dependencies: - '@azure/abort-controller': 2.0.0 - '@azure/core-util': 1.7.0 - '@azure/logger': 1.0.4 + '@azure/abort-controller': 2.1.1 + '@azure/core-util': 1.8.1 + '@azure/logger': 1.1.1 tslib: 2.6.2 dev: true - /@azure/core-paging@1.5.0: - resolution: {integrity: sha512-zqWdVIt+2Z+3wqxEOGzR5hXFZ8MGKK52x4vFLw8n58pR6ZfKRx3EXYTxTaYxYHc/PexPUTyimcTWFJbji9Z6Iw==} - engines: {node: '>=14.0.0'} + /@azure/core-paging@1.6.1: + resolution: {integrity: sha512-3tKIQXSU3mlN+ITz0m2pXLnKK3oQ6/EVcW8ud011Iq+M0rx6Wnm7NUEpoMeOAEedeKlPtemrQzO6YWoDR71O5w==} + engines: {node: '>=18.0.0'} dependencies: tslib: 2.6.2 dev: true @@ -2394,21 +2361,21 @@ packages: resolution: {integrity: sha512-KxDlhXyMlh2Jhj2ykX6vNEU0Vou4nHr025KoSEiz7cS3BNiHNaZcdECk/DmLkEB0as5T7b/TpRcehJ5yV6NeXQ==} engines: {node: '>=12.0.0'} dependencies: - '@opentelemetry/api': 1.7.0 + '@opentelemetry/api': 1.8.0 tslib: 2.6.2 dev: true - /@azure/core-util@1.7.0: - resolution: {integrity: sha512-Zq2i3QO6k9DA8vnm29mYM4G8IE9u1mhF1GUabVEqPNX8Lj833gdxQ2NAFxt2BZsfAL+e9cT8SyVN7dFVJ/Hf0g==} + /@azure/core-util@1.8.1: + resolution: {integrity: sha512-L3voj0StUdJ+YKomvwnTv7gHzguJO+a6h30pmmZdRprJCM+RJlGMPxzuh4R7lhQu1jNmEtaHX5wvTgWLDAmbGQ==} engines: {node: '>=18.0.0'} dependencies: - '@azure/abort-controller': 2.0.0 + '@azure/abort-controller': 2.1.1 tslib: 2.6.2 dev: true - /@azure/logger@1.0.4: - resolution: {integrity: sha512-ustrPY8MryhloQj7OWGe+HrYx+aoiOxzbXTtgblbV3xwCqpzUK36phH3XNHQKj3EPonyFUuDTfR3qFhTEAuZEg==} - engines: {node: '>=14.0.0'} + /@azure/logger@1.1.1: + resolution: {integrity: sha512-/+4TtokaGgC+MnThdf6HyIH9Wrjp+CnCn3Nx3ggevN7FFjjNyjqg0yLlc2i9S+Z2uAzI8GYOo35Nzb1MhQ89MA==} + engines: {node: '>=18.0.0'} dependencies: tslib: 2.6.2 dev: true @@ -2419,40 +2386,40 @@ packages: dependencies: '@azure/abort-controller': 1.1.0 '@azure/core-http': 3.0.4 - '@azure/core-lro': 2.6.0 - '@azure/core-paging': 1.5.0 + '@azure/core-lro': 2.7.1 + '@azure/core-paging': 1.6.1 '@azure/core-tracing': 1.0.0-preview.13 - '@azure/logger': 1.0.4 + '@azure/logger': 1.1.1 events: 3.3.0 tslib: 2.6.2 transitivePeerDependencies: - encoding dev: true - /@babel/code-frame@7.23.5: - resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} + /@babel/code-frame@7.24.2: + resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/highlight': 7.23.4 - chalk: 2.4.2 + '@babel/highlight': 7.24.2 + picocolors: 1.0.0 - /@babel/compat-data@7.23.5: - resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==} + /@babel/compat-data@7.24.4: + resolution: {integrity: sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==} engines: {node: '>=6.9.0'} - /@babel/core@7.24.0: - resolution: {integrity: sha512-fQfkg0Gjkza3nf0c7/w6Xf34BW4YvzNfACRLmmb7XRLa6XHdR+K9AlJlxneFfWYf6uhOzuzZVTjF/8KfndZANw==} + /@babel/core@7.24.4: + resolution: {integrity: sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==} engines: {node: '>=6.9.0'} dependencies: - '@ampproject/remapping': 2.2.1 - '@babel/code-frame': 7.23.5 - '@babel/generator': 7.23.6 + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.24.2 + '@babel/generator': 7.24.4 '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.0) - '@babel/helpers': 7.24.0 - '@babel/parser': 7.24.0 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.4) + '@babel/helpers': 7.24.4 + '@babel/parser': 7.24.4 '@babel/template': 7.24.0 - '@babel/traverse': 7.24.0 + '@babel/traverse': 7.24.1 '@babel/types': 7.24.0 convert-source-map: 2.0.0 debug: 4.3.4(supports-color@5.5.0) @@ -2462,20 +2429,20 @@ packages: transitivePeerDependencies: - supports-color - /@babel/generator@7.23.6: - resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==} + /@babel/generator@7.24.4: + resolution: {integrity: sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.24.0 - '@jridgewell/gen-mapping': 0.3.4 - '@jridgewell/trace-mapping': 0.3.23 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 jsesc: 2.5.2 /@babel/helper-compilation-targets@7.23.6: resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/compat-data': 7.23.5 + '@babel/compat-data': 7.24.4 '@babel/helper-validator-option': 7.23.5 browserslist: 4.23.0 lru-cache: 5.1.1 @@ -2498,21 +2465,21 @@ packages: dependencies: '@babel/types': 7.24.0 - /@babel/helper-module-imports@7.22.15: - resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} + /@babel/helper-module-imports@7.24.3: + resolution: {integrity: sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.24.0 - /@babel/helper-module-transforms@7.23.3(@babel/core@7.24.0): + /@babel/helper-module-transforms@7.23.3(@babel/core@7.24.4): resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.4 '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-module-imports': 7.22.15 + '@babel/helper-module-imports': 7.24.3 '@babel/helper-simple-access': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 '@babel/helper-validator-identifier': 7.22.20 @@ -2533,8 +2500,8 @@ packages: dependencies: '@babel/types': 7.24.0 - /@babel/helper-string-parser@7.23.4: - resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} + /@babel/helper-string-parser@7.24.1: + resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} engines: {node: '>=6.9.0'} /@babel/helper-validator-identifier@7.22.20: @@ -2545,148 +2512,149 @@ packages: resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} engines: {node: '>=6.9.0'} - /@babel/helpers@7.24.0: - resolution: {integrity: sha512-ulDZdc0Aj5uLc5nETsa7EPx2L7rM0YJM8r7ck7U73AXi7qOV44IHHRAYZHY6iU1rr3C5N4NtTmMRUJP6kwCWeA==} + /@babel/helpers@7.24.4: + resolution: {integrity: sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==} engines: {node: '>=6.9.0'} dependencies: '@babel/template': 7.24.0 - '@babel/traverse': 7.24.0 + '@babel/traverse': 7.24.1 '@babel/types': 7.24.0 transitivePeerDependencies: - supports-color - /@babel/highlight@7.23.4: - resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} + /@babel/highlight@7.24.2: + resolution: {integrity: sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==} engines: {node: '>=6.9.0'} dependencies: '@babel/helper-validator-identifier': 7.22.20 chalk: 2.4.2 js-tokens: 4.0.0 + picocolors: 1.0.0 - /@babel/parser@7.24.0: - resolution: {integrity: sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==} + /@babel/parser@7.24.4: + resolution: {integrity: sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==} engines: {node: '>=6.0.0'} hasBin: true dependencies: '@babel/types': 7.24.0 - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.0): + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.4): resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 - /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.24.0): + /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.24.4): resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.0): + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.4): resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.0): + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.4): resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.0): + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.4): resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 - /@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==} + /@babel/plugin-syntax-jsx@7.24.1(@babel/core@7.24.4): + resolution: {integrity: sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.0): + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.4): resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.0): + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.4): resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.0): + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.4): resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.0): + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.4): resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.0): + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.4): resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.0): + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.4): resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.0): + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.4): resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 - /@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==} + /@babel/plugin-syntax-typescript@7.24.1(@babel/core@7.24.4): + resolution: {integrity: sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 - /@babel/runtime@7.24.0: - resolution: {integrity: sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw==} + /@babel/runtime@7.24.4: + resolution: {integrity: sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==} engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.14.1 @@ -2695,21 +2663,21 @@ packages: resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.23.5 - '@babel/parser': 7.24.0 + '@babel/code-frame': 7.24.2 + '@babel/parser': 7.24.4 '@babel/types': 7.24.0 - /@babel/traverse@7.24.0: - resolution: {integrity: sha512-HfuJlI8qq3dEDmNU5ChzzpZRWq+oxCZQyMzIMEqLho+AQnhMnKQUzH6ydo3RBl/YjPCuk68Y6s0Gx0AeyULiWw==} + /@babel/traverse@7.24.1: + resolution: {integrity: sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.23.5 - '@babel/generator': 7.23.6 + '@babel/code-frame': 7.24.2 + '@babel/generator': 7.24.4 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.23.0 '@babel/helper-hoist-variables': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.24.0 + '@babel/parser': 7.24.4 '@babel/types': 7.24.0 debug: 4.3.4(supports-color@5.5.0) globals: 11.12.0 @@ -2720,7 +2688,7 @@ packages: resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-string-parser': 7.23.4 + '@babel/helper-string-parser': 7.24.1 '@babel/helper-validator-identifier': 7.22.20 to-fast-properties: 2.0.0 @@ -2759,429 +2727,429 @@ packages: dependencies: '@jridgewell/trace-mapping': 0.3.9 - /@csstools/cascade-layer-name-parser@1.0.8(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3): - resolution: {integrity: sha512-xHxXavWvXB5nAA9IvZtjEzkONM3hPXpxqYK4cEw60LcqPiFjq7ZlEFxOyYFPrG4UdANKtnucNtRVDy7frjq6AA==} + /@csstools/cascade-layer-name-parser@1.0.9(@csstools/css-parser-algorithms@2.6.1)(@csstools/css-tokenizer@2.2.4): + resolution: {integrity: sha512-RRqNjxTZDUhx7pxYOBG/AkCVmPS3zYzfE47GEhIGkFuWFTQGJBgWOUUkKNo5MfxIfjDz5/1L3F3rF1oIsYaIpw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: - '@csstools/css-parser-algorithms': ^2.6.0 - '@csstools/css-tokenizer': ^2.2.3 + '@csstools/css-parser-algorithms': ^2.6.1 + '@csstools/css-tokenizer': ^2.2.4 dependencies: - '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) - '@csstools/css-tokenizer': 2.2.3 + '@csstools/css-parser-algorithms': 2.6.1(@csstools/css-tokenizer@2.2.4) + '@csstools/css-tokenizer': 2.2.4 dev: true - /@csstools/color-helpers@4.0.0: - resolution: {integrity: sha512-wjyXB22/h2OvxAr3jldPB7R7kjTUEzopvjitS8jWtyd8fN6xJ8vy1HnHu0ZNfEkqpBJgQ76Q+sBDshWcMvTa/w==} + /@csstools/color-helpers@4.1.0: + resolution: {integrity: sha512-pWRKF6cDwget8HowIIf2MqEmqIca/cf8/jO4b3PRtUF5EfQXYMtBIKycXB4yXTCUmwLKOoRZAzh/hjnc7ywOIg==} engines: {node: ^14 || ^16 || >=18} dev: true - /@csstools/css-calc@1.1.7(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3): - resolution: {integrity: sha512-+7bUzB5I4cI97tKmBJA8ilTl/YRo6VAOdlrnd/4x2NyK60nvYurGKa5TZpE1zcgIrTC97iJRE0/V65feyFytuw==} + /@csstools/css-calc@1.2.0(@csstools/css-parser-algorithms@2.6.1)(@csstools/css-tokenizer@2.2.4): + resolution: {integrity: sha512-iQqIW5vDPqQdLx07/atCuNKDprhIWjB0b8XRhUyXZWBZYUG+9mNyFwyu30rypX84WLevVo25NYW2ipxR8WyseQ==} engines: {node: ^14 || ^16 || >=18} peerDependencies: - '@csstools/css-parser-algorithms': ^2.6.0 - '@csstools/css-tokenizer': ^2.2.3 + '@csstools/css-parser-algorithms': ^2.6.1 + '@csstools/css-tokenizer': ^2.2.4 dependencies: - '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) - '@csstools/css-tokenizer': 2.2.3 + '@csstools/css-parser-algorithms': 2.6.1(@csstools/css-tokenizer@2.2.4) + '@csstools/css-tokenizer': 2.2.4 dev: true - /@csstools/css-color-parser@1.5.2(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3): - resolution: {integrity: sha512-5GEkuuUxD5dael3xoWjyf7gAPAi4pwm8X8JW/nUMhxntGY4Wo4Lp7vKlex4V5ZgTfAoov14rZFsZyOantdTatg==} + /@csstools/css-color-parser@1.6.3(@csstools/css-parser-algorithms@2.6.1)(@csstools/css-tokenizer@2.2.4): + resolution: {integrity: sha512-pQPUPo32HW3/NuZxrwr3VJHE+vGqSTVI5gK4jGbuJ7eOFUrsTmZikXcVdInCVWOvuxK5xbCzwDWoTlZUCAKN+A==} engines: {node: ^14 || ^16 || >=18} peerDependencies: - '@csstools/css-parser-algorithms': ^2.6.0 - '@csstools/css-tokenizer': ^2.2.3 + '@csstools/css-parser-algorithms': ^2.6.1 + '@csstools/css-tokenizer': ^2.2.4 dependencies: - '@csstools/color-helpers': 4.0.0 - '@csstools/css-calc': 1.1.7(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) - '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) - '@csstools/css-tokenizer': 2.2.3 + '@csstools/color-helpers': 4.1.0 + '@csstools/css-calc': 1.2.0(@csstools/css-parser-algorithms@2.6.1)(@csstools/css-tokenizer@2.2.4) + '@csstools/css-parser-algorithms': 2.6.1(@csstools/css-tokenizer@2.2.4) + '@csstools/css-tokenizer': 2.2.4 dev: true - /@csstools/css-parser-algorithms@2.6.0(@csstools/css-tokenizer@2.2.3): - resolution: {integrity: sha512-YfEHq0eRH98ffb5/EsrrDspVWAuph6gDggAE74ZtjecsmyyWpW768hOyiONa8zwWGbIWYfa2Xp4tRTrpQQ00CQ==} + /@csstools/css-parser-algorithms@2.6.1(@csstools/css-tokenizer@2.2.4): + resolution: {integrity: sha512-ubEkAaTfVZa+WwGhs5jbo5Xfqpeaybr/RvWzvFxRs4jfq16wH8l8Ty/QEEpINxll4xhuGfdMbipRyz5QZh9+FA==} engines: {node: ^14 || ^16 || >=18} peerDependencies: - '@csstools/css-tokenizer': ^2.2.3 + '@csstools/css-tokenizer': ^2.2.4 dependencies: - '@csstools/css-tokenizer': 2.2.3 + '@csstools/css-tokenizer': 2.2.4 dev: true - /@csstools/css-tokenizer@2.2.3: - resolution: {integrity: sha512-pp//EvZ9dUmGuGtG1p+n17gTHEOqu9jO+FiCUjNN3BDmyhdA2Jq9QsVeR7K8/2QCK17HSsioPlTW9ZkzoWb3Lg==} + /@csstools/css-tokenizer@2.2.4: + resolution: {integrity: sha512-PuWRAewQLbDhGeTvFuq2oClaSCKPIBmHyIobCV39JHRYN0byDcUWJl5baPeNUcqrjtdMNqFooE0FGl31I3JOqw==} engines: {node: ^14 || ^16 || >=18} dev: true - /@csstools/media-query-list-parser@2.1.8(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3): - resolution: {integrity: sha512-DiD3vG5ciNzeuTEoh74S+JMjQDs50R3zlxHnBnfd04YYfA/kh2KiBCGhzqLxlJcNq+7yNQ3stuZZYLX6wK/U2g==} + /@csstools/media-query-list-parser@2.1.9(@csstools/css-parser-algorithms@2.6.1)(@csstools/css-tokenizer@2.2.4): + resolution: {integrity: sha512-qqGuFfbn4rUmyOB0u8CVISIp5FfJ5GAR3mBrZ9/TKndHakdnm6pY0L/fbLcpPnrzwCyyTEZl1nUcXAYHEWneTA==} engines: {node: ^14 || ^16 || >=18} peerDependencies: - '@csstools/css-parser-algorithms': ^2.6.0 - '@csstools/css-tokenizer': ^2.2.3 + '@csstools/css-parser-algorithms': ^2.6.1 + '@csstools/css-tokenizer': ^2.2.4 dependencies: - '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) - '@csstools/css-tokenizer': 2.2.3 + '@csstools/css-parser-algorithms': 2.6.1(@csstools/css-tokenizer@2.2.4) + '@csstools/css-tokenizer': 2.2.4 dev: true - /@csstools/postcss-cascade-layers@4.0.3(postcss@8.4.35): - resolution: {integrity: sha512-RbkQoOH23yGhWVetgBTwFgIOHEyU2tKMN7blTz/YAKKabR6tr9pP7mYS23Q9snFY2hr8WSaV8Le64KdM9BtUSA==} + /@csstools/postcss-cascade-layers@4.0.4(postcss@8.4.38): + resolution: {integrity: sha512-MKErv8lpEwVmAcAwidY1Kfd3oWrh2Q14kxHs9xn26XzjP/PrcdngWq63lJsZeMlBY7o+WlEOeE+FP6zPzeY2uw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/selector-specificity': 3.0.2(postcss-selector-parser@6.0.15) - postcss: 8.4.35 - postcss-selector-parser: 6.0.15 + '@csstools/selector-specificity': 3.0.3(postcss-selector-parser@6.0.16) + postcss: 8.4.38 + postcss-selector-parser: 6.0.16 dev: true - /@csstools/postcss-color-function@3.0.10(postcss@8.4.35): - resolution: {integrity: sha512-jxiXmSl4ZYX8KewFjL5ef6of9uW73VkaHeDb2tqb5q4ZDPYxjusNX1KJ8UXY8+7ydqS5QBo42tVMrSMGy+rDmw==} + /@csstools/postcss-color-function@3.0.13(postcss@8.4.38): + resolution: {integrity: sha512-gM24cIPU45HSPJ2zllz7VKjS1OKQS1sKOMI7Wsw8gFyXSGAGrxhYo++McylOqOXd8ecMaKxKQMUJqJVibvJYig==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/css-color-parser': 1.5.2(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) - '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) - '@csstools/css-tokenizer': 2.2.3 - '@csstools/postcss-progressive-custom-properties': 3.1.0(postcss@8.4.35) - '@csstools/utilities': 1.0.0(postcss@8.4.35) - postcss: 8.4.35 + '@csstools/css-color-parser': 1.6.3(@csstools/css-parser-algorithms@2.6.1)(@csstools/css-tokenizer@2.2.4) + '@csstools/css-parser-algorithms': 2.6.1(@csstools/css-tokenizer@2.2.4) + '@csstools/css-tokenizer': 2.2.4 + '@csstools/postcss-progressive-custom-properties': 3.2.0(postcss@8.4.38) + '@csstools/utilities': 1.0.0(postcss@8.4.38) + postcss: 8.4.38 dev: true - /@csstools/postcss-color-mix-function@2.0.10(postcss@8.4.35): - resolution: {integrity: sha512-zeD856+FDCUjB077pPS+Z9OnTQnqpiJrao3TW+sasCb/gJ3vZCX7sRSRFsRUo0/MntTtJu9hkKv9eMkFmfjydA==} + /@csstools/postcss-color-mix-function@2.0.13(postcss@8.4.38): + resolution: {integrity: sha512-mD8IIfGVeWkN1H1wfCqYePOg4cDnVrOXm4P0OlYcvKriq6sImGCGShv/2D88q6s3iUlLXfUBES+DUjLVjDMhnw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/css-color-parser': 1.5.2(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) - '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) - '@csstools/css-tokenizer': 2.2.3 - '@csstools/postcss-progressive-custom-properties': 3.1.0(postcss@8.4.35) - '@csstools/utilities': 1.0.0(postcss@8.4.35) - postcss: 8.4.35 + '@csstools/css-color-parser': 1.6.3(@csstools/css-parser-algorithms@2.6.1)(@csstools/css-tokenizer@2.2.4) + '@csstools/css-parser-algorithms': 2.6.1(@csstools/css-tokenizer@2.2.4) + '@csstools/css-tokenizer': 2.2.4 + '@csstools/postcss-progressive-custom-properties': 3.2.0(postcss@8.4.38) + '@csstools/utilities': 1.0.0(postcss@8.4.38) + postcss: 8.4.38 dev: true - /@csstools/postcss-exponential-functions@1.0.4(postcss@8.4.35): - resolution: {integrity: sha512-frMf0CFVnZoGEKAHlxLy3s4g/tpjyFn5+A+h895UJNm9Uc+ewGT7+EeK7Kh9IHH4pD4FkaGW1vOQtER00PLurQ==} + /@csstools/postcss-exponential-functions@1.0.5(postcss@8.4.38): + resolution: {integrity: sha512-7S7I7KgwHWQYzJJAoIjRtUf7DQs1dxipeg1A6ikZr0PYapNJX7UHz0evlpE67SQqYj1xBs70gpG7xUv3uLp4PA==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/css-calc': 1.1.7(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) - '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) - '@csstools/css-tokenizer': 2.2.3 - postcss: 8.4.35 + '@csstools/css-calc': 1.2.0(@csstools/css-parser-algorithms@2.6.1)(@csstools/css-tokenizer@2.2.4) + '@csstools/css-parser-algorithms': 2.6.1(@csstools/css-tokenizer@2.2.4) + '@csstools/css-tokenizer': 2.2.4 + postcss: 8.4.38 dev: true - /@csstools/postcss-font-format-keywords@3.0.2(postcss@8.4.35): + /@csstools/postcss-font-format-keywords@3.0.2(postcss@8.4.38): resolution: {integrity: sha512-E0xz2sjm4AMCkXLCFvI/lyl4XO6aN1NCSMMVEOngFDJ+k2rDwfr6NDjWljk1li42jiLNChVX+YFnmfGCigZKXw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/utilities': 1.0.0(postcss@8.4.35) - postcss: 8.4.35 + '@csstools/utilities': 1.0.0(postcss@8.4.38) + postcss: 8.4.38 postcss-value-parser: 4.2.0 dev: true - /@csstools/postcss-gamut-mapping@1.0.3(postcss@8.4.35): - resolution: {integrity: sha512-P0+ude1KyCy9LXOe2pHJmpcXK4q/OQbr2Sn2wQSssMw0rALGmny2MfHiCqEu8n6mf2cN6lWDZdzY8enBk8WHXQ==} + /@csstools/postcss-gamut-mapping@1.0.6(postcss@8.4.38): + resolution: {integrity: sha512-qGFpHU9cRf9qqkbHh9cWMTlBtGi/ujPgP/znQdwkbB4TgDR1ddI5wRRrksBsx64sfoUSlIEd70bxXzD9FtfdLg==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/css-color-parser': 1.5.2(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) - '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) - '@csstools/css-tokenizer': 2.2.3 - postcss: 8.4.35 + '@csstools/css-color-parser': 1.6.3(@csstools/css-parser-algorithms@2.6.1)(@csstools/css-tokenizer@2.2.4) + '@csstools/css-parser-algorithms': 2.6.1(@csstools/css-tokenizer@2.2.4) + '@csstools/css-tokenizer': 2.2.4 + postcss: 8.4.38 dev: true - /@csstools/postcss-gradients-interpolation-method@4.0.11(postcss@8.4.35): - resolution: {integrity: sha512-LFom5jCVUfzF+iuiOZvhvX7RRN8vc+tKpcKo9s4keEBAU2mPwV5/Fgz5iylEfXP/DZbEdq2C0At20urMi/lupw==} + /@csstools/postcss-gradients-interpolation-method@4.0.14(postcss@8.4.38): + resolution: {integrity: sha512-VMWC3xtpchHJoRBb/fs1gJR/5nHopX+0GwwmgdCI1DjROtfWUKIW0nv8occ922Gv0/Lk93XBtYBv8JttVBMZUQ==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/css-color-parser': 1.5.2(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) - '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) - '@csstools/css-tokenizer': 2.2.3 - '@csstools/postcss-progressive-custom-properties': 3.1.0(postcss@8.4.35) - '@csstools/utilities': 1.0.0(postcss@8.4.35) - postcss: 8.4.35 + '@csstools/css-color-parser': 1.6.3(@csstools/css-parser-algorithms@2.6.1)(@csstools/css-tokenizer@2.2.4) + '@csstools/css-parser-algorithms': 2.6.1(@csstools/css-tokenizer@2.2.4) + '@csstools/css-tokenizer': 2.2.4 + '@csstools/postcss-progressive-custom-properties': 3.2.0(postcss@8.4.38) + '@csstools/utilities': 1.0.0(postcss@8.4.38) + postcss: 8.4.38 dev: true - /@csstools/postcss-hwb-function@3.0.9(postcss@8.4.35): - resolution: {integrity: sha512-S3/Z+mGHWIKAex7DLsHFDiku5lBEK34avT2My6sGPNCXB38TZjrKI0rd7JdN9oulem5sn+CU7oONyIftui24oQ==} + /@csstools/postcss-hwb-function@3.0.12(postcss@8.4.38): + resolution: {integrity: sha512-90kIs+FsM6isAXLVoFHTTl4h0J6g1J1M6ahpIjAs6/k7a2A9FB/q+l0MHpLre0ZiPlBf2y3e1j4L+79vml7kJw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/css-color-parser': 1.5.2(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) - '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) - '@csstools/css-tokenizer': 2.2.3 - '@csstools/postcss-progressive-custom-properties': 3.1.0(postcss@8.4.35) - '@csstools/utilities': 1.0.0(postcss@8.4.35) - postcss: 8.4.35 + '@csstools/css-color-parser': 1.6.3(@csstools/css-parser-algorithms@2.6.1)(@csstools/css-tokenizer@2.2.4) + '@csstools/css-parser-algorithms': 2.6.1(@csstools/css-tokenizer@2.2.4) + '@csstools/css-tokenizer': 2.2.4 + '@csstools/postcss-progressive-custom-properties': 3.2.0(postcss@8.4.38) + '@csstools/utilities': 1.0.0(postcss@8.4.38) + postcss: 8.4.38 dev: true - /@csstools/postcss-ic-unit@3.0.4(postcss@8.4.35): - resolution: {integrity: sha512-OB6ojl33/TQHhjVx1NI+n3EnYbdUM6Q/mSUv3WFATdcz7IrH/CmBaZt7P1R6j1Xdp58thIa6jm4Je7saGs+2AA==} + /@csstools/postcss-ic-unit@3.0.6(postcss@8.4.38): + resolution: {integrity: sha512-fHaU9C/sZPauXMrzPitZ/xbACbvxbkPpHoUgB9Kw5evtsBWdVkVrajOyiT9qX7/c+G1yjApoQjP1fQatldsy9w==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/postcss-progressive-custom-properties': 3.1.0(postcss@8.4.35) - '@csstools/utilities': 1.0.0(postcss@8.4.35) - postcss: 8.4.35 + '@csstools/postcss-progressive-custom-properties': 3.2.0(postcss@8.4.38) + '@csstools/utilities': 1.0.0(postcss@8.4.38) + postcss: 8.4.38 postcss-value-parser: 4.2.0 dev: true - /@csstools/postcss-initial@1.0.1(postcss@8.4.35): + /@csstools/postcss-initial@1.0.1(postcss@8.4.38): resolution: {integrity: sha512-wtb+IbUIrIf8CrN6MLQuFR7nlU5C7PwuebfeEXfjthUha1+XZj2RVi+5k/lukToA24sZkYAiSJfHM8uG/UZIdg==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.35 + postcss: 8.4.38 dev: true - /@csstools/postcss-is-pseudo-class@4.0.5(postcss@8.4.35): - resolution: {integrity: sha512-qG3MI7IN3KY9UwdaE9E7G7sFydscVW7nAj5OGwaBP9tQPEEVdxXTGI+l1ZW5EUpZFSj+u3q/22fH5+8HI72+Bg==} + /@csstools/postcss-is-pseudo-class@4.0.6(postcss@8.4.38): + resolution: {integrity: sha512-HilOhAsMpFheMYkuaREZx+CGa4hsG6kQdzwXSsuqKDFzYz2eIMP213+3dH/vUbPXaWrzqLKr8m3i0dgYPoh7vg==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/selector-specificity': 3.0.2(postcss-selector-parser@6.0.15) - postcss: 8.4.35 - postcss-selector-parser: 6.0.15 + '@csstools/selector-specificity': 3.0.3(postcss-selector-parser@6.0.16) + postcss: 8.4.38 + postcss-selector-parser: 6.0.16 dev: true - /@csstools/postcss-light-dark-function@1.0.0(postcss@8.4.35): - resolution: {integrity: sha512-KHo633V16DGo6tmpr1ARAwO73CPBNmDI3PfSQYe7ZBMiv60WEizbcEroK75fHjxKYJ4tj9uCCzp5sYG4cEUqqw==} + /@csstools/postcss-light-dark-function@1.0.3(postcss@8.4.38): + resolution: {integrity: sha512-izW8hvhOqJlarLcGXO5PSylW9pQS3fytmhRdx2/e1oZFi15vs7ZShOHcREHJ3FfGdYqDA10cP9uhH0A3hmm1Rw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) - '@csstools/css-tokenizer': 2.2.3 - '@csstools/postcss-progressive-custom-properties': 3.1.0(postcss@8.4.35) - '@csstools/utilities': 1.0.0(postcss@8.4.35) - postcss: 8.4.35 + '@csstools/css-parser-algorithms': 2.6.1(@csstools/css-tokenizer@2.2.4) + '@csstools/css-tokenizer': 2.2.4 + '@csstools/postcss-progressive-custom-properties': 3.2.0(postcss@8.4.38) + '@csstools/utilities': 1.0.0(postcss@8.4.38) + postcss: 8.4.38 dev: true - /@csstools/postcss-logical-float-and-clear@2.0.1(postcss@8.4.35): + /@csstools/postcss-logical-float-and-clear@2.0.1(postcss@8.4.38): resolution: {integrity: sha512-SsrWUNaXKr+e/Uo4R/uIsqJYt3DaggIh/jyZdhy/q8fECoJSKsSMr7nObSLdvoULB69Zb6Bs+sefEIoMG/YfOA==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.35 + postcss: 8.4.38 dev: true - /@csstools/postcss-logical-overflow@1.0.1(postcss@8.4.35): + /@csstools/postcss-logical-overflow@1.0.1(postcss@8.4.38): resolution: {integrity: sha512-Kl4lAbMg0iyztEzDhZuQw8Sj9r2uqFDcU1IPl+AAt2nue8K/f1i7ElvKtXkjhIAmKiy5h2EY8Gt/Cqg0pYFDCw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.35 + postcss: 8.4.38 dev: true - /@csstools/postcss-logical-overscroll-behavior@1.0.1(postcss@8.4.35): + /@csstools/postcss-logical-overscroll-behavior@1.0.1(postcss@8.4.38): resolution: {integrity: sha512-+kHamNxAnX8ojPCtV8WPcUP3XcqMFBSDuBuvT6MHgq7oX4IQxLIXKx64t7g9LiuJzE7vd06Q9qUYR6bh4YnGpQ==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.35 + postcss: 8.4.38 dev: true - /@csstools/postcss-logical-resize@2.0.1(postcss@8.4.35): + /@csstools/postcss-logical-resize@2.0.1(postcss@8.4.38): resolution: {integrity: sha512-W5Gtwz7oIuFcKa5SmBjQ2uxr8ZoL7M2bkoIf0T1WeNqljMkBrfw1DDA8/J83k57NQ1kcweJEjkJ04pUkmyee3A==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.35 + postcss: 8.4.38 postcss-value-parser: 4.2.0 dev: true - /@csstools/postcss-logical-viewport-units@2.0.6(postcss@8.4.35): - resolution: {integrity: sha512-6hV0ngZh8J7HqNY3kyt+z5ABN/XE18qvrU7ne4YSkKfltrWDnQgGiW/Q+h7bdQz8/W5juAefcdCCAJUIBE7erg==} + /@csstools/postcss-logical-viewport-units@2.0.7(postcss@8.4.38): + resolution: {integrity: sha512-L4G3zsp/bnU0+WXUyysihCUH14LkfMgUJsS9vKz3vCYbVobOTqQRoNXnEPpyNp8WYyolLqAWbGGJhVu8J6u2OQ==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/css-tokenizer': 2.2.3 - '@csstools/utilities': 1.0.0(postcss@8.4.35) - postcss: 8.4.35 + '@csstools/css-tokenizer': 2.2.4 + '@csstools/utilities': 1.0.0(postcss@8.4.38) + postcss: 8.4.38 dev: true - /@csstools/postcss-media-minmax@1.1.3(postcss@8.4.35): - resolution: {integrity: sha512-W9AFRQSLvT+Dxtp20AewzGTUxzkJ21XSKzqRALwQdAv0uJGXkR76qgdhkoX0L/tcV4gXtgDfVtGYL/x2Nz/M5Q==} + /@csstools/postcss-media-minmax@1.1.4(postcss@8.4.38): + resolution: {integrity: sha512-xl/PIO3TUbXO1ZA4SA6HCw+Q9UGe2cgeRKx3lHCzoNig2D4bT5vfVCOrwhxjUb09oHihc9eI3I0iIfVPiXaN1A==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/css-calc': 1.1.7(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) - '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) - '@csstools/css-tokenizer': 2.2.3 - '@csstools/media-query-list-parser': 2.1.8(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) - postcss: 8.4.35 + '@csstools/css-calc': 1.2.0(@csstools/css-parser-algorithms@2.6.1)(@csstools/css-tokenizer@2.2.4) + '@csstools/css-parser-algorithms': 2.6.1(@csstools/css-tokenizer@2.2.4) + '@csstools/css-tokenizer': 2.2.4 + '@csstools/media-query-list-parser': 2.1.9(@csstools/css-parser-algorithms@2.6.1)(@csstools/css-tokenizer@2.2.4) + postcss: 8.4.38 dev: true - /@csstools/postcss-media-queries-aspect-ratio-number-values@2.0.6(postcss@8.4.35): - resolution: {integrity: sha512-awc2qenSDvx6r+w6G9xxENp+LsbvHC8mMMV23KYmk4pR3YL8JxeKPDSiDhmqd93FQ9nNNDc/CaCQEcvP+GV4rw==} + /@csstools/postcss-media-queries-aspect-ratio-number-values@2.0.7(postcss@8.4.38): + resolution: {integrity: sha512-HBDAQw1K0NilcHGMUHv8jzf2mpOtcWTVKtuY3AeZ5TS1uyWWNVi5/yuA/tREPLU9WifNdqHQ+rfbsV/8zTIkTg==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) - '@csstools/css-tokenizer': 2.2.3 - '@csstools/media-query-list-parser': 2.1.8(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) - postcss: 8.4.35 + '@csstools/css-parser-algorithms': 2.6.1(@csstools/css-tokenizer@2.2.4) + '@csstools/css-tokenizer': 2.2.4 + '@csstools/media-query-list-parser': 2.1.9(@csstools/css-parser-algorithms@2.6.1)(@csstools/css-tokenizer@2.2.4) + postcss: 8.4.38 dev: true - /@csstools/postcss-nested-calc@3.0.2(postcss@8.4.35): + /@csstools/postcss-nested-calc@3.0.2(postcss@8.4.38): resolution: {integrity: sha512-ySUmPyawiHSmBW/VI44+IObcKH0v88LqFe0d09Sb3w4B1qjkaROc6d5IA3ll9kjD46IIX/dbO5bwFN/swyoyZA==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/utilities': 1.0.0(postcss@8.4.35) - postcss: 8.4.35 + '@csstools/utilities': 1.0.0(postcss@8.4.38) + postcss: 8.4.38 postcss-value-parser: 4.2.0 dev: true - /@csstools/postcss-normalize-display-values@3.0.2(postcss@8.4.35): + /@csstools/postcss-normalize-display-values@3.0.2(postcss@8.4.38): resolution: {integrity: sha512-fCapyyT/dUdyPtrelQSIV+d5HqtTgnNP/BEG9IuhgXHt93Wc4CfC1bQ55GzKAjWrZbgakMQ7MLfCXEf3rlZJOw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.35 + postcss: 8.4.38 postcss-value-parser: 4.2.0 dev: true - /@csstools/postcss-oklab-function@3.0.10(postcss@8.4.35): - resolution: {integrity: sha512-s9trs1c+gUMtaTtwrrIpdVQkUbRuwi6bQ9rBHaqwt4kd3kEnEYfP85uLY1inFx6Rt8OM2XVg3PSYbfnFSAO51A==} + /@csstools/postcss-oklab-function@3.0.13(postcss@8.4.38): + resolution: {integrity: sha512-xbzMmukDFAwCt2+279io7ZiamZj87s6cnU3UgKB3G+NMpRX9A6uvN8xlnTLCe384hqg6hix5vlOmwkxqACb5pg==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/css-color-parser': 1.5.2(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) - '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) - '@csstools/css-tokenizer': 2.2.3 - '@csstools/postcss-progressive-custom-properties': 3.1.0(postcss@8.4.35) - '@csstools/utilities': 1.0.0(postcss@8.4.35) - postcss: 8.4.35 + '@csstools/css-color-parser': 1.6.3(@csstools/css-parser-algorithms@2.6.1)(@csstools/css-tokenizer@2.2.4) + '@csstools/css-parser-algorithms': 2.6.1(@csstools/css-tokenizer@2.2.4) + '@csstools/css-tokenizer': 2.2.4 + '@csstools/postcss-progressive-custom-properties': 3.2.0(postcss@8.4.38) + '@csstools/utilities': 1.0.0(postcss@8.4.38) + postcss: 8.4.38 dev: true - /@csstools/postcss-progressive-custom-properties@3.1.0(postcss@8.4.35): - resolution: {integrity: sha512-Mfb1T1BHa6pktLI+poMEHI7Q+VYvAsdwJZPFsSkIB2ZUsawCiPxXLw06BKSVPITxFlaY/FEUzfpyOTfX9YCE2w==} + /@csstools/postcss-progressive-custom-properties@3.2.0(postcss@8.4.38): + resolution: {integrity: sha512-BZlirVxCRgKlE7yVme+Xvif72eTn1MYXj8oZ4Knb+jwaH4u3AN1DjbhM7j86RP5vvuAOexJ4JwfifYYKWMN/QQ==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.35 + postcss: 8.4.38 postcss-value-parser: 4.2.0 dev: true - /@csstools/postcss-relative-color-syntax@2.0.10(postcss@8.4.35): - resolution: {integrity: sha512-IkTIk9Eq2VegSN4lgsljGY8boyfX3l3Pw58e+R9oyPe/Ye7r3NwuiQ3w0nkXoQ+RC+d240V6n7eZme2mEPqQvg==} + /@csstools/postcss-relative-color-syntax@2.0.13(postcss@8.4.38): + resolution: {integrity: sha512-mENWPNcHdiEYtjHFfZP9U1jNukQgFpSQ7wvTvwiadK3qgNBiSl0vMSinM9kKsGsJLTHQ0LEAqWLHurU52I4Jeg==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/css-color-parser': 1.5.2(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) - '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) - '@csstools/css-tokenizer': 2.2.3 - '@csstools/postcss-progressive-custom-properties': 3.1.0(postcss@8.4.35) - '@csstools/utilities': 1.0.0(postcss@8.4.35) - postcss: 8.4.35 + '@csstools/css-color-parser': 1.6.3(@csstools/css-parser-algorithms@2.6.1)(@csstools/css-tokenizer@2.2.4) + '@csstools/css-parser-algorithms': 2.6.1(@csstools/css-tokenizer@2.2.4) + '@csstools/css-tokenizer': 2.2.4 + '@csstools/postcss-progressive-custom-properties': 3.2.0(postcss@8.4.38) + '@csstools/utilities': 1.0.0(postcss@8.4.38) + postcss: 8.4.38 dev: true - /@csstools/postcss-scope-pseudo-class@3.0.1(postcss@8.4.35): + /@csstools/postcss-scope-pseudo-class@3.0.1(postcss@8.4.38): resolution: {integrity: sha512-3ZFonK2gfgqg29gUJ2w7xVw2wFJ1eNWVDONjbzGkm73gJHVCYK5fnCqlLr+N+KbEfv2XbWAO0AaOJCFB6Fer6A==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.35 - postcss-selector-parser: 6.0.15 + postcss: 8.4.38 + postcss-selector-parser: 6.0.16 dev: true - /@csstools/postcss-stepped-value-functions@3.0.5(postcss@8.4.35): - resolution: {integrity: sha512-B8K8RaTrYVZLxbNzVUvFO3SlCDJDaUTAO7KRth05fa7f01ufPvb6ztdBuxSoRwOtmNp8iROxPJHOemWo2kBBtA==} + /@csstools/postcss-stepped-value-functions@3.0.6(postcss@8.4.38): + resolution: {integrity: sha512-rnyp8tWRuBXERTHVdB5hjUlif5dQgPcyN+BX55wUnYpZ3LN9QPfK2Z3/HUZymwyou8Gg6vhd6X2W+g1pLq1jYg==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/css-calc': 1.1.7(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) - '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) - '@csstools/css-tokenizer': 2.2.3 - postcss: 8.4.35 + '@csstools/css-calc': 1.2.0(@csstools/css-parser-algorithms@2.6.1)(@csstools/css-tokenizer@2.2.4) + '@csstools/css-parser-algorithms': 2.6.1(@csstools/css-tokenizer@2.2.4) + '@csstools/css-tokenizer': 2.2.4 + postcss: 8.4.38 dev: true - /@csstools/postcss-text-decoration-shorthand@3.0.4(postcss@8.4.35): - resolution: {integrity: sha512-yUZmbnUemgQmja7SpOZeU45+P49wNEgQguRdyTktFkZsHf7Gof+ZIYfvF6Cm+LsU1PwSupy4yUeEKKjX5+k6cQ==} + /@csstools/postcss-text-decoration-shorthand@3.0.5(postcss@8.4.38): + resolution: {integrity: sha512-qKxXpD0TYINkUtWDN1RHdeWKtZCzEv5j3UMT/ZGqyY27icwCFw7iKO0bUeLSHjYFBqhurCWvoOsa9REqLdrNDw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/color-helpers': 4.0.0 - postcss: 8.4.35 + '@csstools/color-helpers': 4.1.0 + postcss: 8.4.38 postcss-value-parser: 4.2.0 dev: true - /@csstools/postcss-trigonometric-functions@3.0.5(postcss@8.4.35): - resolution: {integrity: sha512-RhBfQ0TsBudyPuoo8pXKdfQuUiQxMU/Sc5GyV57bWk93JbUHXq6b4CdPx+B/tHUeFKvocVJn/e2jbu96rh0d3Q==} + /@csstools/postcss-trigonometric-functions@3.0.6(postcss@8.4.38): + resolution: {integrity: sha512-i5Zd0bMJooZAn+ZcDmPij2WCkcOJJJ6opzK+QeDjxbMrYmoGQl0CY8FDHdeQyBF1Nly+Q0Fq3S7QfdNLKBBaCg==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/css-calc': 1.1.7(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) - '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) - '@csstools/css-tokenizer': 2.2.3 - postcss: 8.4.35 + '@csstools/css-calc': 1.2.0(@csstools/css-parser-algorithms@2.6.1)(@csstools/css-tokenizer@2.2.4) + '@csstools/css-parser-algorithms': 2.6.1(@csstools/css-tokenizer@2.2.4) + '@csstools/css-tokenizer': 2.2.4 + postcss: 8.4.38 dev: true - /@csstools/postcss-unset-value@3.0.1(postcss@8.4.35): + /@csstools/postcss-unset-value@3.0.1(postcss@8.4.38): resolution: {integrity: sha512-dbDnZ2ja2U8mbPP0Hvmt2RMEGBiF1H7oY6HYSpjteXJGihYwgxgTr6KRbbJ/V6c+4wd51M+9980qG4gKVn5ttg==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.35 + postcss: 8.4.38 dev: true - /@csstools/selector-resolve-nested@1.1.0(postcss-selector-parser@6.0.15): + /@csstools/selector-resolve-nested@1.1.0(postcss-selector-parser@6.0.16): resolution: {integrity: sha512-uWvSaeRcHyeNenKg8tp17EVDRkpflmdyvbE0DHo6D/GdBb6PDnCYYU6gRpXhtICMGMcahQmj2zGxwFM/WC8hCg==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss-selector-parser: ^6.0.13 dependencies: - postcss-selector-parser: 6.0.15 + postcss-selector-parser: 6.0.16 dev: true - /@csstools/selector-specificity@3.0.2(postcss-selector-parser@6.0.15): - resolution: {integrity: sha512-RpHaZ1h9LE7aALeQXmXrJkRG84ZxIsctEN2biEUmFyKpzFM3zZ35eUMcIzZFsw/2olQE6v69+esEqU2f1MKycg==} + /@csstools/selector-specificity@3.0.3(postcss-selector-parser@6.0.16): + resolution: {integrity: sha512-KEPNw4+WW5AVEIyzC80rTbWEUatTW2lXpN8+8ILC8PiPeWPjwUzrPZDIOZ2wwqDmeqOYTdSGyL3+vE5GC3FB3Q==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss-selector-parser: ^6.0.13 dependencies: - postcss-selector-parser: 6.0.15 + postcss-selector-parser: 6.0.16 dev: true - /@csstools/utilities@1.0.0(postcss@8.4.35): + /@csstools/utilities@1.0.0(postcss@8.4.38): resolution: {integrity: sha512-tAgvZQe/t2mlvpNosA4+CkMiZ2azISW5WPAcdSalZlEjQvUfghHxfQcrCiK/7/CrfAWVxyM88kGFYO82heIGDg==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.35 + postcss: 8.4.38 dev: true /@discoveryjs/json-ext@0.5.7: @@ -3240,11 +3208,11 @@ packages: /@emotion/babel-plugin@11.11.0: resolution: {integrity: sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==} dependencies: - '@babel/helper-module-imports': 7.22.15 - '@babel/runtime': 7.24.0 + '@babel/helper-module-imports': 7.24.3 + '@babel/runtime': 7.24.4 '@emotion/hash': 0.9.1 '@emotion/memoize': 0.8.1 - '@emotion/serialize': 1.1.3 + '@emotion/serialize': 1.1.4 babel-plugin-macros: 3.1.0 convert-source-map: 1.9.0 escape-string-regexp: 4.0.0 @@ -3268,7 +3236,7 @@ packages: dependencies: '@emotion/babel-plugin': 11.11.0 '@emotion/cache': 11.11.0 - '@emotion/serialize': 1.1.3 + '@emotion/serialize': 1.1.4 '@emotion/sheet': 1.2.2 '@emotion/utils': 1.2.1 dev: false @@ -3290,10 +3258,10 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.4 '@emotion/babel-plugin': 11.11.0 '@emotion/cache': 11.11.0 - '@emotion/serialize': 1.1.3 + '@emotion/serialize': 1.1.4 '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.2.0) '@emotion/utils': 1.2.1 '@emotion/weak-memoize': 0.3.1 @@ -3302,8 +3270,8 @@ packages: react: 18.2.0 dev: false - /@emotion/serialize@1.1.3: - resolution: {integrity: sha512-iD4D6QVZFDhcbH0RAG1uVu1CwVLMWUkCvAqqlewO/rxf8+87yIBAlt4+AxMiiKPLs5hFc0owNk/sLLAOROw3cA==} + /@emotion/serialize@1.1.4: + resolution: {integrity: sha512-RIN04MBT8g+FnDwgvIUi8czvr1LU1alUMI05LekWB5DGyTm8cCBMCRpq3GqaiyEDRptEXOyXnvZ58GZYu4kBxQ==} dependencies: '@emotion/hash': 0.9.1 '@emotion/memoize': 0.8.1 @@ -3346,7 +3314,7 @@ packages: resolution: {integrity: sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==} dependencies: '@esbuild-kit/core-utils': 3.3.2 - get-tsconfig: 4.7.2 + get-tsconfig: 4.7.3 /@esbuild/aix-ppc64@0.19.12: resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} @@ -3799,8 +3767,8 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false - /@floating-ui/react@0.26.9(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-p86wynZJVEkEq2BBjY/8p2g3biQ6TlgT4o/3KgFKyTWoJLU1GZ8wpctwRqtkEl2tseYA+kw7dBAIDFcednfI5w==} + /@floating-ui/react@0.26.11(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-fo01Cu+jzLDVG/AYAV2OtV6flhXvxP5rDaR1Fk8WWhtsFqwk478Dr2HGtB8s0HqQCsFWVbdHYpPjMiQiR/A9VA==} peerDependencies: react: ^18.2.0 react-dom: ^18.2.0 @@ -3834,8 +3802,8 @@ packages: engines: {node: '>=14'} dev: true - /@google-cloud/storage@7.7.0: - resolution: {integrity: sha512-EMCEY+6JiIkx7Dt8NXVGGjy1vRdSGdHkoqZoqjJw7cEBkT7ZkX0c7puedfn1MamnzW5SX4xoa2jVq5u7OWBmkQ==} + /@google-cloud/storage@7.9.0: + resolution: {integrity: sha512-PlFl7g3r91NmXtZHXsSEfTZES5ysD3SSBWmX4iBdQ2TFH7tN/Vn/IhnVELCHtgh1vc+uYPZ7XvRYaqtDCdghIA==} engines: {node: '>=14'} dependencies: '@google-cloud/paginator': 5.0.0 @@ -3844,11 +3812,11 @@ packages: abort-controller: 3.0.0 async-retry: 1.3.3 compressible: 2.0.18 - duplexify: 4.1.2 + duplexify: 4.1.3 ent: 2.2.0 - fast-xml-parser: 4.3.5 - gaxios: 6.3.0 - google-auth-library: 9.6.3 + fast-xml-parser: 4.3.6 + gaxios: 6.4.0 + google-auth-library: 9.7.0 mime: 3.0.0 mime-types: 2.1.35 p-limit: 3.1.0 @@ -3874,7 +3842,7 @@ packages: resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} engines: {node: '>=10.10.0'} dependencies: - '@humanwhocodes/object-schema': 2.0.2 + '@humanwhocodes/object-schema': 2.0.3 debug: 4.3.4(supports-color@5.5.0) minimatch: 3.1.2 transitivePeerDependencies: @@ -3884,8 +3852,8 @@ packages: resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - /@humanwhocodes/object-schema@2.0.2: - resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==} + /@humanwhocodes/object-schema@2.0.3: + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} /@hutson/parse-repository-url@5.0.0: resolution: {integrity: sha512-e5+YUKENATs1JgYHMzTr2MW/NDcXGfYFAuOQU8gJgF/kEh4EqKgfGrfLI67bMD4tbhZVlkigz/9YYwWcbOFthg==} @@ -4037,7 +4005,7 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@jridgewell/trace-mapping': 0.3.23 + '@jridgewell/trace-mapping': 0.3.25 '@types/node': 20.12.5 chalk: 4.1.2 collect-v8-coverage: 1.0.2 @@ -4069,7 +4037,7 @@ packages: resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jridgewell/trace-mapping': 0.3.23 + '@jridgewell/trace-mapping': 0.3.25 callsites: 3.1.0 graceful-fs: 4.2.11 @@ -4095,9 +4063,9 @@ packages: resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.4 '@jest/types': 29.6.3 - '@jridgewell/trace-mapping': 0.3.23 + '@jridgewell/trace-mapping': 0.3.25 babel-plugin-istanbul: 6.1.1 chalk: 4.1.2 convert-source-map: 2.0.0 @@ -4124,34 +4092,34 @@ packages: '@types/yargs': 17.0.32 chalk: 4.1.2 - /@jridgewell/gen-mapping@0.3.4: - resolution: {integrity: sha512-Oud2QPM5dHviZNn4y/WhhYKSXksv+1xLEIsNrAbGcFzUN3ubqWRFT5gwPchNc5NuzILOU4tPBDTZ4VwhL8Y7cw==} + /@jridgewell/gen-mapping@0.3.5: + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} engines: {node: '>=6.0.0'} dependencies: - '@jridgewell/set-array': 1.1.2 + '@jridgewell/set-array': 1.2.1 '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.23 + '@jridgewell/trace-mapping': 0.3.25 /@jridgewell/resolve-uri@3.1.2: resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - /@jridgewell/set-array@1.1.2: - resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + /@jridgewell/set-array@1.2.1: + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} engines: {node: '>=6.0.0'} - /@jridgewell/source-map@0.3.5: - resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} + /@jridgewell/source-map@0.3.6: + resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} dependencies: - '@jridgewell/gen-mapping': 0.3.4 - '@jridgewell/trace-mapping': 0.3.23 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 dev: true /@jridgewell/sourcemap-codec@1.4.15: resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - /@jridgewell/trace-mapping@0.3.23: - resolution: {integrity: sha512-9/4foRoUKp8s96tSkh8DlAAc5A0Ty8vLXld+l9gjKKY6ckwI8G15f0hskGmuLZu78ZlGa1vtsfOa+lnB4vG6Jg==} + /@jridgewell/trace-mapping@0.3.25: + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} dependencies: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.4.15 @@ -4322,7 +4290,7 @@ packages: lexical: 0.13.1 dev: false - /@lexical/react@0.13.1(lexical@0.13.1)(react-dom@18.2.0)(react@18.2.0)(yjs@13.6.12): + /@lexical/react@0.13.1(lexical@0.13.1)(react-dom@18.2.0)(react@18.2.0)(yjs@13.6.14): resolution: {integrity: sha512-Sy6EL230KAb0RZsZf1dZrRrc3+rvCDQWltcd8C/cqBUYlxsLYCW9s4f3RB2werngD/PtLYbBB48SYXNkIALITA==} peerDependencies: lexical: 0.13.1 @@ -4345,7 +4313,7 @@ packages: '@lexical/table': 0.13.1(lexical@0.13.1) '@lexical/text': 0.13.1(lexical@0.13.1) '@lexical/utils': 0.13.1(lexical@0.13.1) - '@lexical/yjs': 0.13.1(lexical@0.13.1)(yjs@13.6.12) + '@lexical/yjs': 0.13.1(lexical@0.13.1)(yjs@13.6.14) lexical: 0.13.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -4404,7 +4372,7 @@ packages: lexical: 0.13.1 dev: false - /@lexical/yjs@0.13.1(lexical@0.13.1)(yjs@13.6.12): + /@lexical/yjs@0.13.1(lexical@0.13.1)(yjs@13.6.14): resolution: {integrity: sha512-4GbqQM+PwNTV59AZoNrfTe/0rLjs+cX6Y6yAdZSRPBwr5L3JzYeU1TTcFCVQTtsE7KF8ddVP8sD7w9pi8rOWLA==} peerDependencies: lexical: 0.13.1 @@ -4412,35 +4380,35 @@ packages: dependencies: '@lexical/offset': 0.13.1(lexical@0.13.1) lexical: 0.13.1 - yjs: 13.6.12 + yjs: 13.6.14 dev: false - /@libsql/client@0.5.2: - resolution: {integrity: sha512-aHnYjsqE4QWhb+HdJj2HtLw6QBt61veSu6IQgFO5rxzdY/rb69YAgYF0ZvpVoMn12B/t9U9U7H3ow/IADo4Yhg==} + /@libsql/client@0.5.6: + resolution: {integrity: sha512-UBjmDoxz75Z2sHdP+ETCROpeLA/77VMesiff8R4UWK1rnaWbh6/YoCLDILMJL3Rh0udQeKxjL8MjXthqohax+g==} dependencies: - '@libsql/core': 0.5.2 + '@libsql/core': 0.5.6 '@libsql/hrana-client': 0.5.6 js-base64: 3.7.7 - libsql: 0.3.4 + libsql: 0.3.10 transitivePeerDependencies: - bufferutil - encoding - utf-8-validate - /@libsql/core@0.5.2: - resolution: {integrity: sha512-sBo55JJXRiggymOy91MvI+lJ15U8BdWBHytAeszpebhhbrkuTfd+5jDoB3sSZ0dMH0NIPAVQEEQnQldAO+SDXg==} + /@libsql/core@0.5.6: + resolution: {integrity: sha512-3vicUAydq6jPth410n4AsHHm1n2psTwvkSf94nfJlSXutGSZsl0updn2N/mJBgqUHkbuFoWZtlMifF0SwBj1xQ==} dependencies: js-base64: 3.7.7 - /@libsql/darwin-arm64@0.3.4: - resolution: {integrity: sha512-scNlltUTZp74jqjzDVVBtKUy5nZD+0+Q3CR8RJwCKrf73I/0IAKfvwddx4gsinymFqMn8hyiTGIZukgHlBjftA==} + /@libsql/darwin-arm64@0.3.10: + resolution: {integrity: sha512-RaexEFfPAFogd6dJlqkpCkTxdr6K14Z0286lodIJ8Ny77mWuWyBkWKxf70OYWXXAMxMJFUW+6al1F3/Osf/pTg==} cpu: [arm64] os: [darwin] requiresBuild: true optional: true - /@libsql/darwin-x64@0.3.4: - resolution: {integrity: sha512-xZUVgzH1qshTnnE8RRZlvAgUGFE7w36iczMiDvGN5XHOuI6gLE4Lk1m/G51MKjN+p7AK/3wowlQpvZPK/KMV8Q==} + /@libsql/darwin-x64@0.3.10: + resolution: {integrity: sha512-SNVN6n4qNUdMW1fJMFmx4qn4n5RnXsxjFbczpkzG/V7m/5VeTFt1chhGcrahTHCr3+K6eRJWJUEQHRGqjBwPkw==} cpu: [x64] os: [darwin] requiresBuild: true @@ -4475,36 +4443,36 @@ packages: - bufferutil - utf-8-validate - /@libsql/linux-arm64-gnu@0.3.4: - resolution: {integrity: sha512-IewL34c9WyxPtvLQqYb5WX3IEqFjprDkFjXmySkDrF9+3k2AfmCurnXjJwOrWHu2GlNLo84mwSVsCQ/jfm8lPw==} + /@libsql/linux-arm64-gnu@0.3.10: + resolution: {integrity: sha512-2uXpi9d8qtyIOr7pyG4a88j6YXgemyIHEs2Wbp+PPletlCIPsFS+E7IQHbz8VwTohchOzcokGUm1Bc5QC+A7wg==} cpu: [arm64] os: [linux] requiresBuild: true optional: true - /@libsql/linux-arm64-musl@0.3.4: - resolution: {integrity: sha512-Qiml3cZuLLptsZ9Mkdkt8sZROvVWyqhWcQkEPpp5MtSUiluy+8y+IHniiI7wJvOpi9A4tGREY9KoDZCWWPwLBw==} + /@libsql/linux-arm64-musl@0.3.10: + resolution: {integrity: sha512-72SN1FUavLvzHddCS861ynSpQndcW5oLGKA3U8CyMfgIZIwJAPc7+48Uj1plW00htXBx4GBpcntFp68KKIx3YQ==} cpu: [arm64] os: [linux] requiresBuild: true optional: true - /@libsql/linux-x64-gnu@0.3.4: - resolution: {integrity: sha512-fZRwlEjzRkJFf+lPpe9AMbaF32IL5HFtQVfXe6nSuE+YwlUNC+kN7ElGIKfuh5wJ3S9S4fXMefH0FY4ynEz4vw==} + /@libsql/linux-x64-gnu@0.3.10: + resolution: {integrity: sha512-hXyNqVRi7ONuyWZ1SX6setxL0QaQ7InyS3bHLupsi9s7NpOGD5vcpTaYicJOqmIIm+6kt8vJfmo7ZxlarIHy7Q==} cpu: [x64] os: [linux] requiresBuild: true optional: true - /@libsql/linux-x64-musl@0.3.4: - resolution: {integrity: sha512-TCjX+nQpK/xQC5jhQJWShc98FsoTWQCdp0w1ZhVa47jIFdTPh44rvVf9sS6j5K8bxfyMNiBQQNSn7A0vBfAZXw==} + /@libsql/linux-x64-musl@0.3.10: + resolution: {integrity: sha512-kNmIRxomVwt9S+cLyYS497F/3gXFF4r8wW12YSBQgxG75JYft07AHVd8J7HINg+oqRkLzT0s+mVX5dM6nk68EQ==} cpu: [x64] os: [linux] requiresBuild: true optional: true - /@libsql/win32-x64-msvc@0.3.4: - resolution: {integrity: sha512-q8uLbIqIB6mMUqN6Joiy+GN5d8/WfKsk8cN28H71WAywmQVsFg1u0RJj3X28qFzNGz+K1z4BqQFBSPVEefqYNw==} + /@libsql/win32-x64-msvc@0.3.10: + resolution: {integrity: sha512-c/6rjdtGULKrJkLgfLobFefObfOtxjXGmCfPxv6pr0epPCeUEssfDbDIeEH9fQUgzogIMWEHwT8so52UJ/iT1Q==} cpu: [x64] os: [win32] requiresBuild: true @@ -4544,8 +4512,8 @@ packages: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - /@mongodb-js/saslprep@1.1.4: - resolution: {integrity: sha512-8zJ8N1x51xo9hwPh6AWnKdLGEC5N3lDa6kms1YHmFBoRhTpJR6HG8wWk0td1MVCu9cD4YBrvjZEtd5Obw0Fbnw==} + /@mongodb-js/saslprep@1.1.5: + resolution: {integrity: sha512-XLNOMH66KhJzUJNwT/qlMnS4WsNDWD5ASdyaSH3EtK+F4r/CFGa3jT4GNi4mfOitGvWXtdLgQJkQjxSVrio+jA==} requiresBuild: true dependencies: sparse-bitfield: 3.0.3 @@ -4554,8 +4522,8 @@ packages: /@neon-rs/load@0.0.4: resolution: {integrity: sha512-kTPhdZyTQxB+2wpiRcFWrDcejc4JI6tkPuS7UZCG4l6Zvc5kU/gGQ/ozvHTh1XR5tS+UlfAfGuPajjzQjCiHCw==} - /@next/bundle-analyzer@14.1.0: - resolution: {integrity: sha512-RJWjnlMp/1WSW0ahAdawV22WgJiC6BVaFS5Xfhw6gP7NJEX3cAJjh4JqSHKGr8GnLNRaFCVTQdDPoX84E421BA==} + /@next/bundle-analyzer@14.1.4: + resolution: {integrity: sha512-IpF/18HcAOcfHRr24tqPOUpMmVKIqvkCxIubMeRYWCXs3jm7niPGrt8Mu74yMDzfGlUwgQA6Xd6BUc5+jQxcEg==} dependencies: webpack-bundle-analyzer: 4.10.1 transitivePeerDependencies: @@ -4571,8 +4539,8 @@ packages: resolution: {integrity: sha512-cBlFB8Y/iE3K2NX/Km4tP4RZGLsv0D72KI9KxmZepKSkaQBSbtHM0YeHnZ51CFe9UQKzQ/1mPnCY89BjiyIQtQ==} dev: false - /@next/eslint-plugin-next@14.1.0: - resolution: {integrity: sha512-x4FavbNEeXx/baD/zC/SdrvkjSby8nBn8KcCREqk6UuwvwoAPZmaV8TFCAuo/cpovBRTIY67mHhe86MQQm/68Q==} + /@next/eslint-plugin-next@14.1.4: + resolution: {integrity: sha512-n4zYNLSyCo0Ln5b7qxqQeQ34OZKXwgbdcx6kmkQbywr+0k6M3Vinft0T72R6CDAcDrne2IAgSud4uWCzFgc5HA==} dependencies: glob: 10.3.10 dev: true @@ -4762,71 +4730,71 @@ packages: engines: {node: '>= 18'} dev: true - /@octokit/core@5.1.0: - resolution: {integrity: sha512-BDa2VAMLSh3otEiaMJ/3Y36GU4qf6GI+VivQ/P41NC6GHcdxpKlqV0ikSZ5gdQsmS3ojXeRx5vasgNTinF0Q4g==} + /@octokit/core@5.2.0: + resolution: {integrity: sha512-1LFfa/qnMQvEOAdzlQymH0ulepxbxnCYAKJZfMci/5XJyIHWgEYnDmgnKakbTh7CH2tFQ5O60oYDvns4i9RAIg==} engines: {node: '>= 18'} dependencies: '@octokit/auth-token': 4.0.0 - '@octokit/graphql': 7.0.2 - '@octokit/request': 8.2.0 - '@octokit/request-error': 5.0.1 - '@octokit/types': 12.6.0 + '@octokit/graphql': 7.1.0 + '@octokit/request': 8.3.1 + '@octokit/request-error': 5.1.0 + '@octokit/types': 13.2.0 before-after-hook: 2.2.3 universal-user-agent: 6.0.1 dev: true - /@octokit/endpoint@9.0.4: - resolution: {integrity: sha512-DWPLtr1Kz3tv8L0UvXTDP1fNwM0S+z6EJpRcvH66orY6Eld4XBMCSYsaWp4xIm61jTWxK68BrR7ibO+vSDnZqw==} + /@octokit/endpoint@9.0.5: + resolution: {integrity: sha512-ekqR4/+PCLkEBF6qgj8WqJfvDq65RH85OAgrtnVp1mSxaXF03u2xW/hUdweGS5654IlC0wkNYC18Z50tSYTAFw==} engines: {node: '>= 18'} dependencies: - '@octokit/types': 12.6.0 + '@octokit/types': 13.2.0 universal-user-agent: 6.0.1 dev: true - /@octokit/graphql@7.0.2: - resolution: {integrity: sha512-OJ2iGMtj5Tg3s6RaXH22cJcxXRi7Y3EBqbHTBRq+PQAqfaS8f/236fUrWhfSn8P4jovyzqucxme7/vWSSZBX2Q==} + /@octokit/graphql@7.1.0: + resolution: {integrity: sha512-r+oZUH7aMFui1ypZnAvZmn0KSqAUgE1/tUXIWaqUCa1758ts/Jio84GZuzsvUkme98kv0WFY8//n0J1Z+vsIsQ==} engines: {node: '>= 18'} dependencies: - '@octokit/request': 8.2.0 - '@octokit/types': 12.6.0 + '@octokit/request': 8.3.1 + '@octokit/types': 13.2.0 universal-user-agent: 6.0.1 dev: true - /@octokit/openapi-types@20.0.0: - resolution: {integrity: sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA==} + /@octokit/openapi-types@22.0.0: + resolution: {integrity: sha512-kWzSxSIBjCtwrT8/O/A/nrSjmHvR5I9GGTHPyBU19VuEae+QZfaPnnfLwXgV56n51xHN3U2dYy8zh/kO9/39ig==} dev: true - /@octokit/request-error@5.0.1: - resolution: {integrity: sha512-X7pnyTMV7MgtGmiXBwmO6M5kIPrntOXdyKZLigNfQWSEQzVxR4a4vo49vJjTWX70mPndj8KhfT4Dx+2Ng3vnBQ==} + /@octokit/request-error@5.1.0: + resolution: {integrity: sha512-GETXfE05J0+7H2STzekpKObFe765O5dlAKUTLNGeH+x47z7JjXHfsHKo5z21D/o/IOZTUEI6nyWyR+bZVP/n5Q==} engines: {node: '>= 18'} dependencies: - '@octokit/types': 12.6.0 + '@octokit/types': 13.2.0 deprecation: 2.3.1 once: 1.4.0 dev: true - /@octokit/request@8.2.0: - resolution: {integrity: sha512-exPif6x5uwLqv1N1irkLG1zZNJkOtj8bZxuVHd71U5Ftuxf2wGNvAJyNBcPbPC+EBzwYEbBDdSFb8EPcjpYxPQ==} + /@octokit/request@8.3.1: + resolution: {integrity: sha512-fin4cl5eHN5Ybmb/gtn7YZ+ycyUlcyqqkg5lfxeSChqj7sUt6TNaJPehREi+0PABKLREYL8pfaUhH3TicEWNoA==} engines: {node: '>= 18'} dependencies: - '@octokit/endpoint': 9.0.4 - '@octokit/request-error': 5.0.1 - '@octokit/types': 12.6.0 + '@octokit/endpoint': 9.0.5 + '@octokit/request-error': 5.1.0 + '@octokit/types': 13.2.0 universal-user-agent: 6.0.1 dev: true - /@octokit/types@12.6.0: - resolution: {integrity: sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw==} + /@octokit/types@13.2.0: + resolution: {integrity: sha512-K4rpfbIQLe4UimS/PWZAcImhZUC80lhe2f1NpAaaTulPJXv54QIAFFCQEEbdQdqTV/745QDmdvp8NI49LaI00A==} dependencies: - '@octokit/openapi-types': 20.0.0 + '@octokit/openapi-types': 22.0.0 dev: true /@one-ini/wasm@0.1.1: resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==} dev: false - /@opentelemetry/api@1.7.0: - resolution: {integrity: sha512-AdY5wvN0P2vXBi3b29hxZgSFvdhdxPB9+f0B6s//P9Q8nibRWeA3cHm8UmLpio9ABigkVHJ5NMPk+Mz8VCCyrw==} + /@opentelemetry/api@1.8.0: + resolution: {integrity: sha512-I/s6F7yKUDdtMsoBWXJe8Qz40Tui5vsuKCWJEWVL+5q9sSWRzzx6v2KeNsOBEwd94j0eWkpWCH4yB6rZg9Mf0w==} engines: {node: '>=8.0.0'} dev: true @@ -4844,8 +4812,8 @@ packages: playwright: 1.43.0(patch_hash=smjs6qro5qsqddamrqipwrbi5i) dev: true - /@polka/url@1.0.0-next.24: - resolution: {integrity: sha512-2LuNTFBIO0m7kKIQvvPHN6UE63VjpmL9rnEEaOOaiSPbZK+zUOYIzBAWcED+3XYzhYsd/0mD57VdxAEqqV52CQ==} + /@polka/url@1.0.0-next.25: + resolution: {integrity: sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==} dev: true /@popperjs/core@2.11.8: @@ -4869,99 +4837,99 @@ packages: selderee: 0.10.0 dev: false - /@sentry-internal/feedback@7.103.0: - resolution: {integrity: sha512-2nYoCfP7FpiUR+xxO5y5BL2ajHrhM4fL7HSup6QKNn7gI7vLyllYOOuYFNHhSmsXCD0i00U8DBClGLcn+6DQqw==} + /@sentry-internal/feedback@7.109.0: + resolution: {integrity: sha512-EL7N++poxvJP9rYvh6vSu24tsKkOveNCcCj4IM7+irWPjsuD2GLYYlhp/A/Mtt9l7iqO4plvtiQU5HGk7smcTQ==} engines: {node: '>=12'} dependencies: - '@sentry/core': 7.103.0 - '@sentry/types': 7.103.0 - '@sentry/utils': 7.103.0 + '@sentry/core': 7.109.0 + '@sentry/types': 7.109.0 + '@sentry/utils': 7.109.0 dev: false - /@sentry-internal/replay-canvas@7.103.0: - resolution: {integrity: sha512-EyDRMdlSqtwY8zGFhOWwl+nwwo98hlhJz+bpF5PQ6VmFpbplh6Wqfx2p+cPXQr40TGMMC4+vPFlSWTOMjcO9zQ==} + /@sentry-internal/replay-canvas@7.109.0: + resolution: {integrity: sha512-Lh/K60kmloR6lkPUcQP0iamw7B/MdEUEx/ImAx4tUSMrLj+IoUEcq/ECgnnVyQkJq59+8nPEKrVLt7x6PUPEjw==} engines: {node: '>=12'} dependencies: - '@sentry/core': 7.103.0 - '@sentry/replay': 7.103.0 - '@sentry/types': 7.103.0 - '@sentry/utils': 7.103.0 + '@sentry/core': 7.109.0 + '@sentry/replay': 7.109.0 + '@sentry/types': 7.109.0 + '@sentry/utils': 7.109.0 dev: false - /@sentry-internal/tracing@7.103.0: - resolution: {integrity: sha512-sZ/Wao8HOvGaBs7WlOdflMpHGAFkOBWL6hBiirHaOy5d+IDm7n7et5U6zhvcfiyYBO4nY36gy1Tg5mw+aNO0Vw==} + /@sentry-internal/tracing@7.109.0: + resolution: {integrity: sha512-PzK/joC5tCuh2R/PRh+7dp+uuZl7pTsBIjPhVZHMTtb9+ls65WkdZJ1/uKXPouyz8NOo9Xok7aEvEo9seongyw==} engines: {node: '>=8'} dependencies: - '@sentry/core': 7.103.0 - '@sentry/types': 7.103.0 - '@sentry/utils': 7.103.0 + '@sentry/core': 7.109.0 + '@sentry/types': 7.109.0 + '@sentry/utils': 7.109.0 dev: false - /@sentry/browser@7.103.0: - resolution: {integrity: sha512-lP3Oplnwo1lY8ltk8SWzQURbxnSfVhYA099mVs1T95sdwXS16Za6SX7Ld/9T506ZW/WyoU4VCq7eKtG2kPFhMQ==} + /@sentry/browser@7.109.0: + resolution: {integrity: sha512-yx+OFG+Ab9qUDDgV9ZDv8M9O9Mqr0fjKta/LMlWALYLjzkMvxsPlRPFj7oMBlHqOTVLDeg7lFYmsA8wyWQ8Z8g==} engines: {node: '>=8'} dependencies: - '@sentry-internal/feedback': 7.103.0 - '@sentry-internal/replay-canvas': 7.103.0 - '@sentry-internal/tracing': 7.103.0 - '@sentry/core': 7.103.0 - '@sentry/replay': 7.103.0 - '@sentry/types': 7.103.0 - '@sentry/utils': 7.103.0 + '@sentry-internal/feedback': 7.109.0 + '@sentry-internal/replay-canvas': 7.109.0 + '@sentry-internal/tracing': 7.109.0 + '@sentry/core': 7.109.0 + '@sentry/replay': 7.109.0 + '@sentry/types': 7.109.0 + '@sentry/utils': 7.109.0 dev: false - /@sentry/core@7.103.0: - resolution: {integrity: sha512-LCI+PIDoF/RLqN41fNXum3ilmS6ukni6L7t38vSdibbe2G0804EbPLtOIpv2PkS8E6CFuRW5zOb+8OwEAAtZWw==} + /@sentry/core@7.109.0: + resolution: {integrity: sha512-xwD4U0IlvvlE/x/g/W1I8b4Cfb16SsCMmiEuBf6XxvAa3OfWBxKoqLifb3GyrbxMC4LbIIZCN/SvLlnGJPgszA==} engines: {node: '>=8'} dependencies: - '@sentry/types': 7.103.0 - '@sentry/utils': 7.103.0 + '@sentry/types': 7.109.0 + '@sentry/utils': 7.109.0 dev: false - /@sentry/node@7.103.0: - resolution: {integrity: sha512-/bS/WNeO+PEd0r3o3LN0XGJV+l7hLNy1dTcn61VRgWGVs8SqMBb3uAvXAibZ9zGTCkaX/Ky3JumMcOOoxmNCtg==} + /@sentry/node@7.109.0: + resolution: {integrity: sha512-tqMNAES4X/iBl1eZRCmc29p//0id01FBLEiesNo5nk6ECl6/SaGMFAEwu1gsn90h/Bjgr04slwFOS4cR45V2PQ==} engines: {node: '>=8'} dependencies: - '@sentry-internal/tracing': 7.103.0 - '@sentry/core': 7.103.0 - '@sentry/types': 7.103.0 - '@sentry/utils': 7.103.0 + '@sentry-internal/tracing': 7.109.0 + '@sentry/core': 7.109.0 + '@sentry/types': 7.109.0 + '@sentry/utils': 7.109.0 dev: false - /@sentry/react@7.103.0(react@18.2.0): - resolution: {integrity: sha512-EyWZi9u94RShzAK/vpkXNCdkocMtb98AbxRZOjuFL+pf4jjwxdPRekGGzXz7St0cf56Mv3oHNk6QGDA0PF7mlQ==} + /@sentry/react@7.109.0(react@18.2.0): + resolution: {integrity: sha512-KqXoDh6LVhNO+FLdM5LiTGpuorFvjoBPQ4nPGIVbjeMY/KZIau3kFxR142EvCApxmD69yvS5EhMnEqlNdaQPGw==} engines: {node: '>=8'} peerDependencies: react: ^18.2.0 dependencies: - '@sentry/browser': 7.103.0 - '@sentry/core': 7.103.0 - '@sentry/types': 7.103.0 - '@sentry/utils': 7.103.0 + '@sentry/browser': 7.109.0 + '@sentry/core': 7.109.0 + '@sentry/types': 7.109.0 + '@sentry/utils': 7.109.0 hoist-non-react-statics: 3.3.2 react: 18.2.0 dev: false - /@sentry/replay@7.103.0: - resolution: {integrity: sha512-I37komyb+DruQG8lPPPOFxLLbOijNXeTxiWLsIn+KFZqRtKqxxQWdNnk56V4YSTpFzxnMEFMRCpXhncuTWu4LA==} + /@sentry/replay@7.109.0: + resolution: {integrity: sha512-hCDjbTNO7ErW/XsaBXlyHFsUhneyBUdTec1Swf98TFEfVqNsTs6q338aUcaR8dGRLbLrJ9YU9D1qKq++v5h2CA==} engines: {node: '>=12'} dependencies: - '@sentry-internal/tracing': 7.103.0 - '@sentry/core': 7.103.0 - '@sentry/types': 7.103.0 - '@sentry/utils': 7.103.0 + '@sentry-internal/tracing': 7.109.0 + '@sentry/core': 7.109.0 + '@sentry/types': 7.109.0 + '@sentry/utils': 7.109.0 dev: false - /@sentry/types@7.103.0: - resolution: {integrity: sha512-NCvKyx8d2AGBQKPARrJemZmZ16DiMo688OEikZg4BbvFNDUzK5Egm2BH0vfLDhbNkU19o3maJowrYo42m8r9Zw==} + /@sentry/types@7.109.0: + resolution: {integrity: sha512-egCBnDv3YpVFoNzRLdP0soVrxVLCQ+rovREKJ1sw3rA2/MFH9WJ+DZZexsX89yeAFzy1IFsCp7/dEqudusml6g==} engines: {node: '>=8'} dev: false - /@sentry/utils@7.103.0: - resolution: {integrity: sha512-phkUJt3F0UOkVq+M4GfdAh2ewI3ASrNiJddx9aO7GnT0aDwwVBHZltnqt95qgAB8W+BipTSt1dAh8yUbbq1Ceg==} + /@sentry/utils@7.109.0: + resolution: {integrity: sha512-3RjxMOLMBwZ5VSiH84+o/3NY2An4Zldjz0EbfEQNRY9yffRiCPJSQiCJID8EoylCFOh/PAhPimBhqbtWJxX6iw==} engines: {node: '>=8'} dependencies: - '@sentry/types': 7.103.0 + '@sentry/types': 7.109.0 dev: false /@sideway/address@4.1.5: @@ -5012,460 +4980,420 @@ packages: dependencies: '@sinonjs/commons': 3.0.1 - /@smithy/abort-controller@2.1.3: - resolution: {integrity: sha512-c2aYH2Wu1RVE3rLlVgg2kQOBJGM0WbjReQi5DnPTm2Zb7F0gk7J2aeQeaX2u/lQZoHl6gv8Oac7mt9alU3+f4A==} + /@smithy/abort-controller@2.2.0: + resolution: {integrity: sha512-wRlta7GuLWpTqtFfGo+nZyOO1vEvewdNR1R4rTxpC8XU6vG/NDyrFBhwLZsqg1NUoR1noVaXJPC/7ZK47QCySw==} engines: {node: '>=14.0.0'} - requiresBuild: true dependencies: - '@smithy/types': 2.10.1 + '@smithy/types': 2.12.0 tslib: 2.6.2 - /@smithy/chunked-blob-reader-native@2.1.1: - resolution: {integrity: sha512-zNW+43dltfNMUrBEYLMWgI8lQr0uhtTcUyxkgC9EP4j17WREzgSFMPUFVrVV6Rc2+QtWERYjb4tzZnQGa7R9fQ==} + /@smithy/chunked-blob-reader-native@2.2.0: + resolution: {integrity: sha512-VNB5+1oCgX3Fzs072yuRsUoC2N4Zg/LJ11DTxX3+Qu+Paa6AmbIF0E9sc2wthz9Psrk/zcOlTCyuposlIhPjZQ==} dependencies: - '@smithy/util-base64': 2.1.1 + '@smithy/util-base64': 2.3.0 tslib: 2.6.2 - /@smithy/chunked-blob-reader@2.1.1: - resolution: {integrity: sha512-NjNFCKxC4jVvn+lUr3Yo4/PmUJj3tbyqH6GNHueyTGS5Q27vlEJ1MkNhUDV8QGxJI7Bodnc2pD18lU2zRfhHlQ==} + /@smithy/chunked-blob-reader@2.2.0: + resolution: {integrity: sha512-3GJNvRwXBGdkDZZOGiziVYzDpn4j6zfyULHMDKAGIUo72yHALpE9CbhfQp/XcLNVoc1byfMpn6uW5H2BqPjgaQ==} dependencies: tslib: 2.6.2 - /@smithy/config-resolver@2.1.4: - resolution: {integrity: sha512-AW2WUZmBAzgO3V3ovKtsUbI3aBNMeQKFDumoqkNxaVDWF/xfnxAWqBKDr/NuG7c06N2Rm4xeZLPiJH/d+na0HA==} + /@smithy/config-resolver@2.2.0: + resolution: {integrity: sha512-fsiMgd8toyUba6n1WRmr+qACzXltpdDkPTAaDqc8QqPBUzO+/JKwL6bUBseHVi8tu9l+3JOK+tSf7cay+4B3LA==} engines: {node: '>=14.0.0'} - requiresBuild: true dependencies: - '@smithy/node-config-provider': 2.2.4 - '@smithy/types': 2.10.1 - '@smithy/util-config-provider': 2.2.1 - '@smithy/util-middleware': 2.1.3 + '@smithy/node-config-provider': 2.3.0 + '@smithy/types': 2.12.0 + '@smithy/util-config-provider': 2.3.0 + '@smithy/util-middleware': 2.2.0 tslib: 2.6.2 - /@smithy/core@1.3.5: - resolution: {integrity: sha512-Rrc+e2Jj6Gu7Xbn0jvrzZlSiP2CZocIOfZ9aNUA82+1sa6GBnxqL9+iZ9EKHeD9aqD1nU8EK4+oN2EiFpSv7Yw==} + /@smithy/core@1.4.2: + resolution: {integrity: sha512-2fek3I0KZHWJlRLvRTqxTEri+qV0GRHrJIoLFuBMZB4EMg4WgeBGfF0X6abnrNYpq55KJ6R4D6x4f0vLnhzinA==} engines: {node: '>=14.0.0'} - requiresBuild: true dependencies: - '@smithy/middleware-endpoint': 2.4.4 - '@smithy/middleware-retry': 2.1.4 - '@smithy/middleware-serde': 2.1.3 - '@smithy/protocol-http': 3.2.1 - '@smithy/smithy-client': 2.4.2 - '@smithy/types': 2.10.1 - '@smithy/util-middleware': 2.1.3 + '@smithy/middleware-endpoint': 2.5.1 + '@smithy/middleware-retry': 2.3.1 + '@smithy/middleware-serde': 2.3.0 + '@smithy/protocol-http': 3.3.0 + '@smithy/smithy-client': 2.5.1 + '@smithy/types': 2.12.0 + '@smithy/util-middleware': 2.2.0 tslib: 2.6.2 - /@smithy/credential-provider-imds@2.2.4: - resolution: {integrity: sha512-DdatjmBZQnhGe1FhI8gO98f7NmvQFSDiZTwC3WMvLTCKQUY+Y1SVkhJqIuLu50Eb7pTheoXQmK+hKYUgpUWsNA==} + /@smithy/credential-provider-imds@2.3.0: + resolution: {integrity: sha512-BWB9mIukO1wjEOo1Ojgl6LrG4avcaC7T/ZP6ptmAaW4xluhSIPZhY+/PI5YKzlk+jsm+4sQZB45Bt1OfMeQa3w==} engines: {node: '>=14.0.0'} - requiresBuild: true dependencies: - '@smithy/node-config-provider': 2.2.4 - '@smithy/property-provider': 2.1.3 - '@smithy/types': 2.10.1 - '@smithy/url-parser': 2.1.3 + '@smithy/node-config-provider': 2.3.0 + '@smithy/property-provider': 2.2.0 + '@smithy/types': 2.12.0 + '@smithy/url-parser': 2.2.0 tslib: 2.6.2 - /@smithy/eventstream-codec@2.1.3: - resolution: {integrity: sha512-rGlCVuwSDv6qfKH4/lRxFjcZQnIE0LZ3D4lkMHg7ZSltK9rA74r0VuGSvWVQ4N/d70VZPaniFhp4Z14QYZsa+A==} - requiresBuild: true + /@smithy/eventstream-codec@2.2.0: + resolution: {integrity: sha512-8janZoJw85nJmQZc4L8TuePp2pk1nxLgkxIR0TUjKJ5Dkj5oelB9WtiSSGXCQvNsJl0VSTvK/2ueMXxvpa9GVw==} dependencies: '@aws-crypto/crc32': 3.0.0 - '@smithy/types': 2.10.1 - '@smithy/util-hex-encoding': 2.1.1 + '@smithy/types': 2.12.0 + '@smithy/util-hex-encoding': 2.2.0 tslib: 2.6.2 - /@smithy/eventstream-serde-browser@2.1.3: - resolution: {integrity: sha512-qAgKbZ9m2oBfSyJWWurX/MvQFRPrYypj79cDSleEgDwBoez6Tfd+FTpu2L/j3ZeC3mDlDHIKWksoeaXZpLLAHw==} + /@smithy/eventstream-serde-browser@2.2.0: + resolution: {integrity: sha512-UaPf8jKbcP71BGiO0CdeLmlg+RhWnlN8ipsMSdwvqBFigl5nil3rHOI/5GE3tfiuX8LvY5Z9N0meuU7Rab7jWw==} engines: {node: '>=14.0.0'} dependencies: - '@smithy/eventstream-serde-universal': 2.1.3 - '@smithy/types': 2.10.1 + '@smithy/eventstream-serde-universal': 2.2.0 + '@smithy/types': 2.12.0 tslib: 2.6.2 - /@smithy/eventstream-serde-config-resolver@2.1.3: - resolution: {integrity: sha512-48rvsNv/MgAFCxOE0qwR7ZwKhaEdDoTxqH5HM+T6SDxICmPGb7gEuQzjTxQhcieCPgqyXeZFW8cU0QJxdowuIg==} + /@smithy/eventstream-serde-config-resolver@2.2.0: + resolution: {integrity: sha512-RHhbTw/JW3+r8QQH7PrganjNCiuiEZmpi6fYUAetFfPLfZ6EkiA08uN3EFfcyKubXQxOwTeJRZSQmDDCdUshaA==} engines: {node: '>=14.0.0'} dependencies: - '@smithy/types': 2.10.1 + '@smithy/types': 2.12.0 tslib: 2.6.2 - /@smithy/eventstream-serde-node@2.1.3: - resolution: {integrity: sha512-RPJWWDhj8isk3NtGfm3Xt1WdHyX9ZE42V+m1nLU1I0zZ1hEol/oawHsTnhva/VR5bn+bJ2zscx+BYr0cEPRtmg==} + /@smithy/eventstream-serde-node@2.2.0: + resolution: {integrity: sha512-zpQMtJVqCUMn+pCSFcl9K/RPNtQE0NuMh8sKpCdEHafhwRsjP50Oq/4kMmvxSRy6d8Jslqd8BLvDngrUtmN9iA==} engines: {node: '>=14.0.0'} dependencies: - '@smithy/eventstream-serde-universal': 2.1.3 - '@smithy/types': 2.10.1 + '@smithy/eventstream-serde-universal': 2.2.0 + '@smithy/types': 2.12.0 tslib: 2.6.2 - /@smithy/eventstream-serde-universal@2.1.3: - resolution: {integrity: sha512-ssvSMk1LX2jRhiOVgVLGfNJXdB8SvyjieKcJDHq698Gi3LOog6g/+l7ggrN+hZxyjUiDF4cUxgKaZTBUghzhLw==} + /@smithy/eventstream-serde-universal@2.2.0: + resolution: {integrity: sha512-pvoe/vvJY0mOpuF84BEtyZoYfbehiFj8KKWk1ds2AT0mTLYFVs+7sBJZmioOFdBXKd48lfrx1vumdPdmGlCLxA==} engines: {node: '>=14.0.0'} dependencies: - '@smithy/eventstream-codec': 2.1.3 - '@smithy/types': 2.10.1 + '@smithy/eventstream-codec': 2.2.0 + '@smithy/types': 2.12.0 tslib: 2.6.2 - /@smithy/fetch-http-handler@2.4.3: - resolution: {integrity: sha512-Fn/KYJFo6L5I4YPG8WQb2hOmExgRmNpVH5IK2zU3JKrY5FKW7y9ar5e0BexiIC9DhSKqKX+HeWq/Y18fq7Dkpw==} - requiresBuild: true + /@smithy/fetch-http-handler@2.5.0: + resolution: {integrity: sha512-BOWEBeppWhLn/no/JxUL/ghTfANTjT7kg3Ww2rPqTUY9R4yHPXxJ9JhMe3Z03LN3aPwiwlpDIUcVw1xDyHqEhw==} dependencies: - '@smithy/protocol-http': 3.2.1 - '@smithy/querystring-builder': 2.1.3 - '@smithy/types': 2.10.1 - '@smithy/util-base64': 2.1.1 + '@smithy/protocol-http': 3.3.0 + '@smithy/querystring-builder': 2.2.0 + '@smithy/types': 2.12.0 + '@smithy/util-base64': 2.3.0 tslib: 2.6.2 - /@smithy/hash-blob-browser@2.1.3: - resolution: {integrity: sha512-sHLTM5xQYw5Wxz07DFo+eh1PVC6P5+kazQRF1k5nsvOhZG5VnkIy4LZ7N0ZNWqJx16g9otGd5MvqUOpb3WWtgA==} + /@smithy/hash-blob-browser@2.2.0: + resolution: {integrity: sha512-SGPoVH8mdXBqrkVCJ1Hd1X7vh1zDXojNN1yZyZTZsCno99hVue9+IYzWDjq/EQDDXxmITB0gBmuyPh8oAZSTcg==} dependencies: - '@smithy/chunked-blob-reader': 2.1.1 - '@smithy/chunked-blob-reader-native': 2.1.1 - '@smithy/types': 2.10.1 + '@smithy/chunked-blob-reader': 2.2.0 + '@smithy/chunked-blob-reader-native': 2.2.0 + '@smithy/types': 2.12.0 tslib: 2.6.2 - /@smithy/hash-node@2.1.3: - resolution: {integrity: sha512-FsAPCUj7VNJIdHbSxMd5uiZiF20G2zdSDgrgrDrHqIs/VMxK85Vqk5kMVNNDMCZmMezp6UKnac0B4nAyx7HJ9g==} - engines: {node: '>=14.0.0'} - requiresBuild: true - dependencies: - '@smithy/types': 2.10.1 - '@smithy/util-buffer-from': 2.1.1 - '@smithy/util-utf8': 2.1.1 - tslib: 2.6.2 - - /@smithy/hash-stream-node@2.1.3: - resolution: {integrity: sha512-fWpUx2ca/u5lcD5RhNJogEG5FD7H0RDDpYmfQgxFqIUv3Ow7bZsapMukh8uzQPVO8R+NDAvSdxmgXoy4Hz8sFw==} + /@smithy/hash-node@2.2.0: + resolution: {integrity: sha512-zLWaC/5aWpMrHKpoDF6nqpNtBhlAYKF/7+9yMN7GpdR8CzohnWfGtMznPybnwSS8saaXBMxIGwJqR4HmRp6b3g==} engines: {node: '>=14.0.0'} dependencies: - '@smithy/types': 2.10.1 - '@smithy/util-utf8': 2.1.1 + '@smithy/types': 2.12.0 + '@smithy/util-buffer-from': 2.2.0 + '@smithy/util-utf8': 2.3.0 tslib: 2.6.2 - /@smithy/invalid-dependency@2.1.3: - resolution: {integrity: sha512-wkra7d/G4CbngV4xsjYyAYOvdAhahQje/WymuQdVEnXFExJopEu7fbL5AEAlBPgWHXwu94VnCSG00gVzRfExyg==} - requiresBuild: true - dependencies: - '@smithy/types': 2.10.1 - tslib: 2.6.2 - - /@smithy/is-array-buffer@2.1.1: - resolution: {integrity: sha512-xozSQrcUinPpNPNPds4S7z/FakDTh1MZWtRP/2vQtYB/u3HYrX2UXuZs+VhaKBd6Vc7g2XPr2ZtwGBNDN6fNKQ==} + /@smithy/hash-stream-node@2.2.0: + resolution: {integrity: sha512-aT+HCATOSRMGpPI7bi7NSsTNVZE/La9IaxLXWoVAYMxHT5hGO3ZOGEMZQg8A6nNL+pdFGtZQtND1eoY084HgHQ==} engines: {node: '>=14.0.0'} - requiresBuild: true dependencies: + '@smithy/types': 2.12.0 + '@smithy/util-utf8': 2.3.0 tslib: 2.6.2 - /@smithy/md5-js@2.1.3: - resolution: {integrity: sha512-zmn3M6+mP4IJlSmXBN9964AztgkIO8b5lRzAgdJn9AdCFwA6xLkcW2B6uEnpBjvotxtQMmXTUP19tIO7NmFPpw==} + /@smithy/invalid-dependency@2.2.0: + resolution: {integrity: sha512-nEDASdbKFKPXN2O6lOlTgrEEOO9NHIeO+HVvZnkqc8h5U9g3BIhWsvzFo+UcUbliMHvKNPD/zVxDrkP1Sbgp8Q==} dependencies: - '@smithy/types': 2.10.1 - '@smithy/util-utf8': 2.1.1 + '@smithy/types': 2.12.0 tslib: 2.6.2 - /@smithy/middleware-content-length@2.1.3: - resolution: {integrity: sha512-aJduhkC+dcXxdnv5ZpM3uMmtGmVFKx412R1gbeykS5HXDmRU6oSsyy2SoHENCkfOGKAQOjVE2WVqDJibC0d21g==} + /@smithy/is-array-buffer@2.2.0: + resolution: {integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==} engines: {node: '>=14.0.0'} - requiresBuild: true dependencies: - '@smithy/protocol-http': 3.2.1 - '@smithy/types': 2.10.1 tslib: 2.6.2 - /@smithy/middleware-endpoint@2.4.4: - resolution: {integrity: sha512-4yjHyHK2Jul4JUDBo2sTsWY9UshYUnXeb/TAK/MTaPEb8XQvDmpwSFnfIRDU45RY1a6iC9LCnmJNg/yHyfxqkw==} + /@smithy/md5-js@2.2.0: + resolution: {integrity: sha512-M26XTtt9IIusVMOWEAhIvFIr9jYj4ISPPGJROqw6vXngO3IYJCnVVSMFn4Tx1rUTG5BiKJNg9u2nxmBiZC5IlQ==} + dependencies: + '@smithy/types': 2.12.0 + '@smithy/util-utf8': 2.3.0 + tslib: 2.6.2 + + /@smithy/middleware-content-length@2.2.0: + resolution: {integrity: sha512-5bl2LG1Ah/7E5cMSC+q+h3IpVHMeOkG0yLRyQT1p2aMJkSrZG7RlXHPuAgb7EyaFeidKEnnd/fNaLLaKlHGzDQ==} engines: {node: '>=14.0.0'} - requiresBuild: true dependencies: - '@smithy/middleware-serde': 2.1.3 - '@smithy/node-config-provider': 2.2.4 - '@smithy/shared-ini-file-loader': 2.3.4 - '@smithy/types': 2.10.1 - '@smithy/url-parser': 2.1.3 - '@smithy/util-middleware': 2.1.3 + '@smithy/protocol-http': 3.3.0 + '@smithy/types': 2.12.0 tslib: 2.6.2 - /@smithy/middleware-retry@2.1.4: - resolution: {integrity: sha512-Cyolv9YckZTPli1EkkaS39UklonxMd08VskiuMhURDjC0HHa/AD6aK/YoD21CHv9s0QLg0WMLvk9YeLTKkXaFQ==} + /@smithy/middleware-endpoint@2.5.1: + resolution: {integrity: sha512-1/8kFp6Fl4OsSIVTWHnNjLnTL8IqpIb/D3sTSczrKFnrE9VMNWxnrRKNvpUHOJ6zpGD5f62TPm7+17ilTJpiCQ==} engines: {node: '>=14.0.0'} - requiresBuild: true dependencies: - '@smithy/node-config-provider': 2.2.4 - '@smithy/protocol-http': 3.2.1 - '@smithy/service-error-classification': 2.1.3 - '@smithy/smithy-client': 2.4.2 - '@smithy/types': 2.10.1 - '@smithy/util-middleware': 2.1.3 - '@smithy/util-retry': 2.1.3 + '@smithy/middleware-serde': 2.3.0 + '@smithy/node-config-provider': 2.3.0 + '@smithy/shared-ini-file-loader': 2.4.0 + '@smithy/types': 2.12.0 + '@smithy/url-parser': 2.2.0 + '@smithy/util-middleware': 2.2.0 tslib: 2.6.2 - uuid: 8.3.2 - /@smithy/middleware-serde@2.1.3: - resolution: {integrity: sha512-s76LId+TwASrHhUa9QS4k/zeXDUAuNuddKklQzRgumbzge5BftVXHXIqL4wQxKGLocPwfgAOXWx+HdWhQk9hTg==} + /@smithy/middleware-retry@2.3.1: + resolution: {integrity: sha512-P2bGufFpFdYcWvqpyqqmalRtwFUNUA8vHjJR5iGqbfR6mp65qKOLcUd6lTr4S9Gn/enynSrSf3p3FVgVAf6bXA==} engines: {node: '>=14.0.0'} - requiresBuild: true dependencies: - '@smithy/types': 2.10.1 + '@smithy/node-config-provider': 2.3.0 + '@smithy/protocol-http': 3.3.0 + '@smithy/service-error-classification': 2.1.5 + '@smithy/smithy-client': 2.5.1 + '@smithy/types': 2.12.0 + '@smithy/util-middleware': 2.2.0 + '@smithy/util-retry': 2.2.0 tslib: 2.6.2 + uuid: 9.0.1 - /@smithy/middleware-stack@2.1.3: - resolution: {integrity: sha512-opMFufVQgvBSld/b7mD7OOEBxF6STyraVr1xel1j0abVILM8ALJvRoFbqSWHGmaDlRGIiV9Q5cGbWi0sdiEaLQ==} + /@smithy/middleware-serde@2.3.0: + resolution: {integrity: sha512-sIADe7ojwqTyvEQBe1nc/GXB9wdHhi9UwyX0lTyttmUWDJLP655ZYE1WngnNyXREme8I27KCaUhyhZWRXL0q7Q==} engines: {node: '>=14.0.0'} - requiresBuild: true dependencies: - '@smithy/types': 2.10.1 + '@smithy/types': 2.12.0 tslib: 2.6.2 - /@smithy/node-config-provider@2.2.4: - resolution: {integrity: sha512-nqazHCp8r4KHSFhRQ+T0VEkeqvA0U+RhehBSr1gunUuNW3X7j0uDrWBxB2gE9eutzy6kE3Y7L+Dov/UXT871vg==} + /@smithy/middleware-stack@2.2.0: + resolution: {integrity: sha512-Qntc3jrtwwrsAC+X8wms8zhrTr0sFXnyEGhZd9sLtsJ/6gGQKFzNB+wWbOcpJd7BR8ThNCoKt76BuQahfMvpeA==} engines: {node: '>=14.0.0'} - requiresBuild: true dependencies: - '@smithy/property-provider': 2.1.3 - '@smithy/shared-ini-file-loader': 2.3.4 - '@smithy/types': 2.10.1 + '@smithy/types': 2.12.0 tslib: 2.6.2 - /@smithy/node-http-handler@2.4.1: - resolution: {integrity: sha512-HCkb94soYhJMxPCa61wGKgmeKpJ3Gftx1XD6bcWEB2wMV1L9/SkQu/6/ysKBnbOzWRE01FGzwrTxucHypZ8rdg==} + /@smithy/node-config-provider@2.3.0: + resolution: {integrity: sha512-0elK5/03a1JPWMDPaS726Iw6LpQg80gFut1tNpPfxFuChEEklo2yL823V94SpTZTxmKlXFtFgsP55uh3dErnIg==} engines: {node: '>=14.0.0'} - requiresBuild: true dependencies: - '@smithy/abort-controller': 2.1.3 - '@smithy/protocol-http': 3.2.1 - '@smithy/querystring-builder': 2.1.3 - '@smithy/types': 2.10.1 + '@smithy/property-provider': 2.2.0 + '@smithy/shared-ini-file-loader': 2.4.0 + '@smithy/types': 2.12.0 tslib: 2.6.2 - /@smithy/property-provider@2.1.3: - resolution: {integrity: sha512-bMz3se+ySKWNrgm7eIiQMa2HO/0fl2D0HvLAdg9pTMcpgp4SqOAh6bz7Ik6y7uQqSrk4rLjIKgbQ6yzYgGehCQ==} + /@smithy/node-http-handler@2.5.0: + resolution: {integrity: sha512-mVGyPBzkkGQsPoxQUbxlEfRjrj6FPyA3u3u2VXGr9hT8wilsoQdZdvKpMBFMB8Crfhv5dNkKHIW0Yyuc7eABqA==} engines: {node: '>=14.0.0'} - requiresBuild: true dependencies: - '@smithy/types': 2.10.1 + '@smithy/abort-controller': 2.2.0 + '@smithy/protocol-http': 3.3.0 + '@smithy/querystring-builder': 2.2.0 + '@smithy/types': 2.12.0 tslib: 2.6.2 - /@smithy/protocol-http@3.2.1: - resolution: {integrity: sha512-KLrQkEw4yJCeAmAH7hctE8g9KwA7+H2nSJwxgwIxchbp/L0B5exTdOQi9D5HinPLlothoervGmhpYKelZ6AxIA==} + /@smithy/property-provider@2.2.0: + resolution: {integrity: sha512-+xiil2lFhtTRzXkx8F053AV46QnIw6e7MV8od5Mi68E1ICOjCeCHw2XfLnDEUHnT9WGUIkwcqavXjfwuJbGlpg==} engines: {node: '>=14.0.0'} - requiresBuild: true dependencies: - '@smithy/types': 2.10.1 + '@smithy/types': 2.12.0 tslib: 2.6.2 - /@smithy/querystring-builder@2.1.3: - resolution: {integrity: sha512-kFD3PnNqKELe6m9GRHQw/ftFFSZpnSeQD4qvgDB6BQN6hREHELSosVFUMPN4M3MDKN2jAwk35vXHLoDrNfKu0A==} + /@smithy/protocol-http@3.3.0: + resolution: {integrity: sha512-Xy5XK1AFWW2nlY/biWZXu6/krgbaf2dg0q492D8M5qthsnU2H+UgFeZLbM76FnH7s6RO/xhQRkj+T6KBO3JzgQ==} engines: {node: '>=14.0.0'} - requiresBuild: true dependencies: - '@smithy/types': 2.10.1 - '@smithy/util-uri-escape': 2.1.1 + '@smithy/types': 2.12.0 tslib: 2.6.2 - /@smithy/querystring-parser@2.1.3: - resolution: {integrity: sha512-3+CWJoAqcBMR+yvz6D+Fc5VdoGFtfenW6wqSWATWajrRMGVwJGPT3Vy2eb2bnMktJc4HU4bpjeovFa566P3knQ==} + /@smithy/querystring-builder@2.2.0: + resolution: {integrity: sha512-L1kSeviUWL+emq3CUVSgdogoM/D9QMFaqxL/dd0X7PCNWmPXqt+ExtrBjqT0V7HLN03Vs9SuiLrG3zy3JGnE5A==} engines: {node: '>=14.0.0'} - requiresBuild: true dependencies: - '@smithy/types': 2.10.1 + '@smithy/types': 2.12.0 + '@smithy/util-uri-escape': 2.2.0 tslib: 2.6.2 - /@smithy/service-error-classification@2.1.3: - resolution: {integrity: sha512-iUrpSsem97bbXHHT/v3s7vaq8IIeMo6P6cXdeYHrx0wOJpMeBGQF7CB0mbJSiTm3//iq3L55JiEm8rA7CTVI8A==} + /@smithy/querystring-parser@2.2.0: + resolution: {integrity: sha512-BvHCDrKfbG5Yhbpj4vsbuPV2GgcpHiAkLeIlcA1LtfpMz3jrqizP1+OguSNSj1MwBHEiN+jwNisXLGdajGDQJA==} engines: {node: '>=14.0.0'} - requiresBuild: true dependencies: - '@smithy/types': 2.10.1 + '@smithy/types': 2.12.0 + tslib: 2.6.2 - /@smithy/shared-ini-file-loader@2.3.4: - resolution: {integrity: sha512-CiZmPg9GeDKbKmJGEFvJBsJcFnh0AQRzOtQAzj1XEa8N/0/uSN/v1LYzgO7ry8hhO8+9KB7+DhSW0weqBra4Aw==} + /@smithy/service-error-classification@2.1.5: + resolution: {integrity: sha512-uBDTIBBEdAQryvHdc5W8sS5YX7RQzF683XrHePVdFmAgKiMofU15FLSM0/HU03hKTnazdNRFa0YHS7+ArwoUSQ==} engines: {node: '>=14.0.0'} - requiresBuild: true dependencies: - '@smithy/types': 2.10.1 - tslib: 2.6.2 + '@smithy/types': 2.12.0 - /@smithy/signature-v4@2.1.3: - resolution: {integrity: sha512-Jq4iPPdCmJojZTsPePn4r1ULShh6ONkokLuxp1Lnk4Sq7r7rJp4HlA1LbPBq4bD64TIzQezIpr1X+eh5NYkNxw==} + /@smithy/shared-ini-file-loader@2.4.0: + resolution: {integrity: sha512-WyujUJL8e1B6Z4PBfAqC/aGY1+C7T0w20Gih3yrvJSk97gpiVfB+y7c46T4Nunk+ZngLq0rOIdeVeIklk0R3OA==} engines: {node: '>=14.0.0'} - requiresBuild: true dependencies: - '@smithy/eventstream-codec': 2.1.3 - '@smithy/is-array-buffer': 2.1.1 - '@smithy/types': 2.10.1 - '@smithy/util-hex-encoding': 2.1.1 - '@smithy/util-middleware': 2.1.3 - '@smithy/util-uri-escape': 2.1.1 - '@smithy/util-utf8': 2.1.1 + '@smithy/types': 2.12.0 tslib: 2.6.2 - /@smithy/smithy-client@2.4.2: - resolution: {integrity: sha512-ntAFYN51zu3N3mCd95YFcFi/8rmvm//uX+HnK24CRbI6k5Rjackn0JhgKz5zOx/tbNvOpgQIwhSX+1EvEsBLbA==} + /@smithy/signature-v4@2.2.1: + resolution: {integrity: sha512-j5fHgL1iqKTsKJ1mTcw88p0RUcidDu95AWSeZTgiYJb+QcfwWU/UpBnaqiB59FNH5MiAZuSbOBnZlwzeeY2tIw==} engines: {node: '>=14.0.0'} - requiresBuild: true dependencies: - '@smithy/middleware-endpoint': 2.4.4 - '@smithy/middleware-stack': 2.1.3 - '@smithy/protocol-http': 3.2.1 - '@smithy/types': 2.10.1 - '@smithy/util-stream': 2.1.3 + '@smithy/is-array-buffer': 2.2.0 + '@smithy/types': 2.12.0 + '@smithy/util-hex-encoding': 2.2.0 + '@smithy/util-middleware': 2.2.0 + '@smithy/util-uri-escape': 2.2.0 + '@smithy/util-utf8': 2.3.0 tslib: 2.6.2 - /@smithy/types@2.10.1: - resolution: {integrity: sha512-hjQO+4ru4cQ58FluQvKKiyMsFg0A6iRpGm2kqdH8fniyNd2WyanoOsYJfMX/IFLuLxEoW6gnRkNZy1y6fUUhtA==} + /@smithy/smithy-client@2.5.1: + resolution: {integrity: sha512-jrbSQrYCho0yDaaf92qWgd+7nAeap5LtHTI51KXqmpIFCceKU3K9+vIVTUH72bOJngBMqa4kyu1VJhRcSrk/CQ==} engines: {node: '>=14.0.0'} - requiresBuild: true dependencies: + '@smithy/middleware-endpoint': 2.5.1 + '@smithy/middleware-stack': 2.2.0 + '@smithy/protocol-http': 3.3.0 + '@smithy/types': 2.12.0 + '@smithy/util-stream': 2.2.0 tslib: 2.6.2 - /@smithy/url-parser@2.1.3: - resolution: {integrity: sha512-X1NRA4WzK/ihgyzTpeGvI9Wn45y8HmqF4AZ/FazwAv8V203Ex+4lXqcYI70naX9ETqbqKVzFk88W6WJJzCggTQ==} - requiresBuild: true - dependencies: - '@smithy/querystring-parser': 2.1.3 - '@smithy/types': 2.10.1 - tslib: 2.6.2 - - /@smithy/util-base64@2.1.1: - resolution: {integrity: sha512-UfHVpY7qfF/MrgndI5PexSKVTxSZIdz9InghTFa49QOvuu9I52zLPLUHXvHpNuMb1iD2vmc6R+zbv/bdMipR/g==} + /@smithy/types@2.12.0: + resolution: {integrity: sha512-QwYgloJ0sVNBeBuBs65cIkTbfzV/Q6ZNPCJ99EICFEdJYG50nGIY/uYXp+TbsdJReIuPr0a0kXmCvren3MbRRw==} engines: {node: '>=14.0.0'} - requiresBuild: true - dependencies: - '@smithy/util-buffer-from': 2.1.1 - tslib: 2.6.2 - - /@smithy/util-body-length-browser@2.1.1: - resolution: {integrity: sha512-ekOGBLvs1VS2d1zM2ER4JEeBWAvIOUKeaFch29UjjJsxmZ/f0L3K3x0dEETgh3Q9bkZNHgT+rkdl/J/VUqSRag==} - requiresBuild: true dependencies: tslib: 2.6.2 - /@smithy/util-body-length-node@2.2.1: - resolution: {integrity: sha512-/ggJG+ta3IDtpNVq4ktmEUtOkH1LW64RHB5B0hcr5ZaWBmo96UX2cIOVbjCqqDickTXqBWZ4ZO0APuaPrD7Abg==} + /@smithy/url-parser@2.2.0: + resolution: {integrity: sha512-hoA4zm61q1mNTpksiSWp2nEl1dt3j726HdRhiNgVJQMj7mLp7dprtF57mOB6JvEk/x9d2bsuL5hlqZbBuHQylQ==} + dependencies: + '@smithy/querystring-parser': 2.2.0 + '@smithy/types': 2.12.0 + tslib: 2.6.2 + + /@smithy/util-base64@2.3.0: + resolution: {integrity: sha512-s3+eVwNeJuXUwuMbusncZNViuhv2LjVJ1nMwTqSA0XAC7gjKhqqxRdJPhR8+YrkoZ9IiIbFk/yK6ACe/xlF+hw==} engines: {node: '>=14.0.0'} - requiresBuild: true + dependencies: + '@smithy/util-buffer-from': 2.2.0 + '@smithy/util-utf8': 2.3.0 + tslib: 2.6.2 + + /@smithy/util-body-length-browser@2.2.0: + resolution: {integrity: sha512-dtpw9uQP7W+n3vOtx0CfBD5EWd7EPdIdsQnWTDoFf77e3VUf05uA7R7TGipIo8e4WL2kuPdnsr3hMQn9ziYj5w==} dependencies: tslib: 2.6.2 - /@smithy/util-buffer-from@2.1.1: - resolution: {integrity: sha512-clhNjbyfqIv9Md2Mg6FffGVrJxw7bgK7s3Iax36xnfVj6cg0fUG7I4RH0XgXJF8bxi+saY5HR21g2UPKSxVCXg==} + /@smithy/util-body-length-node@2.3.0: + resolution: {integrity: sha512-ITWT1Wqjubf2CJthb0BuT9+bpzBfXeMokH/AAa5EJQgbv9aPMVfnM76iFIZVFf50hYXGbtiV71BHAthNWd6+dw==} engines: {node: '>=14.0.0'} - requiresBuild: true dependencies: - '@smithy/is-array-buffer': 2.1.1 tslib: 2.6.2 - /@smithy/util-config-provider@2.2.1: - resolution: {integrity: sha512-50VL/tx9oYYcjJn/qKqNy7sCtpD0+s8XEBamIFo4mFFTclKMNp+rsnymD796uybjiIquB7VCB/DeafduL0y2kw==} + /@smithy/util-buffer-from@2.2.0: + resolution: {integrity: sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/is-array-buffer': 2.2.0 + tslib: 2.6.2 + + /@smithy/util-config-provider@2.3.0: + resolution: {integrity: sha512-HZkzrRcuFN1k70RLqlNK4FnPXKOpkik1+4JaBoHNJn+RnJGYqaa3c5/+XtLOXhlKzlRgNvyaLieHTW2VwGN0VQ==} engines: {node: '>=14.0.0'} - requiresBuild: true dependencies: tslib: 2.6.2 - /@smithy/util-defaults-mode-browser@2.1.4: - resolution: {integrity: sha512-J6XAVY+/g7jf03QMnvqPyU+8jqGrrtXoKWFVOS+n1sz0Lg8HjHJ1ANqaDN+KTTKZRZlvG8nU5ZrJOUL6VdwgcQ==} + /@smithy/util-defaults-mode-browser@2.2.1: + resolution: {integrity: sha512-RtKW+8j8skk17SYowucwRUjeh4mCtnm5odCL0Lm2NtHQBsYKrNW0od9Rhopu9wF1gHMfHeWF7i90NwBz/U22Kw==} engines: {node: '>= 10.0.0'} - requiresBuild: true dependencies: - '@smithy/property-provider': 2.1.3 - '@smithy/smithy-client': 2.4.2 - '@smithy/types': 2.10.1 + '@smithy/property-provider': 2.2.0 + '@smithy/smithy-client': 2.5.1 + '@smithy/types': 2.12.0 bowser: 2.11.0 tslib: 2.6.2 - /@smithy/util-defaults-mode-node@2.2.3: - resolution: {integrity: sha512-ttUISrv1uVOjTlDa3nznX33f0pthoUlP+4grhTvOzcLhzArx8qHB94/untGACOG3nlf8vU20nI2iWImfzoLkYA==} + /@smithy/util-defaults-mode-node@2.3.1: + resolution: {integrity: sha512-vkMXHQ0BcLFysBMWgSBLSk3+leMpFSyyFj8zQtv5ZyUBx8/owVh1/pPEkzmW/DR/Gy/5c8vjLDD9gZjXNKbrpA==} engines: {node: '>= 10.0.0'} - requiresBuild: true dependencies: - '@smithy/config-resolver': 2.1.4 - '@smithy/credential-provider-imds': 2.2.4 - '@smithy/node-config-provider': 2.2.4 - '@smithy/property-provider': 2.1.3 - '@smithy/smithy-client': 2.4.2 - '@smithy/types': 2.10.1 + '@smithy/config-resolver': 2.2.0 + '@smithy/credential-provider-imds': 2.3.0 + '@smithy/node-config-provider': 2.3.0 + '@smithy/property-provider': 2.2.0 + '@smithy/smithy-client': 2.5.1 + '@smithy/types': 2.12.0 tslib: 2.6.2 - /@smithy/util-endpoints@1.1.4: - resolution: {integrity: sha512-/qAeHmK5l4yQ4/bCIJ9p49wDe9rwWtOzhPHblu386fwPNT3pxmodgcs9jDCV52yK9b4rB8o9Sj31P/7Vzka1cg==} + /@smithy/util-endpoints@1.2.0: + resolution: {integrity: sha512-BuDHv8zRjsE5zXd3PxFXFknzBG3owCpjq8G3FcsXW3CykYXuEqM3nTSsmLzw5q+T12ZYuDlVUZKBdpNbhVtlrQ==} engines: {node: '>= 14.0.0'} - requiresBuild: true dependencies: - '@smithy/node-config-provider': 2.2.4 - '@smithy/types': 2.10.1 + '@smithy/node-config-provider': 2.3.0 + '@smithy/types': 2.12.0 tslib: 2.6.2 - /@smithy/util-hex-encoding@2.1.1: - resolution: {integrity: sha512-3UNdP2pkYUUBGEXzQI9ODTDK+Tcu1BlCyDBaRHwyxhA+8xLP8agEKQq4MGmpjqb4VQAjq9TwlCQX0kP6XDKYLg==} + /@smithy/util-hex-encoding@2.2.0: + resolution: {integrity: sha512-7iKXR+/4TpLK194pVjKiasIyqMtTYJsgKgM242Y9uzt5dhHnUDvMNb+3xIhRJ9QhvqGii/5cRUt4fJn3dtXNHQ==} engines: {node: '>=14.0.0'} - requiresBuild: true dependencies: tslib: 2.6.2 - /@smithy/util-middleware@2.1.3: - resolution: {integrity: sha512-/+2fm7AZ2ozl5h8wM++ZP0ovE9/tiUUAHIbCfGfb3Zd3+Dyk17WODPKXBeJ/TnK5U+x743QmA0xHzlSm8I/qhw==} + /@smithy/util-middleware@2.2.0: + resolution: {integrity: sha512-L1qpleXf9QD6LwLCJ5jddGkgWyuSvWBkJwWAZ6kFkdifdso+sk3L3O1HdmPvCdnCK3IS4qWyPxev01QMnfHSBw==} engines: {node: '>=14.0.0'} - requiresBuild: true dependencies: - '@smithy/types': 2.10.1 + '@smithy/types': 2.12.0 tslib: 2.6.2 - /@smithy/util-retry@2.1.3: - resolution: {integrity: sha512-Kbvd+GEMuozbNUU3B89mb99tbufwREcyx2BOX0X2+qHjq6Gvsah8xSDDgxISDwcOHoDqUWO425F0Uc/QIRhYkg==} + /@smithy/util-retry@2.2.0: + resolution: {integrity: sha512-q9+pAFPTfftHXRytmZ7GzLFFrEGavqapFc06XxzZFcSIGERXMerXxCitjOG1prVDR9QdjqotF40SWvbqcCpf8g==} engines: {node: '>= 14.0.0'} - requiresBuild: true dependencies: - '@smithy/service-error-classification': 2.1.3 - '@smithy/types': 2.10.1 + '@smithy/service-error-classification': 2.1.5 + '@smithy/types': 2.12.0 tslib: 2.6.2 - /@smithy/util-stream@2.1.3: - resolution: {integrity: sha512-HvpEQbP8raTy9n86ZfXiAkf3ezp1c3qeeO//zGqwZdrfaoOpGKQgF2Sv1IqZp7wjhna7pvczWaGUHjcOPuQwKw==} - engines: {node: '>=14.0.0'} - requiresBuild: true - dependencies: - '@smithy/fetch-http-handler': 2.4.3 - '@smithy/node-http-handler': 2.4.1 - '@smithy/types': 2.10.1 - '@smithy/util-base64': 2.1.1 - '@smithy/util-buffer-from': 2.1.1 - '@smithy/util-hex-encoding': 2.1.1 - '@smithy/util-utf8': 2.1.1 - tslib: 2.6.2 - - /@smithy/util-uri-escape@2.1.1: - resolution: {integrity: sha512-saVzI1h6iRBUVSqtnlOnc9ssU09ypo7n+shdQ8hBTZno/9rZ3AuRYvoHInV57VF7Qn7B+pFJG7qTzFiHxWlWBw==} - engines: {node: '>=14.0.0'} - requiresBuild: true - dependencies: - tslib: 2.6.2 - - /@smithy/util-utf8@2.1.1: - resolution: {integrity: sha512-BqTpzYEcUMDwAKr7/mVRUtHDhs6ZoXDi9NypMvMfOr/+u1NW7JgqodPDECiiLboEm6bobcPcECxzjtQh865e9A==} - engines: {node: '>=14.0.0'} - requiresBuild: true - dependencies: - '@smithy/util-buffer-from': 2.1.1 - tslib: 2.6.2 - - /@smithy/util-waiter@2.1.3: - resolution: {integrity: sha512-3R0wNFAQQoH9e4m+bVLDYNOst2qNxtxFgq03WoNHWTBOqQT3jFnOBRj1W51Rf563xDA5kwqjziksxn6RKkHB+Q==} + /@smithy/util-stream@2.2.0: + resolution: {integrity: sha512-17faEXbYWIRst1aU9SvPZyMdWmqIrduZjVOqCPMIsWFNxs5yQQgFrJL6b2SdiCzyW9mJoDjFtgi53xx7EH+BXA==} engines: {node: '>=14.0.0'} dependencies: - '@smithy/abort-controller': 2.1.3 - '@smithy/types': 2.10.1 + '@smithy/fetch-http-handler': 2.5.0 + '@smithy/node-http-handler': 2.5.0 + '@smithy/types': 2.12.0 + '@smithy/util-base64': 2.3.0 + '@smithy/util-buffer-from': 2.2.0 + '@smithy/util-hex-encoding': 2.2.0 + '@smithy/util-utf8': 2.3.0 tslib: 2.6.2 - /@swc-node/core@1.13.0(@swc/core@1.4.2)(@swc/types@0.1.5): + /@smithy/util-uri-escape@2.2.0: + resolution: {integrity: sha512-jtmJMyt1xMD/d8OtbVJ2gFZOSKc+ueYJZPW20ULW1GOp/q/YIM0wNh+u8ZFao9UaIGz4WoPW8hC64qlWLIfoDA==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.6.2 + + /@smithy/util-utf8@2.3.0: + resolution: {integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/util-buffer-from': 2.2.0 + tslib: 2.6.2 + + /@smithy/util-waiter@2.2.0: + resolution: {integrity: sha512-IHk53BVw6MPMi2Gsn+hCng8rFA3ZmR3Rk7GllxDUW9qFJl/hiSvskn7XldkECapQVkIg/1dHpMAxI9xSTaLLSA==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/abort-controller': 2.2.0 + '@smithy/types': 2.12.0 + tslib: 2.6.2 + + /@swc-node/core@1.13.0(@swc/core@1.4.13)(@swc/types@0.1.6): resolution: {integrity: sha512-lFPD4nmy4ifAOVMChFjwlpXN5KQXvegqeyuzz1KQz42q1lf+cL3Qux1/GteGuZjh8HC+Rj1RdNrHpE/MCfJSTw==} engines: {node: '>= 10'} peerDependencies: '@swc/core': '>= 1.3' '@swc/types': '>= 0.1' dependencies: - '@swc/core': 1.4.2 - '@swc/types': 0.1.5 + '@swc/core': 1.4.13 + '@swc/types': 0.1.6 dev: false /@swc-node/sourcemap-support@0.5.0: @@ -5475,7 +5403,7 @@ packages: tslib: 2.6.2 dev: false - /@swc/cli@0.1.65(@swc/core@1.4.2): + /@swc/cli@0.1.65(@swc/core@1.4.13): resolution: {integrity: sha512-4NcgsvJVHhA7trDnMmkGLLvWMHu2kSy+qHx6QwRhhJhdiYdNUrhdp+ERxen73sYtaeEOYeLJcWrQ60nzKi6rpg==} engines: {node: '>= 12.13'} hasBin: true @@ -5487,97 +5415,97 @@ packages: optional: true dependencies: '@mole-inc/bin-wrapper': 8.0.1 - '@swc/core': 1.4.2 + '@swc/core': 1.4.13 commander: 7.2.0 fast-glob: 3.3.2 - minimatch: 9.0.3 + minimatch: 9.0.4 semver: 7.6.0 slash: 3.0.0 source-map: 0.7.4 dev: true - /@swc/core-darwin-arm64@1.4.2: - resolution: {integrity: sha512-1uSdAn1MRK5C1m/TvLZ2RDvr0zLvochgrZ2xL+lRzugLlCTlSA+Q4TWtrZaOz+vnnFVliCpw7c7qu0JouhgQIw==} + /@swc/core-darwin-arm64@1.4.13: + resolution: {integrity: sha512-36P72FLpm5iq85IvoEjBvi22DiqkkEIanJ1M0E8bkxcFHUbjBrYfPY9T6cpPyK5oQqkaTBvNAc3j1BlVD6IH6w==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] requiresBuild: true optional: true - /@swc/core-darwin-x64@1.4.2: - resolution: {integrity: sha512-TYD28+dCQKeuxxcy7gLJUCFLqrwDZnHtC2z7cdeGfZpbI2mbfppfTf2wUPzqZk3gEC96zHd4Yr37V3Tvzar+lQ==} + /@swc/core-darwin-x64@1.4.13: + resolution: {integrity: sha512-ye7OgKpDdyA8AMIVVdmD1ICDaFXgoEXORnVO8bBHyul0WN71yUBZMX+YxEx2lpWtiftA2vY/1MAuOR80vHkBCw==} engines: {node: '>=10'} cpu: [x64] os: [darwin] requiresBuild: true optional: true - /@swc/core-linux-arm-gnueabihf@1.4.2: - resolution: {integrity: sha512-Eyqipf7ZPGj0vplKHo8JUOoU1un2sg5PjJMpEesX0k+6HKE2T8pdyeyXODN0YTFqzndSa/J43EEPXm+rHAsLFQ==} + /@swc/core-linux-arm-gnueabihf@1.4.13: + resolution: {integrity: sha512-+x593Jlmu4c3lJtZUKRejWpV2MAij1Js5nmQLLdjo6ChR2D4B2rzj3iMiKn5gITew7fraF9t3fvXALdWh7HmUg==} engines: {node: '>=10'} cpu: [arm] os: [linux] requiresBuild: true optional: true - /@swc/core-linux-arm64-gnu@1.4.2: - resolution: {integrity: sha512-wZn02DH8VYPv3FC0ub4my52Rttsus/rFw+UUfzdb3tHMHXB66LqN+rR0ssIOZrH6K+VLN6qpTw9VizjyoH0BxA==} + /@swc/core-linux-arm64-gnu@1.4.13: + resolution: {integrity: sha512-0x8OVw4dfyNerrs/9eZX9wNnmvwbwXSMCi+LbE6Xt1pXOIwvoLtFIXcV3NsrlkFboO3sr5UAQIwDxKqbIZA9pQ==} engines: {node: '>=10'} cpu: [arm64] os: [linux] requiresBuild: true optional: true - /@swc/core-linux-arm64-musl@1.4.2: - resolution: {integrity: sha512-3G0D5z9hUj9bXNcwmA1eGiFTwe5rWkuL3DsoviTj73TKLpk7u64ND0XjEfO0huVv4vVu9H1jodrKb7nvln/dlw==} + /@swc/core-linux-arm64-musl@1.4.13: + resolution: {integrity: sha512-Z9c4JiequtZvngPcxbCuAOkmWBxi2vInZbjjhD5I+Q9oiJdXUz1t2USGwsGPS41Xvk1BOA3ecK2Sn1ilY3titg==} engines: {node: '>=10'} cpu: [arm64] os: [linux] requiresBuild: true optional: true - /@swc/core-linux-x64-gnu@1.4.2: - resolution: {integrity: sha512-LFxn9U8cjmYHw3jrdPNqPAkBGglKE3tCZ8rA7hYyp0BFxuo7L2ZcEnPm4RFpmSCCsExFH+LEJWuMGgWERoktvg==} + /@swc/core-linux-x64-gnu@1.4.13: + resolution: {integrity: sha512-ChatHtk+vX0Ke5QG+jO+rIapw/KwZsi9MedCBHFXHH6iWF4z8d51cJeN68ykcn+vAXzjNeFNdlNy5Vbkd1zAqg==} engines: {node: '>=10'} cpu: [x64] os: [linux] requiresBuild: true optional: true - /@swc/core-linux-x64-musl@1.4.2: - resolution: {integrity: sha512-dp0fAmreeVVYTUcb4u9njTPrYzKnbIH0EhH2qvC9GOYNNREUu2GezSIDgonjOXkHiTCvopG4xU7y56XtXj4VrQ==} + /@swc/core-linux-x64-musl@1.4.13: + resolution: {integrity: sha512-0Pz39YR530mXpsztwQkmEKdkkZy4fY4Smdh4pkm6Ly8Nndyo0te/l4bcAGqN24Jp7aVwF/QSy14SAtw4HRjU9g==} engines: {node: '>=10'} cpu: [x64] os: [linux] requiresBuild: true optional: true - /@swc/core-win32-arm64-msvc@1.4.2: - resolution: {integrity: sha512-HlVIiLMQkzthAdqMslQhDkoXJ5+AOLUSTV6fm6shFKZKqc/9cJvr4S8UveNERL9zUficA36yM3bbfo36McwnvQ==} + /@swc/core-win32-arm64-msvc@1.4.13: + resolution: {integrity: sha512-LVZfhlD+jHcAbz5NN+gAJ1BEasB0WpcvUzcsJt0nQSRsojgzPzFjJ+fzEBnvT7SMtqKkrnVJ0OmDYeh88bDRpw==} engines: {node: '>=10'} cpu: [arm64] os: [win32] requiresBuild: true optional: true - /@swc/core-win32-ia32-msvc@1.4.2: - resolution: {integrity: sha512-WCF8faPGjCl4oIgugkp+kL9nl3nUATlzKXCEGFowMEmVVCFM0GsqlmGdPp1pjZoWc9tpYanoXQDnp5IvlDSLhA==} + /@swc/core-win32-ia32-msvc@1.4.13: + resolution: {integrity: sha512-78hxHWUvUZtWsnhcf8DKwhBcNFJw+j4y4fN2B9ioXmBWX2tIyw+BqUHOrismOtjPihaZmwe/Ok2e4qmkawE2fw==} engines: {node: '>=10'} cpu: [ia32] os: [win32] requiresBuild: true optional: true - /@swc/core-win32-x64-msvc@1.4.2: - resolution: {integrity: sha512-oV71rwiSpA5xre2C5570BhCsg1HF97SNLsZ/12xv7zayGzqr3yvFALFJN8tHKpqUdCB4FGPjoP3JFdV3i+1wUw==} + /@swc/core-win32-x64-msvc@1.4.13: + resolution: {integrity: sha512-WSfy1u2Xde6jU7UpHIInCUMW98Zw9iZglddKUAvmr1obkZji5U6EX0Oca3asEJdZPFb+2lMLjt0Mh5a1YisROg==} engines: {node: '>=10'} cpu: [x64] os: [win32] requiresBuild: true optional: true - /@swc/core@1.4.2: - resolution: {integrity: sha512-vWgY07R/eqj1/a0vsRKLI9o9klGZfpLNOVEnrv4nrccxBgYPjcf22IWwAoaBJ+wpA7Q4fVjCUM8lP0m01dpxcg==} + /@swc/core@1.4.13: + resolution: {integrity: sha512-rOtusBE+2gaeRkAJn5E4zp5yzZekZOypzSOz5ZG6P1hFbd+Cc26fWEdK6sUSnrkkvTd0Oj33KXLB/4UkbK/UHA==} engines: {node: '>=10'} requiresBuild: true peerDependencies: @@ -5587,18 +5515,18 @@ packages: optional: true dependencies: '@swc/counter': 0.1.3 - '@swc/types': 0.1.5 + '@swc/types': 0.1.6 optionalDependencies: - '@swc/core-darwin-arm64': 1.4.2 - '@swc/core-darwin-x64': 1.4.2 - '@swc/core-linux-arm-gnueabihf': 1.4.2 - '@swc/core-linux-arm64-gnu': 1.4.2 - '@swc/core-linux-arm64-musl': 1.4.2 - '@swc/core-linux-x64-gnu': 1.4.2 - '@swc/core-linux-x64-musl': 1.4.2 - '@swc/core-win32-arm64-msvc': 1.4.2 - '@swc/core-win32-ia32-msvc': 1.4.2 - '@swc/core-win32-x64-msvc': 1.4.2 + '@swc/core-darwin-arm64': 1.4.13 + '@swc/core-darwin-x64': 1.4.13 + '@swc/core-linux-arm-gnueabihf': 1.4.13 + '@swc/core-linux-arm64-gnu': 1.4.13 + '@swc/core-linux-arm64-musl': 1.4.13 + '@swc/core-linux-x64-gnu': 1.4.13 + '@swc/core-linux-x64-musl': 1.4.13 + '@swc/core-win32-arm64-msvc': 1.4.13 + '@swc/core-win32-ia32-msvc': 1.4.13 + '@swc/core-win32-x64-msvc': 1.4.13 /@swc/counter@0.1.3: resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} @@ -5609,20 +5537,22 @@ packages: '@swc/counter': 0.1.3 tslib: 2.6.2 - /@swc/jest@0.2.36(@swc/core@1.4.2): + /@swc/jest@0.2.36(@swc/core@1.4.13): resolution: {integrity: sha512-8X80dp81ugxs4a11z1ka43FPhP+/e+mJNXJSxiNYk8gIX/jPBtY4gQTrKu/KIoco8bzKuPI5lUxjfLiGsfvnlw==} engines: {npm: '>= 7.0.0'} peerDependencies: '@swc/core': '*' dependencies: '@jest/create-cache-key-function': 29.7.0 - '@swc/core': 1.4.2 + '@swc/core': 1.4.13 '@swc/counter': 0.1.3 jsonc-parser: 3.2.1 dev: true - /@swc/types@0.1.5: - resolution: {integrity: sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw==} + /@swc/types@0.1.6: + resolution: {integrity: sha512-/JLo/l2JsT/LRd80C3HfbmVpxOAJ11FO2RCEslFrgzLltoP9j8XIbsyDcfCt2WWyX+CM96rBoNM+IToAkFOugg==} + dependencies: + '@swc/counter': 0.1.3 /@szmarczak/http-timer@4.0.6: resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} @@ -5635,8 +5565,8 @@ packages: resolution: {integrity: sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==} engines: {node: '>=14'} dependencies: - '@babel/code-frame': 7.23.5 - '@babel/runtime': 7.24.0 + '@babel/code-frame': 7.24.2 + '@babel/runtime': 7.24.4 '@types/aria-query': 5.0.4 aria-query: 5.1.3 chalk: 4.1.2 @@ -5667,7 +5597,7 @@ packages: optional: true dependencies: '@adobe/css-tools': 4.3.3 - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.4 '@types/jest': 29.5.12 aria-query: 5.3.0 chalk: 3.0.0 @@ -5685,7 +5615,7 @@ packages: react: ^18.2.0 react-dom: ^18.2.0 dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.4 '@testing-library/dom': 9.3.4 '@types/react-dom': 18.2.24 react: 18.2.0 @@ -5705,8 +5635,8 @@ packages: engines: {node: '>=10.13.0'} dev: true - /@tsconfig/node10@1.0.9: - resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} + /@tsconfig/node10@1.0.11: + resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} /@tsconfig/node12@1.0.11: resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} @@ -5728,7 +5658,7 @@ packages: /@types/babel__core@7.20.5: resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} dependencies: - '@babel/parser': 7.24.0 + '@babel/parser': 7.24.4 '@babel/types': 7.24.0 '@types/babel__generator': 7.6.8 '@types/babel__template': 7.4.4 @@ -5742,7 +5672,7 @@ packages: /@types/babel__template@7.4.4: resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} dependencies: - '@babel/parser': 7.24.0 + '@babel/parser': 7.24.4 '@babel/types': 7.24.0 /@types/babel__traverse@7.20.5: @@ -5869,7 +5799,7 @@ packages: resolution: {integrity: sha512-ymwc+qb1XkjT/gfoQwxIeHZ6ixH23A+tCT2ADSA/DPVKzAjwYkTXBMCQ/f6fe4wEa85Lhp26VPeUxI7wMhAi7A==} dependencies: '@types/estree': 1.0.5 - '@types/json-schema': 7.0.12 + '@types/json-schema': 7.0.15 /@types/esprima@4.0.6: resolution: {integrity: sha512-lIk+kSt9lGv5hxK6aZNjiUEGZqKmOTpmg0tKiJQI+Ow98fLillxsiZNik5+RcP7mXL929KiTH/D9jGtpDlMbVw==} @@ -5897,7 +5827,7 @@ packages: resolution: {integrity: sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==} dependencies: '@types/node': 20.12.5 - '@types/qs': 6.9.7 + '@types/qs': 6.9.14 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 dev: true @@ -5907,8 +5837,8 @@ packages: dependencies: '@types/body-parser': 1.19.2 '@types/express-serve-static-core': 4.17.35 - '@types/qs': 6.9.7 - '@types/serve-static': 1.15.5 + '@types/qs': 6.9.14 + '@types/serve-static': 1.15.7 dev: true /@types/express@4.17.21: @@ -5916,8 +5846,8 @@ packages: dependencies: '@types/body-parser': 1.19.2 '@types/express-serve-static-core': 4.17.35 - '@types/qs': 6.9.7 - '@types/serve-static': 1.15.5 + '@types/qs': 6.9.14 + '@types/serve-static': 1.15.7 dev: true /@types/find-node-modules@2.1.2: @@ -6003,13 +5933,6 @@ packages: pretty-format: 29.7.0 dev: true - /@types/jest@29.5.7: - resolution: {integrity: sha512-HLyetab6KVPSiF+7pFcUyMeLsx25LDNDemw9mGsJBkai/oouwrjTycocSDYopMEwFhN2Y4s9oPyOCZNofgSt2g==} - dependencies: - expect: 29.7.0 - pretty-format: 29.7.0 - dev: true - /@types/joi@14.3.4: resolution: {integrity: sha512-1TQNDJvIKlgYXGNIABfgFp9y0FziDpuGrd799Q5RcnsDu+krD+eeW/0Fs5PHARvWWFelOhIG2OPCo6KbadBM4A==} dev: true @@ -6024,6 +5947,7 @@ packages: /@types/json-schema@7.0.12: resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} + dev: true /@types/json-schema@7.0.15: resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} @@ -6049,11 +5973,11 @@ packages: /@types/lodash.get@4.4.9: resolution: {integrity: sha512-J5dvW98sxmGnamqf+/aLP87PYXyrha9xIgc2ZlHl6OHMFR2Ejdxep50QfU0abO1+CH6+ugx+8wEUN1toImAinA==} dependencies: - '@types/lodash': 4.14.202 + '@types/lodash': 4.17.0 dev: true - /@types/lodash@4.14.202: - resolution: {integrity: sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==} + /@types/lodash@4.17.0: + resolution: {integrity: sha512-t7dhREVv6dbNj0q17X12j7yDG4bD/DHYX7o5/DbDxobP0HnGPgpRz2Ej77aL7TZT3DSw13fqUTj8J4mMnqa7WA==} /@types/method-override@0.0.32: resolution: {integrity: sha512-Vf9AohOlANmhNswCbkdRG3p+tYcq1+63O+ex1UoNIVYWW3tO8Mx6Z+5G1R8DENeC6/t1SiDJS+ph6ACKpryokg==} @@ -6172,7 +6096,7 @@ packages: resolution: {integrity: sha512-MKFs9P6nJ+LAeHLU3V0cODEOgyThJ3OAnmOlsZsxux6sfQs3HRXR5bBn7xG5DjckEFhTAxsXi7k7cd0pCMxpJw==} dependencies: '@types/node': 20.12.5 - pg-protocol: 1.6.0 + pg-protocol: 1.6.1 pg-types: 4.0.2 /@types/pluralize@0.0.33: @@ -6197,8 +6121,8 @@ packages: kleur: 3.0.3 dev: true - /@types/prop-types@15.7.11: - resolution: {integrity: sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==} + /@types/prop-types@15.7.12: + resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} /@types/qs@6.9.14: resolution: {integrity: sha512-5khscbd3SwWMhFqylJBLQ0zIu7c1K6Vz0uBIt915BI3zV0q1nfjRQD3RqSBcPaO6PHEF4ov/t9y89fSiyThlPA==} @@ -6239,7 +6163,7 @@ packages: /@types/react@18.2.74: resolution: {integrity: sha512-9AEqNZZyBx8OdZpxzQlaFEVCSFUM2YXJH46yPOiOpm078k6ZLOCcuAzGum/zK8YBwY+dbahVNbHrbgrAwIRlqw==} dependencies: - '@types/prop-types': 15.7.11 + '@types/prop-types': 15.7.12 csstype: 3.1.3 /@types/request@2.48.12: @@ -6267,12 +6191,12 @@ packages: '@types/node': 20.12.5 dev: true - /@types/serve-static@1.15.5: - resolution: {integrity: sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==} + /@types/serve-static@1.15.7: + resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} dependencies: '@types/http-errors': 2.0.4 - '@types/mime': 2.0.3 '@types/node': 20.12.5 + '@types/send': 0.17.4 dev: true /@types/shelljs@0.8.15: @@ -6352,7 +6276,7 @@ packages: ignore: 5.3.1 natural-compare: 1.4.0 semver: 7.6.0 - ts-api-utils: 1.2.1(typescript@5.4.4) + ts-api-utils: 1.3.0(typescript@5.4.4) typescript: 5.4.4 transitivePeerDependencies: - supports-color @@ -6417,7 +6341,7 @@ packages: '@typescript-eslint/utils': 7.3.1(eslint@8.57.0)(typescript@5.4.4) debug: 4.3.4(supports-color@5.5.0) eslint: 8.57.0 - ts-api-utils: 1.2.1(typescript@5.4.4) + ts-api-utils: 1.3.0(typescript@5.4.4) typescript: 5.4.4 transitivePeerDependencies: - supports-color @@ -6475,7 +6399,7 @@ packages: is-glob: 4.0.3 minimatch: 9.0.3 semver: 7.6.0 - ts-api-utils: 1.2.1(typescript@5.4.4) + ts-api-utils: 1.3.0(typescript@5.4.4) typescript: 5.4.4 transitivePeerDependencies: - supports-color @@ -6497,7 +6421,7 @@ packages: is-glob: 4.0.3 minimatch: 9.0.3 semver: 7.6.0 - ts-api-utils: 1.2.1(typescript@5.4.4) + ts-api-utils: 1.3.0(typescript@5.4.4) typescript: 5.4.4 transitivePeerDependencies: - supports-color @@ -6588,8 +6512,8 @@ packages: /@ungap/structured-clone@1.2.0: resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - /@webassemblyjs/ast@1.11.6: - resolution: {integrity: sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==} + /@webassemblyjs/ast@1.12.1: + resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==} dependencies: '@webassemblyjs/helper-numbers': 1.11.6 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 @@ -6603,8 +6527,8 @@ packages: resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} dev: true - /@webassemblyjs/helper-buffer@1.11.6: - resolution: {integrity: sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==} + /@webassemblyjs/helper-buffer@1.12.1: + resolution: {integrity: sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==} dev: true /@webassemblyjs/helper-numbers@1.11.6: @@ -6619,13 +6543,13 @@ packages: resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} dev: true - /@webassemblyjs/helper-wasm-section@1.11.6: - resolution: {integrity: sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==} + /@webassemblyjs/helper-wasm-section@1.12.1: + resolution: {integrity: sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==} dependencies: - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/helper-buffer': 1.11.6 + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-buffer': 1.12.1 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/wasm-gen': 1.11.6 + '@webassemblyjs/wasm-gen': 1.12.1 dev: true /@webassemblyjs/ieee754@1.11.6: @@ -6644,42 +6568,42 @@ packages: resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} dev: true - /@webassemblyjs/wasm-edit@1.11.6: - resolution: {integrity: sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==} + /@webassemblyjs/wasm-edit@1.12.1: + resolution: {integrity: sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==} dependencies: - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/helper-buffer': 1.11.6 + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-buffer': 1.12.1 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/helper-wasm-section': 1.11.6 - '@webassemblyjs/wasm-gen': 1.11.6 - '@webassemblyjs/wasm-opt': 1.11.6 - '@webassemblyjs/wasm-parser': 1.11.6 - '@webassemblyjs/wast-printer': 1.11.6 + '@webassemblyjs/helper-wasm-section': 1.12.1 + '@webassemblyjs/wasm-gen': 1.12.1 + '@webassemblyjs/wasm-opt': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 + '@webassemblyjs/wast-printer': 1.12.1 dev: true - /@webassemblyjs/wasm-gen@1.11.6: - resolution: {integrity: sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==} + /@webassemblyjs/wasm-gen@1.12.1: + resolution: {integrity: sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==} dependencies: - '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/ast': 1.12.1 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 '@webassemblyjs/ieee754': 1.11.6 '@webassemblyjs/leb128': 1.11.6 '@webassemblyjs/utf8': 1.11.6 dev: true - /@webassemblyjs/wasm-opt@1.11.6: - resolution: {integrity: sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==} + /@webassemblyjs/wasm-opt@1.12.1: + resolution: {integrity: sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==} dependencies: - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/helper-buffer': 1.11.6 - '@webassemblyjs/wasm-gen': 1.11.6 - '@webassemblyjs/wasm-parser': 1.11.6 + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-buffer': 1.12.1 + '@webassemblyjs/wasm-gen': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 dev: true - /@webassemblyjs/wasm-parser@1.11.6: - resolution: {integrity: sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==} + /@webassemblyjs/wasm-parser@1.12.1: + resolution: {integrity: sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==} dependencies: - '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/ast': 1.12.1 '@webassemblyjs/helper-api-error': 1.11.6 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 '@webassemblyjs/ieee754': 1.11.6 @@ -6687,36 +6611,36 @@ packages: '@webassemblyjs/utf8': 1.11.6 dev: true - /@webassemblyjs/wast-printer@1.11.6: - resolution: {integrity: sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==} + /@webassemblyjs/wast-printer@1.12.1: + resolution: {integrity: sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==} dependencies: - '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/ast': 1.12.1 '@xtuc/long': 4.2.2 dev: true - /@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4)(webpack@5.90.3): + /@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4)(webpack@5.91.0): resolution: {integrity: sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==} engines: {node: '>=14.15.0'} peerDependencies: webpack: 5.x.x webpack-cli: 5.x.x dependencies: - webpack: 5.90.3(@swc/core@1.4.2)(esbuild@0.19.12)(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack@5.90.3) + webpack: 5.91.0(@swc/core@1.4.13)(esbuild@0.19.12)(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack@5.91.0) dev: true - /@webpack-cli/info@2.0.2(webpack-cli@5.1.4)(webpack@5.90.3): + /@webpack-cli/info@2.0.2(webpack-cli@5.1.4)(webpack@5.91.0): resolution: {integrity: sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==} engines: {node: '>=14.15.0'} peerDependencies: webpack: 5.x.x webpack-cli: 5.x.x dependencies: - webpack: 5.90.3(@swc/core@1.4.2)(esbuild@0.19.12)(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack@5.90.3) + webpack: 5.91.0(@swc/core@1.4.13)(esbuild@0.19.12)(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack@5.91.0) dev: true - /@webpack-cli/serve@2.0.5(webpack-cli@5.1.4)(webpack@5.90.3): + /@webpack-cli/serve@2.0.5(webpack-cli@5.1.4)(webpack@5.91.0): resolution: {integrity: sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==} engines: {node: '>=14.15.0'} peerDependencies: @@ -6727,8 +6651,8 @@ packages: webpack-dev-server: optional: true dependencies: - webpack: 5.90.3(@swc/core@1.4.2)(esbuild@0.19.12)(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack@5.90.3) + webpack: 5.91.0(@swc/core@1.4.13)(esbuild@0.19.12)(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack@5.91.0) dev: true /@xtuc/ieee754@1.2.0: @@ -6818,8 +6742,8 @@ packages: - supports-color dev: true - /agent-base@7.1.0: - resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==} + /agent-base@7.1.1: + resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} engines: {node: '>= 14'} dependencies: debug: 4.3.4(supports-color@5.5.0) @@ -6878,8 +6802,8 @@ packages: require-from-string: 2.0.2 uri-js: 4.4.1 - /amazon-cognito-identity-js@6.3.7: - resolution: {integrity: sha512-tSjnM7KyAeOZ7UMah+oOZ6cW4Gf64FFcc7BE2l7MTcp7ekAPrXaCbpcW2xEpH1EiDS4cPcAouHzmCuc2tr72vQ==} + /amazon-cognito-identity-js@6.3.12: + resolution: {integrity: sha512-s7NKDZgx336cp+oDeUtB2ZzT8jWJp/v2LWuYl+LQtMEODe22RF1IJ4nRiDATp+rp1pTffCZcm44Quw4jx2bqNg==} dependencies: '@aws-crypto/sha256-js': 1.2.2 buffer: 4.9.2 @@ -6987,13 +6911,14 @@ packages: resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} dev: true - /array-includes@3.1.7: - resolution: {integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==} + /array-includes@3.1.8: + resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 get-intrinsic: 1.2.4 is-string: 1.0.7 dev: false @@ -7005,14 +6930,15 @@ packages: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} - /array.prototype.findlast@1.2.4: - resolution: {integrity: sha512-BMtLxpV+8BD+6ZPFIWmnUBpQoy+A+ujcg4rhp2iwCRJYA7PEh2MS4NL3lz8EiDlLrJPp2hg9qWihr5pd//jcGw==} + /array.prototype.findlast@1.2.5: + resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.3 es-errors: 1.3.0 + es-object-atoms: 1.0.0 es-shim-unscopables: 1.0.2 dev: false @@ -7022,7 +6948,7 @@ packages: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.3 es-shim-unscopables: 1.0.2 dev: false @@ -7032,7 +6958,7 @@ packages: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.3 es-shim-unscopables: 1.0.2 dev: false @@ -7041,7 +6967,7 @@ packages: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.3 es-shim-unscopables: 1.0.2 dev: false @@ -7050,7 +6976,7 @@ packages: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.3 es-errors: 1.3.0 es-shim-unscopables: 1.0.2 dev: false @@ -7062,7 +6988,7 @@ packages: array-buffer-byte-length: 1.0.1 call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.3 es-errors: 1.3.0 get-intrinsic: 1.2.4 is-array-buffer: 3.0.4 @@ -7089,12 +7015,6 @@ packages: retry: 0.13.1 dev: true - /asynciterator.prototype@1.0.0: - resolution: {integrity: sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==} - dependencies: - has-symbols: 1.0.3 - dev: false - /asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} @@ -7112,19 +7032,19 @@ packages: engines: {node: '>=10.12.0'} dev: false - /autoprefixer@10.4.18(postcss@8.4.35): - resolution: {integrity: sha512-1DKbDfsr6KUElM6wg+0zRNkB/Q7WcKYAaK+pzXn+Xqmszm/5Xa9coeNdtP88Vi+dPzZnMjhge8GIV49ZQkDa+g==} + /autoprefixer@10.4.19(postcss@8.4.38): + resolution: {integrity: sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==} engines: {node: ^10 || ^12 || >=14} hasBin: true peerDependencies: postcss: ^8.1.0 dependencies: browserslist: 4.23.0 - caniuse-lite: 1.0.30001591 + caniuse-lite: 1.0.30001607 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.0.0 - postcss: 8.4.35 + postcss: 8.4.38 postcss-value-parser: 4.2.0 dev: true @@ -7142,7 +7062,7 @@ packages: /axios@1.4.0: resolution: {integrity: sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==} dependencies: - follow-redirects: 1.15.5(debug@4.3.4) + follow-redirects: 1.15.6(debug@4.3.4) form-data: 4.0.0 proxy-from-env: 1.1.0 transitivePeerDependencies: @@ -7159,17 +7079,17 @@ packages: resolution: {integrity: sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==} dev: true - /babel-jest@29.7.0(@babel/core@7.24.0): + /babel-jest@29.7.0(@babel/core@7.24.4): resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@babel/core': ^7.8.0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.4 '@jest/transform': 29.7.0 '@types/babel__core': 7.20.5 babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.6.3(@babel/core@7.24.0) + babel-preset-jest: 29.6.3(@babel/core@7.24.4) chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 @@ -7201,71 +7121,70 @@ packages: resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} engines: {node: '>=10', npm: '>=6'} dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.4 cosmiconfig: 7.1.0 resolve: 1.22.8 dev: false - /babel-preset-current-node-syntax@1.0.1(@babel/core@7.24.0): + /babel-preset-current-node-syntax@1.0.1(@babel/core@7.24.4): resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.0 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.0) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.24.0) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.0) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.0) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.0) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.0) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.0) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.0) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.0) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.0) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.0) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.0) + '@babel/core': 7.24.4 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.4) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.24.4) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.4) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.4) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.4) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.4) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.4) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.4) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.4) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.4) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.4) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.4) - /babel-preset-jest@29.6.3(@babel/core@7.24.0): + /babel-preset-jest@29.6.3(@babel/core@7.24.4): resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.4 babel-plugin-jest-hoist: 29.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.0) + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.4) /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - /bare-events@2.2.0: - resolution: {integrity: sha512-Yyyqff4PIFfSuthCZqLlPISTWHmnQxoPuAvkmgzsJEmG3CesdIv6Xweayl0JkCZJSB2yYIdJyEz97tpxNhgjbg==} + /bare-events@2.2.2: + resolution: {integrity: sha512-h7z00dWdG0PYOQEvChhOSWvOfkIKsdZGkWr083FgN/HyoQuebSew/cgirYqh9SCuy/hRvxc5Vy6Fw8xAmYHLkQ==} requiresBuild: true dev: true optional: true - /bare-fs@2.2.1: - resolution: {integrity: sha512-+CjmZANQDFZWy4PGbVdmALIwmt33aJg8qTkVjClU6X4WmZkTPBDxRHiBn7fpqEWEfF3AC2io++erpViAIQbSjg==} + /bare-fs@2.2.3: + resolution: {integrity: sha512-amG72llr9pstfXOBOHve1WjiuKKAMnebcmMbPWDZ7BCevAoJLpugjuAPRsDINEyjT0a6tbaVx3DctkXIRbLuJw==} requiresBuild: true dependencies: - bare-events: 2.2.0 - bare-os: 2.2.0 - bare-path: 2.1.0 + bare-events: 2.2.2 + bare-path: 2.1.1 streamx: 2.16.1 dev: true optional: true - /bare-os@2.2.0: - resolution: {integrity: sha512-hD0rOPfYWOMpVirTACt4/nK8mC55La12K5fY1ij8HAdfQakD62M+H4o4tpfKzVGLgRDTuk3vjA4GqGXXCeFbag==} + /bare-os@2.2.1: + resolution: {integrity: sha512-OwPyHgBBMkhC29Hl3O4/YfxW9n7mdTr2+SsO29XBWKKJsbgj3mnorDB80r5TiCQgQstgE5ga1qNYrpes6NvX2w==} requiresBuild: true dev: true optional: true - /bare-path@2.1.0: - resolution: {integrity: sha512-DIIg7ts8bdRKwJRJrUMy/PICEaQZaPGZ26lsSx9MJSwIhSrcdHn7/C8W+XmnG/rKi6BaRcz+JO00CjZteybDtw==} + /bare-path@2.1.1: + resolution: {integrity: sha512-OHM+iwRDRMDBsSW7kl3dO62JyHdBKO3B25FB9vNQBPcGHMo4+eA8Yj41Lfbk3pS/seDY+siNge0LdRTulAau/A==} requiresBuild: true dependencies: - bare-os: 2.2.0 + bare-os: 2.2.1 dev: true optional: true @@ -7309,8 +7228,8 @@ packages: find-versions: 5.1.0 dev: true - /binary-extensions@2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + /binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} /bl@4.1.0: @@ -7321,8 +7240,8 @@ packages: readable-stream: 3.6.2 dev: true - /body-parser@1.20.1: - resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} + /body-parser@1.20.2: + resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} dependencies: bytes: 3.1.2 @@ -7334,7 +7253,7 @@ packages: iconv-lite: 0.4.24 on-finished: 2.4.1 qs: 6.11.0 - raw-body: 2.5.1 + raw-body: 2.5.2 type-is: 1.6.18 unpipe: 1.0.0 transitivePeerDependencies: @@ -7355,7 +7274,6 @@ packages: /bowser@2.11.0: resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==} - requiresBuild: true /brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} @@ -7379,8 +7297,8 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001591 - electron-to-chromium: 1.4.686 + caniuse-lite: 1.0.30001607 + electron-to-chromium: 1.4.730 node-releases: 2.0.14 update-browserslist-db: 1.0.13(browserslist@4.23.0) @@ -7495,7 +7413,7 @@ packages: es-errors: 1.3.0 function-bind: 1.1.2 get-intrinsic: 1.2.4 - set-function-length: 1.2.1 + set-function-length: 1.2.2 /call-me-maybe@1.0.2: resolution: {integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==} @@ -7521,13 +7439,13 @@ packages: resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} dependencies: browserslist: 4.23.0 - caniuse-lite: 1.0.30001591 + caniuse-lite: 1.0.30001607 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 dev: true - /caniuse-lite@1.0.30001591: - resolution: {integrity: sha512-PCzRMei/vXjJyL5mJtzNiUCKP59dm8Apqc3PH8gJkMnMXZGox93RbE76jHsmLwmIo6/3nsYIpJtx0O7u5PqFuQ==} + /caniuse-lite@1.0.30001607: + resolution: {integrity: sha512-WcvhVRjXLKFB/kmOFVwELtMxyhq3iM/MvmXcyCe2PNf166c39mptscOc/45TTS96n2gpNV2z7+NakArTWZCQ3w==} /chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} @@ -7603,11 +7521,11 @@ packages: engines: {node: '>=6'} dev: true - /cli-color@2.0.3: - resolution: {integrity: sha512-OkoZnxyC4ERN3zLzZaY9Emb7f/MhBOIpePv0Ycok0fJYT+Ouo00UBEIwsVsr0yoow++n5YWlSUgST9GKhNHiRQ==} + /cli-color@2.0.4: + resolution: {integrity: sha512-zlnpg0jNcibNrO7GG9IeHH7maWFeCz+Ja1wx/7tZNU5ASSSSZ+/qZciM0/LHCYxSdqv5h2sdbQ/PXYdOuetXvA==} engines: {node: '>=0.10'} dependencies: - d: 1.0.1 + d: 1.0.2 es5-ext: 0.10.64 es6-iterator: 2.0.3 memoizee: 0.4.15 @@ -7981,8 +7899,8 @@ packages: resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} dev: false - /cookie@0.5.0: - resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} + /cookie@0.6.0: + resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} engines: {node: '>= 0.6'} dev: false @@ -8089,39 +8007,39 @@ packages: engines: {node: '>=8'} dev: true - /css-blank-pseudo@6.0.1(postcss@8.4.35): + /css-blank-pseudo@6.0.1(postcss@8.4.38): resolution: {integrity: sha512-goSnEITByxTzU4Oh5oJZrEWudxTqk7L6IXj1UW69pO6Hv0UdX+Vsrt02FFu5DweRh2bLu6WpX/+zsQCu5O1gKw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.35 - postcss-selector-parser: 6.0.15 + postcss: 8.4.38 + postcss-selector-parser: 6.0.16 dev: true - /css-declaration-sorter@7.1.1(postcss@8.4.35): - resolution: {integrity: sha512-dZ3bVTEEc1vxr3Bek9vGwfB5Z6ESPULhcRvO472mfjVnj8jRcTnKO8/JTczlvxM10Myb+wBM++1MtdO76eWcaQ==} + /css-declaration-sorter@7.2.0(postcss@8.4.38): + resolution: {integrity: sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.0.9 dependencies: - postcss: 8.4.35 + postcss: 8.4.38 dev: true - /css-has-pseudo@6.0.2(postcss@8.4.35): - resolution: {integrity: sha512-Z2Qm5yyOvJRTy6THdUlnGIX6PW/1wOc4FHWlfkcBkfkpZ3oz6lPdG+h+J7t1HZHT4uSSVR8XatXiMpqMUADXow==} + /css-has-pseudo@6.0.3(postcss@8.4.38): + resolution: {integrity: sha512-qIsDxK/z0byH/mpNsv5hzQ5NOl8m1FRmOLgZpx4bG5uYHnOlO2XafeMI4mFIgNSViHwoUWcxSJZyyijaAmbs+A==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/selector-specificity': 3.0.2(postcss-selector-parser@6.0.15) - postcss: 8.4.35 - postcss-selector-parser: 6.0.15 + '@csstools/selector-specificity': 3.0.3(postcss-selector-parser@6.0.16) + postcss: 8.4.38 + postcss-selector-parser: 6.0.16 postcss-value-parser: 4.2.0 dev: true - /css-loader@6.10.0(webpack@5.90.3): - resolution: {integrity: sha512-LTSA/jWbwdMlk+rhmElbDR2vbtQoTBPr7fkJE+mxrHj+7ru0hUmHafDRzWIjIHTwpitWVaqY2/UWGRca3yUgRw==} + /css-loader@6.11.0(webpack@5.91.0): + resolution: {integrity: sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==} engines: {node: '>= 12.13.0'} peerDependencies: '@rspack/core': 0.x || 1.x @@ -8132,18 +8050,18 @@ packages: webpack: optional: true dependencies: - icss-utils: 5.1.0(postcss@8.4.35) - postcss: 8.4.35 - postcss-modules-extract-imports: 3.0.0(postcss@8.4.35) - postcss-modules-local-by-default: 4.0.4(postcss@8.4.35) - postcss-modules-scope: 3.1.1(postcss@8.4.35) - postcss-modules-values: 4.0.0(postcss@8.4.35) + icss-utils: 5.1.0(postcss@8.4.38) + postcss: 8.4.38 + postcss-modules-extract-imports: 3.1.0(postcss@8.4.38) + postcss-modules-local-by-default: 4.0.5(postcss@8.4.38) + postcss-modules-scope: 3.2.0(postcss@8.4.38) + postcss-modules-values: 4.0.0(postcss@8.4.38) postcss-value-parser: 4.2.0 semver: 7.6.0 - webpack: 5.90.3(@swc/core@1.4.2)(esbuild@0.19.12)(webpack-cli@5.1.4) + webpack: 5.91.0(@swc/core@1.4.13)(esbuild@0.19.12)(webpack-cli@5.1.4) dev: true - /css-minimizer-webpack-plugin@6.0.0(esbuild@0.19.12)(webpack@5.90.3): + /css-minimizer-webpack-plugin@6.0.0(esbuild@0.19.12)(webpack@5.91.0): resolution: {integrity: sha512-BLpR9CCDkKvhO3i0oZQgad6v9pCxUuhSc5RT6iUEy9M8hBXi4TJb5vqF2GQ2deqYHmRi3O6IR9hgAZQWg0EBwA==} engines: {node: '>= 18.12.0'} peerDependencies: @@ -8168,23 +8086,23 @@ packages: lightningcss: optional: true dependencies: - '@jridgewell/trace-mapping': 0.3.23 - cssnano: 6.1.0(postcss@8.4.35) + '@jridgewell/trace-mapping': 0.3.25 + cssnano: 6.1.2(postcss@8.4.38) esbuild: 0.19.12 jest-worker: 29.7.0 - postcss: 8.4.35 + postcss: 8.4.38 schema-utils: 4.2.0 serialize-javascript: 6.0.2 - webpack: 5.90.3(@swc/core@1.4.2)(esbuild@0.19.12)(webpack-cli@5.1.4) + webpack: 5.91.0(@swc/core@1.4.13)(esbuild@0.19.12)(webpack-cli@5.1.4) dev: true - /css-prefers-color-scheme@9.0.1(postcss@8.4.35): + /css-prefers-color-scheme@9.0.1(postcss@8.4.38): resolution: {integrity: sha512-iFit06ochwCKPRiWagbTa1OAWCvWWVdEnIFd8BaRrgO8YrrNh4RAWUQTFcYX5tdFZgFl1DJ3iiULchZyEbnF4g==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.35 + postcss: 8.4.38 dev: true /css-select@5.1.0: @@ -8202,7 +8120,7 @@ packages: engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} dependencies: mdn-data: 2.0.28 - source-map-js: 1.0.2 + source-map-js: 1.2.0 dev: true /css-tree@2.3.1: @@ -8210,7 +8128,7 @@ packages: engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} dependencies: mdn-data: 2.0.30 - source-map-js: 1.0.2 + source-map-js: 1.2.0 dev: true /css-what@6.1.0: @@ -8222,8 +8140,8 @@ packages: resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} dev: true - /cssdb@7.11.2: - resolution: {integrity: sha512-lhQ32TFkc1X4eTefGfYPvgovRSzIMofHkigfH8nWtyRL4XJLsRhJFreRvEgKzept7x1rjBuy3J/MurXLaFxW/A==} + /cssdb@8.0.0: + resolution: {integrity: sha512-hfpm8VXc7/dhcEWpLvKDLwImOSk1sa2DxL36OEiY/4h2MGfKjPYIMZo4hnEEl+TCJr2GwcX46jF5TafRASDe9w==} dev: true /cssesc@3.0.0: @@ -8236,63 +8154,63 @@ packages: resolution: {integrity: sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw==} dev: false - /cssnano-preset-default@6.1.0(postcss@8.4.35): - resolution: {integrity: sha512-4DUXZoDj+PI3fRl3MqMjl9DwLGjcsFP4qt+92nLUcN1RGfw2TY+GwNoG2B38Usu1BrcTs8j9pxNfSusmvtSjfg==} + /cssnano-preset-default@6.1.2(postcss@8.4.38): + resolution: {integrity: sha512-1C0C+eNaeN8OcHQa193aRgYexyJtU8XwbdieEjClw+J9d94E41LwT6ivKH0WT+fYwYWB0Zp3I3IZ7tI/BbUbrg==} engines: {node: ^14 || ^16 || >=18.0} peerDependencies: postcss: ^8.4.31 dependencies: browserslist: 4.23.0 - css-declaration-sorter: 7.1.1(postcss@8.4.35) - cssnano-utils: 4.0.2(postcss@8.4.35) - postcss: 8.4.35 - postcss-calc: 9.0.1(postcss@8.4.35) - postcss-colormin: 6.1.0(postcss@8.4.35) - postcss-convert-values: 6.1.0(postcss@8.4.35) - postcss-discard-comments: 6.0.2(postcss@8.4.35) - postcss-discard-duplicates: 6.0.3(postcss@8.4.35) - postcss-discard-empty: 6.0.3(postcss@8.4.35) - postcss-discard-overridden: 6.0.2(postcss@8.4.35) - postcss-merge-longhand: 6.0.4(postcss@8.4.35) - postcss-merge-rules: 6.1.0(postcss@8.4.35) - postcss-minify-font-values: 6.0.3(postcss@8.4.35) - postcss-minify-gradients: 6.0.3(postcss@8.4.35) - postcss-minify-params: 6.1.0(postcss@8.4.35) - postcss-minify-selectors: 6.0.3(postcss@8.4.35) - postcss-normalize-charset: 6.0.2(postcss@8.4.35) - postcss-normalize-display-values: 6.0.2(postcss@8.4.35) - postcss-normalize-positions: 6.0.2(postcss@8.4.35) - postcss-normalize-repeat-style: 6.0.2(postcss@8.4.35) - postcss-normalize-string: 6.0.2(postcss@8.4.35) - postcss-normalize-timing-functions: 6.0.2(postcss@8.4.35) - postcss-normalize-unicode: 6.1.0(postcss@8.4.35) - postcss-normalize-url: 6.0.2(postcss@8.4.35) - postcss-normalize-whitespace: 6.0.2(postcss@8.4.35) - postcss-ordered-values: 6.0.2(postcss@8.4.35) - postcss-reduce-initial: 6.1.0(postcss@8.4.35) - postcss-reduce-transforms: 6.0.2(postcss@8.4.35) - postcss-svgo: 6.0.3(postcss@8.4.35) - postcss-unique-selectors: 6.0.3(postcss@8.4.35) + css-declaration-sorter: 7.2.0(postcss@8.4.38) + cssnano-utils: 4.0.2(postcss@8.4.38) + postcss: 8.4.38 + postcss-calc: 9.0.1(postcss@8.4.38) + postcss-colormin: 6.1.0(postcss@8.4.38) + postcss-convert-values: 6.1.0(postcss@8.4.38) + postcss-discard-comments: 6.0.2(postcss@8.4.38) + postcss-discard-duplicates: 6.0.3(postcss@8.4.38) + postcss-discard-empty: 6.0.3(postcss@8.4.38) + postcss-discard-overridden: 6.0.2(postcss@8.4.38) + postcss-merge-longhand: 6.0.5(postcss@8.4.38) + postcss-merge-rules: 6.1.1(postcss@8.4.38) + postcss-minify-font-values: 6.1.0(postcss@8.4.38) + postcss-minify-gradients: 6.0.3(postcss@8.4.38) + postcss-minify-params: 6.1.0(postcss@8.4.38) + postcss-minify-selectors: 6.0.4(postcss@8.4.38) + postcss-normalize-charset: 6.0.2(postcss@8.4.38) + postcss-normalize-display-values: 6.0.2(postcss@8.4.38) + postcss-normalize-positions: 6.0.2(postcss@8.4.38) + postcss-normalize-repeat-style: 6.0.2(postcss@8.4.38) + postcss-normalize-string: 6.0.2(postcss@8.4.38) + postcss-normalize-timing-functions: 6.0.2(postcss@8.4.38) + postcss-normalize-unicode: 6.1.0(postcss@8.4.38) + postcss-normalize-url: 6.0.2(postcss@8.4.38) + postcss-normalize-whitespace: 6.0.2(postcss@8.4.38) + postcss-ordered-values: 6.0.2(postcss@8.4.38) + postcss-reduce-initial: 6.1.0(postcss@8.4.38) + postcss-reduce-transforms: 6.0.2(postcss@8.4.38) + postcss-svgo: 6.0.3(postcss@8.4.38) + postcss-unique-selectors: 6.0.4(postcss@8.4.38) dev: true - /cssnano-utils@4.0.2(postcss@8.4.35): + /cssnano-utils@4.0.2(postcss@8.4.38): resolution: {integrity: sha512-ZR1jHg+wZ8o4c3zqf1SIUSTIvm/9mU343FMR6Obe/unskbvpGhZOo1J6d/r8D1pzkRQYuwbcH3hToOuoA2G7oQ==} engines: {node: ^14 || ^16 || >=18.0} peerDependencies: postcss: ^8.4.31 dependencies: - postcss: 8.4.35 + postcss: 8.4.38 dev: true - /cssnano@6.1.0(postcss@8.4.35): - resolution: {integrity: sha512-e2v4w/t3OFM6HTuSweI4RSdABaqgVgHlJp5FZrQsopHnKKHLFIvK2D3C4kHWeFIycN/1L1J5VIrg5KlDzn3r/g==} + /cssnano@6.1.2(postcss@8.4.38): + resolution: {integrity: sha512-rYk5UeX7VAM/u0lNqewCdasdtPK81CgX8wJFLEIXHbV2oldWRgJAsZrdhRXkV1NJzA2g850KiFm9mMU2HxNxMA==} engines: {node: ^14 || ^16 || >=18.0} peerDependencies: postcss: ^8.4.31 dependencies: - cssnano-preset-default: 6.1.0(postcss@8.4.35) + cssnano-preset-default: 6.1.2(postcss@8.4.38) lilconfig: 3.1.1 - postcss: 8.4.35 + postcss: 8.4.38 dev: true /csso@5.0.5: @@ -8320,11 +8238,12 @@ packages: /csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - /d@1.0.1: - resolution: {integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==} + /d@1.0.2: + resolution: {integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==} + engines: {node: '>=0.12'} dependencies: es5-ext: 0.10.64 - type: 1.2.0 + type: 2.7.2 /damerau-levenshtein@1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} @@ -8348,6 +8267,30 @@ packages: whatwg-url: 11.0.0 dev: true + /data-view-buffer@1.0.1: + resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + + /data-view-byte-length@1.0.1: + resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + + /data-view-byte-offset@1.0.0: + resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + /dataloader@2.2.2: resolution: {integrity: sha512-8YnDaaf7N3k/q5HnTJVuzSyLETjoZjVmHc4AeKAzOvKHEFQKcn64OKBfzHYtE9zGjctNM7V9I0MfnUVLpi7M5g==} dev: false @@ -8356,7 +8299,7 @@ packages: resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} engines: {node: '>=0.11'} dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.4 dev: true /date-fns@3.3.1: @@ -8445,10 +8388,10 @@ packages: object-keys: 1.1.1 object.assign: 4.1.4 regexp.prototype.flags: 1.5.2 - side-channel: 1.0.5 + side-channel: 1.0.6 which-boxed-primitive: 1.0.2 - which-collection: 1.0.1 - which-typed-array: 1.1.14 + which-collection: 1.0.2 + which-typed-array: 1.1.15 dev: false /deep-equal@2.2.3: @@ -8469,10 +8412,10 @@ packages: object-keys: 1.1.1 object.assign: 4.1.4 regexp.prototype.flags: 1.5.2 - side-channel: 1.0.5 + side-channel: 1.0.6 which-boxed-primitive: 1.0.2 - which-collection: 1.0.1 - which-typed-array: 1.1.14 + which-collection: 1.0.2 + which-typed-array: 1.1.15 /deep-extend@0.6.0: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} @@ -8579,6 +8522,11 @@ packages: resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} engines: {node: '>=8'} + /detect-libc@2.0.3: + resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} + engines: {node: '>=8'} + dev: true + /detect-newline@3.1.0: resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} engines: {node: '>=8'} @@ -8648,7 +8596,7 @@ packages: /dom-helpers@5.2.1: resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.4 csstype: 3.1.3 dev: false @@ -8728,7 +8676,7 @@ packages: transitivePeerDependencies: - supports-color - /drizzle-orm@0.29.4(@libsql/client@0.5.2)(@types/pg@8.10.2)(@types/react@18.2.74)(pg@8.11.3)(react@18.2.0): + /drizzle-orm@0.29.4(@libsql/client@0.5.6)(@types/pg@8.10.2)(@types/react@18.2.74)(pg@8.11.3)(react@18.2.0): resolution: {integrity: sha512-ZnSM8TAxFhzH7p1s3+w3pRE/eKaOeNkH9SKitm717pubDVVcV2I0BCDBPGKV+pe02+wMfw37ntlTcCyo2rA3IA==} peerDependencies: '@aws-sdk/client-rds-data': '>=3' @@ -8799,7 +8747,7 @@ packages: sqlite3: optional: true dependencies: - '@libsql/client': 0.5.2 + '@libsql/client': 0.5.6 '@types/pg': 8.10.2 '@types/react': 18.2.74 pg: 8.11.3 @@ -8809,8 +8757,8 @@ packages: resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} dev: true - /duplexify@4.1.2: - resolution: {integrity: sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==} + /duplexify@4.1.3: + resolution: {integrity: sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==} dependencies: end-of-stream: 1.4.4 inherits: 2.0.4 @@ -8840,8 +8788,8 @@ packages: /ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - /electron-to-chromium@1.4.686: - resolution: {integrity: sha512-3avY1B+vUzNxEgkBDpKOP8WarvUAEwpRaiCL0He5OKWEFxzaOFiq4WoZEZe7qh0ReS7DiWoHMnYoQCKxNZNzSg==} + /electron-to-chromium@1.4.730: + resolution: {integrity: sha512-oJRPo82XEqtQAobHpJIR3zW5YO3sSRRkPz2an4yxi1UvqhsGm54vR/wzTFV74a3soDOJ8CKW7ajOOX5ESzddwg==} /emittery@0.13.1: resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} @@ -8867,8 +8815,8 @@ packages: dependencies: once: 1.4.0 - /enhanced-resolve@5.15.1: - resolution: {integrity: sha512-3d3JRbwsCLJsYgvb6NuWEG44jjPSOMuS73L/6+7BZuoKm3W+qXnSoIYVHi8dG7Qcg4inAY4jbzkZ7MnskePeDg==} + /enhanced-resolve@5.16.0: + resolution: {integrity: sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==} engines: {node: '>=10.13.0'} dependencies: graceful-fs: 4.2.11 @@ -8891,8 +8839,8 @@ packages: resolution: {integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - /envinfo@7.11.1: - resolution: {integrity: sha512-8PiZgZNIB4q/Lw4AhOvAfB/ityHAd2bli3lESSWmWSzSsl5dKpy5N1d1Rfkd2teq/g9xN90lc6o98DOjMeYHpg==} + /envinfo@7.12.0: + resolution: {integrity: sha512-Iw9rQJBGpJRd3rwXm9ft/JiGoAZmLxxJZELYDQoPRZ4USVhkKtIcNBPw6U+/K2mBpaqM25JSV6Yl4Az9vO2wJg==} engines: {node: '>=4'} hasBin: true dev: true @@ -8902,16 +8850,20 @@ packages: dependencies: is-arrayish: 0.2.1 - /es-abstract@1.22.5: - resolution: {integrity: sha512-oW69R+4q2wG+Hc3KZePPZxOiisRIqfKBVo/HLx94QcJeWGU/8sZhCvc829rd1kS366vlJbzBfXf9yWwf0+Ko7w==} + /es-abstract@1.23.3: + resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} engines: {node: '>= 0.4'} dependencies: array-buffer-byte-length: 1.0.1 arraybuffer.prototype.slice: 1.0.3 available-typed-arrays: 1.0.7 call-bind: 1.0.7 + data-view-buffer: 1.0.1 + data-view-byte-length: 1.0.1 + data-view-byte-offset: 1.0.0 es-define-property: 1.0.0 es-errors: 1.3.0 + es-object-atoms: 1.0.0 es-set-tostringtag: 2.0.3 es-to-primitive: 1.2.1 function.prototype.name: 1.1.6 @@ -8922,10 +8874,11 @@ packages: has-property-descriptors: 1.0.2 has-proto: 1.0.3 has-symbols: 1.0.3 - hasown: 2.0.1 + hasown: 2.0.2 internal-slot: 1.0.7 is-array-buffer: 3.0.4 is-callable: 1.2.7 + is-data-view: 1.0.1 is-negative-zero: 2.0.3 is-regex: 1.1.4 is-shared-array-buffer: 1.0.3 @@ -8936,17 +8889,17 @@ packages: object-keys: 1.1.1 object.assign: 4.1.5 regexp.prototype.flags: 1.5.2 - safe-array-concat: 1.1.0 + safe-array-concat: 1.1.2 safe-regex-test: 1.0.3 - string.prototype.trim: 1.2.8 - string.prototype.trimend: 1.0.7 - string.prototype.trimstart: 1.0.7 + string.prototype.trim: 1.2.9 + string.prototype.trimend: 1.0.8 + string.prototype.trimstart: 1.0.8 typed-array-buffer: 1.0.2 typed-array-byte-length: 1.0.1 typed-array-byte-offset: 1.0.2 - typed-array-length: 1.0.5 + typed-array-length: 1.0.6 unbox-primitive: 1.0.2 - which-typed-array: 1.1.14 + which-typed-array: 1.1.15 /es-define-property@1.0.0: resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} @@ -8965,20 +8918,19 @@ packages: get-intrinsic: 1.2.4 has-symbols: 1.0.3 is-arguments: 1.1.1 - is-map: 2.0.2 - is-set: 2.0.2 + is-map: 2.0.3 + is-set: 2.0.3 is-string: 1.0.7 isarray: 2.0.5 stop-iteration-iterator: 1.0.0 - /es-iterator-helpers@1.0.17: - resolution: {integrity: sha512-lh7BsUqelv4KUbR5a/ZTaGGIMLCjPGPqJ6q+Oq24YP0RdyptX1uzm4vvaqzk7Zx3bpl/76YLTTDj9L7uYQ92oQ==} + /es-iterator-helpers@1.0.18: + resolution: {integrity: sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA==} engines: {node: '>= 0.4'} dependencies: - asynciterator.prototype: 1.0.0 call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.3 es-errors: 1.3.0 es-set-tostringtag: 2.0.3 function-bind: 1.1.2 @@ -8989,25 +8941,31 @@ packages: has-symbols: 1.0.3 internal-slot: 1.0.7 iterator.prototype: 1.1.2 - safe-array-concat: 1.1.0 + safe-array-concat: 1.1.2 dev: false - /es-module-lexer@1.4.1: - resolution: {integrity: sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==} + /es-module-lexer@1.5.0: + resolution: {integrity: sha512-pqrTKmwEIgafsYZAGw9kszYzmagcE/n4dbgwGWLEXg7J4QFJVQRBld8j3Q3GNez79jzxZshq0bcT962QHOghjw==} dev: true + /es-object-atoms@1.0.0: + resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + /es-set-tostringtag@2.0.3: resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} engines: {node: '>= 0.4'} dependencies: get-intrinsic: 1.2.4 has-tostringtag: 1.0.2 - hasown: 2.0.1 + hasown: 2.0.2 /es-shim-unscopables@1.0.2: resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} dependencies: - hasown: 2.0.1 + hasown: 2.0.2 dev: false /es-to-primitive@1.2.1: @@ -9024,30 +8982,31 @@ packages: requiresBuild: true dependencies: es6-iterator: 2.0.3 - es6-symbol: 3.1.3 + es6-symbol: 3.1.4 esniff: 2.0.1 next-tick: 1.1.0 /es6-iterator@2.0.3: resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} dependencies: - d: 1.0.1 + d: 1.0.2 es5-ext: 0.10.64 - es6-symbol: 3.1.3 + es6-symbol: 3.1.4 - /es6-symbol@3.1.3: - resolution: {integrity: sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==} + /es6-symbol@3.1.4: + resolution: {integrity: sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==} + engines: {node: '>=0.12'} dependencies: - d: 1.0.1 + d: 1.0.2 ext: 1.7.0 /es6-weak-map@2.0.3: resolution: {integrity: sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==} dependencies: - d: 1.0.1 + d: 1.0.2 es5-ext: 0.10.64 es6-iterator: 2.0.3 - es6-symbol: 3.1.3 + es6-symbol: 3.1.4 /esbuild-register@3.5.0(esbuild@0.19.12): resolution: {integrity: sha512-+4G/XmakeBAsvJuDugJvtyF1x+XJT4FMocynNpxrvEBViirpfUn2PgNpCHedfWhF4WokNsO/OvMKrmJOIJsI5A==} @@ -9184,7 +9143,7 @@ packages: '@testing-library/dom': optional: true dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.4 eslint: 8.57.0 requireindex: 1.2.0 dev: false @@ -9217,23 +9176,23 @@ packages: peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.4 aria-query: 5.3.0 - array-includes: 3.1.7 + array-includes: 3.1.8 array.prototype.flatmap: 1.3.2 ast-types-flow: 0.0.8 axe-core: 4.7.0 axobject-query: 3.2.1 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - es-iterator-helpers: 1.0.17 + es-iterator-helpers: 1.0.18 eslint: 8.57.0 - hasown: 2.0.1 + hasown: 2.0.2 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 minimatch: 3.1.2 - object.entries: 1.1.7 - object.fromentries: 2.0.7 + object.entries: 1.1.8 + object.fromentries: 2.0.8 dev: false /eslint-plugin-node@11.1.0(eslint@8.57.0): @@ -9271,7 +9230,7 @@ packages: dependencies: '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.4.4) eslint: 8.57.0 - minimatch: 9.0.3 + minimatch: 9.0.4 natural-compare-lite: 1.4.0 transitivePeerDependencies: - supports-color @@ -9307,25 +9266,25 @@ packages: peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 dependencies: - array-includes: 3.1.7 - array.prototype.findlast: 1.2.4 + array-includes: 3.1.8 + array.prototype.findlast: 1.2.5 array.prototype.flatmap: 1.3.2 array.prototype.toreversed: 1.1.2 array.prototype.tosorted: 1.1.3 doctrine: 2.1.0 - es-iterator-helpers: 1.0.17 + es-iterator-helpers: 1.0.18 eslint: 8.57.0 estraverse: 5.3.0 jsx-ast-utils: 3.3.5 minimatch: 3.1.2 - object.entries: 1.1.7 - object.fromentries: 2.0.7 - object.hasown: 1.1.3 - object.values: 1.1.7 + object.entries: 1.1.8 + object.fromentries: 2.0.8 + object.hasown: 1.1.4 + object.values: 1.2.0 prop-types: 15.8.1 resolve: 2.0.0-next.5 semver: 6.3.1 - string.prototype.matchall: 4.0.10 + string.prototype.matchall: 4.0.11 dev: false /eslint-plugin-regexp@2.3.0(eslint@8.57.0): @@ -9424,7 +9383,7 @@ packages: resolution: {integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==} engines: {node: '>=0.10'} dependencies: - d: 1.0.1 + d: 1.0.2 es5-ext: 0.10.64 event-emitter: 0.3.5 type: 2.7.2 @@ -9473,7 +9432,7 @@ packages: /event-emitter@0.3.5: resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} dependencies: - d: 1.0.1 + d: 1.0.2 es5-ext: 0.10.64 /event-target-shim@5.0.1: @@ -9563,16 +9522,16 @@ packages: jest-message-util: 29.7.0 jest-util: 29.7.0 - /express@4.18.2: - resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} + /express@4.19.2: + resolution: {integrity: sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==} engines: {node: '>= 0.10.0'} dependencies: accepts: 1.3.8 array-flatten: 1.1.1 - body-parser: 1.20.1 + body-parser: 1.20.2 content-disposition: 0.5.4 content-type: 1.0.5 - cookie: 0.5.0 + cookie: 0.6.0 cookie-signature: 1.0.6 debug: 2.6.9 depd: 2.0.0 @@ -9637,8 +9596,8 @@ packages: resolution: {integrity: sha512-qwaScUgUGBYeDNRnbc/KyllVU88Jk1pRHPStuF/lO7B0/RTRLj7U0lkdTAutlBblY08rwZDff6tNU9cjv6j//Q==} dev: false - /fast-copy@3.0.1: - resolution: {integrity: sha512-Knr7NOtK3HWRYGtHoJrjkaWepqT8thIVGAwt0p0aUs1zqkAzXZV4vo9fFNwyb5fcqK1GKYFYxldQdIDVKhUAfA==} + /fast-copy@3.0.2: + resolution: {integrity: sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==} /fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -9663,8 +9622,8 @@ packages: /fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - /fast-redact@3.3.0: - resolution: {integrity: sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ==} + /fast-redact@3.5.0: + resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==} engines: {node: '>=6'} /fast-safe-stringify@2.1.1: @@ -9673,12 +9632,11 @@ packages: /fast-xml-parser@4.2.5: resolution: {integrity: sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==} hasBin: true - requiresBuild: true dependencies: strnum: 1.0.5 - /fast-xml-parser@4.3.5: - resolution: {integrity: sha512-sWvP1Pl8H03B8oFJpFR3HE31HUfwtX7Rlf9BNsvdpujD4n7WMhfmu8h9wOV2u+c1k0ZilTADhPqypzx2J690ZQ==} + /fast-xml-parser@4.3.6: + resolution: {integrity: sha512-M2SovcRxD4+vC493Uc2GZVcZaj66CCJhWurC4viynVSTvrpErCShNcDz1lAho6n9REQKvL/ll4A4/fw6Y9z8nw==} hasBin: true dependencies: strnum: 1.0.5 @@ -9725,7 +9683,7 @@ packages: dependencies: flat-cache: 3.2.0 - /file-loader@6.2.0(webpack@5.90.3): + /file-loader@6.2.0(webpack@5.91.0): resolution: {integrity: sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -9733,7 +9691,7 @@ packages: dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.90.3(@swc/core@1.4.2)(esbuild@0.19.12)(webpack-cli@5.1.4) + webpack: 5.91.0(@swc/core@1.4.13)(esbuild@0.19.12)(webpack-cli@5.1.4) dev: true /file-type@16.5.4: @@ -9883,8 +9841,8 @@ packages: tabbable: 5.3.3 dev: false - /follow-redirects@1.15.5(debug@4.3.4): - resolution: {integrity: sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==} + /follow-redirects@1.15.6(debug@4.3.4): + resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} engines: {node: '>=4.0'} peerDependencies: debug: '*' @@ -10001,20 +9959,21 @@ packages: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.3 functions-have-names: 1.2.3 /functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - /gaxios@6.3.0: - resolution: {integrity: sha512-p+ggrQw3fBwH2F5N/PAI4k/G/y1art5OxKpb2J2chwNNHM4hHuAOtivjPuirMF4KNKwTTUal/lPfL2+7h2mEcg==} + /gaxios@6.4.0: + resolution: {integrity: sha512-apAloYrY4dlBGlhauDAYSZveafb5U6+L9titing1wox6BvWM0TSXBp603zTrLpyLMGkrcFgohnUN150dFN/zOA==} engines: {node: '>=14'} dependencies: extend: 3.0.2 https-proxy-agent: 7.0.4 is-stream: 2.0.1 node-fetch: 2.7.0 + uuid: 9.0.1 transitivePeerDependencies: - encoding - supports-color @@ -10024,7 +9983,7 @@ packages: resolution: {integrity: sha512-Jh/AIwwgaxan+7ZUUmRLCjtchyDiqh4KjBJ5tW3plBZb5iL/BPcso8A5DlzeD9qlw0duCamnNdpFjxwaT0KyKg==} engines: {node: '>=14'} dependencies: - gaxios: 6.3.0 + gaxios: 6.4.0 json-bigint: 1.0.0 transitivePeerDependencies: - encoding @@ -10047,7 +10006,7 @@ packages: function-bind: 1.1.2 has-proto: 1.0.3 has-symbols: 1.0.3 - hasown: 2.0.1 + hasown: 2.0.2 /get-package-type@0.1.0: resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} @@ -10086,8 +10045,8 @@ packages: es-errors: 1.3.0 get-intrinsic: 1.2.4 - /get-tsconfig@4.7.2: - resolution: {integrity: sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==} + /get-tsconfig@4.7.3: + resolution: {integrity: sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==} dependencies: resolve-pkg-maps: 1.0.0 @@ -10147,9 +10106,22 @@ packages: dependencies: foreground-child: 3.1.1 jackspeak: 2.3.6 - minimatch: 9.0.3 + minimatch: 9.0.4 minipass: 7.0.4 - path-scurry: 1.10.1 + path-scurry: 1.10.2 + dev: true + + /glob@10.3.12: + resolution: {integrity: sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + dependencies: + foreground-child: 3.1.1 + jackspeak: 2.3.6 + minimatch: 9.0.4 + minipass: 7.0.4 + path-scurry: 1.10.2 + dev: false /glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} @@ -10218,13 +10190,13 @@ packages: merge2: 1.4.1 slash: 3.0.0 - /google-auth-library@9.6.3: - resolution: {integrity: sha512-4CacM29MLC2eT9Cey5GDVK4Q8t+MMp8+OEdOaqD9MG6b0dOyLORaaeJMPQ7EESVgm/+z5EKYyFLxgzBJlJgyHQ==} + /google-auth-library@9.7.0: + resolution: {integrity: sha512-I/AvzBiUXDzLOy4iIZ2W+Zq33W4lcukQv1nl7C8WUA6SQwyQwUwu3waNmWNAvzds//FG8SZ+DnKnW/2k6mQS8A==} engines: {node: '>=14'} dependencies: base64-js: 1.5.1 ecdsa-sig-formatter: 1.0.11 - gaxios: 6.3.0 + gaxios: 6.4.0 gcp-metadata: 6.1.0 gtoken: 7.1.0 jws: 4.0.0 @@ -10272,7 +10244,7 @@ packages: /graphql-playground-html@1.6.30: resolution: {integrity: sha512-tpCujhsJMva4aqE8ULnF7/l3xw4sNRZcSHu+R00VV+W0mfp+Q20Plvcrp+5UXD+2yS6oyCXncA+zoQJQqhGCEw==} dependencies: - xss: 1.0.14 + xss: 1.0.15 dev: false /graphql-query-complexity@0.12.0(graphql@16.8.1): @@ -10310,7 +10282,7 @@ packages: resolution: {integrity: sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==} engines: {node: '>=14.0.0'} dependencies: - gaxios: 6.3.0 + gaxios: 6.4.0 jws: 4.0.0 transitivePeerDependencies: - encoding @@ -10377,8 +10349,8 @@ packages: dependencies: has-symbols: 1.0.3 - /hasown@2.0.1: - resolution: {integrity: sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==} + /hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} dependencies: function-bind: 1.1.2 @@ -10493,7 +10465,7 @@ packages: resolution: {integrity: sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==} engines: {node: '>= 14'} dependencies: - agent-base: 7.1.0 + agent-base: 7.1.1 debug: 4.3.4(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -10528,13 +10500,13 @@ packages: safer-buffer: 2.1.2 dev: true - /icss-utils@5.1.0(postcss@8.4.35): + /icss-utils@5.1.0(postcss@8.4.38): resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.35 + postcss: 8.4.38 dev: true /ieee754@1.2.1: @@ -10595,8 +10567,8 @@ packages: engines: {node: '>= 0.4'} dependencies: es-errors: 1.3.0 - hasown: 2.0.1 - side-channel: 1.0.5 + hasown: 2.0.2 + side-channel: 1.0.6 /interpret@1.4.0: resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} @@ -10657,7 +10629,7 @@ packages: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} dependencies: - binary-extensions: 2.2.0 + binary-extensions: 2.3.0 /is-boolean-object@1.1.2: resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} @@ -10677,7 +10649,13 @@ packages: /is-core-module@2.13.1: resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} dependencies: - hasown: 2.0.1 + hasown: 2.0.2 + + /is-data-view@1.0.1: + resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} + engines: {node: '>= 0.4'} + dependencies: + is-typed-array: 1.1.13 /is-date-object@1.0.5: resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} @@ -10748,8 +10726,9 @@ packages: is-docker: 3.0.0 dev: true - /is-map@2.0.2: - resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} + /is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} /is-negative-zero@2.0.3: resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} @@ -10808,8 +10787,9 @@ packages: call-bind: 1.0.7 has-tostringtag: 1.0.2 - /is-set@2.0.2: - resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} + /is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} /is-shared-array-buffer@1.0.3: resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} @@ -10854,23 +10834,25 @@ packages: resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} engines: {node: '>= 0.4'} dependencies: - which-typed-array: 1.1.14 + which-typed-array: 1.1.15 /is-unicode-supported@2.0.0: resolution: {integrity: sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==} engines: {node: '>=18'} dev: false - /is-weakmap@2.0.1: - resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} + /is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} /is-weakref@1.0.2: resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} dependencies: call-bind: 1.0.7 - /is-weakset@2.0.2: - resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} + /is-weakset@2.0.3: + resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 get-intrinsic: 1.2.4 @@ -10935,8 +10917,8 @@ packages: resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} engines: {node: '>=8'} dependencies: - '@babel/core': 7.24.0 - '@babel/parser': 7.24.0 + '@babel/core': 7.24.4 + '@babel/parser': 7.24.4 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 6.3.1 @@ -10947,8 +10929,8 @@ packages: resolution: {integrity: sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==} engines: {node: '>=10'} dependencies: - '@babel/core': 7.24.0 - '@babel/parser': 7.24.0 + '@babel/core': 7.24.4 + '@babel/parser': 7.24.4 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 7.6.0 @@ -10986,7 +10968,7 @@ packages: define-properties: 1.2.1 get-intrinsic: 1.2.4 has-symbols: 1.0.3 - reflect.getprototypeof: 1.0.5 + reflect.getprototypeof: 1.0.6 set-function-name: 2.0.2 dev: false @@ -11027,7 +11009,7 @@ packages: jest-util: 29.7.0 p-limit: 3.1.0 pretty-format: 29.7.0 - pure-rand: 6.0.4 + pure-rand: 6.1.0 slash: 3.0.0 stack-utils: 2.0.6 transitivePeerDependencies: @@ -11073,11 +11055,11 @@ packages: ts-node: optional: true dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.4 '@jest/test-sequencer': 29.7.0 '@jest/types': 29.6.3 '@types/node': 20.12.5 - babel-jest: 29.7.0(@babel/core@7.24.0) + babel-jest: 29.7.0(@babel/core@7.24.4) chalk: 4.1.2 ci-info: 3.9.0 deepmerge: 4.3.1 @@ -11096,7 +11078,7 @@ packages: pretty-format: 29.7.0 slash: 3.0.0 strip-json-comments: 3.1.1 - ts-node: 10.9.1(@swc/core@1.4.2)(@types/node@20.12.5)(typescript@5.4.4) + ts-node: 10.9.1(@swc/core@1.4.13)(@types/node@20.12.5)(typescript@5.4.4) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -11227,7 +11209,7 @@ packages: resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/code-frame': 7.23.5 + '@babel/code-frame': 7.24.2 '@jest/types': 29.6.3 '@types/stack-utils': 2.0.3 chalk: 4.1.2 @@ -11344,15 +11326,15 @@ packages: resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/core': 7.24.0 - '@babel/generator': 7.23.6 - '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.24.0) + '@babel/core': 7.24.4 + '@babel/generator': 7.24.4 + '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-syntax-typescript': 7.24.1(@babel/core@7.24.4) '@babel/types': 7.24.0 '@jest/expect-utils': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.0) + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.4) chalk: 4.1.2 expect: 29.7.0 graceful-fs: 4.2.11 @@ -11445,8 +11427,8 @@ packages: hasBin: true dev: true - /joi@17.12.2: - resolution: {integrity: sha512-RonXAIzCiHLc8ss3Ibuz45u28GOsWE1UpfDXLbN/9NKbL4tCJf8TWYVKsoYuuh+sAUt7fsSNpA+r2+TBA6Wjmw==} + /joi@17.12.3: + resolution: {integrity: sha512-2RRziagf555owrm9IRVtdKynOBeITiDpuZqIpgwqXShPncPKNiRQoiGsl/T8SQdq+8ugRzH2LqY67irr2y/d+g==} dependencies: '@hapi/hoek': 9.3.0 '@hapi/topo': 5.1.0 @@ -11469,7 +11451,7 @@ packages: dependencies: config-chain: 1.1.13 editorconfig: 1.0.4 - glob: 10.3.10 + glob: 10.3.12 js-cookie: 3.0.5 nopt: 7.2.0 dev: false @@ -11566,7 +11548,7 @@ packages: resolution: {integrity: sha512-cVnggDrVkAAA3OvFfHpFEhOnmcsUpleEKq4d4O8sQWWSH40MBrWstKigVB1kGrgLWzuom+7rRdaCsnBD6VyObQ==} hasBin: true dependencies: - cli-color: 2.0.3 + cli-color: 2.0.4 difflib: 0.2.4 dreamopt: 0.8.0 @@ -11585,9 +11567,9 @@ packages: dependencies: '@bcherny/json-schema-ref-parser': 9.0.9 '@types/json-schema': 7.0.15 - '@types/lodash': 4.14.202 + '@types/lodash': 4.17.0 '@types/prettier': 2.7.3 - cli-color: 2.0.3 + cli-color: 2.0.4 get-stdin: 8.0.0 glob: 7.2.3 glob-promise: 4.2.2(glob@7.2.3) @@ -11655,10 +11637,10 @@ packages: resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} engines: {node: '>=4.0'} dependencies: - array-includes: 3.1.7 + array-includes: 3.1.8 array.prototype.flat: 1.3.2 object.assign: 4.1.4 - object.values: 1.1.7 + object.values: 1.2.0 dev: false /jwa@1.4.1: @@ -11750,29 +11732,29 @@ packages: /lexical@0.13.1: resolution: {integrity: sha512-jaqRYzVEfBKbX4FwYpd/g+MyOjRaraAel0iQsTrwvx3hyN0bswUZuzb6H6nGlFSjcdrc77wKpyKwoWj4aUd+Bw==} - /lib0@0.2.90: - resolution: {integrity: sha512-iQmk+fThPq1ZTD2cFUu8xN6JLp9gFWnjs8auR6hmI6QQXoy6sSEh85uKcdkqpuEnkhhwQm4GSlKHOYfSCVp0Mw==} + /lib0@0.2.93: + resolution: {integrity: sha512-M5IKsiFJYulS+8Eal8f+zAqf5ckm1vffW0fFDxfgxJ+uiVopvDdd3PxJmz0GsVi3YNO7QCFSq0nAsiDmNhLj9Q==} engines: {node: '>=16'} hasBin: true dependencies: isomorphic.js: 0.2.5 dev: false - /libsql@0.3.4: - resolution: {integrity: sha512-lbmNw2H7e2UrBoV0gtvivsBoa8bxuApoYEawAYzwHW+fY51p9VGMp6kS18iSs1QFAn7Ck8YXpT3l29RT2Yh0EQ==} - cpu: [x64, arm64] + /libsql@0.3.10: + resolution: {integrity: sha512-/8YMTbwWFPmrDWY+YFK3kYqVPFkMgQre0DGmBaOmjogMdSe+7GHm1/q9AZ61AWkEub/vHmi+bA4tqIzVhKnqzg==} + cpu: [x64, arm64, wasm32] os: [darwin, linux, win32] dependencies: '@neon-rs/load': 0.0.4 detect-libc: 2.0.2 optionalDependencies: - '@libsql/darwin-arm64': 0.3.4 - '@libsql/darwin-x64': 0.3.4 - '@libsql/linux-arm64-gnu': 0.3.4 - '@libsql/linux-arm64-musl': 0.3.4 - '@libsql/linux-x64-gnu': 0.3.4 - '@libsql/linux-x64-musl': 0.3.4 - '@libsql/win32-x64-msvc': 0.3.4 + '@libsql/darwin-arm64': 0.3.10 + '@libsql/darwin-x64': 0.3.10 + '@libsql/linux-arm64-gnu': 0.3.10 + '@libsql/linux-arm64-musl': 0.3.10 + '@libsql/linux-x64-gnu': 0.3.10 + '@libsql/linux-x64-musl': 0.3.10 + '@libsql/win32-x64-msvc': 0.3.10 /lilconfig@2.1.0: resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} @@ -11997,7 +11979,7 @@ packages: /memoizee@0.4.15: resolution: {integrity: sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==} dependencies: - d: 1.0.1 + d: 1.0.2 es5-ext: 0.10.64 es6-weak-map: 2.0.3 event-emitter: 0.3.5 @@ -12096,7 +12078,7 @@ packages: engines: {node: '>=4'} dev: true - /mini-css-extract-plugin@1.6.2(webpack@5.90.3): + /mini-css-extract-plugin@1.6.2(webpack@5.91.0): resolution: {integrity: sha512-WhDvO3SjGm40oV5y26GjMJYjd2UMqrLAGKy5YS2/3QKJy2F7jgynuHTir/tgUUOiNQu5saXHdc8reo7YuhhT4Q==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -12104,7 +12086,7 @@ packages: dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.90.3(@swc/core@1.4.2)(esbuild@0.19.12)(webpack-cli@5.1.4) + webpack: 5.91.0(@swc/core@1.4.13)(esbuild@0.19.12)(webpack-cli@5.1.4) webpack-sources: 1.4.3 dev: true @@ -12137,6 +12119,13 @@ packages: engines: {node: '>=16 || 14 >=14.17'} dependencies: brace-expansion: 2.0.1 + dev: false + + /minimatch@9.0.4: + resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 /minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} @@ -12163,15 +12152,15 @@ packages: '@types/whatwg-url': 8.2.2 whatwg-url: 11.0.0 - /mongodb-memory-server-core@9.1.7: - resolution: {integrity: sha512-q8geqCmt5hGuxaDhRo03ZUB0ITr6lnJ3jffdNiC4nDq13WbHUfY2A1RQq3OHDbdrY6aRYvZphx2bcXYBFRis3A==} + /mongodb-memory-server-core@9.1.8: + resolution: {integrity: sha512-iCWwaP7De4lm1lRCUKB2ffUYr6GB0I/cj6fK0NV9dgwc9fA3xapHTTT/cPYRNx29M5gmAOSaOpUgjP7i2GZ/LQ==} engines: {node: '>=14.20.1'} dependencies: async-mutex: 0.4.1 camelcase: 6.3.0 debug: 4.3.4(supports-color@5.5.0) find-cache-dir: 3.3.2 - follow-redirects: 1.15.5(debug@4.3.4) + follow-redirects: 1.15.6(debug@4.3.4) https-proxy-agent: 7.0.4 mongodb: 5.9.2 new-find-package-json: 2.0.0 @@ -12188,12 +12177,12 @@ packages: - supports-color dev: true - /mongodb-memory-server@9.1.7: - resolution: {integrity: sha512-Yxw1cUMoCKTK6jxk4cKG07P+Z/qOmuCVyt3ScIDaoHeOCbOlg2sEtXYO9vEK/tzpj/1KHdDStU2oYrsJ8Fvm0A==} + /mongodb-memory-server@9.1.8: + resolution: {integrity: sha512-QumPTOlWWWzgW6dtV4bf+ZFdTxenHSSGS4ZT85Vbb+FzPVoOtfcFwYlSfC9IM4e2nw7xvnQZvWtILYseO6HE9Q==} engines: {node: '>=14.20.1'} requiresBuild: true dependencies: - mongodb-memory-server-core: 9.1.7 + mongodb-memory-server-core: 9.1.8 tslib: 2.6.2 transitivePeerDependencies: - '@aws-sdk/credential-providers' @@ -12212,8 +12201,8 @@ packages: mongodb-connection-string-url: 2.6.0 socks: 2.8.1 optionalDependencies: - '@aws-sdk/credential-providers': 3.525.0 - '@mongodb-js/saslprep': 1.1.4 + '@aws-sdk/credential-providers': 3.549.0 + '@mongodb-js/saslprep': 1.1.5 transitivePeerDependencies: - aws-crt @@ -12242,7 +12231,7 @@ packages: mongodb-connection-string-url: 2.6.0 socks: 2.8.1 optionalDependencies: - '@mongodb-js/saslprep': 1.1.4 + '@mongodb-js/saslprep': 1.1.5 dev: true /mongoose-paginate-v2@1.7.22: @@ -12347,7 +12336,7 @@ packages: /next-tick@1.1.0: resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} - /next@14.2.0-canary.22(@babel/core@7.24.0)(react-dom@18.2.0)(react@18.2.0): + /next@14.2.0-canary.22(@babel/core@7.24.4)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-nCqEuJLHRFDWpMfcql3D8V88GAGoEeZobxSCgi6ablFWMkzBGgrwZmsJi41OgtJnWwfF/c56MPXAgkFqbBcwyw==} engines: {node: '>=18.17.0'} hasBin: true @@ -12365,12 +12354,12 @@ packages: '@next/env': 14.2.0-canary.22 '@swc/helpers': 0.5.5 busboy: 1.6.0 - caniuse-lite: 1.0.30001591 + caniuse-lite: 1.0.30001607 graceful-fs: 4.2.11 postcss: 8.4.31 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - styled-jsx: 5.1.1(@babel/core@7.24.0)(react@18.2.0) + styled-jsx: 5.1.1(@babel/core@7.24.4)(react@18.2.0) optionalDependencies: '@next/swc-darwin-arm64': 14.2.0-canary.22 '@next/swc-darwin-x64': 14.2.0-canary.22 @@ -12386,7 +12375,7 @@ packages: - babel-plugin-macros dev: true - /next@14.2.0-canary.23(@babel/core@7.24.0)(react-dom@18.2.0)(react@18.2.0)(sass@1.71.1): + /next@14.2.0-canary.23(@babel/core@7.24.4)(react-dom@18.2.0)(react@18.2.0)(sass@1.74.1): resolution: {integrity: sha512-HuQYIeSlmBmTueVIxn0Zjxx5I4MD6vG3p6AsFySTF7/hMSF5qFUCHGIj3YJRWsDcUw/LQhuGPNLaGUg119YegQ==} engines: {node: '>=18.17.0'} hasBin: true @@ -12404,13 +12393,13 @@ packages: '@next/env': 14.2.0-canary.23 '@swc/helpers': 0.5.5 busboy: 1.6.0 - caniuse-lite: 1.0.30001591 + caniuse-lite: 1.0.30001607 graceful-fs: 4.2.11 postcss: 8.4.31 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - sass: 1.71.1 - styled-jsx: 5.1.1(@babel/core@7.24.0)(react@18.2.0) + sass: 1.74.1 + styled-jsx: 5.1.1(@babel/core@7.24.4)(react@18.2.0) optionalDependencies: '@next/swc-darwin-arm64': 14.2.0-canary.23 '@next/swc-darwin-x64': 14.2.0-canary.23 @@ -12426,8 +12415,8 @@ packages: - babel-plugin-macros dev: false - /node-abi@3.56.0: - resolution: {integrity: sha512-fZjdhDOeRcaS+rcpve7XuwHBmktS1nS1gzgghwKUQQ8nTy2FdSDr6ZT8k6YhvlJeHmmQMYiT/IH9hfco5zeW2Q==} + /node-abi@3.57.0: + resolution: {integrity: sha512-Dp+A9JWxRaKuHP35H77I4kCKesDy5HUDEmScia2FyncMTOXASMyg251F5PhFoDA5uqBrDDffiLpbqnrZmNXW+g==} engines: {node: '>=10'} dependencies: semver: 7.6.0 @@ -12629,41 +12618,44 @@ packages: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.3 dev: true - /object.entries@1.1.7: - resolution: {integrity: sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==} + /object.entries@1.1.8: + resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-object-atoms: 1.0.0 dev: false - /object.fromentries@2.0.7: - resolution: {integrity: sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==} + /object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 dev: false - /object.hasown@1.1.3: - resolution: {integrity: sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==} + /object.hasown@1.1.4: + resolution: {integrity: sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==} + engines: {node: '>= 0.4'} dependencies: define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 dev: false - /object.values@1.1.7: - resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==} + /object.values@1.2.0: + resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-object-atoms: 1.0.0 dev: false /obuf@1.1.2: @@ -12816,7 +12808,7 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} dependencies: - '@babel/code-frame': 7.23.5 + '@babel/code-frame': 7.24.2 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -12825,7 +12817,7 @@ packages: resolution: {integrity: sha512-SgOTCX/EZXtZxBE5eJ97P4yGM5n37BwRU+YMsH4vNzFqJV/oWFXXCmwFlgWUM4PrakybVOueJJ6pwHqSVhTFDw==} engines: {node: '>=16'} dependencies: - '@babel/code-frame': 7.23.5 + '@babel/code-frame': 7.24.2 error-ex: 1.3.2 json-parse-even-better-errors: 3.0.1 lines-and-columns: 2.0.4 @@ -12893,8 +12885,8 @@ packages: /path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - /path-scurry@1.10.1: - resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} + /path-scurry@1.10.2: + resolution: {integrity: sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==} engines: {node: '>=16 || 14 >=14.17'} dependencies: lru-cache: 10.2.0 @@ -12904,8 +12896,8 @@ packages: resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} dev: false - /path-to-regexp@6.2.1: - resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} + /path-to-regexp@6.2.2: + resolution: {integrity: sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==} dev: false /path-type@4.0.0: @@ -12935,8 +12927,8 @@ packages: requiresBuild: true optional: true - /pg-connection-string@2.6.2: - resolution: {integrity: sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==} + /pg-connection-string@2.6.4: + resolution: {integrity: sha512-v+Z7W/0EO707aNMaAEfiGnGL9sxxumwLl2fJvCQtMn9Fxsg+lPpPkdcyBSv/KFgpGdYkMfn+EI1Or2EHjpgLCA==} /pg-int8@1.0.1: resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} @@ -12946,15 +12938,15 @@ packages: resolution: {integrity: sha512-BM/Thnrw5jm2kKLE5uJkXqqExRUY/toLHda65XgFTBTFYZyopbKjBe29Ii3RbkvlsMoFwD+tHeGaCjjv0gHlyw==} engines: {node: '>=4'} - /pg-pool@3.6.1(pg@8.11.3): - resolution: {integrity: sha512-jizsIzhkIitxCGfPRzJn1ZdcosIt3pz9Sh3V01fm1vZnbnCMgmGl5wvGGdNN2EL9Rmb0EcFoCkixH4Pu+sP9Og==} + /pg-pool@3.6.2(pg@8.11.3): + resolution: {integrity: sha512-Htjbg8BlwXqSBQ9V8Vjtc+vzf/6fVUuak/3/XXKA9oxZprwW3IMDQTGHP+KDmVL7rtd+R1QjbnCFPuTHm3G4hg==} peerDependencies: pg: '>=8.0' dependencies: pg: 8.11.3 - /pg-protocol@1.6.0: - resolution: {integrity: sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q==} + /pg-protocol@1.6.1: + resolution: {integrity: sha512-jPIlvgoD63hrEuihvIg+tJhoGjUsLPn6poJY9N5CnlPd91c2T18T/9zBtLxZSb1EhYxBRoZJtzScCaWlYLtktg==} /pg-types@2.2.0: resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} @@ -12989,9 +12981,9 @@ packages: dependencies: buffer-writer: 2.0.0 packet-reader: 1.0.0 - pg-connection-string: 2.6.2 - pg-pool: 3.6.1(pg@8.11.3) - pg-protocol: 1.6.0 + pg-connection-string: 2.6.4 + pg-pool: 3.6.2(pg@8.11.3) + pg-protocol: 1.6.1 pg-types: 2.2.0 pgpass: 1.0.5 optionalDependencies: @@ -13038,7 +13030,7 @@ packages: dependencies: colorette: 2.0.20 dateformat: 4.6.3 - fast-copy: 3.0.1 + fast-copy: 3.0.2 fast-safe-stringify: 2.1.1 help-me: 4.2.0 joycon: 3.1.1 @@ -13048,7 +13040,7 @@ packages: pump: 3.0.0 readable-stream: 4.5.2 secure-json-parse: 2.7.0 - sonic-boom: 3.8.0 + sonic-boom: 3.8.1 strip-json-comments: 3.1.1 /pino-std-serializers@6.2.2: @@ -13059,7 +13051,7 @@ packages: hasBin: true dependencies: atomic-sleep: 1.0.0 - fast-redact: 3.3.0 + fast-redact: 3.5.0 on-exit-leak-free: 2.1.2 pino-abstract-transport: 1.0.0 pino-std-serializers: 6.2.2 @@ -13067,7 +13059,7 @@ packages: quick-format-unescaped: 4.0.4 real-require: 0.2.0 safe-stable-stringify: 2.4.3 - sonic-boom: 3.8.0 + sonic-boom: 3.8.1 thread-stream: 2.4.1 /pirates@4.0.6: @@ -13113,74 +13105,74 @@ packages: resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} engines: {node: '>= 0.4'} - /postcss-attribute-case-insensitive@6.0.3(postcss@8.4.35): + /postcss-attribute-case-insensitive@6.0.3(postcss@8.4.38): resolution: {integrity: sha512-KHkmCILThWBRtg+Jn1owTnHPnFit4OkqS+eKiGEOPIGke54DCeYGJ6r0Fx/HjfE9M9kznApCLcU0DvnPchazMQ==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.35 - postcss-selector-parser: 6.0.15 + postcss: 8.4.38 + postcss-selector-parser: 6.0.16 dev: true - /postcss-calc@9.0.1(postcss@8.4.35): + /postcss-calc@9.0.1(postcss@8.4.38): resolution: {integrity: sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==} engines: {node: ^14 || ^16 || >=18.0} peerDependencies: postcss: ^8.2.2 dependencies: - postcss: 8.4.35 - postcss-selector-parser: 6.0.15 + postcss: 8.4.38 + postcss-selector-parser: 6.0.16 postcss-value-parser: 4.2.0 dev: true - /postcss-clamp@4.1.0(postcss@8.4.35): + /postcss-clamp@4.1.0(postcss@8.4.38): resolution: {integrity: sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==} engines: {node: '>=7.6.0'} peerDependencies: postcss: ^8.4.6 dependencies: - postcss: 8.4.35 + postcss: 8.4.38 postcss-value-parser: 4.2.0 dev: true - /postcss-color-functional-notation@6.0.5(postcss@8.4.35): - resolution: {integrity: sha512-aTFsIy89ftjyclwUHRwvz1IxucLzVrzmmcXmtbPWT9GdyYeaJEKeAwbaZzOZn7AQlXg4xfwgkYhKsofC4aLIwg==} + /postcss-color-functional-notation@6.0.8(postcss@8.4.38): + resolution: {integrity: sha512-BilFPTHcfWEnuQeqL83nbSPVK3tcU57S60aOrqgditarNDzOojyF0Gdc2Ur5L+zox366QjrCe0rOBLDO2pNvRQ==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/css-color-parser': 1.5.2(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) - '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) - '@csstools/css-tokenizer': 2.2.3 - '@csstools/postcss-progressive-custom-properties': 3.1.0(postcss@8.4.35) - '@csstools/utilities': 1.0.0(postcss@8.4.35) - postcss: 8.4.35 + '@csstools/css-color-parser': 1.6.3(@csstools/css-parser-algorithms@2.6.1)(@csstools/css-tokenizer@2.2.4) + '@csstools/css-parser-algorithms': 2.6.1(@csstools/css-tokenizer@2.2.4) + '@csstools/css-tokenizer': 2.2.4 + '@csstools/postcss-progressive-custom-properties': 3.2.0(postcss@8.4.38) + '@csstools/utilities': 1.0.0(postcss@8.4.38) + postcss: 8.4.38 dev: true - /postcss-color-hex-alpha@9.0.4(postcss@8.4.35): + /postcss-color-hex-alpha@9.0.4(postcss@8.4.38): resolution: {integrity: sha512-XQZm4q4fNFqVCYMGPiBjcqDhuG7Ey2xrl99AnDJMyr5eDASsAGalndVgHZF8i97VFNy1GQeZc4q2ydagGmhelQ==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/utilities': 1.0.0(postcss@8.4.35) - postcss: 8.4.35 + '@csstools/utilities': 1.0.0(postcss@8.4.38) + postcss: 8.4.38 postcss-value-parser: 4.2.0 dev: true - /postcss-color-rebeccapurple@9.0.3(postcss@8.4.35): + /postcss-color-rebeccapurple@9.0.3(postcss@8.4.38): resolution: {integrity: sha512-ruBqzEFDYHrcVq3FnW3XHgwRqVMrtEPLBtD7K2YmsLKVc2jbkxzzNEctJKsPCpDZ+LeMHLKRDoSShVefGc+CkQ==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/utilities': 1.0.0(postcss@8.4.35) - postcss: 8.4.35 + '@csstools/utilities': 1.0.0(postcss@8.4.38) + postcss: 8.4.38 postcss-value-parser: 4.2.0 dev: true - /postcss-colormin@6.1.0(postcss@8.4.35): + /postcss-colormin@6.1.0(postcss@8.4.38): resolution: {integrity: sha512-x9yX7DOxeMAR+BgGVnNSAxmAj98NX/YxEMNFP+SDCEeNLb2r3i6Hh1ksMsnW8Ub5SLCpbescQqn9YEbE9554Sw==} engines: {node: ^14 || ^16 || >=18.0} peerDependencies: @@ -13189,182 +13181,182 @@ packages: browserslist: 4.23.0 caniuse-api: 3.0.0 colord: 2.9.3 - postcss: 8.4.35 + postcss: 8.4.38 postcss-value-parser: 4.2.0 dev: true - /postcss-convert-values@6.1.0(postcss@8.4.35): + /postcss-convert-values@6.1.0(postcss@8.4.38): resolution: {integrity: sha512-zx8IwP/ts9WvUM6NkVSkiU902QZL1bwPhaVaLynPtCsOTqp+ZKbNi+s6XJg3rfqpKGA/oc7Oxk5t8pOQJcwl/w==} engines: {node: ^14 || ^16 || >=18.0} peerDependencies: postcss: ^8.4.31 dependencies: browserslist: 4.23.0 - postcss: 8.4.35 + postcss: 8.4.38 postcss-value-parser: 4.2.0 dev: true - /postcss-custom-media@10.0.3(postcss@8.4.35): - resolution: {integrity: sha512-wfJ9nKpLn/Qy7LASKu0Rj9Iq2uMzlRt27P4FAE1889IKRMdYUgy8SqvdXfAOs7LJLQX9Fjm0mZ+TSFphD/mKwA==} + /postcss-custom-media@10.0.4(postcss@8.4.38): + resolution: {integrity: sha512-Ubs7O3wj2prghaKRa68VHBvuy3KnTQ0zbGwqDYY1mntxJD0QL2AeiAy+AMfl3HBedTCVr2IcFNktwty9YpSskA==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/cascade-layer-name-parser': 1.0.8(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) - '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) - '@csstools/css-tokenizer': 2.2.3 - '@csstools/media-query-list-parser': 2.1.8(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) - postcss: 8.4.35 + '@csstools/cascade-layer-name-parser': 1.0.9(@csstools/css-parser-algorithms@2.6.1)(@csstools/css-tokenizer@2.2.4) + '@csstools/css-parser-algorithms': 2.6.1(@csstools/css-tokenizer@2.2.4) + '@csstools/css-tokenizer': 2.2.4 + '@csstools/media-query-list-parser': 2.1.9(@csstools/css-parser-algorithms@2.6.1)(@csstools/css-tokenizer@2.2.4) + postcss: 8.4.38 dev: true - /postcss-custom-properties@13.3.5(postcss@8.4.35): - resolution: {integrity: sha512-xHg8DTCMfN2nrqs2CQTF+0m5jgnzKL5zrW5Y05KF6xBRO0uDPxiplBm/xcr1o49SLbyJXkMuaRJKhRzkrquKnQ==} + /postcss-custom-properties@13.3.6(postcss@8.4.38): + resolution: {integrity: sha512-vVVIwQbJiIz+PBLMIWA6XMi53Zg66/f474KolA7x0Das6EwkATc/9ZvM6zZx2gs7ZhcgVHjmWBbHkK9FlCgLeA==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/cascade-layer-name-parser': 1.0.8(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) - '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) - '@csstools/css-tokenizer': 2.2.3 - '@csstools/utilities': 1.0.0(postcss@8.4.35) - postcss: 8.4.35 + '@csstools/cascade-layer-name-parser': 1.0.9(@csstools/css-parser-algorithms@2.6.1)(@csstools/css-tokenizer@2.2.4) + '@csstools/css-parser-algorithms': 2.6.1(@csstools/css-tokenizer@2.2.4) + '@csstools/css-tokenizer': 2.2.4 + '@csstools/utilities': 1.0.0(postcss@8.4.38) + postcss: 8.4.38 postcss-value-parser: 4.2.0 dev: true - /postcss-custom-selectors@7.1.7(postcss@8.4.35): - resolution: {integrity: sha512-N19MpExaR+hYTXU59VO02xE42zLoAUYSVcupwkKlWWLteOb+sWCWHw5FhV7u7gVLTzaGULy7nZP3DNTHgOZAPA==} + /postcss-custom-selectors@7.1.8(postcss@8.4.38): + resolution: {integrity: sha512-fqDkGSEsO7+oQaqdRdR8nwwqH+N2uk6LE/2g4myVJJYz/Ly418lHKEleKTdV/GzjBjFcG4n0dbfuH/Pd2BE8YA==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/cascade-layer-name-parser': 1.0.8(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) - '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) - '@csstools/css-tokenizer': 2.2.3 - postcss: 8.4.35 - postcss-selector-parser: 6.0.15 + '@csstools/cascade-layer-name-parser': 1.0.9(@csstools/css-parser-algorithms@2.6.1)(@csstools/css-tokenizer@2.2.4) + '@csstools/css-parser-algorithms': 2.6.1(@csstools/css-tokenizer@2.2.4) + '@csstools/css-tokenizer': 2.2.4 + postcss: 8.4.38 + postcss-selector-parser: 6.0.16 dev: true - /postcss-dir-pseudo-class@8.0.1(postcss@8.4.35): + /postcss-dir-pseudo-class@8.0.1(postcss@8.4.38): resolution: {integrity: sha512-uULohfWBBVoFiZXgsQA24JV6FdKIidQ+ZqxOouhWwdE+qJlALbkS5ScB43ZTjPK+xUZZhlaO/NjfCt5h4IKUfw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.35 - postcss-selector-parser: 6.0.15 + postcss: 8.4.38 + postcss-selector-parser: 6.0.16 dev: true - /postcss-discard-comments@6.0.2(postcss@8.4.35): + /postcss-discard-comments@6.0.2(postcss@8.4.38): resolution: {integrity: sha512-65w/uIqhSBBfQmYnG92FO1mWZjJ4GL5b8atm5Yw2UgrwD7HiNiSSNwJor1eCFGzUgYnN/iIknhNRVqjrrpuglw==} engines: {node: ^14 || ^16 || >=18.0} peerDependencies: postcss: ^8.4.31 dependencies: - postcss: 8.4.35 + postcss: 8.4.38 dev: true - /postcss-discard-duplicates@6.0.3(postcss@8.4.35): + /postcss-discard-duplicates@6.0.3(postcss@8.4.38): resolution: {integrity: sha512-+JA0DCvc5XvFAxwx6f/e68gQu/7Z9ud584VLmcgto28eB8FqSFZwtrLwB5Kcp70eIoWP/HXqz4wpo8rD8gpsTw==} engines: {node: ^14 || ^16 || >=18.0} peerDependencies: postcss: ^8.4.31 dependencies: - postcss: 8.4.35 + postcss: 8.4.38 dev: true - /postcss-discard-empty@6.0.3(postcss@8.4.35): + /postcss-discard-empty@6.0.3(postcss@8.4.38): resolution: {integrity: sha512-znyno9cHKQsK6PtxL5D19Fj9uwSzC2mB74cpT66fhgOadEUPyXFkbgwm5tvc3bt3NAy8ltE5MrghxovZRVnOjQ==} engines: {node: ^14 || ^16 || >=18.0} peerDependencies: postcss: ^8.4.31 dependencies: - postcss: 8.4.35 + postcss: 8.4.38 dev: true - /postcss-discard-overridden@6.0.2(postcss@8.4.35): + /postcss-discard-overridden@6.0.2(postcss@8.4.38): resolution: {integrity: sha512-j87xzI4LUggC5zND7KdjsI25APtyMuynXZSujByMaav2roV6OZX+8AaCUcZSWqckZpjAjRyFDdpqybgjFO0HJQ==} engines: {node: ^14 || ^16 || >=18.0} peerDependencies: postcss: ^8.4.31 dependencies: - postcss: 8.4.35 + postcss: 8.4.38 dev: true - /postcss-double-position-gradients@5.0.4(postcss@8.4.35): - resolution: {integrity: sha512-xOH2QhazCPeYR+ziYaDcGlpo7Bpw8PVoggOFfU/xPkmBRUQH8MR2eWoPY1CZM93CB0WKs2mxq3ORo83QGIooLw==} + /postcss-double-position-gradients@5.0.6(postcss@8.4.38): + resolution: {integrity: sha512-QJ+089FKMaqDxOhhIHsJrh4IP7h4PIHNC5jZP5PMmnfUScNu8Hji2lskqpFWCvu+5sj+2EJFyzKd13sLEWOZmQ==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/postcss-progressive-custom-properties': 3.1.0(postcss@8.4.35) - '@csstools/utilities': 1.0.0(postcss@8.4.35) - postcss: 8.4.35 + '@csstools/postcss-progressive-custom-properties': 3.2.0(postcss@8.4.38) + '@csstools/utilities': 1.0.0(postcss@8.4.38) + postcss: 8.4.38 postcss-value-parser: 4.2.0 dev: true - /postcss-focus-visible@9.0.1(postcss@8.4.35): + /postcss-focus-visible@9.0.1(postcss@8.4.38): resolution: {integrity: sha512-N2VQ5uPz3Z9ZcqI5tmeholn4d+1H14fKXszpjogZIrFbhaq0zNAtq8sAnw6VLiqGbL8YBzsnu7K9bBkTqaRimQ==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.35 - postcss-selector-parser: 6.0.15 + postcss: 8.4.38 + postcss-selector-parser: 6.0.16 dev: true - /postcss-focus-within@8.0.1(postcss@8.4.35): + /postcss-focus-within@8.0.1(postcss@8.4.38): resolution: {integrity: sha512-NFU3xcY/xwNaapVb+1uJ4n23XImoC86JNwkY/uduytSl2s9Ekc2EpzmRR63+ExitnW3Mab3Fba/wRPCT5oDILA==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.35 - postcss-selector-parser: 6.0.15 + postcss: 8.4.38 + postcss-selector-parser: 6.0.16 dev: true - /postcss-font-variant@5.0.0(postcss@8.4.35): + /postcss-font-variant@5.0.0(postcss@8.4.38): resolution: {integrity: sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.35 + postcss: 8.4.38 dev: true - /postcss-gap-properties@5.0.1(postcss@8.4.35): + /postcss-gap-properties@5.0.1(postcss@8.4.38): resolution: {integrity: sha512-k2z9Cnngc24c0KF4MtMuDdToROYqGMMUQGcE6V0odwjHyOHtaDBlLeRBV70y9/vF7KIbShrTRZ70JjsI1BZyWw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.35 + postcss: 8.4.38 dev: true - /postcss-image-set-function@6.0.3(postcss@8.4.35): + /postcss-image-set-function@6.0.3(postcss@8.4.38): resolution: {integrity: sha512-i2bXrBYzfbRzFnm+pVuxVePSTCRiNmlfssGI4H0tJQvDue+yywXwUxe68VyzXs7cGtMaH6MCLY6IbCShrSroCw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/utilities': 1.0.0(postcss@8.4.35) - postcss: 8.4.35 + '@csstools/utilities': 1.0.0(postcss@8.4.38) + postcss: 8.4.38 postcss-value-parser: 4.2.0 dev: true - /postcss-lab-function@6.0.10(postcss@8.4.35): - resolution: {integrity: sha512-Csvw/CwwuwTojK2O3Ad0SvYKrfnAKy+uvT+1Fjk6igR+n8gHuJHIwdj1A2s46EZZojg3RkibdMBuv1vMvR6Sng==} + /postcss-lab-function@6.0.13(postcss@8.4.38): + resolution: {integrity: sha512-tzEThi3prSyomnVqaAU+k/YJib4rxeeTKVfMt+mPcEugFgp0t6xRjoc7fzaWCoEwYLC6GxGLD8/Ugx8COCqabw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/css-color-parser': 1.5.2(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) - '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) - '@csstools/css-tokenizer': 2.2.3 - '@csstools/postcss-progressive-custom-properties': 3.1.0(postcss@8.4.35) - '@csstools/utilities': 1.0.0(postcss@8.4.35) - postcss: 8.4.35 + '@csstools/css-color-parser': 1.6.3(@csstools/css-parser-algorithms@2.6.1)(@csstools/css-tokenizer@2.2.4) + '@csstools/css-parser-algorithms': 2.6.1(@csstools/css-tokenizer@2.2.4) + '@csstools/css-tokenizer': 2.2.4 + '@csstools/postcss-progressive-custom-properties': 3.2.0(postcss@8.4.38) + '@csstools/utilities': 1.0.0(postcss@8.4.38) + postcss: 8.4.38 dev: true - /postcss-loader@8.1.1(postcss@8.4.35)(typescript@5.4.4)(webpack@5.90.3): + /postcss-loader@8.1.1(postcss@8.4.38)(typescript@5.4.4)(webpack@5.91.0): resolution: {integrity: sha512-0IeqyAsG6tYiDRCYKQJLAmgQr47DX6N7sFSWvQxt6AcupX8DIdmykuk/o/tx0Lze3ErGHJEp5OSRxrelC6+NdQ==} engines: {node: '>= 18.12.0'} peerDependencies: @@ -13379,362 +13371,362 @@ packages: dependencies: cosmiconfig: 9.0.0(typescript@5.4.4) jiti: 1.21.0 - postcss: 8.4.35 + postcss: 8.4.38 semver: 7.6.0 - webpack: 5.90.3(@swc/core@1.4.2)(esbuild@0.19.12)(webpack-cli@5.1.4) + webpack: 5.91.0(@swc/core@1.4.13)(esbuild@0.19.12)(webpack-cli@5.1.4) transitivePeerDependencies: - typescript dev: true - /postcss-logical@7.0.1(postcss@8.4.35): + /postcss-logical@7.0.1(postcss@8.4.38): resolution: {integrity: sha512-8GwUQZE0ri0K0HJHkDv87XOLC8DE0msc+HoWLeKdtjDZEwpZ5xuK3QdV6FhmHSQW40LPkg43QzvATRAI3LsRkg==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.35 + postcss: 8.4.38 postcss-value-parser: 4.2.0 dev: true - /postcss-merge-longhand@6.0.4(postcss@8.4.35): - resolution: {integrity: sha512-vAfWGcxUUGlFiPM3nDMZA+/Yo9sbpc3JNkcYZez8FfJDv41Dh7tAgA3QGVTocaHCZZL6aXPXPOaBMJsjujodsA==} + /postcss-merge-longhand@6.0.5(postcss@8.4.38): + resolution: {integrity: sha512-5LOiordeTfi64QhICp07nzzuTDjNSO8g5Ksdibt44d+uvIIAE1oZdRn8y/W5ZtYgRH/lnLDlvi9F8btZcVzu3w==} engines: {node: ^14 || ^16 || >=18.0} peerDependencies: postcss: ^8.4.31 dependencies: - postcss: 8.4.35 + postcss: 8.4.38 postcss-value-parser: 4.2.0 - stylehacks: 6.1.0(postcss@8.4.35) + stylehacks: 6.1.1(postcss@8.4.38) dev: true - /postcss-merge-rules@6.1.0(postcss@8.4.35): - resolution: {integrity: sha512-lER+W3Gr6XOvxOYk1Vi/6UsAgKMg6MDBthmvbNqi2XxAk/r9XfhdYZSigfWjuWWn3zYw2wLelvtM8XuAEFqRkA==} + /postcss-merge-rules@6.1.1(postcss@8.4.38): + resolution: {integrity: sha512-KOdWF0gju31AQPZiD+2Ar9Qjowz1LTChSjFFbS+e2sFgc4uHOp3ZvVX4sNeTlk0w2O31ecFGgrFzhO0RSWbWwQ==} engines: {node: ^14 || ^16 || >=18.0} peerDependencies: postcss: ^8.4.31 dependencies: browserslist: 4.23.0 caniuse-api: 3.0.0 - cssnano-utils: 4.0.2(postcss@8.4.35) - postcss: 8.4.35 - postcss-selector-parser: 6.0.15 + cssnano-utils: 4.0.2(postcss@8.4.38) + postcss: 8.4.38 + postcss-selector-parser: 6.0.16 dev: true - /postcss-minify-font-values@6.0.3(postcss@8.4.35): - resolution: {integrity: sha512-SmAeTA1We5rMnN3F8X9YBNo9bj9xB4KyDHnaNJnBfQIPi+60fNiR9OTRnIaMqkYzAQX0vObIw4Pn0vuKEOettg==} + /postcss-minify-font-values@6.1.0(postcss@8.4.38): + resolution: {integrity: sha512-gklfI/n+9rTh8nYaSJXlCo3nOKqMNkxuGpTn/Qm0gstL3ywTr9/WRKznE+oy6fvfolH6dF+QM4nCo8yPLdvGJg==} engines: {node: ^14 || ^16 || >=18.0} peerDependencies: postcss: ^8.4.31 dependencies: - postcss: 8.4.35 + postcss: 8.4.38 postcss-value-parser: 4.2.0 dev: true - /postcss-minify-gradients@6.0.3(postcss@8.4.35): + /postcss-minify-gradients@6.0.3(postcss@8.4.38): resolution: {integrity: sha512-4KXAHrYlzF0Rr7uc4VrfwDJ2ajrtNEpNEuLxFgwkhFZ56/7gaE4Nr49nLsQDZyUe+ds+kEhf+YAUolJiYXF8+Q==} engines: {node: ^14 || ^16 || >=18.0} peerDependencies: postcss: ^8.4.31 dependencies: colord: 2.9.3 - cssnano-utils: 4.0.2(postcss@8.4.35) - postcss: 8.4.35 + cssnano-utils: 4.0.2(postcss@8.4.38) + postcss: 8.4.38 postcss-value-parser: 4.2.0 dev: true - /postcss-minify-params@6.1.0(postcss@8.4.35): + /postcss-minify-params@6.1.0(postcss@8.4.38): resolution: {integrity: sha512-bmSKnDtyyE8ujHQK0RQJDIKhQ20Jq1LYiez54WiaOoBtcSuflfK3Nm596LvbtlFcpipMjgClQGyGr7GAs+H1uA==} engines: {node: ^14 || ^16 || >=18.0} peerDependencies: postcss: ^8.4.31 dependencies: browserslist: 4.23.0 - cssnano-utils: 4.0.2(postcss@8.4.35) - postcss: 8.4.35 + cssnano-utils: 4.0.2(postcss@8.4.38) + postcss: 8.4.38 postcss-value-parser: 4.2.0 dev: true - /postcss-minify-selectors@6.0.3(postcss@8.4.35): - resolution: {integrity: sha512-IcV7ZQJcaXyhx4UBpWZMsinGs2NmiUC60rJSkyvjPCPqhNjVGsrJUM+QhAtCaikZ0w0/AbZuH4wVvF/YMuMhvA==} + /postcss-minify-selectors@6.0.4(postcss@8.4.38): + resolution: {integrity: sha512-L8dZSwNLgK7pjTto9PzWRoMbnLq5vsZSTu8+j1P/2GB8qdtGQfn+K1uSvFgYvgh83cbyxT5m43ZZhUMTJDSClQ==} engines: {node: ^14 || ^16 || >=18.0} peerDependencies: postcss: ^8.4.31 dependencies: - postcss: 8.4.35 - postcss-selector-parser: 6.0.15 + postcss: 8.4.38 + postcss-selector-parser: 6.0.16 dev: true - /postcss-modules-extract-imports@3.0.0(postcss@8.4.35): - resolution: {integrity: sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==} + /postcss-modules-extract-imports@3.1.0(postcss@8.4.38): + resolution: {integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.35 + postcss: 8.4.38 dev: true - /postcss-modules-local-by-default@4.0.4(postcss@8.4.35): - resolution: {integrity: sha512-L4QzMnOdVwRm1Qb8m4x8jsZzKAaPAgrUF1r/hjDR2Xj7R+8Zsf97jAlSQzWtKx5YNiNGN8QxmPFIc/sh+RQl+Q==} + /postcss-modules-local-by-default@4.0.5(postcss@8.4.38): + resolution: {integrity: sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - icss-utils: 5.1.0(postcss@8.4.35) - postcss: 8.4.35 - postcss-selector-parser: 6.0.15 + icss-utils: 5.1.0(postcss@8.4.38) + postcss: 8.4.38 + postcss-selector-parser: 6.0.16 postcss-value-parser: 4.2.0 dev: true - /postcss-modules-scope@3.1.1(postcss@8.4.35): - resolution: {integrity: sha512-uZgqzdTleelWjzJY+Fhti6F3C9iF1JR/dODLs/JDefozYcKTBCdD8BIl6nNPbTbcLnGrk56hzwZC2DaGNvYjzA==} + /postcss-modules-scope@3.2.0(postcss@8.4.38): + resolution: {integrity: sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.35 - postcss-selector-parser: 6.0.15 + postcss: 8.4.38 + postcss-selector-parser: 6.0.16 dev: true - /postcss-modules-values@4.0.0(postcss@8.4.35): + /postcss-modules-values@4.0.0(postcss@8.4.38): resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - icss-utils: 5.1.0(postcss@8.4.35) - postcss: 8.4.35 + icss-utils: 5.1.0(postcss@8.4.38) + postcss: 8.4.38 dev: true - /postcss-nesting@12.1.0(postcss@8.4.35): - resolution: {integrity: sha512-QOYnosaZ+mlP6plQrAxFw09UUp2Sgtxj1BVHN+rSVbtV0Yx48zRt9/9F/ZOoxOKBBEsaJk2MYhhVRjeRRw5yuw==} + /postcss-nesting@12.1.1(postcss@8.4.38): + resolution: {integrity: sha512-qc74KvIAQNa5ujZKG1UV286dhaDW6basbUy2i9AzNU/T8C9hpvGu9NZzm1SfePe2yP7sPYgpA8d4sPVopn2Hhw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/selector-resolve-nested': 1.1.0(postcss-selector-parser@6.0.15) - '@csstools/selector-specificity': 3.0.2(postcss-selector-parser@6.0.15) - postcss: 8.4.35 - postcss-selector-parser: 6.0.15 + '@csstools/selector-resolve-nested': 1.1.0(postcss-selector-parser@6.0.16) + '@csstools/selector-specificity': 3.0.3(postcss-selector-parser@6.0.16) + postcss: 8.4.38 + postcss-selector-parser: 6.0.16 dev: true - /postcss-normalize-charset@6.0.2(postcss@8.4.35): + /postcss-normalize-charset@6.0.2(postcss@8.4.38): resolution: {integrity: sha512-a8N9czmdnrjPHa3DeFlwqst5eaL5W8jYu3EBbTTkI5FHkfMhFZh1EGbku6jhHhIzTA6tquI2P42NtZ59M/H/kQ==} engines: {node: ^14 || ^16 || >=18.0} peerDependencies: postcss: ^8.4.31 dependencies: - postcss: 8.4.35 + postcss: 8.4.38 dev: true - /postcss-normalize-display-values@6.0.2(postcss@8.4.35): + /postcss-normalize-display-values@6.0.2(postcss@8.4.38): resolution: {integrity: sha512-8H04Mxsb82ON/aAkPeq8kcBbAtI5Q2a64X/mnRRfPXBq7XeogoQvReqxEfc0B4WPq1KimjezNC8flUtC3Qz6jg==} engines: {node: ^14 || ^16 || >=18.0} peerDependencies: postcss: ^8.4.31 dependencies: - postcss: 8.4.35 + postcss: 8.4.38 postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-positions@6.0.2(postcss@8.4.35): + /postcss-normalize-positions@6.0.2(postcss@8.4.38): resolution: {integrity: sha512-/JFzI441OAB9O7VnLA+RtSNZvQ0NCFZDOtp6QPFo1iIyawyXg0YI3CYM9HBy1WvwCRHnPep/BvI1+dGPKoXx/Q==} engines: {node: ^14 || ^16 || >=18.0} peerDependencies: postcss: ^8.4.31 dependencies: - postcss: 8.4.35 + postcss: 8.4.38 postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-repeat-style@6.0.2(postcss@8.4.35): + /postcss-normalize-repeat-style@6.0.2(postcss@8.4.38): resolution: {integrity: sha512-YdCgsfHkJ2jEXwR4RR3Tm/iOxSfdRt7jplS6XRh9Js9PyCR/aka/FCb6TuHT2U8gQubbm/mPmF6L7FY9d79VwQ==} engines: {node: ^14 || ^16 || >=18.0} peerDependencies: postcss: ^8.4.31 dependencies: - postcss: 8.4.35 + postcss: 8.4.38 postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-string@6.0.2(postcss@8.4.35): + /postcss-normalize-string@6.0.2(postcss@8.4.38): resolution: {integrity: sha512-vQZIivlxlfqqMp4L9PZsFE4YUkWniziKjQWUtsxUiVsSSPelQydwS8Wwcuw0+83ZjPWNTl02oxlIvXsmmG+CiQ==} engines: {node: ^14 || ^16 || >=18.0} peerDependencies: postcss: ^8.4.31 dependencies: - postcss: 8.4.35 + postcss: 8.4.38 postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-timing-functions@6.0.2(postcss@8.4.35): + /postcss-normalize-timing-functions@6.0.2(postcss@8.4.38): resolution: {integrity: sha512-a+YrtMox4TBtId/AEwbA03VcJgtyW4dGBizPl7e88cTFULYsprgHWTbfyjSLyHeBcK/Q9JhXkt2ZXiwaVHoMzA==} engines: {node: ^14 || ^16 || >=18.0} peerDependencies: postcss: ^8.4.31 dependencies: - postcss: 8.4.35 + postcss: 8.4.38 postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-unicode@6.1.0(postcss@8.4.35): + /postcss-normalize-unicode@6.1.0(postcss@8.4.38): resolution: {integrity: sha512-QVC5TQHsVj33otj8/JD869Ndr5Xcc/+fwRh4HAsFsAeygQQXm+0PySrKbr/8tkDKzW+EVT3QkqZMfFrGiossDg==} engines: {node: ^14 || ^16 || >=18.0} peerDependencies: postcss: ^8.4.31 dependencies: browserslist: 4.23.0 - postcss: 8.4.35 + postcss: 8.4.38 postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-url@6.0.2(postcss@8.4.35): + /postcss-normalize-url@6.0.2(postcss@8.4.38): resolution: {integrity: sha512-kVNcWhCeKAzZ8B4pv/DnrU1wNh458zBNp8dh4y5hhxih5RZQ12QWMuQrDgPRw3LRl8mN9vOVfHl7uhvHYMoXsQ==} engines: {node: ^14 || ^16 || >=18.0} peerDependencies: postcss: ^8.4.31 dependencies: - postcss: 8.4.35 + postcss: 8.4.38 postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-whitespace@6.0.2(postcss@8.4.35): + /postcss-normalize-whitespace@6.0.2(postcss@8.4.38): resolution: {integrity: sha512-sXZ2Nj1icbJOKmdjXVT9pnyHQKiSAyuNQHSgRCUgThn2388Y9cGVDR+E9J9iAYbSbLHI+UUwLVl1Wzco/zgv0Q==} engines: {node: ^14 || ^16 || >=18.0} peerDependencies: postcss: ^8.4.31 dependencies: - postcss: 8.4.35 + postcss: 8.4.38 postcss-value-parser: 4.2.0 dev: true - /postcss-opacity-percentage@2.0.0(postcss@8.4.35): + /postcss-opacity-percentage@2.0.0(postcss@8.4.38): resolution: {integrity: sha512-lyDrCOtntq5Y1JZpBFzIWm2wG9kbEdujpNt4NLannF+J9c8CgFIzPa80YQfdza+Y+yFfzbYj/rfoOsYsooUWTQ==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.2 dependencies: - postcss: 8.4.35 + postcss: 8.4.38 dev: true - /postcss-ordered-values@6.0.2(postcss@8.4.35): + /postcss-ordered-values@6.0.2(postcss@8.4.38): resolution: {integrity: sha512-VRZSOB+JU32RsEAQrO94QPkClGPKJEL/Z9PCBImXMhIeK5KAYo6slP/hBYlLgrCjFxyqvn5VC81tycFEDBLG1Q==} engines: {node: ^14 || ^16 || >=18.0} peerDependencies: postcss: ^8.4.31 dependencies: - cssnano-utils: 4.0.2(postcss@8.4.35) - postcss: 8.4.35 + cssnano-utils: 4.0.2(postcss@8.4.38) + postcss: 8.4.38 postcss-value-parser: 4.2.0 dev: true - /postcss-overflow-shorthand@5.0.1(postcss@8.4.35): + /postcss-overflow-shorthand@5.0.1(postcss@8.4.38): resolution: {integrity: sha512-XzjBYKLd1t6vHsaokMV9URBt2EwC9a7nDhpQpjoPk2HRTSQfokPfyAS/Q7AOrzUu6q+vp/GnrDBGuj/FCaRqrQ==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.35 + postcss: 8.4.38 postcss-value-parser: 4.2.0 dev: true - /postcss-page-break@3.0.4(postcss@8.4.35): + /postcss-page-break@3.0.4(postcss@8.4.38): resolution: {integrity: sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==} peerDependencies: postcss: ^8 dependencies: - postcss: 8.4.35 + postcss: 8.4.38 dev: true - /postcss-place@9.0.1(postcss@8.4.35): + /postcss-place@9.0.1(postcss@8.4.38): resolution: {integrity: sha512-JfL+paQOgRQRMoYFc2f73pGuG/Aw3tt4vYMR6UA3cWVMxivviPTnMFnFTczUJOA4K2Zga6xgQVE+PcLs64WC8Q==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.35 + postcss: 8.4.38 postcss-value-parser: 4.2.0 dev: true - /postcss-preset-env@9.5.0(postcss@8.4.35): - resolution: {integrity: sha512-ZTrTWCSqKVYSABB1GerMBb6F8Uto5YWIq1nqi+TKOHPzrXMcyJNuJTc0v2lp5WjG4Sfvwdo7HF/7/3j7HskRog==} + /postcss-preset-env@9.5.4(postcss@8.4.38): + resolution: {integrity: sha512-o/jOlJjhm4f6rI5q1f+4Og3tz1cjaO50er9ndk7ZdcXHjWOH49kMAhqDC/nQifypQkOAiAmF46dPt3pZM+Cwbg==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/postcss-cascade-layers': 4.0.3(postcss@8.4.35) - '@csstools/postcss-color-function': 3.0.10(postcss@8.4.35) - '@csstools/postcss-color-mix-function': 2.0.10(postcss@8.4.35) - '@csstools/postcss-exponential-functions': 1.0.4(postcss@8.4.35) - '@csstools/postcss-font-format-keywords': 3.0.2(postcss@8.4.35) - '@csstools/postcss-gamut-mapping': 1.0.3(postcss@8.4.35) - '@csstools/postcss-gradients-interpolation-method': 4.0.11(postcss@8.4.35) - '@csstools/postcss-hwb-function': 3.0.9(postcss@8.4.35) - '@csstools/postcss-ic-unit': 3.0.4(postcss@8.4.35) - '@csstools/postcss-initial': 1.0.1(postcss@8.4.35) - '@csstools/postcss-is-pseudo-class': 4.0.5(postcss@8.4.35) - '@csstools/postcss-light-dark-function': 1.0.0(postcss@8.4.35) - '@csstools/postcss-logical-float-and-clear': 2.0.1(postcss@8.4.35) - '@csstools/postcss-logical-overflow': 1.0.1(postcss@8.4.35) - '@csstools/postcss-logical-overscroll-behavior': 1.0.1(postcss@8.4.35) - '@csstools/postcss-logical-resize': 2.0.1(postcss@8.4.35) - '@csstools/postcss-logical-viewport-units': 2.0.6(postcss@8.4.35) - '@csstools/postcss-media-minmax': 1.1.3(postcss@8.4.35) - '@csstools/postcss-media-queries-aspect-ratio-number-values': 2.0.6(postcss@8.4.35) - '@csstools/postcss-nested-calc': 3.0.2(postcss@8.4.35) - '@csstools/postcss-normalize-display-values': 3.0.2(postcss@8.4.35) - '@csstools/postcss-oklab-function': 3.0.10(postcss@8.4.35) - '@csstools/postcss-progressive-custom-properties': 3.1.0(postcss@8.4.35) - '@csstools/postcss-relative-color-syntax': 2.0.10(postcss@8.4.35) - '@csstools/postcss-scope-pseudo-class': 3.0.1(postcss@8.4.35) - '@csstools/postcss-stepped-value-functions': 3.0.5(postcss@8.4.35) - '@csstools/postcss-text-decoration-shorthand': 3.0.4(postcss@8.4.35) - '@csstools/postcss-trigonometric-functions': 3.0.5(postcss@8.4.35) - '@csstools/postcss-unset-value': 3.0.1(postcss@8.4.35) - autoprefixer: 10.4.18(postcss@8.4.35) + '@csstools/postcss-cascade-layers': 4.0.4(postcss@8.4.38) + '@csstools/postcss-color-function': 3.0.13(postcss@8.4.38) + '@csstools/postcss-color-mix-function': 2.0.13(postcss@8.4.38) + '@csstools/postcss-exponential-functions': 1.0.5(postcss@8.4.38) + '@csstools/postcss-font-format-keywords': 3.0.2(postcss@8.4.38) + '@csstools/postcss-gamut-mapping': 1.0.6(postcss@8.4.38) + '@csstools/postcss-gradients-interpolation-method': 4.0.14(postcss@8.4.38) + '@csstools/postcss-hwb-function': 3.0.12(postcss@8.4.38) + '@csstools/postcss-ic-unit': 3.0.6(postcss@8.4.38) + '@csstools/postcss-initial': 1.0.1(postcss@8.4.38) + '@csstools/postcss-is-pseudo-class': 4.0.6(postcss@8.4.38) + '@csstools/postcss-light-dark-function': 1.0.3(postcss@8.4.38) + '@csstools/postcss-logical-float-and-clear': 2.0.1(postcss@8.4.38) + '@csstools/postcss-logical-overflow': 1.0.1(postcss@8.4.38) + '@csstools/postcss-logical-overscroll-behavior': 1.0.1(postcss@8.4.38) + '@csstools/postcss-logical-resize': 2.0.1(postcss@8.4.38) + '@csstools/postcss-logical-viewport-units': 2.0.7(postcss@8.4.38) + '@csstools/postcss-media-minmax': 1.1.4(postcss@8.4.38) + '@csstools/postcss-media-queries-aspect-ratio-number-values': 2.0.7(postcss@8.4.38) + '@csstools/postcss-nested-calc': 3.0.2(postcss@8.4.38) + '@csstools/postcss-normalize-display-values': 3.0.2(postcss@8.4.38) + '@csstools/postcss-oklab-function': 3.0.13(postcss@8.4.38) + '@csstools/postcss-progressive-custom-properties': 3.2.0(postcss@8.4.38) + '@csstools/postcss-relative-color-syntax': 2.0.13(postcss@8.4.38) + '@csstools/postcss-scope-pseudo-class': 3.0.1(postcss@8.4.38) + '@csstools/postcss-stepped-value-functions': 3.0.6(postcss@8.4.38) + '@csstools/postcss-text-decoration-shorthand': 3.0.5(postcss@8.4.38) + '@csstools/postcss-trigonometric-functions': 3.0.6(postcss@8.4.38) + '@csstools/postcss-unset-value': 3.0.1(postcss@8.4.38) + autoprefixer: 10.4.19(postcss@8.4.38) browserslist: 4.23.0 - css-blank-pseudo: 6.0.1(postcss@8.4.35) - css-has-pseudo: 6.0.2(postcss@8.4.35) - css-prefers-color-scheme: 9.0.1(postcss@8.4.35) - cssdb: 7.11.2 - postcss: 8.4.35 - postcss-attribute-case-insensitive: 6.0.3(postcss@8.4.35) - postcss-clamp: 4.1.0(postcss@8.4.35) - postcss-color-functional-notation: 6.0.5(postcss@8.4.35) - postcss-color-hex-alpha: 9.0.4(postcss@8.4.35) - postcss-color-rebeccapurple: 9.0.3(postcss@8.4.35) - postcss-custom-media: 10.0.3(postcss@8.4.35) - postcss-custom-properties: 13.3.5(postcss@8.4.35) - postcss-custom-selectors: 7.1.7(postcss@8.4.35) - postcss-dir-pseudo-class: 8.0.1(postcss@8.4.35) - postcss-double-position-gradients: 5.0.4(postcss@8.4.35) - postcss-focus-visible: 9.0.1(postcss@8.4.35) - postcss-focus-within: 8.0.1(postcss@8.4.35) - postcss-font-variant: 5.0.0(postcss@8.4.35) - postcss-gap-properties: 5.0.1(postcss@8.4.35) - postcss-image-set-function: 6.0.3(postcss@8.4.35) - postcss-lab-function: 6.0.10(postcss@8.4.35) - postcss-logical: 7.0.1(postcss@8.4.35) - postcss-nesting: 12.1.0(postcss@8.4.35) - postcss-opacity-percentage: 2.0.0(postcss@8.4.35) - postcss-overflow-shorthand: 5.0.1(postcss@8.4.35) - postcss-page-break: 3.0.4(postcss@8.4.35) - postcss-place: 9.0.1(postcss@8.4.35) - postcss-pseudo-class-any-link: 9.0.1(postcss@8.4.35) - postcss-replace-overflow-wrap: 4.0.0(postcss@8.4.35) - postcss-selector-not: 7.0.2(postcss@8.4.35) + css-blank-pseudo: 6.0.1(postcss@8.4.38) + css-has-pseudo: 6.0.3(postcss@8.4.38) + css-prefers-color-scheme: 9.0.1(postcss@8.4.38) + cssdb: 8.0.0 + postcss: 8.4.38 + postcss-attribute-case-insensitive: 6.0.3(postcss@8.4.38) + postcss-clamp: 4.1.0(postcss@8.4.38) + postcss-color-functional-notation: 6.0.8(postcss@8.4.38) + postcss-color-hex-alpha: 9.0.4(postcss@8.4.38) + postcss-color-rebeccapurple: 9.0.3(postcss@8.4.38) + postcss-custom-media: 10.0.4(postcss@8.4.38) + postcss-custom-properties: 13.3.6(postcss@8.4.38) + postcss-custom-selectors: 7.1.8(postcss@8.4.38) + postcss-dir-pseudo-class: 8.0.1(postcss@8.4.38) + postcss-double-position-gradients: 5.0.6(postcss@8.4.38) + postcss-focus-visible: 9.0.1(postcss@8.4.38) + postcss-focus-within: 8.0.1(postcss@8.4.38) + postcss-font-variant: 5.0.0(postcss@8.4.38) + postcss-gap-properties: 5.0.1(postcss@8.4.38) + postcss-image-set-function: 6.0.3(postcss@8.4.38) + postcss-lab-function: 6.0.13(postcss@8.4.38) + postcss-logical: 7.0.1(postcss@8.4.38) + postcss-nesting: 12.1.1(postcss@8.4.38) + postcss-opacity-percentage: 2.0.0(postcss@8.4.38) + postcss-overflow-shorthand: 5.0.1(postcss@8.4.38) + postcss-page-break: 3.0.4(postcss@8.4.38) + postcss-place: 9.0.1(postcss@8.4.38) + postcss-pseudo-class-any-link: 9.0.1(postcss@8.4.38) + postcss-replace-overflow-wrap: 4.0.0(postcss@8.4.38) + postcss-selector-not: 7.0.2(postcss@8.4.38) dev: true - /postcss-pseudo-class-any-link@9.0.1(postcss@8.4.35): + /postcss-pseudo-class-any-link@9.0.1(postcss@8.4.38): resolution: {integrity: sha512-cKYGGZ9yzUZi+dZd7XT2M8iSDfo+T2Ctbpiizf89uBTBfIpZpjvTavzIJXpCReMVXSKROqzpxClNu6fz4DHM0Q==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.35 - postcss-selector-parser: 6.0.15 + postcss: 8.4.38 + postcss-selector-parser: 6.0.16 dev: true - /postcss-reduce-initial@6.1.0(postcss@8.4.35): + /postcss-reduce-initial@6.1.0(postcss@8.4.38): resolution: {integrity: sha512-RarLgBK/CrL1qZags04oKbVbrrVK2wcxhvta3GCxrZO4zveibqbRPmm2VI8sSgCXwoUHEliRSbOfpR0b/VIoiw==} engines: {node: ^14 || ^16 || >=18.0} peerDependencies: @@ -13742,64 +13734,64 @@ packages: dependencies: browserslist: 4.23.0 caniuse-api: 3.0.0 - postcss: 8.4.35 + postcss: 8.4.38 dev: true - /postcss-reduce-transforms@6.0.2(postcss@8.4.35): + /postcss-reduce-transforms@6.0.2(postcss@8.4.38): resolution: {integrity: sha512-sB+Ya++3Xj1WaT9+5LOOdirAxP7dJZms3GRcYheSPi1PiTMigsxHAdkrbItHxwYHr4kt1zL7mmcHstgMYT+aiA==} engines: {node: ^14 || ^16 || >=18.0} peerDependencies: postcss: ^8.4.31 dependencies: - postcss: 8.4.35 + postcss: 8.4.38 postcss-value-parser: 4.2.0 dev: true - /postcss-replace-overflow-wrap@4.0.0(postcss@8.4.35): + /postcss-replace-overflow-wrap@4.0.0(postcss@8.4.38): resolution: {integrity: sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==} peerDependencies: postcss: ^8.0.3 dependencies: - postcss: 8.4.35 + postcss: 8.4.38 dev: true - /postcss-selector-not@7.0.2(postcss@8.4.35): + /postcss-selector-not@7.0.2(postcss@8.4.38): resolution: {integrity: sha512-/SSxf/90Obye49VZIfc0ls4H0P6i6V1iHv0pzZH8SdgvZOPFkF37ef1r5cyWcMflJSFJ5bfuoluTnFnBBFiuSA==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.35 - postcss-selector-parser: 6.0.15 + postcss: 8.4.38 + postcss-selector-parser: 6.0.16 dev: true - /postcss-selector-parser@6.0.15: - resolution: {integrity: sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==} + /postcss-selector-parser@6.0.16: + resolution: {integrity: sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==} engines: {node: '>=4'} dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 dev: true - /postcss-svgo@6.0.3(postcss@8.4.35): + /postcss-svgo@6.0.3(postcss@8.4.38): resolution: {integrity: sha512-dlrahRmxP22bX6iKEjOM+c8/1p+81asjKT+V5lrgOH944ryx/OHpclnIbGsKVd3uWOXFLYJwCVf0eEkJGvO96g==} engines: {node: ^14 || ^16 || >= 18} peerDependencies: postcss: ^8.4.31 dependencies: - postcss: 8.4.35 + postcss: 8.4.38 postcss-value-parser: 4.2.0 svgo: 3.2.0 dev: true - /postcss-unique-selectors@6.0.3(postcss@8.4.35): - resolution: {integrity: sha512-NFXbYr8qdmCr/AFceaEfdcsKGCvWTeGO6QVC9h2GvtWgj0/0dklKQcaMMVzs6tr8bY+ase8hOtHW8OBTTRvS8A==} + /postcss-unique-selectors@6.0.4(postcss@8.4.38): + resolution: {integrity: sha512-K38OCaIrO8+PzpArzkLKB42dSARtC2tmG6PvD4b1o1Q2E9Os8jzfWFfSy/rixsHwohtsDdFtAWGjFVFUdwYaMg==} engines: {node: ^14 || ^16 || >=18.0} peerDependencies: postcss: ^8.4.31 dependencies: - postcss: 8.4.35 - postcss-selector-parser: 6.0.15 + postcss: 8.4.38 + postcss-selector-parser: 6.0.16 dev: true /postcss-value-parser@4.2.0: @@ -13812,15 +13804,15 @@ packages: dependencies: nanoid: 3.3.7 picocolors: 1.0.0 - source-map-js: 1.0.2 + source-map-js: 1.2.0 - /postcss@8.4.35: - resolution: {integrity: sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==} + /postcss@8.4.38: + resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} engines: {node: ^10 || ^12 || >=14} dependencies: nanoid: 3.3.7 picocolors: 1.0.0 - source-map-js: 1.0.2 + source-map-js: 1.2.0 dev: true /postgres-array@2.0.0: @@ -13867,13 +13859,13 @@ packages: engines: {node: '>=10'} hasBin: true dependencies: - detect-libc: 2.0.2 + detect-libc: 2.0.3 expand-template: 2.0.3 github-from-package: 0.0.0 minimist: 1.2.8 mkdirp-classic: 0.5.3 napi-build-utils: 1.0.2 - node-abi: 3.56.0 + node-abi: 3.57.0 pump: 3.0.0 rc: 1.2.8 simple-get: 4.0.1 @@ -14006,21 +13998,21 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - /pure-rand@6.0.4: - resolution: {integrity: sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==} + /pure-rand@6.1.0: + resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} /qs@6.11.0: resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} engines: {node: '>=0.6'} dependencies: - side-channel: 1.0.5 + side-channel: 1.0.6 dev: false /qs@6.11.2: resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} engines: {node: '>=0.6'} dependencies: - side-channel: 1.0.5 + side-channel: 1.0.6 /querystringify@2.2.0: resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} @@ -14031,7 +14023,6 @@ packages: /queue-tick@1.0.1: resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} - requiresBuild: true dev: true /quick-format-unescaped@4.0.4: @@ -14052,8 +14043,8 @@ packages: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} - /raw-body@2.5.1: - resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} + /raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} engines: {node: '>= 0.8'} dependencies: bytes: 3.1.2 @@ -14091,7 +14082,7 @@ packages: react: ^18.2.0 react-dom: ^18.2.0 dependencies: - '@floating-ui/react': 0.26.9(react-dom@18.2.0)(react@18.2.0) + '@floating-ui/react': 0.26.11(react-dom@18.2.0)(react@18.2.0) classnames: 2.5.1 date-fns: 3.3.1 prop-types: 15.8.1 @@ -14131,7 +14122,7 @@ packages: peerDependencies: react: ^18.2.0 dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.4 react: 18.2.0 dev: false @@ -14140,7 +14131,7 @@ packages: peerDependencies: react: ^18.2.0 dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.4 react: 18.2.0 dev: false @@ -14197,7 +14188,7 @@ packages: react: ^18.2.0 react-dom: ^18.2.0 dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.4 '@emotion/cache': 11.11.0 '@emotion/react': 11.11.4(@types/react@18.2.74)(react@18.2.0) '@floating-ui/dom': 1.6.3 @@ -14240,7 +14231,7 @@ packages: react: ^18.2.0 react-dom: ^18.2.0 dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.4 dom-helpers: 5.2.1 loose-envify: 1.4.0 prop-types: 15.8.1 @@ -14260,7 +14251,7 @@ packages: dependencies: find-up: 6.3.0 read-pkg: 8.1.0 - type-fest: 4.10.3 + type-fest: 4.15.0 dev: true /read-pkg@8.1.0: @@ -14270,7 +14261,7 @@ packages: '@types/normalize-package-data': 2.4.4 normalize-package-data: 6.0.0 parse-json: 7.1.1 - type-fest: 4.10.3 + type-fest: 4.15.0 dev: true /read-stream@2.1.1: @@ -14364,13 +14355,13 @@ packages: '@eslint-community/regexpp': 4.10.0 dev: false - /reflect.getprototypeof@1.0.5: - resolution: {integrity: sha512-62wgfC8dJWrmxv44CA36pLDnP6KKl3Vhxb7PL+8+qrrFMMoJij4vgiMP8zV4O8+CBMXY1mHxI5fITGHXFHVmQQ==} + /reflect.getprototypeof@1.0.6: + resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.3 es-errors: 1.3.0 get-intrinsic: 1.2.4 globalthis: 1.0.3 @@ -14538,8 +14529,8 @@ packages: dependencies: queue-microtask: 1.2.3 - /safe-array-concat@1.1.0: - resolution: {integrity: sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==} + /safe-array-concat@1.1.2: + resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} engines: {node: '>=0.4'} dependencies: call-bind: 1.0.7 @@ -14575,7 +14566,7 @@ packages: truncate-utf8-bytes: 1.0.2 dev: false - /sass-loader@14.1.1(sass@1.71.1)(webpack@5.90.3): + /sass-loader@14.1.1(sass@1.74.1)(webpack@5.91.0): resolution: {integrity: sha512-QX8AasDg75monlybel38BZ49JP5Z+uSKfKwF2rO7S74BywaRmGQMUBw9dtkS+ekyM/QnP+NOrRYq8ABMZ9G8jw==} engines: {node: '>= 18.12.0'} peerDependencies: @@ -14597,18 +14588,18 @@ packages: optional: true dependencies: neo-async: 2.6.2 - sass: 1.71.1 - webpack: 5.90.3(@swc/core@1.4.2)(esbuild@0.19.12)(webpack-cli@5.1.4) + sass: 1.74.1 + webpack: 5.91.0(@swc/core@1.4.13)(esbuild@0.19.12)(webpack-cli@5.1.4) dev: true - /sass@1.71.1: - resolution: {integrity: sha512-wovtnV2PxzteLlfNzbgm1tFXPLoZILYAMJtvoXXkD7/+1uP41eKkIt1ypWq5/q2uT94qHjXehEYfmjKOvjL9sg==} + /sass@1.74.1: + resolution: {integrity: sha512-w0Z9p/rWZWelb88ISOLyvqTWGmtmu2QJICqDBGyNnfG4OUnPX9BBjjYIXUpXCMOOg5MQWNpqzt876la1fsTvUA==} engines: {node: '>=14.0.0'} hasBin: true dependencies: chokidar: 3.6.0 immutable: 4.3.5 - source-map-js: 1.0.2 + source-map-js: 1.2.0 /sax@1.3.0: resolution: {integrity: sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==} @@ -14732,8 +14723,8 @@ packages: transitivePeerDependencies: - supports-color - /set-function-length@1.2.1: - resolution: {integrity: sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==} + /set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} dependencies: define-data-property: 1.1.4 @@ -14768,7 +14759,7 @@ packages: requiresBuild: true dependencies: color: 4.2.3 - detect-libc: 2.0.2 + detect-libc: 2.0.3 node-addon-api: 6.1.0 prebuild-install: 7.1.2 semver: 7.6.0 @@ -14809,8 +14800,8 @@ packages: rechoir: 0.6.2 dev: true - /side-channel@1.0.5: - resolution: {integrity: sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ==} + /side-channel@1.0.6: + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 @@ -14871,7 +14862,7 @@ packages: resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==} engines: {node: '>= 10'} dependencies: - '@polka/url': 1.0.0-next.24 + '@polka/url': 1.0.0-next.25 mrmime: 2.0.0 totalist: 3.0.1 dev: true @@ -14910,7 +14901,7 @@ packages: dependencies: '@juggle/resize-observer': 3.4.0 '@types/is-hotkey': 0.1.10 - '@types/lodash': 4.14.202 + '@types/lodash': 4.17.0 direction: 1.0.4 is-hotkey: 0.1.8 is-plain-object: 5.0.0 @@ -14948,8 +14939,8 @@ packages: ip-address: 9.0.5 smart-buffer: 4.2.0 - /sonic-boom@3.8.0: - resolution: {integrity: sha512-ybz6OYOUjoQQCQ/i4LU8kaToD8ACtYP+Cj5qd2AO36bwbdewxWJ3ArmJ2cr6AvxlL2o0PqnCcPGUgkILbfkaCA==} + /sonic-boom@3.8.1: + resolution: {integrity: sha512-y4Z8LCDBuum+PBP3lSV7RHrXscqksve/bi0as7mhwVnBW+/wUqKT/2Kb7um8yqcFy0duYbbPxzt89Zy2nOCaxg==} dependencies: atomic-sleep: 1.0.0 @@ -14971,8 +14962,8 @@ packages: resolution: {integrity: sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==} dev: true - /source-map-js@1.0.2: - resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + /source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} engines: {node: '>=0.10.0'} /source-map-support@0.5.13: @@ -15093,7 +15084,7 @@ packages: fast-fifo: 1.3.2 queue-tick: 1.0.1 optionalDependencies: - bare-events: 2.2.0 + bare-events: 2.2.2 dev: true /string-argv@0.3.2: @@ -15124,41 +15115,47 @@ packages: emoji-regex: 9.2.2 strip-ansi: 7.1.0 - /string.prototype.matchall@4.0.10: - resolution: {integrity: sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==} - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.22.5 - get-intrinsic: 1.2.4 - has-symbols: 1.0.3 - internal-slot: 1.0.7 - regexp.prototype.flags: 1.5.2 - set-function-name: 2.0.2 - side-channel: 1.0.5 - dev: false - - /string.prototype.trim@1.2.8: - resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==} + /string.prototype.matchall@4.0.11: + resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + get-intrinsic: 1.2.4 + gopd: 1.0.1 + has-symbols: 1.0.3 + internal-slot: 1.0.7 + regexp.prototype.flags: 1.5.2 + set-function-name: 2.0.2 + side-channel: 1.0.6 + dev: false - /string.prototype.trimend@1.0.7: - resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==} + /string.prototype.trim@1.2.9: + resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 - /string.prototype.trimstart@1.0.7: - resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} + /string.prototype.trimend@1.0.8: + resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-object-atoms: 1.0.0 + + /string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 /string_decoder@0.10.31: resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} @@ -15236,7 +15233,6 @@ packages: /strnum@1.0.5: resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} - requiresBuild: true /strtok3@6.3.0: resolution: {integrity: sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw==} @@ -15258,7 +15254,7 @@ packages: resolution: {integrity: sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==} dev: true - /styled-jsx@5.1.1(@babel/core@7.24.0)(react@18.2.0): + /styled-jsx@5.1.1(@babel/core@7.24.4)(react@18.2.0): resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} engines: {node: '>= 12.0.0'} peerDependencies: @@ -15271,19 +15267,19 @@ packages: babel-plugin-macros: optional: true dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.4 client-only: 0.0.1 react: 18.2.0 - /stylehacks@6.1.0(postcss@8.4.35): - resolution: {integrity: sha512-ETErsPFgwlfYZ/CSjMO2Ddf+TsnkCVPBPaoB99Ro8WMAxf7cglzmFsRBhRmKObFjibtcvlNxFFPHuyr3sNlNUQ==} + /stylehacks@6.1.1(postcss@8.4.38): + resolution: {integrity: sha512-gSTTEQ670cJNoaeIp9KX6lZmm8LJ3jPB5yJmX8Zq/wQxOsAFXV3qjWzHas3YYk1qesuVIyYWWUpZ0vSE/dTSGg==} engines: {node: ^14 || ^16 || >=18.0} peerDependencies: postcss: ^8.4.31 dependencies: browserslist: 4.23.0 - postcss: 8.4.35 - postcss-selector-parser: 6.0.15 + postcss: 8.4.38 + postcss-selector-parser: 6.0.16 dev: true /stylis@4.2.0: @@ -15340,15 +15336,15 @@ packages: picocolors: 1.0.0 dev: true - /swc-loader@0.2.6(@swc/core@1.4.2)(webpack@5.90.3): + /swc-loader@0.2.6(@swc/core@1.4.13)(webpack@5.91.0): resolution: {integrity: sha512-9Zi9UP2YmDpgmQVbyOPJClY0dwf58JDyDMQ7uRc4krmc72twNI2fvlBWHLqVekBpPc7h5NJkGVT1zNDxFrqhvg==} peerDependencies: '@swc/core': ^1.2.147 webpack: '>=2' dependencies: - '@swc/core': 1.4.2 + '@swc/core': 1.4.13 '@swc/counter': 0.1.3 - webpack: 5.90.3(@swc/core@1.4.2)(esbuild@0.19.12)(webpack-cli@5.1.4) + webpack: 5.91.0(@swc/core@1.4.13)(esbuild@0.19.12)(webpack-cli@5.1.4) dev: true /swc-plugin-transform-remove-imports@1.12.1: @@ -15387,8 +15383,8 @@ packages: pump: 3.0.0 tar-stream: 3.1.7 optionalDependencies: - bare-fs: 2.2.1 - bare-path: 2.1.0 + bare-fs: 2.2.3 + bare-path: 2.1.1 dev: true /tar-stream@2.2.0: @@ -15456,7 +15452,7 @@ packages: supports-hyperlinks: 2.3.0 dev: false - /terser-webpack-plugin@5.3.10(@swc/core@1.4.2)(esbuild@0.19.12)(webpack@5.90.3): + /terser-webpack-plugin@5.3.10(@swc/core@1.4.13)(esbuild@0.19.12)(webpack@5.91.0): resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -15472,22 +15468,22 @@ packages: uglify-js: optional: true dependencies: - '@jridgewell/trace-mapping': 0.3.23 - '@swc/core': 1.4.2 + '@jridgewell/trace-mapping': 0.3.25 + '@swc/core': 1.4.13 esbuild: 0.19.12 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.2 - terser: 5.28.1 - webpack: 5.90.3(@swc/core@1.4.2)(esbuild@0.19.12)(webpack-cli@5.1.4) + terser: 5.30.3 + webpack: 5.91.0(@swc/core@1.4.13)(esbuild@0.19.12)(webpack-cli@5.1.4) dev: true - /terser@5.28.1: - resolution: {integrity: sha512-wM+bZp54v/E9eRRGXb5ZFDvinrJIOaTapx3WUokyVGZu5ucVCK55zEgGd5Dl2fSr3jUo5sDiERErUWLY6QPFyA==} + /terser@5.30.3: + resolution: {integrity: sha512-STdUgOUx8rLbMGO9IOwHLpCqolkDITFFQSMYYwKE1N2lY6MVSaeoi10z/EhWxRc6ybqoVmKSkhKYH/XUpl7vSA==} engines: {node: '>=10'} hasBin: true dependencies: - '@jridgewell/source-map': 0.3.5 + '@jridgewell/source-map': 0.3.6 acorn: 8.11.3 commander: 2.20.3 source-map-support: 0.5.21 @@ -15644,8 +15640,8 @@ packages: utf8-byte-length: 1.0.4 dev: false - /ts-api-utils@1.2.1(typescript@5.4.4): - resolution: {integrity: sha512-RIYA36cJn2WiH9Hy77hdF9r7oEwxAtB/TS9/S4Qd90Ap4z5FSiin5zEiTL44OII1Y3IIlEvxwxFUVgrHSZ/UpA==} + /ts-api-utils@1.3.0(typescript@5.4.4): + resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} engines: {node: '>=16'} peerDependencies: typescript: 5.4.4 @@ -15660,7 +15656,7 @@ packages: dependencies: typescript: 5.4.4 - /ts-jest@29.1.2(@babel/core@7.24.0)(esbuild@0.19.12)(jest@29.7.0)(typescript@5.4.4): + /ts-jest@29.1.2(@babel/core@7.24.4)(esbuild@0.19.12)(jest@29.7.0)(typescript@5.4.4): resolution: {integrity: sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g==} engines: {node: ^16.10.0 || ^18.0.0 || >=20.0.0} hasBin: true @@ -15681,7 +15677,7 @@ packages: esbuild: optional: true dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.4 bs-logger: 0.2.6 esbuild: 0.19.12 fast-json-stable-stringify: 2.1.0 @@ -15695,7 +15691,7 @@ packages: yargs-parser: 21.1.1 dev: true - /ts-node@10.9.1(@swc/core@1.4.2)(@types/node@20.12.5)(typescript@5.4.4): + /ts-node@10.9.1(@swc/core@1.4.13)(@types/node@20.12.5)(typescript@5.4.4): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -15710,8 +15706,8 @@ packages: optional: true dependencies: '@cspotcode/source-map-support': 0.8.1 - '@swc/core': 1.4.2 - '@tsconfig/node10': 1.0.9 + '@swc/core': 1.4.13 + '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 @@ -15728,7 +15724,6 @@ packages: /tslib@1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - requiresBuild: true /tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} @@ -15743,13 +15738,13 @@ packages: typescript: 5.4.4 dev: false - /tsx@4.7.1: - resolution: {integrity: sha512-8d6VuibXHtlN5E3zFkgY8u4DX7Y3Z27zvvPKVmLon/D4AjuKzarkUBTLDBgj9iTQ0hg5xM7c/mYiRVM+HETf0g==} + /tsx@4.7.2: + resolution: {integrity: sha512-BCNd4kz6fz12fyrgCTEdZHGJ9fWTGeUzXmQysh0RVocDY3h4frk05ZNCXSy4kIenF7y/QnrdiVpTsyNRn6vlAw==} engines: {node: '>=18.0.0'} hasBin: true dependencies: esbuild: 0.19.12 - get-tsconfig: 4.7.2 + get-tsconfig: 4.7.3 optionalDependencies: fsevents: 2.3.3 dev: true @@ -15863,8 +15858,8 @@ packages: engines: {node: '>=14.16'} dev: true - /type-fest@4.10.3: - resolution: {integrity: sha512-JLXyjizi072smKGGcZiAJDCNweT8J+AuRxmPZ1aG7TERg4ijx9REl8CNhbr36RV4qXqL1gO1FF9HL8OkVmmrsA==} + /type-fest@4.15.0: + resolution: {integrity: sha512-tB9lu0pQpX5KJq54g+oHOLumOx+pMep4RaM6liXh2PKmVRFF+/vAtUP0ZaJ0kOySfVNjF6doBWPHhBhISKdlIA==} engines: {node: '>=16'} dev: true @@ -15875,9 +15870,6 @@ packages: media-typer: 0.3.0 mime-types: 2.1.35 - /type@1.2.0: - resolution: {integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==} - /type@2.7.2: resolution: {integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==} @@ -15910,8 +15902,8 @@ packages: has-proto: 1.0.3 is-typed-array: 1.1.13 - /typed-array-length@1.0.5: - resolution: {integrity: sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==} + /typed-array-length@1.0.6: + resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 @@ -16061,7 +16053,7 @@ packages: /uuid@8.3.2: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} hasBin: true - requiresBuild: true + dev: true /uuid@9.0.0: resolution: {integrity: sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==} @@ -16079,7 +16071,7 @@ packages: resolution: {integrity: sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==} engines: {node: '>=10.12.0'} dependencies: - '@jridgewell/trace-mapping': 0.3.23 + '@jridgewell/trace-mapping': 0.3.25 '@types/istanbul-lib-coverage': 2.0.6 convert-source-map: 2.0.0 @@ -16113,8 +16105,8 @@ packages: loose-envify: 1.4.0 dev: true - /watchpack@2.4.0: - resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} + /watchpack@2.4.1: + resolution: {integrity: sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==} engines: {node: '>=10.13.0'} dependencies: glob-to-regexp: 0.4.1 @@ -16155,7 +16147,7 @@ packages: - utf-8-validate dev: true - /webpack-cli@5.1.4(webpack@5.90.3): + /webpack-cli@5.1.4(webpack@5.91.0): resolution: {integrity: sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==} engines: {node: '>=14.15.0'} hasBin: true @@ -16173,18 +16165,18 @@ packages: optional: true dependencies: '@discoveryjs/json-ext': 0.5.7 - '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4)(webpack@5.90.3) - '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4)(webpack@5.90.3) - '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4)(webpack@5.90.3) + '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4)(webpack@5.91.0) + '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4)(webpack@5.91.0) + '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4)(webpack@5.91.0) colorette: 2.0.20 commander: 10.0.1 cross-spawn: 7.0.3 - envinfo: 7.11.1 + envinfo: 7.12.0 fastest-levenshtein: 1.0.16 import-local: 3.1.0 interpret: 3.1.1 rechoir: 0.8.0 - webpack: 5.90.3(@swc/core@1.4.2)(esbuild@0.19.12)(webpack-cli@5.1.4) + webpack: 5.91.0(@swc/core@1.4.13)(esbuild@0.19.12)(webpack-cli@5.1.4) webpack-merge: 5.10.0 dev: true @@ -16209,8 +16201,8 @@ packages: engines: {node: '>=10.13.0'} dev: true - /webpack@5.90.3(@swc/core@1.4.2)(esbuild@0.19.12)(webpack-cli@5.1.4): - resolution: {integrity: sha512-h6uDYlWCctQRuXBs1oYpVe6sFcWedl0dpcVaTf/YF67J9bKvwJajFulMVSYKHrksMB3I/pIagRzDxwxkebuzKA==} + /webpack@5.91.0(@swc/core@1.4.13)(esbuild@0.19.12)(webpack-cli@5.1.4): + resolution: {integrity: sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: @@ -16221,15 +16213,15 @@ packages: dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.5 - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/wasm-edit': 1.11.6 - '@webassemblyjs/wasm-parser': 1.11.6 + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/wasm-edit': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 acorn: 8.11.3 acorn-import-assertions: 1.9.0(acorn@8.11.3) browserslist: 4.23.0 chrome-trace-event: 1.0.3 - enhanced-resolve: 5.15.1 - es-module-lexer: 1.4.1 + enhanced-resolve: 5.16.0 + es-module-lexer: 1.5.0 eslint-scope: 5.1.1 events: 3.3.0 glob-to-regexp: 0.4.1 @@ -16240,9 +16232,9 @@ packages: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(@swc/core@1.4.2)(esbuild@0.19.12)(webpack@5.90.3) - watchpack: 2.4.0 - webpack-cli: 5.1.4(webpack@5.90.3) + terser-webpack-plugin: 5.3.10(@swc/core@1.4.13)(esbuild@0.19.12)(webpack@5.91.0) + watchpack: 2.4.1 + webpack-cli: 5.1.4(webpack@5.91.0) webpack-sources: 3.2.3 transitivePeerDependencies: - '@swc/core' @@ -16298,20 +16290,21 @@ packages: is-weakref: 1.0.2 isarray: 2.0.5 which-boxed-primitive: 1.0.2 - which-collection: 1.0.1 - which-typed-array: 1.1.14 + which-collection: 1.0.2 + which-typed-array: 1.1.15 dev: false - /which-collection@1.0.1: - resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} + /which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} dependencies: - is-map: 2.0.2 - is-set: 2.0.2 - is-weakmap: 2.0.1 - is-weakset: 2.0.2 + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.3 - /which-typed-array@1.1.14: - resolution: {integrity: sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==} + /which-typed-array@1.1.15: + resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} engines: {node: '>= 0.4'} dependencies: available-typed-arrays: 1.0.7 @@ -16413,8 +16406,8 @@ packages: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} dev: true - /xss@1.0.14: - resolution: {integrity: sha512-og7TEJhXvn1a7kzZGQ7ETjdQVS2UfZyTlsEdDOqvQF7GoxNfY+0YLCzBy1kPdsDDx4QuNAonQPddpsn6Xl/7sw==} + /xss@1.0.15: + resolution: {integrity: sha512-FVdlVVC67WOIPvfOwhoMETV72f6GbW7aOabBC3WxN/oUdoEMDyLz4OgRv5/gck2ZeNqEQu+Tb0kloovXOfpYVg==} engines: {node: '>= 0.10.0'} hasBin: true dependencies: @@ -16491,11 +16484,11 @@ packages: fd-slicer: 1.1.0 dev: true - /yjs@13.6.12: - resolution: {integrity: sha512-KOT8ILoyVH2f/PxPadeu5kVVS055D1r3x1iFfJVJzFdnN98pVGM8H07NcKsO+fG3F7/0tf30Vnokf5YIqhU/iw==} + /yjs@13.6.14: + resolution: {integrity: sha512-D+7KcUr0j+vBCUSKXXEWfA+bG4UQBviAwP3gYBhkstkgwy5+8diOPMx0iqLIOxNo/HxaREUimZRxqHGAHCL2BQ==} engines: {node: '>=16.0.0', npm: '>=8.0.0'} dependencies: - lib0: 0.2.90 + lib0: 0.2.93 dev: false /yn@3.1.1: From e73e610669591285d6bc68640e976b6142e4d02d Mon Sep 17 00:00:00 2001 From: Alessio Gravili Date: Tue, 9 Apr 2024 12:22:42 -0400 Subject: [PATCH 031/177] chore: fields test suite: clearAndSeedEverything instead of seed for dev as well, to ensure same state as test runs (most importantly, this gets rid of leftover uploads) --- test/fields/config.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/fields/config.ts b/test/fields/config.ts index 96e765092a..db0fa8f645 100644 --- a/test/fields/config.ts +++ b/test/fields/config.ts @@ -26,7 +26,7 @@ import Uploads from './collections/Upload/index.js' import Uploads2 from './collections/Upload2/index.js' import Uploads3 from './collections/Uploads3/index.js' import TabsWithRichText from './globals/TabsWithRichText.js' -import { seed } from './seed.js' +import { clearAndSeedEverything } from './seed.js' export const collectionSlugs: CollectionConfig[] = [ LexicalFields, @@ -79,7 +79,7 @@ export default buildConfigWithDefaults({ }, onInit: async (payload) => { if (process.env.SEED_IN_CONFIG_ONINIT !== 'false') { - await seed(payload) + await clearAndSeedEverything(payload) } }, }) From 607ff1703382a328ff793305ed0b39080b6e6503 Mon Sep 17 00:00:00 2001 From: Alessio Gravili Date: Tue, 9 Apr 2024 12:24:30 -0400 Subject: [PATCH 032/177] fix(richtext-lexical): upload nodes weren't visible due to incorrect relationships condition --- .../relationship/utils/EnabledRelationshipsCondition.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/richtext-lexical/src/field/features/relationship/utils/EnabledRelationshipsCondition.tsx b/packages/richtext-lexical/src/field/features/relationship/utils/EnabledRelationshipsCondition.tsx index f3d1c72531..8bcf4639c2 100644 --- a/packages/richtext-lexical/src/field/features/relationship/utils/EnabledRelationshipsCondition.tsx +++ b/packages/richtext-lexical/src/field/features/relationship/utils/EnabledRelationshipsCondition.tsx @@ -19,7 +19,7 @@ type FilteredCollectionsT = ( const filterRichTextCollections: FilteredCollectionsT = (collections, options) => { return collections.filter(({ slug, admin: { enableRichTextRelationship }, upload }) => { - if (options.visibleEntities.collections.includes(slug)) { + if (!options.visibleEntities.collections.includes(slug)) { return false } From ec0e0ae449d985b8c026c9674e71878d2943934d Mon Sep 17 00:00:00 2001 From: Alessio Gravili Date: Tue, 9 Apr 2024 12:24:54 -0400 Subject: [PATCH 033/177] chore(richtext-lexical): add e2e test to ensure that pre-seeded upload nodes are visible --- test/fields/lexical.e2e.spec.ts | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/test/fields/lexical.e2e.spec.ts b/test/fields/lexical.e2e.spec.ts index 0ea4e229f9..75b0a4f3ff 100644 --- a/test/fields/lexical.e2e.spec.ts +++ b/test/fields/lexical.e2e.spec.ts @@ -798,6 +798,22 @@ describe('lexical', () => { await shouldRespectRowRemovalTest() }) + test('ensure pre-seeded uploads node is visible', async () => { + // Due to issues with the relationships condition, we had issues with that not being visible. Checking for visibility ensures there is no breakage there again + await navigateToLexicalFields() + const richTextField = page.locator('.rich-text-lexical').nth(1) // second + await richTextField.scrollIntoViewIfNeeded() + await expect(richTextField).toBeVisible() + + const uploadBlock = richTextField.locator('.ContentEditable__root > div').first() // Check for the first div, as we wanna make sure it's the first div in the editor (1. node is a paragraph, second node is a div which is the upload node) + await uploadBlock.scrollIntoViewIfNeeded() + await expect(uploadBlock).toBeVisible() + + await expect(uploadBlock.locator('.lexical-upload__doc-drawer-toggler strong')).toHaveText( + 'payload.jpg', + ) + }) + test.skip('should respect required error state in deeply nested text field', async () => { await navigateToLexicalFields() const richTextField = page.locator('.rich-text-lexical').nth(1) // second From af40302e5ff9f9764d0bd537f3c4633e67268932 Mon Sep 17 00:00:00 2001 From: Alessio Gravili Date: Tue, 9 Apr 2024 12:29:45 -0400 Subject: [PATCH 034/177] fix(richtext-lexical): get links to work again (#5745) --- .../src/field/features/link/nodes/LinkNode.ts | 4 +- .../floatingLinkEditor/LinkEditor/index.tsx | 27 ++++-- .../link/plugins/floatingLinkEditor/types.ts | 3 + test/fields/lexical.e2e.spec.ts | 90 ++++++++++++++++++- 4 files changed, 114 insertions(+), 10 deletions(-) diff --git a/packages/richtext-lexical/src/field/features/link/nodes/LinkNode.ts b/packages/richtext-lexical/src/field/features/link/nodes/LinkNode.ts index 7ba74f1846..5846d8aa96 100644 --- a/packages/richtext-lexical/src/field/features/link/nodes/LinkNode.ts +++ b/packages/richtext-lexical/src/field/features/link/nodes/LinkNode.ts @@ -246,10 +246,10 @@ export const TOGGLE_LINK_COMMAND: LexicalCommand = export function toggleLink(payload: LinkPayload): void { const selection = $getSelection() - if (!$isRangeSelection(selection)) { + if (!$isRangeSelection(selection) && !payload.selectedNodes.length) { return } - const nodes = selection.extract() + const nodes = $isRangeSelection(selection) ? selection.extract() : payload.selectedNodes if (payload === null) { // Remove LinkNodes diff --git a/packages/richtext-lexical/src/field/features/link/plugins/floatingLinkEditor/LinkEditor/index.tsx b/packages/richtext-lexical/src/field/features/link/plugins/floatingLinkEditor/LinkEditor/index.tsx index 2ec17c9179..16179480c0 100644 --- a/packages/richtext-lexical/src/field/features/link/plugins/floatingLinkEditor/LinkEditor/index.tsx +++ b/packages/richtext-lexical/src/field/features/link/plugins/floatingLinkEditor/LinkEditor/index.tsx @@ -8,6 +8,8 @@ const { useLexicalComposerContext } = lexicalComposerContextImport import lexicalUtilsImport from '@lexical/utils' const { $findMatchingParent, mergeRegister } = lexicalUtilsImport +import type { LexicalNode } from 'lexical' + import { getTranslation } from '@payloadcms/translations' import lexicalImport from 'lexical' const { @@ -57,6 +59,8 @@ export function LinkEditor({ anchorElem }: { anchorElem: HTMLElement }): React.R const { closeModal, toggleModal } = useModal() const editDepth = useEditDepth() const [isLink, setIsLink] = useState(false) + const [selectedNodes, setSelectedNodes] = useState([]) + const [isAutoLink, setIsAutoLink] = useState(false) const drawerSlug = formatDrawerSlug({ @@ -78,6 +82,7 @@ export function LinkEditor({ anchorElem }: { anchorElem: HTMLElement }): React.R setIsAutoLink(false) setLinkUrl('') setLinkLabel('') + setSelectedNodes([]) return } @@ -115,6 +120,8 @@ export function LinkEditor({ anchorElem }: { anchorElem: HTMLElement }): React.R setStateData(data) setIsLink(true) + setSelectedNodes(selection ? selection?.getNodes() : []) + if ($isAutoLinkNode(linkParent)) { setIsAutoLink(true) } else { @@ -291,18 +298,26 @@ export function LinkEditor({ anchorElem }: { anchorElem: HTMLElement }): React.R const newLinkPayload: LinkPayload = data as LinkPayload + newLinkPayload.selectedNodes = selectedNodes + // See: https://github.com/facebook/lexical/pull/5536. This updates autolink nodes to link nodes whenever a change was made (which is good!). editor.update(() => { const selection = $getSelection() + let linkParent = null if ($isRangeSelection(selection)) { - const parent = getSelectedNode(selection).getParent() - if ($isAutoLinkNode(parent)) { - const linkNode = $createLinkNode({ - fields: newLinkPayload.fields, - }) - parent.replace(linkNode, true) + linkParent = getSelectedNode(selection).getParent() + } else { + if (selectedNodes.length) { + linkParent = selectedNodes[0].getParent() } } + + if (linkParent && $isAutoLinkNode(linkParent)) { + const linkNode = $createLinkNode({ + fields: newLinkPayload.fields, + }) + linkParent.replace(linkNode, true) + } }) // Needs to happen AFTER a potential auto link => link node conversion, as otherwise, the updated text to display may be lost due to diff --git a/packages/richtext-lexical/src/field/features/link/plugins/floatingLinkEditor/types.ts b/packages/richtext-lexical/src/field/features/link/plugins/floatingLinkEditor/types.ts index 2c9d2a3bee..30e103f97d 100644 --- a/packages/richtext-lexical/src/field/features/link/plugins/floatingLinkEditor/types.ts +++ b/packages/richtext-lexical/src/field/features/link/plugins/floatingLinkEditor/types.ts @@ -1,3 +1,5 @@ +import type { LexicalNode } from 'lexical' + import type { LinkFields } from '../../nodes/types.js' /** @@ -6,6 +8,7 @@ import type { LinkFields } from '../../nodes/types.js' */ export type LinkPayload = { fields: LinkFields + selectedNodes?: LexicalNode[] /** * The text content of the link node - will be displayed in the drawer */ diff --git a/test/fields/lexical.e2e.spec.ts b/test/fields/lexical.e2e.spec.ts index 0ea4e229f9..52a562054f 100644 --- a/test/fields/lexical.e2e.spec.ts +++ b/test/fields/lexical.e2e.spec.ts @@ -1,4 +1,4 @@ -import type { SerializedBlockNode } from '@payloadcms/richtext-lexical' +import type { SerializedBlockNode, SerializedLinkNode } from '@payloadcms/richtext-lexical' import type { Page } from '@playwright/test' import type { SerializedEditorState, SerializedParagraphNode, SerializedTextNode } from 'lexical' import type { Payload } from 'payload' @@ -401,7 +401,7 @@ describe('lexical', () => { for (let i = 0; i < 18; i++) { await page.keyboard.press('Shift+ArrowRight') } - // The following text should now be selected: elationship node 1 + // The following text should now be selectedelationship node 1 const floatingToolbar_formatSection = page.locator( '.floating-select-toolbar-popup__section-format', @@ -462,6 +462,92 @@ describe('lexical', () => { timeout: POLL_TOPASS_TIMEOUT, }) }) + + test('should be able to select text, make it an external link and receive the updated link value', async () => { + // Reproduces https://github.com/payloadcms/payload/issues/4025 + await navigateToLexicalFields() + const richTextField = page.locator('.rich-text-lexical').nth(1) // second + await richTextField.scrollIntoViewIfNeeded() + await expect(richTextField).toBeVisible() + + // Find span in contentEditable with text "Some text below relationship node" + const spanInEditor = richTextField.locator('span').getByText('Upload Node:').first() + await expect(spanInEditor).toBeVisible() + await spanInEditor.click() // Use click, because focus does not work + + await page.keyboard.press('ArrowRight') + // Now select some text + for (let i = 0; i < 4; i++) { + await page.keyboard.press('Shift+ArrowRight') + } + // The following text should now be "Node" + + const floatingToolbar = page.locator('.floating-select-toolbar-popup') + + await expect(floatingToolbar).toBeVisible() + + const linkButton = floatingToolbar + .locator('.floating-select-toolbar-popup__button-link') + .first() + + await expect(linkButton).toBeVisible() + await linkButton.click() + + /** + * In drawer + */ + const drawerContent = page.locator('.drawer__content').first() + await expect(drawerContent).toBeVisible() + + const urlField = drawerContent.locator('input#field-fields__url').first() + await expect(urlField).toBeVisible() + // Fill with https://www.payloadcms.com + await urlField.fill('https://www.payloadcms.com') + await expect(urlField).toHaveValue('https://www.payloadcms.com') + await drawerContent.locator('.form-submit button').click({ delay: 100 }) + await expect(drawerContent).toBeHidden() + + /** + * check if it worked correctly + */ + + const linkInEditor = richTextField.locator('a.LexicalEditorTheme__link').first() + await expect(linkInEditor).toBeVisible() + await expect(linkInEditor).toHaveAttribute('href', 'https://www.payloadcms.com') + + await saveDocAndAssert(page) + + // Check if it persists after saving + await expect(linkInEditor).toBeVisible() + await expect(linkInEditor).toHaveAttribute('href', 'https://www.payloadcms.com') + + // Make sure it's being returned from the API as well + await expect(async () => { + const lexicalDoc: LexicalField = ( + await payload.find({ + collection: lexicalFieldsSlug, + depth: 0, + where: { + title: { + equals: lexicalDocData.title, + }, + }, + }) + ).docs[0] as never + + const lexicalField: SerializedEditorState = lexicalDoc.lexicalWithBlocks + + expect( + ( + (lexicalField.root.children[0] as SerializedParagraphNode) + .children[1] as SerializedLinkNode + ).fields.url, + ).toBe('https://www.payloadcms.com') + }).toPass({ + timeout: POLL_TOPASS_TIMEOUT, + }) + }) + test('ensure slash menu is not hidden behind other blocks', async () => { // This test makes sure there are no z-index issues here await navigateToLexicalFields() From 98438175cfd16a26bea1bf07fe133db132556650 Mon Sep 17 00:00:00 2001 From: James Date: Tue, 9 Apr 2024 12:31:25 -0400 Subject: [PATCH 035/177] chore: handles server errors --- packages/ui/src/forms/Form/fieldReducer.ts | 62 ++++++++++++++++++++++ packages/ui/src/forms/Form/index.tsx | 11 ++-- packages/ui/src/forms/Form/types.ts | 9 ++++ test/fields/e2e.spec.ts | 2 +- test/tsconfig.json | 8 ++- 5 files changed, 81 insertions(+), 11 deletions(-) diff --git a/packages/ui/src/forms/Form/fieldReducer.ts b/packages/ui/src/forms/Form/fieldReducer.ts index 7ed0bc78e0..143dbf41a6 100644 --- a/packages/ui/src/forms/Form/fieldReducer.ts +++ b/packages/ui/src/forms/Form/fieldReducer.ts @@ -47,6 +47,68 @@ export function fieldReducer(state: FormState, action: FieldAction): FormState { return newState } + case 'ADD_SERVER_ERRORS': { + let newState = { ...state } + + const errorPaths: { fieldErrorPath: string; parentPath: string }[] = [] + + action.errors.forEach(({ field, message }) => { + newState[field] = { + ...(newState[field] || { + initialValue: null, + value: null, + }), + errorMessage: message, + valid: false, + } + + const segments = field.split('.') + if (segments.length > 1) { + errorPaths.push({ + fieldErrorPath: field, + parentPath: segments.slice(0, segments.length - 1).join('.'), + }) + } + }) + + newState = Object.entries(newState).reduce((acc, [path, fieldState]) => { + const fieldErrorPaths = errorPaths.reduce((errorACC, { fieldErrorPath, parentPath }) => { + if (parentPath.startsWith(path)) { + errorACC.push(fieldErrorPath) + } + return errorACC + }, []) + + let changed = false + + if (fieldErrorPaths.length > 0) { + const newErrorPaths = Array.isArray(fieldState.errorPaths) ? fieldState.errorPaths : [] + + fieldErrorPaths.forEach((fieldErrorPath) => { + if (!newErrorPaths.includes(fieldErrorPath)) { + newErrorPaths.push(fieldErrorPath) + changed = true + } + }) + + if (changed) { + acc[path] = { + ...fieldState, + errorPaths: newErrorPaths, + } + } + } + + if (!changed) { + acc[path] = fieldState + } + + return acc + }, {}) + + return newState + } + case 'UPDATE': { const newField = Object.entries(action).reduce( (field, [key, value]) => { diff --git a/packages/ui/src/forms/Form/index.tsx b/packages/ui/src/forms/Form/index.tsx index 7ab6ddacd9..23d81406dc 100644 --- a/packages/ui/src/forms/Form/index.tsx +++ b/packages/ui/src/forms/Form/index.tsx @@ -317,14 +317,9 @@ export const Form: React.FC = (props) => { [[], []], ) - fieldErrors.forEach((err) => { - dispatchFields({ - type: 'UPDATE', - ...(contextRef.current?.fields?.[err.field] || {}), - errorMessage: err.message, - path: err.field, - valid: false, - }) + dispatchFields({ + type: 'ADD_SERVER_ERRORS', + errors: fieldErrors, }) nonFieldErrors.forEach((err) => { diff --git a/packages/ui/src/forms/Form/types.ts b/packages/ui/src/forms/Form/types.ts index ec48eb4a4b..fbaef43667 100644 --- a/packages/ui/src/forms/Form/types.ts +++ b/packages/ui/src/forms/Form/types.ts @@ -129,6 +129,14 @@ export type MOVE_ROW = { type: 'MOVE_ROW' } +export type ADD_SERVER_ERRORS = { + errors: { + field: string + message: string + }[] + type: 'ADD_SERVER_ERRORS' +} + export type SET_ROW_COLLAPSED = { collapsed: boolean path: string @@ -146,6 +154,7 @@ export type SET_ALL_ROWS_COLLAPSED = { export type FieldAction = | ADD_ROW + | ADD_SERVER_ERRORS | DUPLICATE_ROW | MODIFY_CONDITION | MOVE_ROW diff --git a/test/fields/e2e.spec.ts b/test/fields/e2e.spec.ts index 291a9c46c2..c40595accd 100644 --- a/test/fields/e2e.spec.ts +++ b/test/fields/e2e.spec.ts @@ -254,7 +254,7 @@ describe('fields', () => { }) // TODO - This test is flaky. Rarely, but sometimes it randomly fails. - test.skip('should display unique constraint error in ui', async () => { + test('should display unique constraint error in ui', async () => { const uniqueText = 'uniqueText' await payload.create({ collection: 'indexed-fields', diff --git a/test/tsconfig.json b/test/tsconfig.json index 209f12718c..1c52f71df4 100644 --- a/test/tsconfig.json +++ b/test/tsconfig.json @@ -40,8 +40,12 @@ "@payloadcms/ui/scss": ["../packages/ui/src/scss.scss"], "@payloadcms/ui/scss/app.scss": ["../packages/ui/src/scss/app.scss"], "payload/types": ["../packages/payload/src/exports/types/index.ts"], - "@payloadcms/next/*": ["../packages/next/src/*"], - "@payloadcms/next": ["../packages/next/src/exports/*"], + "@payloadcms/next/*": [ + "./packages/next/src/exports/*" + ], + "@payloadcms/next": [ + "./packages/next/src/exports/*" + ], "@payload-config": ["./_community/config.ts"] } }, From 3acfb7a83fa57fb65ee542ce7750eeded71864da Mon Sep 17 00:00:00 2001 From: James Date: Tue, 9 Apr 2024 12:43:36 -0400 Subject: [PATCH 036/177] chore: corrects imports --- app/(payload)/admin/[[...segments]]/not-found.tsx | 2 +- app/(payload)/admin/[[...segments]]/page.tsx | 2 +- app/(payload)/api/[...slug]/route.ts | 2 +- app/(payload)/api/graphql-playground/route.ts | 2 +- app/(payload)/api/graphql/route.ts | 2 +- app/(payload)/layout.tsx | 2 +- test/tsconfig.json | 5 +---- tsconfig.json | 2 +- 8 files changed, 8 insertions(+), 11 deletions(-) diff --git a/app/(payload)/admin/[[...segments]]/not-found.tsx b/app/(payload)/admin/[[...segments]]/not-found.tsx index a7d49cffe1..e7723f49a0 100644 --- a/app/(payload)/admin/[[...segments]]/not-found.tsx +++ b/app/(payload)/admin/[[...segments]]/not-found.tsx @@ -3,7 +3,7 @@ import type { Metadata } from 'next' import config from '@payload-config' /* DO NOT MODIFY IT BECAUSE IT COULD BE REWRITTEN AT ANY TIME. */ -import { NotFoundPage, generatePageMetadata } from '@payloadcms/next/views.js' +import { NotFoundPage, generatePageMetadata } from '@payloadcms/next/views' type Args = { params: { diff --git a/app/(payload)/admin/[[...segments]]/page.tsx b/app/(payload)/admin/[[...segments]]/page.tsx index cd97ec8606..61be15c883 100644 --- a/app/(payload)/admin/[[...segments]]/page.tsx +++ b/app/(payload)/admin/[[...segments]]/page.tsx @@ -3,7 +3,7 @@ import type { Metadata } from 'next' import config from '@payload-config' /* DO NOT MODIFY IT BECAUSE IT COULD BE REWRITTEN AT ANY TIME. */ -import { RootPage, generatePageMetadata } from '@payloadcms/next/views.js' +import { RootPage, generatePageMetadata } from '@payloadcms/next/views' type Args = { params: { diff --git a/app/(payload)/api/[...slug]/route.ts b/app/(payload)/api/[...slug]/route.ts index c982aa94d5..282e1ad32f 100644 --- a/app/(payload)/api/[...slug]/route.ts +++ b/app/(payload)/api/[...slug]/route.ts @@ -1,7 +1,7 @@ /* THIS FILE WAS GENERATED AUTOMATICALLY BY PAYLOAD. */ /* DO NOT MODIFY it because it could be re-written at any time. */ import config from '@payload-config' -import { REST_DELETE, REST_GET, REST_PATCH, REST_POST } from '@payloadcms/next/routes.js' +import { REST_DELETE, REST_GET, REST_PATCH, REST_POST } from '@payloadcms/next/routes' export const GET = REST_GET(config) export const POST = REST_POST(config) diff --git a/app/(payload)/api/graphql-playground/route.ts b/app/(payload)/api/graphql-playground/route.ts index 997feb2415..7b7f279983 100644 --- a/app/(payload)/api/graphql-playground/route.ts +++ b/app/(payload)/api/graphql-playground/route.ts @@ -1,6 +1,6 @@ /* THIS FILE WAS GENERATED AUTOMATICALLY BY PAYLOAD. */ /* DO NOT MODIFY it because it could be re-written at any time. */ import config from '@payload-config' -import { GRAPHQL_PLAYGROUND_GET } from '@payloadcms/next/routes.js' +import { GRAPHQL_PLAYGROUND_GET } from '@payloadcms/next/routes' export const GET = GRAPHQL_PLAYGROUND_GET(config) diff --git a/app/(payload)/api/graphql/route.ts b/app/(payload)/api/graphql/route.ts index 2b7c41215b..c2723e439f 100644 --- a/app/(payload)/api/graphql/route.ts +++ b/app/(payload)/api/graphql/route.ts @@ -1,6 +1,6 @@ /* THIS FILE WAS GENERATED AUTOMATICALLY BY PAYLOAD. */ /* DO NOT MODIFY it because it could be re-written at any time. */ import config from '@payload-config' -import { GRAPHQL_POST } from '@payloadcms/next/routes.js' +import { GRAPHQL_POST } from '@payloadcms/next/routes' export const POST = GRAPHQL_POST(config) diff --git a/app/(payload)/layout.tsx b/app/(payload)/layout.tsx index 18bdb4de37..78db7265e1 100644 --- a/app/(payload)/layout.tsx +++ b/app/(payload)/layout.tsx @@ -1,6 +1,6 @@ /* THIS FILE WAS GENERATED AUTOMATICALLY BY PAYLOAD. */ import configPromise from '@payload-config' -import { RootLayout } from '@payloadcms/next/layouts.js' +import { RootLayout } from '@payloadcms/next/layouts' /* DO NOT MODIFY IT BECAUSE IT COULD BE REWRITTEN AT ANY TIME. */ import React from 'react' diff --git a/test/tsconfig.json b/test/tsconfig.json index 1c52f71df4..a5a128f02e 100644 --- a/test/tsconfig.json +++ b/test/tsconfig.json @@ -41,10 +41,7 @@ "@payloadcms/ui/scss/app.scss": ["../packages/ui/src/scss/app.scss"], "payload/types": ["../packages/payload/src/exports/types/index.ts"], "@payloadcms/next/*": [ - "./packages/next/src/exports/*" - ], - "@payloadcms/next": [ - "./packages/next/src/exports/*" + "./packages/next/src/exports/*.ts" ], "@payload-config": ["./_community/config.ts"] } diff --git a/tsconfig.json b/tsconfig.json index 379414e8b6..a7865622d1 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -82,7 +82,7 @@ "./packages/ui/src/scss/app.scss" ], "@payloadcms/next/*": [ - "./packages/next/src/*" + "./packages/next/src/exports/*.ts" ], "@payloadcms/next": [ "./packages/next/src/exports/*" From 313ea52e3d6923702aba12eab674c0545124ad7f Mon Sep 17 00:00:00 2001 From: James Date: Tue, 9 Apr 2024 13:17:43 -0400 Subject: [PATCH 037/177] chore: getRequestLanguage now defaults --- packages/next/src/utilities/getRequestLanguage.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/next/src/utilities/getRequestLanguage.ts b/packages/next/src/utilities/getRequestLanguage.ts index 6ca0b8b1aa..0adf954e8a 100644 --- a/packages/next/src/utilities/getRequestLanguage.ts +++ b/packages/next/src/utilities/getRequestLanguage.ts @@ -7,7 +7,7 @@ import { matchLanguage } from '@payloadcms/translations' type GetRequestLanguageArgs = { config: SanitizedConfig cookies: Map | ReadonlyRequestCookies - defaultLanguage?: string + defaultLanguage?: AcceptedLanguages headers: Request['headers'] } @@ -26,5 +26,5 @@ export const getRequestLanguage = ({ config.i18n.fallbackLanguage || defaultLanguage - return matchLanguage(reqLanguage) + return matchLanguage(reqLanguage) || defaultLanguage } From 9ad1cbe9207d5a943d1bb697b1017112b9afa76f Mon Sep 17 00:00:00 2001 From: James Date: Tue, 9 Apr 2024 13:33:42 -0400 Subject: [PATCH 038/177] chore: adjusts test snapshot logic to restore uploads properly --- test/helpers/seed.ts | 29 ++++++++++++++++------------- test/helpers/snapshot.ts | 6 ++---- tsconfig.json | 2 +- 3 files changed, 19 insertions(+), 18 deletions(-) diff --git a/test/helpers/seed.ts b/test/helpers/seed.ts index 2dfb0fb532..8c0aaa0576 100644 --- a/test/helpers/seed.ts +++ b/test/helpers/seed.ts @@ -67,10 +67,10 @@ export async function seedDB({ /** * Restore uploads dir if it exists */ - if (uploadsDir && fs.existsSync(uploadsDirCache.path)) { + if (uploadsDir && fs.existsSync(uploadsDirCache[snapshotKey])) { // move all files from inside uploadsDirCacheFolder to uploadsDir await fs.promises - .readdir(uploadsDirCache.path, { withFileTypes: true }) + .readdir(uploadsDirCache[snapshotKey], { withFileTypes: true }) .then(async (files) => { for (const file of files) { if (file.isDirectory()) { @@ -78,12 +78,12 @@ export async function seedDB({ recursive: true, }) await fs.promises.copyFile( - path.join(uploadsDirCache.path, file.name), + path.join(uploadsDirCache[snapshotKey], file.name), path.join(uploadsDir, file.name), ) } else { await fs.promises.copyFile( - path.join(uploadsDirCache.path, file.name), + path.join(uploadsDirCache[snapshotKey], file.name), path.join(uploadsDir, file.name), ) } @@ -106,7 +106,6 @@ export async function seedDB({ if (isMongoose(_payload)) { await Promise.all([ ...collectionSlugs.map(async (collectionSlug) => { - // @ts-expect-error TODO: Type this better await _payload.db.collections[collectionSlug].createIndexes() }), ]) @@ -134,33 +133,37 @@ export async function seedDB({ * Cache uploads dir to a cache folder if uploadsDir exists */ if (!alwaysSeed && uploadsDir && fs.existsSync(uploadsDir)) { - if (!uploadsDirCache.path) { + if (!uploadsDirCache[snapshotKey]) { // Define new cache folder path to the OS temp directory (well a random folder inside it) - uploadsDirCache.path = path.join(os.tmpdir(), `payload-e2e-tests-uploads-cache`) + uploadsDirCache[snapshotKey] = path.join( + os.tmpdir(), + `${snapshotKey}`, + `payload-e2e-tests-uploads-cache`, + ) } // delete the cache folder if it exists - if (fs.existsSync(uploadsDirCache.path)) { - await fs.promises.rm(uploadsDirCache.path, { recursive: true }) + if (fs.existsSync(uploadsDirCache[snapshotKey])) { + await fs.promises.rm(uploadsDirCache[snapshotKey], { recursive: true }) } - await fs.promises.mkdir(uploadsDirCache.path, { recursive: true }) + await fs.promises.mkdir(uploadsDirCache[snapshotKey], { recursive: true }) // recursively move all files and directories from uploadsDir to uploadsDirCacheFolder await fs.promises .readdir(uploadsDir, { withFileTypes: true }) .then(async (files) => { for (const file of files) { if (file.isDirectory()) { - await fs.promises.mkdir(path.join(uploadsDirCache.path, file.name), { + await fs.promises.mkdir(path.join(uploadsDirCache[snapshotKey], file.name), { recursive: true, }) await fs.promises.copyFile( path.join(uploadsDir, file.name), - path.join(uploadsDirCache.path, file.name), + path.join(uploadsDirCache[snapshotKey], file.name), ) } else { await fs.promises.copyFile( path.join(uploadsDir, file.name), - path.join(uploadsDirCache.path, file.name), + path.join(uploadsDirCache[snapshotKey], file.name), ) } } diff --git a/test/helpers/snapshot.ts b/test/helpers/snapshot.ts index 9996611be4..e9cbc752bf 100644 --- a/test/helpers/snapshot.ts +++ b/test/helpers/snapshot.ts @@ -7,10 +7,8 @@ import { sql } from 'drizzle-orm' import { isMongoose } from './isMongoose.js' export const uploadsDirCache: { - path: null | string -} = { - path: null, -} + [key: string]: string +} = {} export const dbSnapshot = {} async function createMongooseSnapshot(collectionsObj, snapshotKey: string) { diff --git a/tsconfig.json b/tsconfig.json index a7865622d1..07cf2e3abc 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -161,4 +161,4 @@ ".next/types/**/*.ts", "scripts/**/*.ts" ] -} +} \ No newline at end of file From 167ba0c68fc152f37744dfdfe0b88a6bbf5ebafe Mon Sep 17 00:00:00 2001 From: James Date: Tue, 9 Apr 2024 13:50:54 -0400 Subject: [PATCH 039/177] chore: adds back all tests --- .github/workflows/main.yml | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 5e2d13246b..4b563f9579 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -214,25 +214,25 @@ jobs: matrix: # find test -type f -name 'e2e.spec.ts' | sort | xargs dirname | xargs -I {} basename {} suite: - # - _community - # - access-control - # - admin - # - auth - # - email - # - field-error-states - # - fields-relationship + - _community + - access-control + - admin + - auth + - email + - field-error-states + - fields-relationship - fields - fields__collections__Blocks - fields__collections__Array - fields__collections__Relationship - fields__collections__Lexical - # - live-preview - # - localization - # - plugin-form-builder - # - plugin-nested-docs - # - plugin-seo - # - versions - # - uploads + - live-preview + - localization + - plugin-form-builder + - plugin-nested-docs + - plugin-seo + - versions + - uploads steps: - name: Use Node.js 18 From c2ee8e399930799de8e826af494d5666e13a282c Mon Sep 17 00:00:00 2001 From: James Date: Tue, 9 Apr 2024 13:56:32 -0400 Subject: [PATCH 040/177] chore: de-flakes fields/index tests --- test/fields/e2e.spec.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/fields/e2e.spec.ts b/test/fields/e2e.spec.ts index c40595accd..33a1fdb367 100644 --- a/test/fields/e2e.spec.ts +++ b/test/fields/e2e.spec.ts @@ -296,6 +296,8 @@ describe('fields', () => { // nested in a group error await page.locator('#field-group__unique').fill(uniqueText) + await wait(1000) + // attempt to save await page.locator('#action-save').click() From abf285d7130b17344fcc3c8184aa3476e9eceba0 Mon Sep 17 00:00:00 2001 From: Alessio Gravili Date: Tue, 9 Apr 2024 14:12:23 -0400 Subject: [PATCH 041/177] chore: get dev:generate-types to work again (#5750) --- packages/payload/src/exports/node.ts | 1 + test/fields/payload-types.ts | 50 ++++++++++++++++++++-------- test/generateTypes.ts | 18 ++++++++-- 3 files changed, 53 insertions(+), 16 deletions(-) diff --git a/packages/payload/src/exports/node.ts b/packages/payload/src/exports/node.ts index 3ffa8dea3a..5a5157c065 100644 --- a/packages/payload/src/exports/node.ts +++ b/packages/payload/src/exports/node.ts @@ -1 +1,2 @@ +export { generateTypes } from '../bin/generateTypes.js' export { importConfig, importWithoutClientFiles } from '../utilities/importWithoutClientFiles.js' diff --git a/test/fields/payload-types.ts b/test/fields/payload-types.ts index 3db5186856..be677a8e2b 100644 --- a/test/fields/payload-types.ts +++ b/test/fields/payload-types.ts @@ -13,6 +13,12 @@ export type BlockColumns = | { text?: string | null + subArray?: + | { + requiredText: string + id?: string | null + }[] + | null id?: string | null }[] | null @@ -202,7 +208,7 @@ export interface User { hash?: string | null loginAttempts?: number | null lockUntil?: string | null - password: string | null + password?: string | null } /** * This interface was referenced by `Config`'s JSON-Schema @@ -247,12 +253,6 @@ export interface ArrayField { id?: string | null }[] | null - rowLabelAsFunction?: - | { - title?: string | null - id?: string | null - }[] - | null rowLabelAsComponent?: | { title?: string | null @@ -774,6 +774,7 @@ export interface IndexedField { text: string uniqueText?: string | null uniqueRequiredText: string + localizedUniqueRequiredText: string /** * @minItems 2 * @maxItems 2 @@ -1115,14 +1116,25 @@ export interface Upload { id: string text?: string | null media?: string | Upload | null - richText?: - | { + richText?: { + root: { + type: string + children: { + type: string + version: number [k: string]: unknown }[] - | null + direction: ('ltr' | 'rtl') | null + format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '' + indent: number + version: number + } + [k: string]: unknown + } | null updatedAt: string createdAt: string url?: string | null + thumbnailURL?: string | null filename?: string | null mimeType?: string | null filesize?: number | null @@ -1140,6 +1152,7 @@ export interface Uploads2 { updatedAt: string createdAt: string url?: string | null + thumbnailURL?: string | null filename?: string | null mimeType?: string | null filesize?: number | null @@ -1153,14 +1166,25 @@ export interface Uploads2 { export interface Uploads3 { id: string media?: string | Uploads3 | null - richText?: - | { + richText?: { + root: { + type: string + children: { + type: string + version: number [k: string]: unknown }[] - | null + direction: ('ltr' | 'rtl') | null + format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '' + indent: number + version: number + } + [k: string]: unknown + } | null updatedAt: string createdAt: string url?: string | null + thumbnailURL?: string | null filename?: string | null mimeType?: string | null filesize?: number | null diff --git a/test/generateTypes.ts b/test/generateTypes.ts index 28a05f9218..463c43a3d8 100644 --- a/test/generateTypes.ts +++ b/test/generateTypes.ts @@ -1,29 +1,41 @@ import fs from 'fs' import path from 'path' +import { generateTypes } from 'payload/node' -import { generateTypes } from '../packages/payload/src/bin/generateTypes.js' import { setTestEnvPaths } from './helpers/setTestEnvPaths.js' const [testConfigDir] = process.argv.slice(2) import { fileURLToPath } from 'url' + +import { load } from './loader/load.js' const filename = fileURLToPath(import.meta.url) const dirname = path.dirname(filename) +const loadConfig = async (configPath: string) => { + const configPromise = await load(configPath) + return configPromise.default +} + let testDir if (testConfigDir) { testDir = path.resolve(dirname, testConfigDir) + + const config = await loadConfig(path.resolve(testDir, 'config.ts')) + setTestEnvPaths(testDir) - generateTypes() + generateTypes(config) } else { // Generate types for entire directory testDir = dirname + const config = await loadConfig(path.resolve(testDir, 'config.ts')) + fs.readdirSync(dirname, { withFileTypes: true }) .filter((f) => f.isDirectory()) .forEach((dir) => { const suiteDir = path.resolve(testDir, dir.name) const configFound = setTestEnvPaths(suiteDir) - if (configFound) generateTypes() + if (configFound) generateTypes(config) }) } From d057ce0a853e190d79e3fadbd58a2fe0addadde0 Mon Sep 17 00:00:00 2001 From: Patrik Date: Tue, 9 Apr 2024 14:26:09 -0400 Subject: [PATCH 042/177] fix(next): removes `global` slug from `collectionSlug` prop in `SetStepNav` (#5744) --- packages/next/src/views/Versions/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/next/src/views/Versions/index.tsx b/packages/next/src/views/Versions/index.tsx index e5ea9a7f49..e3392c8383 100644 --- a/packages/next/src/views/Versions/index.tsx +++ b/packages/next/src/views/Versions/index.tsx @@ -101,7 +101,7 @@ export const VersionsView: EditViewComponent = async (props) => { return ( Date: Tue, 9 Apr 2024 14:22:12 -0400 Subject: [PATCH 043/177] chore(release): v3.0.0-alpha.61 [skip ci] --- package.json | 2 +- packages/create-payload-app/package.json | 2 +- packages/db-mongodb/package.json | 2 +- packages/db-postgres/package.json | 2 +- packages/graphql/package.json | 2 +- packages/next/package.json | 2 +- packages/payload/package.json | 2 +- packages/plugin-cloud-storage/package.json | 2 +- packages/plugin-cloud/package.json | 2 +- packages/plugin-form-builder/package.json | 2 +- packages/plugin-nested-docs/package.json | 2 +- packages/plugin-redirects/package.json | 2 +- packages/plugin-search/package.json | 2 +- packages/plugin-seo/package.json | 2 +- packages/richtext-lexical/package.json | 2 +- packages/richtext-slate/package.json | 2 +- packages/translations/package.json | 2 +- packages/ui/package.json | 2 +- 18 files changed, 18 insertions(+), 18 deletions(-) diff --git a/package.json b/package.json index 2a578fd892..43511a817b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "payload-monorepo", - "version": "3.0.0-alpha.60", + "version": "3.0.0-alpha.61", "private": true, "type": "module", "workspaces:": [ diff --git a/packages/create-payload-app/package.json b/packages/create-payload-app/package.json index 0c2682b48b..2dcb6b09bd 100644 --- a/packages/create-payload-app/package.json +++ b/packages/create-payload-app/package.json @@ -1,6 +1,6 @@ { "name": "create-payload-app", - "version": "3.0.0-alpha.60", + "version": "3.0.0-alpha.61", "license": "MIT", "type": "module", "homepage": "https://payloadcms.com", diff --git a/packages/db-mongodb/package.json b/packages/db-mongodb/package.json index 9b68bbcc99..1d01b0119e 100644 --- a/packages/db-mongodb/package.json +++ b/packages/db-mongodb/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/db-mongodb", - "version": "3.0.0-alpha.60", + "version": "3.0.0-alpha.61", "description": "The officially supported MongoDB database adapter for Payload", "repository": { "type": "git", diff --git a/packages/db-postgres/package.json b/packages/db-postgres/package.json index 4ec3be5cb4..75e6c31ac2 100644 --- a/packages/db-postgres/package.json +++ b/packages/db-postgres/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/db-postgres", - "version": "3.0.0-alpha.60", + "version": "3.0.0-alpha.61", "description": "The officially supported Postgres database adapter for Payload", "repository": { "type": "git", diff --git a/packages/graphql/package.json b/packages/graphql/package.json index ff2095c4cf..317a4543b2 100644 --- a/packages/graphql/package.json +++ b/packages/graphql/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/graphql", - "version": "3.0.0-alpha.60", + "version": "3.0.0-alpha.61", "main": "./src/index.ts", "types": "./src/index.d.ts", "type": "module", diff --git a/packages/next/package.json b/packages/next/package.json index c68d5ffff3..60beba32eb 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/next", - "version": "3.0.0-alpha.60", + "version": "3.0.0-alpha.61", "main": "./src/index.js", "types": "./src/index.js", "type": "module", diff --git a/packages/payload/package.json b/packages/payload/package.json index 5c7de4bcea..dae8e3d0e8 100644 --- a/packages/payload/package.json +++ b/packages/payload/package.json @@ -1,6 +1,6 @@ { "name": "payload", - "version": "3.0.0-alpha.60", + "version": "3.0.0-alpha.61", "description": "Node, React and MongoDB Headless CMS and Application Framework", "license": "MIT", "main": "./src/index.ts", diff --git a/packages/plugin-cloud-storage/package.json b/packages/plugin-cloud-storage/package.json index f405d0e375..8a8b517886 100644 --- a/packages/plugin-cloud-storage/package.json +++ b/packages/plugin-cloud-storage/package.json @@ -1,7 +1,7 @@ { "name": "@payloadcms/plugin-cloud-storage", "description": "The official cloud storage plugin for Payload CMS", - "version": "3.0.0-alpha.60", + "version": "3.0.0-alpha.61", "main": "./src/index.ts", "types": "./src/index.ts", "type": "module", diff --git a/packages/plugin-cloud/package.json b/packages/plugin-cloud/package.json index 3ba9f4ac63..93e7a5c691 100644 --- a/packages/plugin-cloud/package.json +++ b/packages/plugin-cloud/package.json @@ -1,7 +1,7 @@ { "name": "@payloadcms/plugin-cloud", "description": "The official Payload Cloud plugin", - "version": "3.0.0-alpha.60", + "version": "3.0.0-alpha.61", "main": "./src/index.ts", "types": "./src/index.ts", "license": "MIT", diff --git a/packages/plugin-form-builder/package.json b/packages/plugin-form-builder/package.json index 1c883b6151..6bcc6adf4a 100644 --- a/packages/plugin-form-builder/package.json +++ b/packages/plugin-form-builder/package.json @@ -1,7 +1,7 @@ { "name": "@payloadcms/plugin-form-builder", "description": "Form builder plugin for Payload CMS", - "version": "3.0.0-alpha.60", + "version": "3.0.0-alpha.61", "homepage:": "https://payloadcms.com", "repository": { "type": "git", diff --git a/packages/plugin-nested-docs/package.json b/packages/plugin-nested-docs/package.json index bbf42e969c..f61493184a 100644 --- a/packages/plugin-nested-docs/package.json +++ b/packages/plugin-nested-docs/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-nested-docs", - "version": "3.0.0-alpha.60", + "version": "3.0.0-alpha.61", "description": "The official Nested Docs plugin for Payload", "repository": { "type": "git", diff --git a/packages/plugin-redirects/package.json b/packages/plugin-redirects/package.json index cc228114a2..93252f8f58 100644 --- a/packages/plugin-redirects/package.json +++ b/packages/plugin-redirects/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-redirects", - "version": "3.0.0-alpha.60", + "version": "3.0.0-alpha.61", "homepage:": "https://payloadcms.com", "repository": { "type": "git", diff --git a/packages/plugin-search/package.json b/packages/plugin-search/package.json index fa4424e91c..bde2907ec5 100644 --- a/packages/plugin-search/package.json +++ b/packages/plugin-search/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-search", - "version": "3.0.0-alpha.60", + "version": "3.0.0-alpha.61", "homepage:": "https://payloadcms.com", "repository": { "type": "git", diff --git a/packages/plugin-seo/package.json b/packages/plugin-seo/package.json index 595c5b5909..6cf3319047 100644 --- a/packages/plugin-seo/package.json +++ b/packages/plugin-seo/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-seo", - "version": "3.0.0-alpha.60", + "version": "3.0.0-alpha.61", "homepage:": "https://payloadcms.com", "repository": { "type": "git", diff --git a/packages/richtext-lexical/package.json b/packages/richtext-lexical/package.json index 4f0a9d9f30..c147cb2037 100644 --- a/packages/richtext-lexical/package.json +++ b/packages/richtext-lexical/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/richtext-lexical", - "version": "3.0.0-alpha.60", + "version": "3.0.0-alpha.61", "description": "The officially supported Lexical richtext adapter for Payload", "repository": { "type": "git", diff --git a/packages/richtext-slate/package.json b/packages/richtext-slate/package.json index 7091415b9d..4ec1311d1a 100644 --- a/packages/richtext-slate/package.json +++ b/packages/richtext-slate/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/richtext-slate", - "version": "3.0.0-alpha.60", + "version": "3.0.0-alpha.61", "description": "The officially supported Slate richtext adapter for Payload", "repository": { "type": "git", diff --git a/packages/translations/package.json b/packages/translations/package.json index 1850317681..26967a8417 100644 --- a/packages/translations/package.json +++ b/packages/translations/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/translations", - "version": "3.0.0-alpha.60", + "version": "3.0.0-alpha.61", "main": "./src/exports/index.ts", "types": "./src/types.ts", "type": "module", diff --git a/packages/ui/package.json b/packages/ui/package.json index 32690f0b42..b489e8aafe 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/ui", - "version": "3.0.0-alpha.60", + "version": "3.0.0-alpha.61", "type": "module", "homepage": "https://payloadcms.com", "repository": { From 1faf621f1730769c7bf1f8b6c5d6cba6a0293621 Mon Sep 17 00:00:00 2001 From: Jarrod Flesch <30633324+JarrodMFlesch@users.noreply.github.com> Date: Tue, 9 Apr 2024 14:49:26 -0400 Subject: [PATCH 044/177] fix: persist locale when navigating (#5753) --- packages/ui/src/providers/Locale/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/ui/src/providers/Locale/index.tsx b/packages/ui/src/providers/Locale/index.tsx index 054b0d9753..2502bfdb42 100644 --- a/packages/ui/src/providers/Locale/index.tsx +++ b/packages/ui/src/providers/Locale/index.tsx @@ -20,7 +20,7 @@ export const LocaleProvider: React.FC<{ children?: React.ReactNode }> = ({ child localization && localization.defaultLocale ? localization.defaultLocale : 'en' const { searchParams } = useSearchParams() - const localeFromParams = searchParams?.locale || '' + const localeFromParams = searchParams?.locale const [localeCode, setLocaleCode] = useState( (localeFromParams as string) || defaultLocale, From 75873bfcfa2e31d4ff632d2336010ff0b2f48880 Mon Sep 17 00:00:00 2001 From: Alessio Gravili Date: Tue, 9 Apr 2024 14:53:17 -0400 Subject: [PATCH 045/177] fix(richtext-lexical): catch errors that may occur during HTML generation (#5752) --- .../converters/html/converter/index.ts | 33 ++++++++++++------- .../field/features/upload/feature.server.ts | 20 ++++++++--- 2 files changed, 38 insertions(+), 15 deletions(-) diff --git a/packages/richtext-lexical/src/field/features/converters/html/converter/index.ts b/packages/richtext-lexical/src/field/features/converters/html/converter/index.ts index d239cc4a2e..eba92092e9 100644 --- a/packages/richtext-lexical/src/field/features/converters/html/converter/index.ts +++ b/packages/richtext-lexical/src/field/features/converters/html/converter/index.ts @@ -47,19 +47,30 @@ export async function convertLexicalNodesToHTML({ const converterForNode = converters.find((converter) => converter.nodeTypes.includes(node.type), ) - if (!converterForNode) { - if (unknownConverter) { - return unknownConverter.converter({ childIndex: i, converters, node, parent, payload }) + try { + if (!converterForNode) { + if (unknownConverter) { + return await unknownConverter.converter({ + childIndex: i, + converters, + node, + parent, + payload, + }) + } + return 'unknown node' } - return 'unknown node' + return await converterForNode.converter({ + childIndex: i, + converters, + node, + parent, + payload, + }) + } catch (error) { + console.error('Error converting lexical node to HTML:', error, 'node:', node) + return '' } - return converterForNode.converter({ - childIndex: i, - converters, - node, - parent, - payload, - }) }), ) diff --git a/packages/richtext-lexical/src/field/features/upload/feature.server.ts b/packages/richtext-lexical/src/field/features/upload/feature.server.ts index b6fbaab83a..83d62ab5b7 100644 --- a/packages/richtext-lexical/src/field/features/upload/feature.server.ts +++ b/packages/richtext-lexical/src/field/features/upload/feature.server.ts @@ -65,10 +65,22 @@ export const UploadFeature: FeatureProviderProviderServer< html: { converter: async ({ node, payload }) => { if (payload) { - const uploadDocument: any = await payload.findByID({ - id: node.value.id, - collection: node.relationTo, - }) + let uploadDocument: any + try { + uploadDocument = await payload.findByID({ + id: node.value.id, + collection: node.relationTo, + }) + } catch (ignored) { + // eslint-disable-next-line no-console + console.error( + 'Lexical upload node HTML converter: error fetching upload file', + ignored, + 'Node:', + node, + ) + return `` + } const url: string = getAbsoluteURL(uploadDocument?.url as string, payload) From 6f74fd1f9860a33e1790c1085e2e2067eddb43a0 Mon Sep 17 00:00:00 2001 From: Elliot DeNolf Date: Tue, 9 Apr 2024 15:00:39 -0400 Subject: [PATCH 046/177] chore(release): v3.0.0-beta.0 [skip ci] --- package.json | 2 +- packages/create-payload-app/package.json | 2 +- packages/db-mongodb/package.json | 2 +- packages/db-postgres/package.json | 2 +- packages/graphql/package.json | 2 +- packages/next/package.json | 2 +- packages/payload/package.json | 2 +- packages/plugin-cloud-storage/package.json | 2 +- packages/plugin-cloud/package.json | 2 +- packages/plugin-form-builder/package.json | 2 +- packages/plugin-nested-docs/package.json | 2 +- packages/plugin-redirects/package.json | 2 +- packages/plugin-search/package.json | 2 +- packages/plugin-seo/package.json | 2 +- packages/richtext-lexical/package.json | 2 +- packages/richtext-slate/package.json | 2 +- packages/translations/package.json | 2 +- packages/ui/package.json | 2 +- 18 files changed, 18 insertions(+), 18 deletions(-) diff --git a/package.json b/package.json index 43511a817b..5202af45f4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "payload-monorepo", - "version": "3.0.0-alpha.61", + "version": "3.0.0-beta.0", "private": true, "type": "module", "workspaces:": [ diff --git a/packages/create-payload-app/package.json b/packages/create-payload-app/package.json index 2dcb6b09bd..04b4f342b1 100644 --- a/packages/create-payload-app/package.json +++ b/packages/create-payload-app/package.json @@ -1,6 +1,6 @@ { "name": "create-payload-app", - "version": "3.0.0-alpha.61", + "version": "3.0.0-beta.0", "license": "MIT", "type": "module", "homepage": "https://payloadcms.com", diff --git a/packages/db-mongodb/package.json b/packages/db-mongodb/package.json index 1d01b0119e..8e26f3ebde 100644 --- a/packages/db-mongodb/package.json +++ b/packages/db-mongodb/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/db-mongodb", - "version": "3.0.0-alpha.61", + "version": "3.0.0-beta.0", "description": "The officially supported MongoDB database adapter for Payload", "repository": { "type": "git", diff --git a/packages/db-postgres/package.json b/packages/db-postgres/package.json index 75e6c31ac2..9d4c59a40f 100644 --- a/packages/db-postgres/package.json +++ b/packages/db-postgres/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/db-postgres", - "version": "3.0.0-alpha.61", + "version": "3.0.0-beta.0", "description": "The officially supported Postgres database adapter for Payload", "repository": { "type": "git", diff --git a/packages/graphql/package.json b/packages/graphql/package.json index 317a4543b2..c18ccbea69 100644 --- a/packages/graphql/package.json +++ b/packages/graphql/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/graphql", - "version": "3.0.0-alpha.61", + "version": "3.0.0-beta.0", "main": "./src/index.ts", "types": "./src/index.d.ts", "type": "module", diff --git a/packages/next/package.json b/packages/next/package.json index 60beba32eb..125437a984 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/next", - "version": "3.0.0-alpha.61", + "version": "3.0.0-beta.0", "main": "./src/index.js", "types": "./src/index.js", "type": "module", diff --git a/packages/payload/package.json b/packages/payload/package.json index dae8e3d0e8..4f92eb0d56 100644 --- a/packages/payload/package.json +++ b/packages/payload/package.json @@ -1,6 +1,6 @@ { "name": "payload", - "version": "3.0.0-alpha.61", + "version": "3.0.0-beta.0", "description": "Node, React and MongoDB Headless CMS and Application Framework", "license": "MIT", "main": "./src/index.ts", diff --git a/packages/plugin-cloud-storage/package.json b/packages/plugin-cloud-storage/package.json index 8a8b517886..136ace5bdb 100644 --- a/packages/plugin-cloud-storage/package.json +++ b/packages/plugin-cloud-storage/package.json @@ -1,7 +1,7 @@ { "name": "@payloadcms/plugin-cloud-storage", "description": "The official cloud storage plugin for Payload CMS", - "version": "3.0.0-alpha.61", + "version": "3.0.0-beta.0", "main": "./src/index.ts", "types": "./src/index.ts", "type": "module", diff --git a/packages/plugin-cloud/package.json b/packages/plugin-cloud/package.json index 93e7a5c691..57b70198d8 100644 --- a/packages/plugin-cloud/package.json +++ b/packages/plugin-cloud/package.json @@ -1,7 +1,7 @@ { "name": "@payloadcms/plugin-cloud", "description": "The official Payload Cloud plugin", - "version": "3.0.0-alpha.61", + "version": "3.0.0-beta.0", "main": "./src/index.ts", "types": "./src/index.ts", "license": "MIT", diff --git a/packages/plugin-form-builder/package.json b/packages/plugin-form-builder/package.json index 6bcc6adf4a..e74c5484a9 100644 --- a/packages/plugin-form-builder/package.json +++ b/packages/plugin-form-builder/package.json @@ -1,7 +1,7 @@ { "name": "@payloadcms/plugin-form-builder", "description": "Form builder plugin for Payload CMS", - "version": "3.0.0-alpha.61", + "version": "3.0.0-beta.0", "homepage:": "https://payloadcms.com", "repository": { "type": "git", diff --git a/packages/plugin-nested-docs/package.json b/packages/plugin-nested-docs/package.json index f61493184a..4ff7eb95cf 100644 --- a/packages/plugin-nested-docs/package.json +++ b/packages/plugin-nested-docs/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-nested-docs", - "version": "3.0.0-alpha.61", + "version": "3.0.0-beta.0", "description": "The official Nested Docs plugin for Payload", "repository": { "type": "git", diff --git a/packages/plugin-redirects/package.json b/packages/plugin-redirects/package.json index 93252f8f58..7f9295d782 100644 --- a/packages/plugin-redirects/package.json +++ b/packages/plugin-redirects/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-redirects", - "version": "3.0.0-alpha.61", + "version": "3.0.0-beta.0", "homepage:": "https://payloadcms.com", "repository": { "type": "git", diff --git a/packages/plugin-search/package.json b/packages/plugin-search/package.json index bde2907ec5..7429bc2e28 100644 --- a/packages/plugin-search/package.json +++ b/packages/plugin-search/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-search", - "version": "3.0.0-alpha.61", + "version": "3.0.0-beta.0", "homepage:": "https://payloadcms.com", "repository": { "type": "git", diff --git a/packages/plugin-seo/package.json b/packages/plugin-seo/package.json index 6cf3319047..c8ed820a74 100644 --- a/packages/plugin-seo/package.json +++ b/packages/plugin-seo/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-seo", - "version": "3.0.0-alpha.61", + "version": "3.0.0-beta.0", "homepage:": "https://payloadcms.com", "repository": { "type": "git", diff --git a/packages/richtext-lexical/package.json b/packages/richtext-lexical/package.json index c147cb2037..22f3a4b128 100644 --- a/packages/richtext-lexical/package.json +++ b/packages/richtext-lexical/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/richtext-lexical", - "version": "3.0.0-alpha.61", + "version": "3.0.0-beta.0", "description": "The officially supported Lexical richtext adapter for Payload", "repository": { "type": "git", diff --git a/packages/richtext-slate/package.json b/packages/richtext-slate/package.json index 4ec1311d1a..3fec2c4eca 100644 --- a/packages/richtext-slate/package.json +++ b/packages/richtext-slate/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/richtext-slate", - "version": "3.0.0-alpha.61", + "version": "3.0.0-beta.0", "description": "The officially supported Slate richtext adapter for Payload", "repository": { "type": "git", diff --git a/packages/translations/package.json b/packages/translations/package.json index 26967a8417..bddb870efb 100644 --- a/packages/translations/package.json +++ b/packages/translations/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/translations", - "version": "3.0.0-alpha.61", + "version": "3.0.0-beta.0", "main": "./src/exports/index.ts", "types": "./src/types.ts", "type": "module", diff --git a/packages/ui/package.json b/packages/ui/package.json index b489e8aafe..c31f298643 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/ui", - "version": "3.0.0-alpha.61", + "version": "3.0.0-beta.0", "type": "module", "homepage": "https://payloadcms.com", "repository": { From 1141a5d3af50dad8ad9302a0e0cf6adcb50e5fdc Mon Sep 17 00:00:00 2001 From: Alessio Gravili Date: Tue, 9 Apr 2024 16:30:43 -0400 Subject: [PATCH 047/177] fix(richtext-lexical): do not render uploads extra fields drawer if no extra fields are provided (#5755) --- .../src/field/features/upload/component/index.tsx | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/packages/richtext-lexical/src/field/features/upload/component/index.tsx b/packages/richtext-lexical/src/field/features/upload/component/index.tsx index c3f05c0c83..0d373045ed 100644 --- a/packages/richtext-lexical/src/field/features/upload/component/index.tsx +++ b/packages/richtext-lexical/src/field/features/upload/component/index.tsx @@ -173,11 +173,13 @@ const Component: React.FC = (props) => { {value?.id && } - + {hasExtraFields ? ( + + ) : null} ) } From 7c60772b2666b6514812c0f81a3e71c60cde6754 Mon Sep 17 00:00:00 2001 From: Elliot DeNolf Date: Tue, 9 Apr 2024 23:07:09 -0400 Subject: [PATCH 048/177] ci: alpha -> beta branch push list --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 4b563f9579..e2a64fd966 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -4,7 +4,7 @@ on: pull_request: types: [opened, reopened, synchronize] push: - branches: ['main', 'alpha'] + branches: ['main', 'beta'] concurrency: group: ${{ github.workflow }}-${{ github.ref }} From ba7ac5d4398db7aa1dc7aeca4a63f86acb6e8de7 Mon Sep 17 00:00:00 2001 From: Elliot DeNolf Date: Tue, 9 Apr 2024 23:08:20 -0400 Subject: [PATCH 049/177] test: fix unit tests (#5760) --- .github/workflows/main.yml | 1 - .../queries/getLocalizedSortProperty.spec.ts | 24 ++++++++++--------- packages/plugin-sentry/src/plugin.spec.ts | 2 -- 3 files changed, 13 insertions(+), 14 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index e2a64fd966..851534eb5b 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -88,7 +88,6 @@ jobs: tests-unit: runs-on: ubuntu-latest needs: build - if: false # Disable until tests are updated for 3.0 steps: - name: Use Node.js 18 diff --git a/packages/db-mongodb/src/queries/getLocalizedSortProperty.spec.ts b/packages/db-mongodb/src/queries/getLocalizedSortProperty.spec.ts index 55310ca3a3..bc1153fa74 100644 --- a/packages/db-mongodb/src/queries/getLocalizedSortProperty.spec.ts +++ b/packages/db-mongodb/src/queries/getLocalizedSortProperty.spec.ts @@ -1,18 +1,20 @@ -import { sanitizeConfig } from 'payload/config' +import { SanitizedConfig, sanitizeConfig } from 'payload/config' import { Config } from 'payload/config' import { getLocalizedSortProperty } from './getLocalizedSortProperty.js' -const config = { +const config = sanitizeConfig({ localization: { locales: ['en', 'es'], + defaultLocale: 'en', + fallback: true, }, -} as Config +} as Config) as SanitizedConfig describe('get localized sort property', () => { it('passes through a non-localized sort property', () => { const result = getLocalizedSortProperty({ segments: ['title'], - config: sanitizeConfig(config), + config, fields: [ { name: 'title', @@ -28,7 +30,7 @@ describe('get localized sort property', () => { it('properly localizes an un-localized sort property', () => { const result = getLocalizedSortProperty({ segments: ['title'], - config: sanitizeConfig(config), + config, fields: [ { name: 'title', @@ -45,7 +47,7 @@ describe('get localized sort property', () => { it('keeps specifically asked-for localized sort properties', () => { const result = getLocalizedSortProperty({ segments: ['title', 'es'], - config: sanitizeConfig(config), + config, fields: [ { name: 'title', @@ -62,7 +64,7 @@ describe('get localized sort property', () => { it('properly localizes nested sort properties', () => { const result = getLocalizedSortProperty({ segments: ['group', 'title'], - config: sanitizeConfig(config), + config, fields: [ { name: 'group', @@ -85,7 +87,7 @@ describe('get localized sort property', () => { it('keeps requested locale with nested sort properties', () => { const result = getLocalizedSortProperty({ segments: ['group', 'title', 'es'], - config: sanitizeConfig(config), + config, fields: [ { name: 'group', @@ -108,7 +110,7 @@ describe('get localized sort property', () => { it('properly localizes field within row', () => { const result = getLocalizedSortProperty({ segments: ['title'], - config: sanitizeConfig(config), + config, fields: [ { type: 'row', @@ -130,7 +132,7 @@ describe('get localized sort property', () => { it('properly localizes field within named tab', () => { const result = getLocalizedSortProperty({ segments: ['tab', 'title'], - config: sanitizeConfig(config), + config, fields: [ { type: 'tabs', @@ -157,7 +159,7 @@ describe('get localized sort property', () => { it('properly localizes field within unnamed tab', () => { const result = getLocalizedSortProperty({ segments: ['title'], - config: sanitizeConfig(config), + config, fields: [ { type: 'tabs', diff --git a/packages/plugin-sentry/src/plugin.spec.ts b/packages/plugin-sentry/src/plugin.spec.ts index 1cb3056ffa..83318dacce 100644 --- a/packages/plugin-sentry/src/plugin.spec.ts +++ b/packages/plugin-sentry/src/plugin.spec.ts @@ -34,13 +34,11 @@ describe('plugin', () => { }) function assertPluginRan(config: Config) { - expect(config.admin?.webpack).toBeDefined() expect(config.hooks?.afterError).toBeDefined() expect(config.onInit).toBeDefined() } function assertPluginDidNotRun(config: Config) { - expect(config.admin?.webpack).toBeDefined() expect(config.hooks?.afterError).toBeUndefined() expect(config.onInit).toBeUndefined() } From 9841731ae7ceb00ed143acdef19a487103af92bf Mon Sep 17 00:00:00 2001 From: Alessio Gravili Date: Wed, 10 Apr 2024 09:51:46 -0400 Subject: [PATCH 050/177] feat: properly type withPayload (#5756) --- packages/next/src/withPayload.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/next/src/withPayload.js b/packages/next/src/withPayload.js index db8e1fbbe1..d4c1ad4568 100644 --- a/packages/next/src/withPayload.js +++ b/packages/next/src/withPayload.js @@ -1,4 +1,8 @@ -/** @type {import('next').NextConfig} */ +/** + * @param {import('next').NextConfig} nextConfig + * + * @returns {import('next').NextConfig} + * */ const withPayload = (nextConfig = {}) => { return { ...nextConfig, From 68989a58a8e70337fd7f608fc07a0599833fbad8 Mon Sep 17 00:00:00 2001 From: Alessio Gravili Date: Wed, 10 Apr 2024 10:56:07 -0400 Subject: [PATCH 051/177] fix: undo changing baseBlockFields types to FieldWithRichTextRequiredEditor --- packages/payload/src/fields/baseFields/baseBlockFields.ts | 4 ++-- .../src/field/features/blocks/feature.server.ts | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/payload/src/fields/baseFields/baseBlockFields.ts b/packages/payload/src/fields/baseFields/baseBlockFields.ts index 2e52967a58..34faab1daa 100644 --- a/packages/payload/src/fields/baseFields/baseBlockFields.ts +++ b/packages/payload/src/fields/baseFields/baseBlockFields.ts @@ -1,8 +1,8 @@ -import type { FieldWithRichTextRequiredEditor } from '../config/types.js' +import type { Field } from '../config/types.js' import { baseIDField } from './baseIDField.js' -export const baseBlockFields: FieldWithRichTextRequiredEditor[] = [ +export const baseBlockFields: Field[] = [ baseIDField, { name: 'blockName', diff --git a/packages/richtext-lexical/src/field/features/blocks/feature.server.ts b/packages/richtext-lexical/src/field/features/blocks/feature.server.ts index 24b7bc7c44..7fcdb60c9b 100644 --- a/packages/richtext-lexical/src/field/features/blocks/feature.server.ts +++ b/packages/richtext-lexical/src/field/features/blocks/feature.server.ts @@ -32,7 +32,8 @@ export const BlocksFeature: FeatureProviderProviderServer< return { ...blockCopy, - fields: blockCopy.fields.concat(baseBlockFields), + // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion + fields: blockCopy.fields.concat(baseBlockFields as FieldWithRichTextRequiredEditor[]), labels: !blockCopy.labels ? formatLabels(blockCopy.slug) : blockCopy.labels, } }) From a73eaf5d37dfbf106b1eee9bdf127c22ceedaf57 Mon Sep 17 00:00:00 2001 From: Alessio Gravili Date: Wed, 10 Apr 2024 11:07:01 -0400 Subject: [PATCH 052/177] chore: fix test suite types, add LexicalBlock type --- .../field/features/blocks/feature.server.ts | 10 ++++----- packages/richtext-lexical/src/index.ts | 6 +++++- test/fields/collections/Lexical/blocks.ts | 21 ++++++++++--------- test/fields/collections/RichText/blocks.ts | 10 ++++----- 4 files changed, 26 insertions(+), 21 deletions(-) diff --git a/packages/richtext-lexical/src/field/features/blocks/feature.server.ts b/packages/richtext-lexical/src/field/features/blocks/feature.server.ts index 7fcdb60c9b..a31b75bfa6 100644 --- a/packages/richtext-lexical/src/field/features/blocks/feature.server.ts +++ b/packages/richtext-lexical/src/field/features/blocks/feature.server.ts @@ -12,12 +12,12 @@ import { BlockNode } from './nodes/BlocksNode.js' import { blockPopulationPromiseHOC } from './populationPromise.js' import { blockValidationHOC } from './validate.js' +export type LexicalBlock = Omit & { + fields: FieldWithRichTextRequiredEditor[] +} + export type BlocksFeatureProps = { - blocks: Array< - Omit & { - fields: FieldWithRichTextRequiredEditor[] - } - > + blocks: LexicalBlock[] } export const BlocksFeature: FeatureProviderProviderServer< diff --git a/packages/richtext-lexical/src/index.ts b/packages/richtext-lexical/src/index.ts index a5dd3fe601..ff683312db 100644 --- a/packages/richtext-lexical/src/index.ts +++ b/packages/richtext-lexical/src/index.ts @@ -212,7 +212,11 @@ export function lexicalEditor(props?: LexicalEditorProps): LexicalRichTextAdapte export { AlignFeature } from './field/features/align/feature.server.js' export { BlockQuoteFeature } from './field/features/blockquote/feature.server.js' -export { BlocksFeature, type BlocksFeatureProps } from './field/features/blocks/feature.server.js' +export { + BlocksFeature, + type BlocksFeatureProps, + type LexicalBlock, +} from './field/features/blocks/feature.server.js' export { $createBlockNode, $isBlockNode, diff --git a/test/fields/collections/Lexical/blocks.ts b/test/fields/collections/Lexical/blocks.ts index 768b2c9093..15ae911f01 100644 --- a/test/fields/collections/Lexical/blocks.ts +++ b/test/fields/collections/Lexical/blocks.ts @@ -1,4 +1,5 @@ -import type { ArrayField, Block } from 'payload/types' +import type { LexicalBlock } from '@payloadcms/richtext-lexical' +import type { ArrayField } from 'payload/types' import { lexicalEditor } from '@payloadcms/richtext-lexical' @@ -29,7 +30,7 @@ export const BlockColumns = ({ name }: { name: string }): ArrayField => ({ }, ], }) -export const ConditionalLayoutBlock: Block = { +export const ConditionalLayoutBlock: LexicalBlock = { fields: [ { label: 'Layout', @@ -73,7 +74,7 @@ export const ConditionalLayoutBlock: Block = { slug: 'conditionalLayout', } -export const TextBlock: Block = { +export const TextBlock: LexicalBlock = { fields: [ { name: 'text', @@ -84,7 +85,7 @@ export const TextBlock: Block = { slug: 'text', } -export const RadioButtonsBlock: Block = { +export const RadioButtonsBlock: LexicalBlock = { interfaceName: 'LexicalBlocksRadioButtonsBlock', fields: [ { @@ -109,7 +110,7 @@ export const RadioButtonsBlock: Block = { slug: 'radioButtons', } -export const RichTextBlock: Block = { +export const RichTextBlock: LexicalBlock = { fields: [ { name: 'richText', @@ -120,7 +121,7 @@ export const RichTextBlock: Block = { slug: 'richText', } -export const UploadAndRichTextBlock: Block = { +export const UploadAndRichTextBlock: LexicalBlock = { fields: [ { name: 'upload', @@ -137,7 +138,7 @@ export const UploadAndRichTextBlock: Block = { slug: 'uploadAndRichText', } -export const RelationshipHasManyBlock: Block = { +export const RelationshipHasManyBlock: LexicalBlock = { fields: [ { name: 'rel', @@ -149,7 +150,7 @@ export const RelationshipHasManyBlock: Block = { ], slug: 'relationshipHasManyBlock', } -export const RelationshipBlock: Block = { +export const RelationshipBlock: LexicalBlock = { fields: [ { name: 'rel', @@ -161,7 +162,7 @@ export const RelationshipBlock: Block = { slug: 'relationshipBlock', } -export const SelectFieldBlock: Block = { +export const SelectFieldBlock: LexicalBlock = { fields: [ { name: 'select', @@ -193,7 +194,7 @@ export const SelectFieldBlock: Block = { slug: 'select', } -export const SubBlockBlock: Block = { +export const SubBlockBlock: LexicalBlock = { slug: 'subBlock', fields: [ { diff --git a/test/fields/collections/RichText/blocks.ts b/test/fields/collections/RichText/blocks.ts index 13e3d20eac..a6207b1956 100644 --- a/test/fields/collections/RichText/blocks.ts +++ b/test/fields/collections/RichText/blocks.ts @@ -1,8 +1,8 @@ -import type { Block } from 'payload/types' +import type { LexicalBlock } from '@payloadcms/richtext-lexical' import { lexicalEditor } from '@payloadcms/richtext-lexical' -export const TextBlock: Block = { +export const TextBlock: LexicalBlock = { fields: [ { name: 'text', @@ -13,7 +13,7 @@ export const TextBlock: Block = { slug: 'text', } -export const UploadAndRichTextBlock: Block = { +export const UploadAndRichTextBlock: LexicalBlock = { fields: [ { name: 'upload', @@ -30,7 +30,7 @@ export const UploadAndRichTextBlock: Block = { slug: 'uploadAndRichText', } -export const RelationshipBlock: Block = { +export const RelationshipBlock: LexicalBlock = { fields: [ { name: 'rel', @@ -42,7 +42,7 @@ export const RelationshipBlock: Block = { slug: 'relationshipBlock', } -export const SelectFieldBlock: Block = { +export const SelectFieldBlock: LexicalBlock = { fields: [ { name: 'select', From 7c1c840a59d98604a7aaa25f4effa0622913c213 Mon Sep 17 00:00:00 2001 From: Alessio Gravili Date: Wed, 10 Apr 2024 11:22:17 -0400 Subject: [PATCH 053/177] chore: increase admin e2e beforeAll timeout, as prebuild sometimes takes longer than the timeout --- test/admin/e2e.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/admin/e2e.spec.ts b/test/admin/e2e.spec.ts index db2e7d3058..7601c8843d 100644 --- a/test/admin/e2e.spec.ts +++ b/test/admin/e2e.spec.ts @@ -75,7 +75,7 @@ describe('admin', () => { beforeAll(async ({ browser }, testInfo) => { const prebuild = Boolean(process.env.CI) - if (prebuild) testInfo.setTimeout(testInfo.timeout * 2) + if (prebuild) testInfo.setTimeout(testInfo.timeout * 3) process.env.SEED_IN_CONFIG_ONINIT = 'false' // Makes it so the payload config onInit seed is not run. Otherwise, the seed would be run unnecessarily twice for the initial test run - once for beforeEach and once for onInit ;({ payload, serverURL } = await initPayloadE2ENoConfig({ From 3677a59a788dd4703180e1a6fa32c78d147c7089 Mon Sep 17 00:00:00 2001 From: Elliot DeNolf Date: Wed, 10 Apr 2024 11:25:54 -0400 Subject: [PATCH 054/177] fix(cpa): dependency tag (#5768) --- packages/create-payload-app/src/lib/init-next.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/create-payload-app/src/lib/init-next.ts b/packages/create-payload-app/src/lib/init-next.ts index b8374ef745..f7c1e980f9 100644 --- a/packages/create-payload-app/src/lib/init-next.ts +++ b/packages/create-payload-app/src/lib/init-next.ts @@ -191,10 +191,10 @@ function installAndConfigurePayload( async function installDeps(projectDir: string, packageManager: PackageManager, dbType: DbType) { const packagesToInstall = ['payload', '@payloadcms/next', '@payloadcms/richtext-lexical'].map( - (pkg) => `${pkg}@alpha`, + (pkg) => `${pkg}@beta`, ) - packagesToInstall.push(`@payloadcms/db-${dbType}@alpha`) + packagesToInstall.push(`@payloadcms/db-${dbType}@beta`) let exitCode = 0 switch (packageManager) { From 14498e8a9ccc35728ca5a3cb2e31d6ed3659b721 Mon Sep 17 00:00:00 2001 From: Patrik Date: Wed, 10 Apr 2024 11:42:03 -0400 Subject: [PATCH 055/177] fix(ui): avoids getting and setting doc preferences when creating new (#5758) --- packages/ui/src/fields/Collapsible/index.tsx | 55 +++++++++++-------- packages/ui/src/fields/Tabs/index.tsx | 58 +++++++++++--------- 2 files changed, 62 insertions(+), 51 deletions(-) diff --git a/packages/ui/src/fields/Collapsible/index.tsx b/packages/ui/src/fields/Collapsible/index.tsx index 6dc0084a31..f9e66ce555 100644 --- a/packages/ui/src/fields/Collapsible/index.tsx +++ b/packages/ui/src/fields/Collapsible/index.tsx @@ -67,40 +67,47 @@ const CollapsibleField: React.FC = (props) => { async (newCollapsedState: boolean) => { const existingPreferences: DocumentPreferences = await getPreference(preferencesKey) - void setPreference(preferencesKey, { - ...existingPreferences, - ...(path - ? { - fields: { - ...(existingPreferences?.fields || {}), - [path]: { - ...existingPreferences?.fields?.[path], - collapsed: newCollapsedState, + if (preferencesKey) { + void setPreference(preferencesKey, { + ...existingPreferences, + ...(path + ? { + fields: { + ...(existingPreferences?.fields || {}), + [path]: { + ...existingPreferences?.fields?.[path], + collapsed: newCollapsedState, + }, }, - }, - } - : { - fields: { - ...(existingPreferences?.fields || {}), - [fieldPreferencesKey]: { - ...existingPreferences?.fields?.[fieldPreferencesKey], - collapsed: newCollapsedState, + } + : { + fields: { + ...(existingPreferences?.fields || {}), + [fieldPreferencesKey]: { + ...existingPreferences?.fields?.[fieldPreferencesKey], + collapsed: newCollapsedState, + }, }, - }, - }), - }) + }), + }) + } }, [preferencesKey, fieldPreferencesKey, getPreference, setPreference, path], ) useEffect(() => { const fetchInitialState = async () => { - const preferences = await getPreference(preferencesKey) - if (preferences) { - const initCollapsedFromPref = path + if (preferencesKey) { + const preferences = await getPreference(preferencesKey) + const specificPreference = path ? preferences?.fields?.[path]?.collapsed : preferences?.fields?.[fieldPreferencesKey]?.collapsed - setCollapsedOnMount(Boolean(initCollapsedFromPref)) + + if (specificPreference !== undefined) { + setCollapsedOnMount(Boolean(specificPreference)) + } else { + setCollapsedOnMount(typeof initCollapsed === 'boolean' ? initCollapsed : false) + } } else { setCollapsedOnMount(typeof initCollapsed === 'boolean' ? initCollapsed : false) } diff --git a/packages/ui/src/fields/Tabs/index.tsx b/packages/ui/src/fields/Tabs/index.tsx index 2a20413b93..a09078b493 100644 --- a/packages/ui/src/fields/Tabs/index.tsx +++ b/packages/ui/src/fields/Tabs/index.tsx @@ -64,14 +64,16 @@ const TabsField: React.FC = (props) => { const tabsPrefKey = `tabs-${indexPath}` useEffect(() => { - const getInitialPref = async () => { - const existingPreferences: DocumentPreferences = await getPreference(preferencesKey) - const initialIndex = path - ? existingPreferences?.fields?.[path]?.tabIndex - : existingPreferences?.fields?.[tabsPrefKey]?.tabIndex - setActiveTabIndex(initialIndex || 0) + if (preferencesKey) { + const getInitialPref = async () => { + const existingPreferences: DocumentPreferences = await getPreference(preferencesKey) + const initialIndex = path + ? existingPreferences?.fields?.[path]?.tabIndex + : existingPreferences?.fields?.[tabsPrefKey]?.tabIndex + setActiveTabIndex(initialIndex || 0) + } + void getInitialPref() } - void getInitialPref() }, [path, getPreference, preferencesKey, tabsPrefKey]) const handleTabChange = useCallback( @@ -80,28 +82,30 @@ const TabsField: React.FC = (props) => { const existingPreferences: DocumentPreferences = await getPreference(preferencesKey) - void setPreference(preferencesKey, { - ...existingPreferences, - ...(path - ? { - fields: { - ...(existingPreferences?.fields || {}), - [path]: { - ...existingPreferences?.fields?.[path], - tabIndex: incomingTabIndex, + if (preferencesKey) { + void setPreference(preferencesKey, { + ...existingPreferences, + ...(path + ? { + fields: { + ...(existingPreferences?.fields || {}), + [path]: { + ...existingPreferences?.fields?.[path], + tabIndex: incomingTabIndex, + }, }, - }, - } - : { - fields: { - ...existingPreferences?.fields, - [tabsPrefKey]: { - ...existingPreferences?.fields?.[tabsPrefKey], - tabIndex: incomingTabIndex, + } + : { + fields: { + ...existingPreferences?.fields, + [tabsPrefKey]: { + ...existingPreferences?.fields?.[tabsPrefKey], + tabIndex: incomingTabIndex, + }, }, - }, - }), - }) + }), + }) + } }, [preferencesKey, getPreference, setPreference, path, tabsPrefKey], ) From 2deeb61f173e28d343ef00381649daeb93e9e530 Mon Sep 17 00:00:00 2001 From: Jarrod Flesch <30633324+JarrodMFlesch@users.noreply.github.com> Date: Wed, 10 Apr 2024 13:05:30 -0400 Subject: [PATCH 056/177] fix: locale switcher flakey test (#5761) --- test/admin/e2e.spec.ts | 2 +- test/fields/e2e.spec.ts | 46 +++++++++++++++-------------------- test/helpers.ts | 24 ++++++++++++------ test/live-preview/e2e.spec.ts | 31 +++++++---------------- test/localization/e2e.spec.ts | 14 +++++------ 5 files changed, 52 insertions(+), 65 deletions(-) diff --git a/test/admin/e2e.spec.ts b/test/admin/e2e.spec.ts index 7601c8843d..0e2e4d36dc 100644 --- a/test/admin/e2e.spec.ts +++ b/test/admin/e2e.spec.ts @@ -430,7 +430,7 @@ describe('admin', () => { const { id } = await createPost() await page.goto(postsUrl.edit(id)) await page.locator('#field-title')?.fill('') - expect(await page.locator('.doc-header__title.render-title')?.innerText()).toContain('ID:') + await expect(page.locator('.doc-header__title.render-title:has-text("ID:")')).toBeVisible() await saveDocAndAssert(page) }) diff --git a/test/fields/e2e.spec.ts b/test/fields/e2e.spec.ts index 33a1fdb367..b44855585a 100644 --- a/test/fields/e2e.spec.ts +++ b/test/fields/e2e.spec.ts @@ -11,7 +11,9 @@ import type { Config } from './payload-types.js' import { ensureAutoLoginAndCompilationIsDone, initPageConsoleErrorCatch, + navigateToListCellLink, saveDocAndAssert, + switchTab, } from '../helpers.js' import { AdminUrlUtil } from '../helpers/adminUrlUtil.js' import { initPayloadE2ENoConfig } from '../helpers/initPayloadE2ENoConfig.js' @@ -34,11 +36,7 @@ let serverURL: string // If we want to make this run in parallel: test.describe.configure({ mode: 'parallel' }) describe('fields', () => { - beforeAll(async ({ browser }, testInfo) => { - // const prebuild = Boolean(process.env.CI) - - // if (prebuild) testInfo.setTimeout(testInfo.timeout * 3) - + beforeAll(async ({ browser }) => { process.env.SEED_IN_CONFIG_ONINIT = 'false' // Makes it so the payload config onInit seed is not run. Otherwise, the seed would be run unnecessarily twice for the initial test run - once for beforeEach and once for onInit ;({ payload, serverURL } = await initPayloadE2ENoConfig({ dirname, @@ -542,20 +540,17 @@ describe('fields', () => { const jsonValue = '{ "foo": "bar"}' await page.goto(url.create) + await page.waitForURL(url.create) - await wait(1000) - - await page.locator('.tabs-field__tab-button:has-text("Tab with Row")').click() + await switchTab(page, '.tabs-field__tab-button:has-text("Tab with Row")') await page.locator('#field-textInRow').fill(textInRowValue) await page.locator('#field-numberInRow').fill(numberInRowValue) await page.locator('.json-field .inputarea').fill(jsonValue) await wait(300) - await page.locator('.tabs-field__tab-button:has-text("Tab with Array")').click() - await page.locator('.tabs-field__tab-button:has-text("Tab with Row")').click() - - await wait(100) + await switchTab(page, '.tabs-field__tab-button:has-text("Tab with Array")') + await switchTab(page, '.tabs-field__tab-button:has-text("Tab with Row")') await expect(page.locator('#field-textInRow')).toHaveValue(textInRowValue) await expect(page.locator('#field-numberInRow')).toHaveValue(numberInRowValue) @@ -566,46 +561,43 @@ describe('fields', () => { const textInRowValue = 'new value' const jsonValue = '{ "new": "value"}' await page.goto(url.list) - await page.locator('.cell-id a').click() - - await wait(500) + await navigateToListCellLink(page) // Go to Row tab, update the value - await page.locator('.tabs-field__tab-button:has-text("Tab with Row")').click() + await switchTab(page, '.tabs-field__tab-button:has-text("Tab with Row")') + await page.locator('#field-textInRow').fill(textInRowValue) await page.locator('.json-field .inputarea').fill(jsonValue) await wait(500) // Go to Array tab, then back to Row. Make sure new value is still there - await page.locator('.tabs-field__tab-button:has-text("Tab with Array")').click() - await page.locator('.tabs-field__tab-button:has-text("Tab with Row")').click() + await switchTab(page, '.tabs-field__tab-button:has-text("Tab with Array")') + await switchTab(page, '.tabs-field__tab-button:has-text("Tab with Row")') await expect(page.locator('#field-textInRow')).toHaveValue(textInRowValue) await expect(page.locator('.json-field .lines-content')).toContainText(jsonValue) // Go to array tab, save the doc - await page.locator('.tabs-field__tab-button:has-text("Tab with Array")').click() - await page.click('#action-save', { delay: 100 }) - - await wait(500) + await switchTab(page, '.tabs-field__tab-button:has-text("Tab with Array")') + await saveDocAndAssert(page) // Go back to row tab, make sure the new value is still present - await page.locator('.tabs-field__tab-button:has-text("Tab with Row")').click() + await switchTab(page, '.tabs-field__tab-button:has-text("Tab with Row")') await expect(page.locator('#field-textInRow')).toHaveValue(textInRowValue) }) test('should render array data within unnamed tabs', async () => { await page.goto(url.list) - await page.locator('.cell-id a').click() - await page.locator('.tabs-field__tab-button:has-text("Tab with Array")').click() + await navigateToListCellLink(page) + await switchTab(page, '.tabs-field__tab-button:has-text("Tab with Array")') await expect(page.locator('#field-array__0__text')).toHaveValue("Hello, I'm the first row") }) test('should render array data within named tabs', async () => { await page.goto(url.list) - await page.locator('.cell-id a').click() - await page.locator('.tabs-field__tab-button:nth-child(5)').click() + await navigateToListCellLink(page) + await switchTab(page, '.tabs-field__tab-button:nth-child(5)') await expect(page.locator('#field-tab__array__0__text')).toHaveValue( "Hello, I'm the first row, in a named tab", ) diff --git a/test/helpers.ts b/test/helpers.ts index f9fb38d65f..7ae6847d00 100644 --- a/test/helpers.ts +++ b/test/helpers.ts @@ -141,11 +141,10 @@ export async function openDocControls(page: Page): Promise { await expect(page.locator('.doc-controls__popup >> .popup__content')).toBeVisible() } -export async function changeLocale(page: Page, newLocale: string, skipURLCheck: boolean = false) { +export async function changeLocale(page: Page, newLocale: string) { await page.locator('.localizer >> button').first().click() await page - .locator(`.localizer`) - .locator(`.popup >> button`, { + .locator(`.localizer .popup.popup--active .popup-button-list button`, { hasText: newLocale, }) .first() @@ -153,11 +152,7 @@ export async function changeLocale(page: Page, newLocale: string, skipURLCheck: const regexPattern = new RegExp(`locale=${newLocale}`) - if (skipURLCheck) { - await wait(500) - } else { - await expect(page).toHaveURL(regexPattern) - } + await expect(page).toHaveURL(regexPattern) } export function exactText(text: string) { @@ -196,12 +191,25 @@ export const findTableCell = (page: Page, fieldName: string, rowTitle?: string): return cell } +export async function navigateToListCellLink(page: Page, selector = '.cell-id') { + const cellLink = page.locator(`${selector} a`).first() + const linkURL = await cellLink.getAttribute('href') + await cellLink.click() + await page.waitForURL(`**${linkURL}`) +} + export const findTableRow = (page: Page, title: string): Locator => { const row = page.locator(`tbody tr:has-text("${title}")`) expect(row).toBeTruthy() return row } +export async function switchTab(page: Page, selector: string) { + await page.locator(selector).click() + await wait(300) + await expect(page.locator(`${selector}.tabs-field__tab-button--active`)).toBeVisible() +} + /** * Throws an error when browser console error messages (with some exceptions) are thrown, thus resulting * in the e2e test failing. diff --git a/test/live-preview/e2e.spec.ts b/test/live-preview/e2e.spec.ts index 38d8e3413b..02b0cb15cf 100644 --- a/test/live-preview/e2e.spec.ts +++ b/test/live-preview/e2e.spec.ts @@ -8,6 +8,7 @@ import { ensureAutoLoginAndCompilationIsDone, exactText, initPageConsoleErrorCatch, + navigateToListCellLink, saveDocAndAssert, } from '../helpers.js' import { AdminUrlUtil } from '../helpers/adminUrlUtil.js' @@ -26,25 +27,21 @@ describe('Live Preview', () => { const goToDoc = async (page: Page) => { await page.goto(url.list) - const linkToDoc = page.locator('tbody tr:first-child .cell-id a').first() - - await expect(() => expect(linkToDoc).toBeTruthy()).toPass({ timeout: POLL_TOPASS_TIMEOUT }) - const linkDocHref = await linkToDoc.getAttribute('href') - - await linkToDoc.click() - - await page.waitForURL(`**${linkDocHref}`) + await page.waitForURL(url.list) + await navigateToListCellLink(page) } const goToCollectionPreview = async (page: Page): Promise => { await goToDoc(page) await page.goto(`${page.url()}/preview`) + await page.waitForURL(`**/preview`) } const goToGlobalPreview = async (page: Page, slug: string): Promise => { const global = new AdminUrlUtil(serverURL, slug) const previewURL = `${global.global(slug)}/preview` await page.goto(previewURL) + await page.waitForURL(previewURL) } beforeAll(async ({ browser }) => { @@ -78,12 +75,9 @@ describe('Live Preview', () => { test('collection — has route', async () => { await goToDoc(page) - const url = page.url() await goToCollectionPreview(page) - await expect(() => expect(page.url()).toBe(`${url}/preview`)).toPass({ - timeout: POLL_TOPASS_TIMEOUT, - }) + await expect(page.locator('.live-preview')).toBeVisible() }) test('collection — renders iframe', async () => { @@ -127,6 +121,7 @@ describe('Live Preview', () => { test('global — has tab', async () => { const global = new AdminUrlUtil(serverURL, 'header') await page.goto(global.global('header')) + await page.waitForURL(global.global('header')) const docURL = page.url() const pathname = new URL(docURL).pathname @@ -169,17 +164,13 @@ describe('Live Preview', () => { test('properly measures iframe and displays size', async () => { await page.goto(url.create) + await page.waitForURL(url.create) await page.locator('#field-title').fill('Title 3') await page.locator('#field-slug').fill('slug-3') await saveDocAndAssert(page) - await goToCollectionPreview(page) - await expect(() => expect(page.url()).toContain('/preview')).toPass({ - timeout: POLL_TOPASS_TIMEOUT, - }) - const iframe = page.locator('iframe') // Measure the actual iframe size and compare it with the inputs rendered in the toolbar @@ -222,17 +213,13 @@ describe('Live Preview', () => { test('resizes iframe to specified breakpoint', async () => { await page.goto(url.create) - await expect.poll(() => page.url(), { timeout: POLL_TOPASS_TIMEOUT }).toContain('create') + await page.waitForURL(url.create) await page.locator('#field-title').fill('Title 4') await page.locator('#field-slug').fill('slug-4') await saveDocAndAssert(page) await goToCollectionPreview(page) - await expect(() => expect(page.url()).toContain('/preview')).toPass({ - timeout: POLL_TOPASS_TIMEOUT, - }) - // Check that the breakpoint select is present const breakpointSelector = page.locator( '.live-preview-toolbar-controls__breakpoint button.popup-button', diff --git a/test/localization/e2e.spec.ts b/test/localization/e2e.spec.ts index 81c1bdb49c..b603d0b959 100644 --- a/test/localization/e2e.spec.ts +++ b/test/localization/e2e.spec.ts @@ -86,7 +86,7 @@ describe('Localization', () => { await fillValues({ description, title: spanishTitle }) await saveDocAndAssert(page) - await changeLocale(page, defaultLocale, true) + await changeLocale(page, defaultLocale) // Expect english title await expect(page.locator('#field-title')).toHaveValue(title) @@ -105,7 +105,7 @@ describe('Localization', () => { await saveDocAndAssert(page) // Change back to English - await changeLocale(page, defaultLocale, true) + await changeLocale(page, defaultLocale) // Localized field should not be populated await expect(page.locator('#field-title')).toBeEmpty() @@ -133,7 +133,7 @@ describe('Localization', () => { await saveDocAndAssert(page) // Change back to English - await changeLocale(page, defaultLocale, true) + await changeLocale(page, defaultLocale) // Localized field should not be populated await expect(page.locator('#field-title')).toBeEmpty() @@ -191,9 +191,9 @@ describe('Localization', () => { test('should duplicate localized checkbox correctly', async () => { await page.goto(url.create) - await page.waitForURL(`**${url.create}`) + await page.waitForURL(url.create) - //await changeLocale(page, defaultLocale, true) + await changeLocale(page, defaultLocale) await fillValues({ description, title: englishTitle }) await page.locator('#field-localizedCheckbox').click() @@ -207,7 +207,7 @@ describe('Localization', () => { await expect(page.locator('#field-localizedCheckbox')).not.toBeChecked() // duplicate doc - await changeLocale(page, defaultLocale, true) + await changeLocale(page, defaultLocale) await openDocControls(page) await page.locator('#action-duplicate').click() @@ -225,7 +225,7 @@ describe('Localization', () => { test('should duplicate even if missing some localized data', async () => { // create a localized required doc await page.goto(urlWithRequiredLocalizedFields.create) - await changeLocale(page, defaultLocale, true) + await changeLocale(page, defaultLocale) await page.locator('#field-title').fill(englishTitle) await page.locator('#field-layout .blocks-field__drawer-toggler').click() await page.locator('button[title="Text"]').click() From 364e9832ac82ff39238f8d4b8a833c60a139ff88 Mon Sep 17 00:00:00 2001 From: Jarrod Flesch <30633324+JarrodMFlesch@users.noreply.github.com> Date: Wed, 10 Apr 2024 13:05:56 -0400 Subject: [PATCH 057/177] fix(next): ensures requested lang header is supported (#5765) --- packages/next/src/exports/utilities.ts | 2 +- packages/next/src/utilities/getNextI18n.ts | 20 ---------------- .../next/src/utilities/getNextRequestI18n.ts | 19 +++++++++++++++ .../next/src/utilities/getRequestLanguage.ts | 24 ++++++++++++------- .../src/views/Document/getMetaBySegment.tsx | 4 ++-- packages/next/src/views/NotFound/index.tsx | 4 ++-- packages/next/src/views/Root/meta.ts | 4 ++-- packages/translations/src/exports/index.ts | 2 +- .../translations/src/utilities/languages.ts | 2 +- 9 files changed, 43 insertions(+), 38 deletions(-) delete mode 100644 packages/next/src/utilities/getNextI18n.ts create mode 100644 packages/next/src/utilities/getNextRequestI18n.ts diff --git a/packages/next/src/exports/utilities.ts b/packages/next/src/exports/utilities.ts index 4d71645a14..4937507d59 100644 --- a/packages/next/src/exports/utilities.ts +++ b/packages/next/src/exports/utilities.ts @@ -1,2 +1,2 @@ -export { getNextI18n } from '../utilities/getNextI18n.js' +export { getNextRequestI18n } from '../utilities/getNextRequestI18n.js' export { getPayloadHMR } from '../utilities/getPayloadHMR.js' diff --git a/packages/next/src/utilities/getNextI18n.ts b/packages/next/src/utilities/getNextI18n.ts deleted file mode 100644 index e93b50fa2a..0000000000 --- a/packages/next/src/utilities/getNextI18n.ts +++ /dev/null @@ -1,20 +0,0 @@ -import type { AcceptedLanguages, I18n } from '@payloadcms/translations' -import type { SanitizedConfig } from 'payload/types' - -import { initI18n } from '@payloadcms/translations' -import { cookies, headers } from 'next/headers.js' - -import { getRequestLanguage } from './getRequestLanguage.js' - -export const getNextI18n = async ({ - config, - language, -}: { - config: SanitizedConfig - language?: AcceptedLanguages -}): Promise => - initI18n({ - config: config.i18n, - context: 'client', - language: language || getRequestLanguage({ config, cookies: cookies(), headers: headers() }), - }) diff --git a/packages/next/src/utilities/getNextRequestI18n.ts b/packages/next/src/utilities/getNextRequestI18n.ts new file mode 100644 index 0000000000..79b7a7d97b --- /dev/null +++ b/packages/next/src/utilities/getNextRequestI18n.ts @@ -0,0 +1,19 @@ +import type { I18n } from '@payloadcms/translations' +import type { SanitizedConfig } from 'payload/types' + +import { initI18n } from '@payloadcms/translations' +import { cookies, headers } from 'next/headers.js' + +import { getRequestLanguage } from './getRequestLanguage.js' + +/** + * In the context of NextJS, this function initializes the i18n object for the current request. + * + * It must be called on the server side, and within the lifecycle of a request since it relies on the request headers and cookies. + */ +export const getNextRequestI18n = async ({ config }: { config: SanitizedConfig }): Promise => + initI18n({ + config: config.i18n, + context: 'client', + language: getRequestLanguage({ config, cookies: cookies(), headers: headers() }), + }) diff --git a/packages/next/src/utilities/getRequestLanguage.ts b/packages/next/src/utilities/getRequestLanguage.ts index 0adf954e8a..018f07290e 100644 --- a/packages/next/src/utilities/getRequestLanguage.ts +++ b/packages/next/src/utilities/getRequestLanguage.ts @@ -2,7 +2,7 @@ import type { AcceptedLanguages } from '@payloadcms/translations' import type { ReadonlyRequestCookies } from 'next/dist/server/web/spec-extension/adapters/request-cookies.js' import type { SanitizedConfig } from 'payload/config' -import { matchLanguage } from '@payloadcms/translations' +import { extractHeaderLanguage } from '@payloadcms/translations' type GetRequestLanguageArgs = { config: SanitizedConfig @@ -17,14 +17,20 @@ export const getRequestLanguage = ({ defaultLanguage = 'en', headers, }: GetRequestLanguageArgs): AcceptedLanguages => { - const acceptLanguage = headers.get('Accept-Language') - const cookieLanguage = cookies.get(`${config.cookiePrefix || 'payload'}-lng`) + const langCookie = cookies.get(`${config.cookiePrefix || 'payload'}-lng`) + const languageFromCookie = typeof langCookie === 'string' ? langCookie : langCookie?.value + const languageFromHeader = extractHeaderLanguage(headers.get('Accept-Language')) + const fallbackLang = config?.i18n?.fallbackLanguage || defaultLanguage - const reqLanguage = - (typeof cookieLanguage === 'string' ? cookieLanguage : cookieLanguage?.value) || - acceptLanguage || - config.i18n.fallbackLanguage || - defaultLanguage + const supportedLanguageKeys = Object.keys(config?.i18n?.supportedLanguages || {}) - return matchLanguage(reqLanguage) || defaultLanguage + if (languageFromCookie && supportedLanguageKeys.includes(languageFromCookie)) { + return languageFromCookie as AcceptedLanguages + } + + if (languageFromHeader && supportedLanguageKeys.includes(languageFromHeader)) { + return languageFromHeader + } + + return supportedLanguageKeys.includes(fallbackLang) ? (fallbackLang as AcceptedLanguages) : 'en' } diff --git a/packages/next/src/views/Document/getMetaBySegment.tsx b/packages/next/src/views/Document/getMetaBySegment.tsx index dde140b5f8..34fa17f494 100644 --- a/packages/next/src/views/Document/getMetaBySegment.tsx +++ b/packages/next/src/views/Document/getMetaBySegment.tsx @@ -3,7 +3,7 @@ import type { SanitizedCollectionConfig, SanitizedGlobalConfig } from 'payload/t import type { GenerateViewMetadata } from '../Root/index.js' -import { getNextI18n } from '../../utilities/getNextI18n.js' +import { getNextRequestI18n } from '../../utilities/getNextRequestI18n.js' import { generateMetadata as apiMeta } from '../API/meta.js' import { generateMetadata as editMeta } from '../Edit/meta.js' import { generateMetadata as livePreviewMeta } from '../LivePreview/meta.js' @@ -89,7 +89,7 @@ export const getMetaBySegment: GenerateEditViewMetadata = async ({ } } - const i18n = await getNextI18n({ + const i18n = await getNextRequestI18n({ config, }) diff --git a/packages/next/src/views/NotFound/index.tsx b/packages/next/src/views/NotFound/index.tsx index 1424c94ccd..db51474294 100644 --- a/packages/next/src/views/NotFound/index.tsx +++ b/packages/next/src/views/NotFound/index.tsx @@ -6,8 +6,8 @@ import { HydrateClientUser } from '@payloadcms/ui/elements/HydrateClientUser' import { DefaultTemplate } from '@payloadcms/ui/templates/Default' import React, { Fragment } from 'react' +import { getNextRequestI18n } from '../../utilities/getNextRequestI18n.js' import { initPage } from '../../utilities/initPage.js' -import { getNextI18n } from '.././../utilities/getNextI18n.js' import { NotFoundClient } from './index.client.js' export const generatePageMetadata = async ({ @@ -19,7 +19,7 @@ export const generatePageMetadata = async ({ }): Promise => { const config = await configPromise - const i18n = await getNextI18n({ + const i18n = await getNextRequestI18n({ config, }) diff --git a/packages/next/src/views/Root/meta.ts b/packages/next/src/views/Root/meta.ts index dbbed934d6..496afe871a 100644 --- a/packages/next/src/views/Root/meta.ts +++ b/packages/next/src/views/Root/meta.ts @@ -1,7 +1,7 @@ import type { Metadata } from 'next' import type { SanitizedConfig } from 'payload/types' -import { getNextI18n } from '../../utilities/getNextI18n.js' +import { getNextRequestI18n } from '../../utilities/getNextRequestI18n.js' import { generateAccountMetadata } from '../Account/index.js' import { generateCreateFirstUserMetadata } from '../CreateFirstUser/index.js' import { generateDashboardMetadata } from '../Dashboard/index.js' @@ -49,7 +49,7 @@ export const generatePageMetadata = async ({ config: configPromise, params }: Ar const isGlobal = segmentOne === 'globals' const isCollection = segmentOne === 'collections' - const i18n = await getNextI18n({ + const i18n = await getNextRequestI18n({ config, }) diff --git a/packages/translations/src/exports/index.ts b/packages/translations/src/exports/index.ts index fa5c314f56..416cec3c0d 100644 --- a/packages/translations/src/exports/index.ts +++ b/packages/translations/src/exports/index.ts @@ -1,5 +1,5 @@ export { importDateFNSLocale } from '../importDateFNSLocale.js' export { getTranslation } from '../utilities/getTranslation.js' export { initI18n, t } from '../utilities/init.js' -export { acceptedLanguages, matchLanguage, rtlLanguages } from '../utilities/languages.js' +export { acceptedLanguages, extractHeaderLanguage, rtlLanguages } from '../utilities/languages.js' export type * from '../types.js' diff --git a/packages/translations/src/utilities/languages.ts b/packages/translations/src/utilities/languages.ts index 2822170741..ca9c98fa2a 100644 --- a/packages/translations/src/utilities/languages.ts +++ b/packages/translations/src/utilities/languages.ts @@ -149,7 +149,7 @@ function parseAcceptLanguage(acceptLanguageHeader: string): LanguagePreference[] .sort((a, b) => b.quality - a.quality) // Sort by quality, highest to lowest } -export function matchLanguage(acceptLanguageHeader: string): AcceptedLanguages | undefined { +export function extractHeaderLanguage(acceptLanguageHeader: string): AcceptedLanguages | undefined { const parsedHeader = parseAcceptLanguage(acceptLanguageHeader) let matchedLanguage: AcceptedLanguages From 8b2cf4705e2b2ff288e773dac7bae91cf214d6e1 Mon Sep 17 00:00:00 2001 From: James Date: Wed, 10 Apr 2024 12:01:16 -0400 Subject: [PATCH 058/177] chore: withPayload CJS --- packages/next/.swcrc-cjs | 15 +++++++++++++++ packages/next/package.json | 7 ++++--- packages/next/tsconfig.cjs.json | 13 +++++++++++++ tsconfig.json | 4 ++-- 4 files changed, 34 insertions(+), 5 deletions(-) create mode 100644 packages/next/.swcrc-cjs create mode 100644 packages/next/tsconfig.cjs.json diff --git a/packages/next/.swcrc-cjs b/packages/next/.swcrc-cjs new file mode 100644 index 0000000000..903575624a --- /dev/null +++ b/packages/next/.swcrc-cjs @@ -0,0 +1,15 @@ +{ + "$schema": "https://json.schemastore.org/swcrc", + "sourceMaps": true, + "jsc": { + "target": "esnext", + "parser": { + "syntax": "typescript", + "tsx": true, + "dts": true, + }, + }, + "module": { + "type": "commonjs", + }, +} diff --git a/packages/next/package.json b/packages/next/package.json index 125437a984..a064a2fe82 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -11,6 +11,7 @@ "directory": "packages/next" }, "scripts": { + "build:cjs": "swc ./src/withPayload.js -d ./dist/cjs --config-file .swcrc-cjs", "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", @@ -84,9 +85,9 @@ "require": "./dist/prod/styles.css", "default": "./dist/prod/styles.css" }, - ".": { - "import": "./dist/index.js", - "require": "./dist/index.js" + "./withPayload": { + "import": "./dist/withPayload.js", + "require": "./dist/cjs/withPayload.js" }, "./*": { "import": "./dist/exports/*.js", diff --git a/packages/next/tsconfig.cjs.json b/packages/next/tsconfig.cjs.json new file mode 100644 index 0000000000..9d16e08ea6 --- /dev/null +++ b/packages/next/tsconfig.cjs.json @@ -0,0 +1,13 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "module": "CommonJS", + "composite": true, // Required for references to work + "noEmit": false /* Do not emit outputs. */, + "emitDeclarationOnly": true, + "outDir": "./dist/cjs" /* Specify an output folder for all emitted files. */, + "rootDir": "./src" /* Specify the root folder within your source files. */, + "sourceMap": true + }, + "include": ["src/withPayload.js" /* Include the withPayload.js file in the build */] +} diff --git a/tsconfig.json b/tsconfig.json index 07cf2e3abc..d55001935b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -37,7 +37,7 @@ ], "paths": { "@payload-config": [ - "./test/fields/config.ts" + "./test/_community/config.ts" ], "@payloadcms/live-preview": [ "./packages/live-preview/src" @@ -161,4 +161,4 @@ ".next/types/**/*.ts", "scripts/**/*.ts" ] -} \ No newline at end of file +} From 9df8de2386cb0e73b26d973ead0c06aff754b52a Mon Sep 17 00:00:00 2001 From: Elliot DeNolf Date: Wed, 10 Apr 2024 13:21:07 -0400 Subject: [PATCH 059/177] chore: adjust exports --- packages/next/.swcrc-cjs | 8 ++++---- packages/next/package.json | 10 +++++++--- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/packages/next/.swcrc-cjs b/packages/next/.swcrc-cjs index 903575624a..8148972038 100644 --- a/packages/next/.swcrc-cjs +++ b/packages/next/.swcrc-cjs @@ -6,10 +6,10 @@ "parser": { "syntax": "typescript", "tsx": true, - "dts": true, - }, + "dts": true + } }, "module": { - "type": "commonjs", - }, + "type": "commonjs" + } } diff --git a/packages/next/package.json b/packages/next/package.json index a064a2fe82..c0f7c122fa 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -11,8 +11,8 @@ "directory": "packages/next" }, "scripts": { - "build:cjs": "swc ./src/withPayload.js -d ./dist/cjs --config-file .swcrc-cjs", - "build": "pnpm copyfiles && pnpm build:swc && pnpm build:types && pnpm build:webpack && rm dist/prod/index.js", + "build:cjs": "swc ./src/withPayload.js -o ./dist/cjs/withPayload.cjs --config-file .swcrc-cjs", + "build": "pnpm copyfiles && pnpm build:swc && p build:cjs && 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", @@ -28,6 +28,10 @@ "require": "./src/index.js", "types": "./src/index.js" }, + "./withPayload": { + "import": "./src/withPayload.js", + "require": "./src/withPayload.js" + }, "./*": { "import": "./src/exports/*.ts", "require": "./src/exports/*.ts", @@ -87,7 +91,7 @@ }, "./withPayload": { "import": "./dist/withPayload.js", - "require": "./dist/cjs/withPayload.js" + "require": "./dist/cjs/withPayload.cjs" }, "./*": { "import": "./dist/exports/*.js", From f14883aa117153a60a96a44c2e15bd7d99f24947 Mon Sep 17 00:00:00 2001 From: Elliot DeNolf Date: Wed, 10 Apr 2024 13:35:07 -0400 Subject: [PATCH 060/177] chore: update blank 3.0 template for withPayload change --- templates/blank-3.0/next.config.mjs | 2 +- templates/blank-3.0/package.json | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/templates/blank-3.0/next.config.mjs b/templates/blank-3.0/next.config.mjs index 8d3f99c5be..7ec4bd8366 100644 --- a/templates/blank-3.0/next.config.mjs +++ b/templates/blank-3.0/next.config.mjs @@ -1,4 +1,4 @@ -import { withPayload } from '@payloadcms/next' +import { withPayload } from '@payloadcms/next/withPayload' /** @type {import('next').NextConfig} */ const nextConfig = { diff --git a/templates/blank-3.0/package.json b/templates/blank-3.0/package.json index 1f2730cd82..6235afd3ad 100644 --- a/templates/blank-3.0/package.json +++ b/templates/blank-3.0/package.json @@ -16,13 +16,13 @@ "node": ">=18.19.0" }, "dependencies": { - "@payloadcms/db-mongodb": "alpha", - "@payloadcms/next": "alpha", - "@payloadcms/plugin-cloud": "alpha", - "@payloadcms/richtext-lexical": "alpha", + "@payloadcms/db-mongodb": "beta", + "@payloadcms/next": "beta", + "@payloadcms/plugin-cloud": "beta", + "@payloadcms/richtext-lexical": "beta", "cross-env": "^7.0.3", "next": "14.2.0-canary.23", - "payload": "alpha", + "payload": "beta", "react": "^18.2.0", "react-dom": "^18.2.0", "sharp": "0.32.6" From 7cf268609787039ac662da4b520e56dc440f226c Mon Sep 17 00:00:00 2001 From: Jacob Fletcher Date: Wed, 10 Apr 2024 14:08:47 -0400 Subject: [PATCH 061/177] fix: optionally types req in auth operation (#5769) --- packages/payload/src/auth/operations/auth.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/payload/src/auth/operations/auth.ts b/packages/payload/src/auth/operations/auth.ts index 1627a01be6..37e45782c2 100644 --- a/packages/payload/src/auth/operations/auth.ts +++ b/packages/payload/src/auth/operations/auth.ts @@ -10,7 +10,7 @@ import { getAccessResults } from '../getAccessResults.js' export type AuthArgs = { headers: Request['headers'] - req: Omit + req?: Omit } export type AuthResult = { @@ -19,7 +19,7 @@ export type AuthResult = { user: User | null } -export const auth = async (args: AuthArgs): Promise => { +export const auth = async (args: Required): Promise => { const { headers } = args const req = args.req as PayloadRequest const { payload } = req From 94af06466bf0cfacbc738bd41f00cd51efdbb8cb Mon Sep 17 00:00:00 2001 From: Jarrod Flesch <30633324+JarrodMFlesch@users.noreply.github.com> Date: Wed, 10 Apr 2024 15:55:01 -0400 Subject: [PATCH 062/177] chore: re-exports languages in payload (#5771) --- .../next/src/utilities/getRequestLanguage.ts | 4 +- packages/payload/src/exports/i18n/ar.ts | 1 + packages/payload/src/exports/i18n/az.ts | 1 + packages/payload/src/exports/i18n/bg.ts | 1 + packages/payload/src/exports/i18n/cs.ts | 1 + packages/payload/src/exports/i18n/de.ts | 1 + packages/payload/src/exports/i18n/en.ts | 1 + packages/payload/src/exports/i18n/es.ts | 1 + packages/payload/src/exports/i18n/fa.ts | 1 + packages/payload/src/exports/i18n/fr.ts | 1 + packages/payload/src/exports/i18n/hr.ts | 1 + packages/payload/src/exports/i18n/hu.ts | 1 + packages/payload/src/exports/i18n/it.ts | 1 + packages/payload/src/exports/i18n/ja.ts | 1 + packages/payload/src/exports/i18n/ko.ts | 1 + packages/payload/src/exports/i18n/my.ts | 1 + packages/payload/src/exports/i18n/nb.ts | 1 + packages/payload/src/exports/i18n/nl.ts | 1 + packages/payload/src/exports/i18n/pl.ts | 1 + packages/payload/src/exports/i18n/pt.ts | 1 + packages/payload/src/exports/i18n/ro.ts | 1 + packages/payload/src/exports/i18n/rs.ts | 1 + packages/payload/src/exports/i18n/rsLatin.ts | 1 + packages/payload/src/exports/i18n/ru.ts | 1 + packages/payload/src/exports/i18n/sv.ts | 1 + packages/payload/src/exports/i18n/th.ts | 1 + packages/payload/src/exports/i18n/tr.ts | 1 + packages/payload/src/exports/i18n/uk.ts | 1 + packages/payload/src/exports/i18n/vi.ts | 1 + packages/payload/src/exports/i18n/zh.ts | 1 + packages/payload/src/exports/i18n/zhTw.ts | 1 + packages/translations/README.md | 21 +- .../translations/writeTranslationFiles.ts | 480 ------------------ packages/ui/src/fields/Array/index.tsx | 5 +- packages/ui/src/fields/Blocks/index.tsx | 12 +- test/admin/e2e.spec.ts | 7 +- test/buildConfigWithDefaults.ts | 6 +- test/fields/e2e.spec.ts | 14 +- test/helpers.ts | 5 + test/uploads/e2e.spec.ts | 12 +- 40 files changed, 79 insertions(+), 517 deletions(-) create mode 100644 packages/payload/src/exports/i18n/ar.ts create mode 100644 packages/payload/src/exports/i18n/az.ts create mode 100644 packages/payload/src/exports/i18n/bg.ts create mode 100644 packages/payload/src/exports/i18n/cs.ts create mode 100644 packages/payload/src/exports/i18n/de.ts create mode 100644 packages/payload/src/exports/i18n/en.ts create mode 100644 packages/payload/src/exports/i18n/es.ts create mode 100644 packages/payload/src/exports/i18n/fa.ts create mode 100644 packages/payload/src/exports/i18n/fr.ts create mode 100644 packages/payload/src/exports/i18n/hr.ts create mode 100644 packages/payload/src/exports/i18n/hu.ts create mode 100644 packages/payload/src/exports/i18n/it.ts create mode 100644 packages/payload/src/exports/i18n/ja.ts create mode 100644 packages/payload/src/exports/i18n/ko.ts create mode 100644 packages/payload/src/exports/i18n/my.ts create mode 100644 packages/payload/src/exports/i18n/nb.ts create mode 100644 packages/payload/src/exports/i18n/nl.ts create mode 100644 packages/payload/src/exports/i18n/pl.ts create mode 100644 packages/payload/src/exports/i18n/pt.ts create mode 100644 packages/payload/src/exports/i18n/ro.ts create mode 100644 packages/payload/src/exports/i18n/rs.ts create mode 100644 packages/payload/src/exports/i18n/rsLatin.ts create mode 100644 packages/payload/src/exports/i18n/ru.ts create mode 100644 packages/payload/src/exports/i18n/sv.ts create mode 100644 packages/payload/src/exports/i18n/th.ts create mode 100644 packages/payload/src/exports/i18n/tr.ts create mode 100644 packages/payload/src/exports/i18n/uk.ts create mode 100644 packages/payload/src/exports/i18n/vi.ts create mode 100644 packages/payload/src/exports/i18n/zh.ts create mode 100644 packages/payload/src/exports/i18n/zhTw.ts delete mode 100644 packages/translations/writeTranslationFiles.ts diff --git a/packages/next/src/utilities/getRequestLanguage.ts b/packages/next/src/utilities/getRequestLanguage.ts index 018f07290e..7b4a45891c 100644 --- a/packages/next/src/utilities/getRequestLanguage.ts +++ b/packages/next/src/utilities/getRequestLanguage.ts @@ -19,7 +19,9 @@ export const getRequestLanguage = ({ }: GetRequestLanguageArgs): AcceptedLanguages => { const langCookie = cookies.get(`${config.cookiePrefix || 'payload'}-lng`) const languageFromCookie = typeof langCookie === 'string' ? langCookie : langCookie?.value - const languageFromHeader = extractHeaderLanguage(headers.get('Accept-Language')) + const languageFromHeader = headers.get('Accept-Language') + ? extractHeaderLanguage(headers.get('Accept-Language')) + : undefined const fallbackLang = config?.i18n?.fallbackLanguage || defaultLanguage const supportedLanguageKeys = Object.keys(config?.i18n?.supportedLanguages || {}) diff --git a/packages/payload/src/exports/i18n/ar.ts b/packages/payload/src/exports/i18n/ar.ts new file mode 100644 index 0000000000..897e9d2e31 --- /dev/null +++ b/packages/payload/src/exports/i18n/ar.ts @@ -0,0 +1 @@ +export { ar } from '@payloadcms/translations/languages/ar' diff --git a/packages/payload/src/exports/i18n/az.ts b/packages/payload/src/exports/i18n/az.ts new file mode 100644 index 0000000000..7859c0aa5b --- /dev/null +++ b/packages/payload/src/exports/i18n/az.ts @@ -0,0 +1 @@ +export { az } from '@payloadcms/translations/languages/az' diff --git a/packages/payload/src/exports/i18n/bg.ts b/packages/payload/src/exports/i18n/bg.ts new file mode 100644 index 0000000000..082a1fb522 --- /dev/null +++ b/packages/payload/src/exports/i18n/bg.ts @@ -0,0 +1 @@ +export { bg } from '@payloadcms/translations/languages/bg' diff --git a/packages/payload/src/exports/i18n/cs.ts b/packages/payload/src/exports/i18n/cs.ts new file mode 100644 index 0000000000..20bbd9ecc0 --- /dev/null +++ b/packages/payload/src/exports/i18n/cs.ts @@ -0,0 +1 @@ +export { cs } from '@payloadcms/translations/languages/cs' diff --git a/packages/payload/src/exports/i18n/de.ts b/packages/payload/src/exports/i18n/de.ts new file mode 100644 index 0000000000..c128b18773 --- /dev/null +++ b/packages/payload/src/exports/i18n/de.ts @@ -0,0 +1 @@ +export { de } from '@payloadcms/translations/languages/de' diff --git a/packages/payload/src/exports/i18n/en.ts b/packages/payload/src/exports/i18n/en.ts new file mode 100644 index 0000000000..e30aafa16d --- /dev/null +++ b/packages/payload/src/exports/i18n/en.ts @@ -0,0 +1 @@ +export { en } from '@payloadcms/translations/languages/en' diff --git a/packages/payload/src/exports/i18n/es.ts b/packages/payload/src/exports/i18n/es.ts new file mode 100644 index 0000000000..ac6ea9ed89 --- /dev/null +++ b/packages/payload/src/exports/i18n/es.ts @@ -0,0 +1 @@ +export { es } from '@payloadcms/translations/languages/es' diff --git a/packages/payload/src/exports/i18n/fa.ts b/packages/payload/src/exports/i18n/fa.ts new file mode 100644 index 0000000000..7acff2adba --- /dev/null +++ b/packages/payload/src/exports/i18n/fa.ts @@ -0,0 +1 @@ +export { fa } from '@payloadcms/translations/languages/fa' diff --git a/packages/payload/src/exports/i18n/fr.ts b/packages/payload/src/exports/i18n/fr.ts new file mode 100644 index 0000000000..65de019fd8 --- /dev/null +++ b/packages/payload/src/exports/i18n/fr.ts @@ -0,0 +1 @@ +export { fr } from '@payloadcms/translations/languages/fr' diff --git a/packages/payload/src/exports/i18n/hr.ts b/packages/payload/src/exports/i18n/hr.ts new file mode 100644 index 0000000000..c4b712841e --- /dev/null +++ b/packages/payload/src/exports/i18n/hr.ts @@ -0,0 +1 @@ +export { hr } from '@payloadcms/translations/languages/hr' diff --git a/packages/payload/src/exports/i18n/hu.ts b/packages/payload/src/exports/i18n/hu.ts new file mode 100644 index 0000000000..7fad4df042 --- /dev/null +++ b/packages/payload/src/exports/i18n/hu.ts @@ -0,0 +1 @@ +export { hu } from '@payloadcms/translations/languages/hu' diff --git a/packages/payload/src/exports/i18n/it.ts b/packages/payload/src/exports/i18n/it.ts new file mode 100644 index 0000000000..36bbb80de0 --- /dev/null +++ b/packages/payload/src/exports/i18n/it.ts @@ -0,0 +1 @@ +export { it } from '@payloadcms/translations/languages/it' diff --git a/packages/payload/src/exports/i18n/ja.ts b/packages/payload/src/exports/i18n/ja.ts new file mode 100644 index 0000000000..ef65a7567c --- /dev/null +++ b/packages/payload/src/exports/i18n/ja.ts @@ -0,0 +1 @@ +export { ja } from '@payloadcms/translations/languages/ja' diff --git a/packages/payload/src/exports/i18n/ko.ts b/packages/payload/src/exports/i18n/ko.ts new file mode 100644 index 0000000000..e080561e0a --- /dev/null +++ b/packages/payload/src/exports/i18n/ko.ts @@ -0,0 +1 @@ +export { ko } from '@payloadcms/translations/languages/ko' diff --git a/packages/payload/src/exports/i18n/my.ts b/packages/payload/src/exports/i18n/my.ts new file mode 100644 index 0000000000..c040b71aa4 --- /dev/null +++ b/packages/payload/src/exports/i18n/my.ts @@ -0,0 +1 @@ +export { my } from '@payloadcms/translations/languages/my' diff --git a/packages/payload/src/exports/i18n/nb.ts b/packages/payload/src/exports/i18n/nb.ts new file mode 100644 index 0000000000..e4ea01536d --- /dev/null +++ b/packages/payload/src/exports/i18n/nb.ts @@ -0,0 +1 @@ +export { nb } from '@payloadcms/translations/languages/nb' diff --git a/packages/payload/src/exports/i18n/nl.ts b/packages/payload/src/exports/i18n/nl.ts new file mode 100644 index 0000000000..432a6d74c7 --- /dev/null +++ b/packages/payload/src/exports/i18n/nl.ts @@ -0,0 +1 @@ +export { nl } from '@payloadcms/translations/languages/nl' diff --git a/packages/payload/src/exports/i18n/pl.ts b/packages/payload/src/exports/i18n/pl.ts new file mode 100644 index 0000000000..1b722ff673 --- /dev/null +++ b/packages/payload/src/exports/i18n/pl.ts @@ -0,0 +1 @@ +export { pl } from '@payloadcms/translations/languages/pl' diff --git a/packages/payload/src/exports/i18n/pt.ts b/packages/payload/src/exports/i18n/pt.ts new file mode 100644 index 0000000000..533ff4fd65 --- /dev/null +++ b/packages/payload/src/exports/i18n/pt.ts @@ -0,0 +1 @@ +export { pt } from '@payloadcms/translations/languages/pt' diff --git a/packages/payload/src/exports/i18n/ro.ts b/packages/payload/src/exports/i18n/ro.ts new file mode 100644 index 0000000000..1280ecec14 --- /dev/null +++ b/packages/payload/src/exports/i18n/ro.ts @@ -0,0 +1 @@ +export { ro } from '@payloadcms/translations/languages/ro' diff --git a/packages/payload/src/exports/i18n/rs.ts b/packages/payload/src/exports/i18n/rs.ts new file mode 100644 index 0000000000..193c1cfa9b --- /dev/null +++ b/packages/payload/src/exports/i18n/rs.ts @@ -0,0 +1 @@ +export { rs } from '@payloadcms/translations/languages/rs' diff --git a/packages/payload/src/exports/i18n/rsLatin.ts b/packages/payload/src/exports/i18n/rsLatin.ts new file mode 100644 index 0000000000..e03c7ed9bb --- /dev/null +++ b/packages/payload/src/exports/i18n/rsLatin.ts @@ -0,0 +1 @@ +export { rsLatin } from '@payloadcms/translations/languages/rsLatin' diff --git a/packages/payload/src/exports/i18n/ru.ts b/packages/payload/src/exports/i18n/ru.ts new file mode 100644 index 0000000000..8795e813b0 --- /dev/null +++ b/packages/payload/src/exports/i18n/ru.ts @@ -0,0 +1 @@ +export { ru } from '@payloadcms/translations/languages/ru' diff --git a/packages/payload/src/exports/i18n/sv.ts b/packages/payload/src/exports/i18n/sv.ts new file mode 100644 index 0000000000..4d83844598 --- /dev/null +++ b/packages/payload/src/exports/i18n/sv.ts @@ -0,0 +1 @@ +export { sv } from '@payloadcms/translations/languages/sv' diff --git a/packages/payload/src/exports/i18n/th.ts b/packages/payload/src/exports/i18n/th.ts new file mode 100644 index 0000000000..1dced32a22 --- /dev/null +++ b/packages/payload/src/exports/i18n/th.ts @@ -0,0 +1 @@ +export { th } from '@payloadcms/translations/languages/th' diff --git a/packages/payload/src/exports/i18n/tr.ts b/packages/payload/src/exports/i18n/tr.ts new file mode 100644 index 0000000000..f711e422b2 --- /dev/null +++ b/packages/payload/src/exports/i18n/tr.ts @@ -0,0 +1 @@ +export { tr } from '@payloadcms/translations/languages/tr' diff --git a/packages/payload/src/exports/i18n/uk.ts b/packages/payload/src/exports/i18n/uk.ts new file mode 100644 index 0000000000..a1d6832f2d --- /dev/null +++ b/packages/payload/src/exports/i18n/uk.ts @@ -0,0 +1 @@ +export { uk } from '@payloadcms/translations/languages/uk' diff --git a/packages/payload/src/exports/i18n/vi.ts b/packages/payload/src/exports/i18n/vi.ts new file mode 100644 index 0000000000..0e97a52283 --- /dev/null +++ b/packages/payload/src/exports/i18n/vi.ts @@ -0,0 +1 @@ +export { vi } from '@payloadcms/translations/languages/vi' diff --git a/packages/payload/src/exports/i18n/zh.ts b/packages/payload/src/exports/i18n/zh.ts new file mode 100644 index 0000000000..248182a460 --- /dev/null +++ b/packages/payload/src/exports/i18n/zh.ts @@ -0,0 +1 @@ +export { zh } from '@payloadcms/translations/languages/zh' diff --git a/packages/payload/src/exports/i18n/zhTw.ts b/packages/payload/src/exports/i18n/zhTw.ts new file mode 100644 index 0000000000..acb2ecc668 --- /dev/null +++ b/packages/payload/src/exports/i18n/zhTw.ts @@ -0,0 +1 @@ +export { zhTw } from '@payloadcms/translations/languages/zhTw' diff --git a/packages/translations/README.md b/packages/translations/README.md index 22c328f79d..a6904beb5d 100644 --- a/packages/translations/README.md +++ b/packages/translations/README.md @@ -1,14 +1,13 @@ # Payload Translations -These are the translations for Payload. Translations are used on both the server and the client. The admin panel uses translations to display text to the user in their selected language. The server uses translations when sending API responses. +The home of Payloads API and Admin Panel translations. ## How to contribute #### Updating a translation -1. Open the language file you wish to edit located within the `src/all` folder -2. Update the translation value -3. Run one of the following: +1. Update the translation value +2. Run one of the following: ```sh yarn build // or @@ -19,9 +18,8 @@ These are the translations for Payload. Translations are used on both the server #### Adding a new translation -1. Add the new translation key/value pair for all languages located in the `src/all` folder -2. Open the `writeTranslationFiles.ts` file and add the key to either `clientTranslationKeys` or `serverTranslationKeys` depending on where the translation will be used. -3. Run one of the following: +1. Add the new translation key/value pair for **all** languages located in the `/packages/translations/src/languages` folder +2. Run one of the following: ```sh yarn build // or @@ -32,10 +30,9 @@ These are the translations for Payload. Translations are used on both the server #### Adding a new language -1. Create a new JSON file in the `src/all` folder with the language code as the file name (e.g. `en.json` for English) -2. Translate all of the keys in the new file -3. Open the `src/index.ts` file and import your json file and then export it inside the `translations` object -4. Run one of the following: +1. Create a new TS file in the `/packages/translations/src/languages` folder, use the language code as the file name (e.g. `/packages/translations/src/languages/en.ts` for English) +2. Copy all translations from an existing language file and update all of the translations to match your new language +3. Run one of the following: ```sh yarn build // or @@ -43,6 +40,8 @@ These are the translations for Payload. Translations are used on both the server // or pnpm build ``` +4. Import and export your new language file from within `/packages/translations/src/exports/all.ts` +5. Re-export the file from within `/packages/payload/src/exports/i18n/[your-new-language].ts` Here is a full list of language keys. Note that these are not all implemented, but if you would like to contribute and add a new language, you can use this list as a reference: diff --git a/packages/translations/writeTranslationFiles.ts b/packages/translations/writeTranslationFiles.ts deleted file mode 100644 index a1d001ce7b..0000000000 --- a/packages/translations/writeTranslationFiles.ts +++ /dev/null @@ -1,480 +0,0 @@ -/* eslint-disable no-console */ -import { exec } from 'child_process' -import * as fs from 'fs' -import * as path from 'path' -import { fileURLToPath } from 'url' - -import { translations } from './src/all/index.js' -import { copyFile } from './src/utilities/copyFile.js' -import { ensureDirectoryExists } from './src/utilities/ensureDirExists.js' - -const filename = fileURLToPath(import.meta.url) -const dirname = path.dirname(filename) - -const serverTranslationKeys = [ - 'authentication:account', - 'authentication:api', - 'authentication:apiKey', - 'authentication:enableAPIKey', - 'authentication:newAccountCreated', - 'authentication:resetYourPassword', - 'authentication:verifyYourEmail', - 'authentication:youAreReceivingResetPassword', - 'authentication:loggedInChangePassword', - 'authentication:youDidNotRequestPassword', - 'authentication:verified', - - 'fields:textToDisplay', - 'fields:linkType', - 'fields:chooseBetweenCustomTextOrDocument', - 'fields:customURL', - 'fields:internalLink', - 'fields:enterURL', - 'fields:chooseDocumentToLink', - 'fields:openInNewTab', - - 'general:copy', - 'general:createdAt', - 'general:deletedCountSuccessfully', - 'general:deletedSuccessfully', - 'general:email', - 'general:notFound', - 'general:successfullyCreated', - 'general:successfullyDuplicated', - 'general:thisLanguage', - 'general:user', - 'general:users', - 'general:updatedAt', - 'general:updatedSuccessfully', - 'general:updatedCountSuccessfully', - 'general:value', - 'general:row', - 'general:rows', - - 'error:deletingFile', - 'error:emailOrPasswordIncorrect', - 'error:followingFieldsInvalid', - 'error:noFilesUploaded', - 'error:notAllowedToPerformAction', - 'error:problemUploadingFile', - 'error:unableToDeleteCount', - 'error:unableToUpdateCount', - 'error:unauthorized', - 'error:userLocked', - 'error:valueMustBeUnique', - - 'upload:width', - 'upload:height', - 'upload:fileSize', - 'upload:fileName', - 'upload:sizes', - - 'validation:emailAddress', - 'validation:enterNumber', - 'validation:greaterThanMax', - 'validation:invalidInput', - 'validation:invalidSelection', - 'validation:invalidSelections', - 'validation:lessThanMin', - 'validation:longerThanMin', - 'validation:notValidDate', - 'validation:required', - 'validation:requiresAtLeast', - 'validation:requiresNoMoreThan', - 'validation:requiresTwoNumbers', - 'validation:shorterThanMax', - 'validation:trueOrFalse', - 'validation:validUploadID', - - 'version:autosavedSuccessfully', - 'version:draftSavedSuccessfully', - 'version:restoredSuccessfully', - 'version:draft', - 'version:published', - 'version:status', -] - -const clientTranslationKeys = [ - 'authentication:account', - 'authentication:accountOfCurrentUser', - 'authentication:alreadyActivated', - 'authentication:alreadyLoggedIn', - 'authentication:backToLogin', - 'authentication:beginCreateFirstUser', - 'authentication:changePassword', - 'authentication:confirmGeneration', - 'authentication:confirmPassword', - 'authentication:createFirstUser', - 'authentication:emailNotValid', - 'authentication:emailSent', - 'authentication:enableAPIKey', - 'authentication:failedToUnlock', - 'authentication:forceUnlock', - 'authentication:forgotPassword', - 'authentication:forgotPasswordEmailInstructions', - 'authentication:forgotPasswordQuestion', - 'authentication:generate', - 'authentication:generateNewAPIKey', - 'authentication:logBackIn', - 'authentication:loggedOutInactivity', - 'authentication:loggedOutSuccessfully', - 'authentication:login', - 'authentication:logOut', - 'authentication:logout', - 'authentication:logoutUser', - 'authentication:newAPIKeyGenerated', - 'authentication:newPassword', - 'authentication:resetPassword', - 'authentication:stayLoggedIn', - 'authentication:successfullyUnlocked', - 'authentication:unableToVerify', - 'authentication:verified', - 'authentication:verifiedSuccessfully', - 'authentication:verify', - 'authentication:verifyUser', - 'authentication:youAreInactive', - - 'error:autosaving', - 'error:correctInvalidFields', - 'error:deletingTitle', - 'error:loadingDocument', - 'error:noMatchedField', - 'error:notAllowedToAccessPage', - 'error:previewing', - 'error:unableToDeleteCount', - 'error:unableToUpdateCount', - 'error:unauthorized', - 'error:unknown', - 'error:unspecific', - - 'fields:addLabel', - 'fields:addLink', - 'fields:addNew', - 'fields:addNewLabel', - 'fields:addRelationship', - 'fields:addUpload', - 'fields:block', - 'fields:blocks', - 'fields:blockType', - 'fields:chooseFromExisting', - 'fields:collapseAll', - 'fields:editLink', - 'fields:editRelationship', - 'fields:itemsAndMore', - 'fields:labelRelationship', - 'fields:latitude', - 'fields:linkedTo', - 'fields:longitude', - 'fields:passwordsDoNotMatch', - 'fields:removeRelationship', - 'fields:removeUpload', - 'fields:saveChanges', - 'fields:searchForBlock', - 'fields:selectFieldsToEdit', - 'fields:showAll', - 'fields:swapRelationship', - 'fields:swapUpload', - 'fields:toggleBlock', - 'fields:uploadNewLabel', - - 'general:aboutToDeleteCount', - 'general:aboutToDelete', - 'general:addBelow', - 'general:addFilter', - 'general:adminTheme', - 'general:and', - 'general:applyChanges', - 'general:ascending', - 'general:automatic', - 'general:backToDashboard', - 'general:cancel', - 'general:changesNotSaved', - 'general:close', - 'general:collapse', - 'general:collections', - 'general:columns', - 'general:columnToSort', - 'general:confirm', - 'general:confirmDeletion', - 'general:confirmDuplication', - 'general:copied', - 'general:copy', - 'general:create', - 'general:created', - 'general:createNew', - 'general:createNewLabel', - 'general:creating', - 'general:creatingNewLabel', - 'general:dark', - 'general:dashboard', - 'general:delete', - 'general:deletedCountSuccessfully', - 'general:deleting', - 'general:descending', - 'general:deselectAllRows', - 'general:duplicate', - 'general:duplicateWithoutSaving', - 'general:edit', - 'general:editing', - 'general:editingLabel', - 'general:editLabel', - 'general:email', - 'general:emailAddress', - 'general:enterAValue', - 'general:error', - 'general:errors', - 'general:fallbackToDefaultLocale', - 'general:filters', - 'general:filterWhere', - 'general:globals', - 'general:language', - 'general:lastModified', - 'general:leaveAnyway', - 'general:leaveWithoutSaving', - 'general:light', - 'general:livePreview', - 'general:loading', - 'general:locale', - 'general:menu', - 'general:moveDown', - 'general:moveUp', - 'general:noFiltersSet', - 'general:noLabel', - 'general:none', - 'general:noOptions', - 'general:noResults', - 'general:notFound', - 'general:nothingFound', - 'general:noValue', - 'general:of', - 'general:open', - 'general:or', - 'general:order', - 'general:pageNotFound', - 'general:password', - 'general:payloadSettings', - 'general:perPage', - 'general:remove', - 'general:reset', - 'general:row', - 'general:rows', - 'general:save', - 'general:saving', - 'general:searchBy', - 'general:selectAll', - 'general:selectAllRows', - 'general:selectedCount', - 'general:selectValue', - 'general:showAllLabel', - 'general:sorryNotFound', - 'general:sort', - 'general:sortByLabelDirection', - 'general:stayOnThisPage', - 'general:submissionSuccessful', - 'general:submit', - 'general:successfullyCreated', - 'general:successfullyDeleted', - 'general:thisLanguage', - 'general:titleDeleted', - 'general:unauthorized', - 'general:unsavedChangesDuplicate', - 'general:untitled', - 'general:updatedAt', - 'general:updatedCountSuccessfully', - 'general:updatedSuccessfully', - 'general:updating', - 'general:welcome', - - 'operators:equals', - 'operators:exists', - 'operators:isNotIn', - 'operators:isIn', - 'operators:contains', - 'operators:isLike', - 'operators:isNotEqualTo', - 'operators:near', - 'operators:isGreaterThan', - 'operators:isLessThan', - 'operators:isGreaterThanOrEqualTo', - 'operators:isLessThanOrEqualTo', - - 'upload:crop', - 'upload:cropToolDescription', - 'upload:dragAndDrop', - 'upload:editImage', - 'upload:focalPoint', - 'upload:focalPointDescription', - 'upload:height', - 'upload:previewSizes', - 'upload:selectCollectionToBrowse', - 'upload:selectFile', - 'upload:setCropArea', - 'upload:setFocalPoint', - 'upload:sizesFor', - 'upload:width', - - 'validation:fieldHasNo', - 'validation:limitReached', - 'validation:required', - 'validation:requiresAtLeast', - - 'version:aboutToPublishSelection', - 'version:aboutToRestore', - 'version:aboutToRestoreGlobal', - 'version:aboutToRevertToPublished', - 'version:aboutToUnpublish', - 'version:aboutToUnpublishSelection', - 'version:autosave', - 'version:autosavedSuccessfully', - 'version:changed', - 'version:confirmRevertToSaved', - 'version:compareVersion', - 'version:confirmPublish', - 'version:confirmUnpublish', - 'version:confirmVersionRestoration', - 'version:draft', - 'version:draftSavedSuccessfully', - 'version:lastSavedAgo', - 'version:noFurtherVersionsFound', - 'version:noRowsFound', - 'version:preview', - 'version:problemRestoringVersion', - 'version:publish', - 'version:publishChanges', - 'version:published', - 'version:publishing', - 'version:restoredSuccessfully', - 'version:restoreThisVersion', - 'version:restoring', - 'version:revertToPublished', - 'version:saveDraft', - 'version:selectLocales', - 'version:selectVersionToCompare', - 'version:showLocales', - 'version:status', - 'version:type', - 'version:unpublish', - 'version:unpublishing', - 'version:versionCreatedOn', - 'version:versionID', - 'version:version', - 'version:versions', - 'version:viewingVersion', - 'version:viewingVersionGlobal', - 'version:viewingVersions', - 'version:viewingVersionsGlobal', -] - -const DESTINATION_ROOT = './src/_generatedFiles_' -const SOURCE_DIR = './src/all' - -function filterKeys(obj, parentGroupKey = '', keys) { - const result = {} - - for (const [namespaceKey, value] of Object.entries(obj)) { - // Skip $schema key - if (namespaceKey === '$schema') { - result[namespaceKey] = value - continue - } - - if (typeof value === 'object') { - const filteredObject = filterKeys(value, namespaceKey, keys) - if (Object.keys(filteredObject).length > 0) { - result[namespaceKey] = filteredObject - } - } else { - for (const key of keys) { - const [groupKey, selector] = key.split(':') - - if (parentGroupKey === groupKey) { - if (namespaceKey === selector) { - result[selector] = value - } else { - const pluralKeys = ['zero', 'one', 'two', 'few', 'many', 'other'] - pluralKeys.forEach((pluralKey) => { - if (namespaceKey === `${selector}_${pluralKey}`) { - result[`${selector}_${pluralKey}`] = value - } - }) - } - } - } - } - } - - return result -} - -function sortObject(obj) { - const sortedObject = {} - Object.keys(obj) - .sort() - .forEach((key) => { - if (typeof obj[key] === 'object') { - sortedObject[key] = sortObject(obj[key]) - } else { - sortedObject[key] = obj[key] - } - }) - return sortedObject -} - -function build() { - return new Promise((resolve, reject) => { - ensureDirectoryExists(path.resolve(dirname, `${DESTINATION_ROOT}/client`)) - ensureDirectoryExists(path.resolve(dirname, `${DESTINATION_ROOT}/api`)) - - try { - // build up the client and server translation files - for (const [locale, values] of Object.entries(translations)) { - const dest1 = path.resolve(dirname, `${DESTINATION_ROOT}/client/${locale}.js`) - - const clientTranslations = sortObject(filterKeys(values, '', clientTranslationKeys)) - - fs.writeFileSync(dest1, 'export default ' + JSON.stringify(clientTranslations, null, 2), { - flag: 'w+', - }) - - const serverTranslations = sortObject(filterKeys(values, '', serverTranslationKeys)) - const dest2 = path.resolve(dirname, `${DESTINATION_ROOT}/api/${locale}.js`) - - fs.writeFileSync(dest2, 'export default ' + JSON.stringify(serverTranslations, null, 2), { - flag: 'w+', - }) - - console.info('Rebuilt:', filename) - } - - // Copy barrel file to both client and api folders - copyFile( - path.resolve(dirname, `${SOURCE_DIR}/index.ts`), - path.resolve(dirname, `${DESTINATION_ROOT}/api/index.ts`), - ) - copyFile( - path.resolve(dirname, `${SOURCE_DIR}/index.ts`), - path.resolve(dirname, `${DESTINATION_ROOT}/client/index.ts`), - ) - - // Run prettier from CLI so that files pass the pre-commit hook: - console.info('Running prettier...') - exec('prettier --write "**/*.js"', (err, stdout) => { - if (err) { - console.error(err) - } else { - console.info(stdout) - } - }) - } catch (error) { - reject(error) - } - }) -} - -build() - .then(() => { - console.log('Built client and api translation files.') - }) - .catch((error) => { - console.error('Error occurred:', error) - }) diff --git a/packages/ui/src/fields/Array/index.tsx b/packages/ui/src/fields/Array/index.tsx index bdebd7e6db..05105b86b6 100644 --- a/packages/ui/src/fields/Array/index.tsx +++ b/packages/ui/src/fields/Array/index.tsx @@ -62,7 +62,7 @@ export const _ArrayField: React.FC = (props) => { labelProps, localized, maxRows, - minRows, + minRows: minRowsProp, path: pathFromProps, permissions, readOnly: readOnlyFromProps, @@ -72,6 +72,7 @@ export const _ArrayField: React.FC = (props) => { const { indexPath, readOnly: readOnlyFromContext } = useFieldProps() const readOnly = readOnlyFromProps || readOnlyFromContext + const minRows = minRowsProp ?? required ? 1 : 0 const { setDocFieldPreferences } = useDocumentInfo() const { addFieldRow, dispatchFields, setModified } = useForm() @@ -300,7 +301,7 @@ export const _ArrayField: React.FC = (props) => { {t('validation:requiresAtLeast', { count: minRows, label: - getTranslation(minRows ? labels.plural : labels.singular, i18n) || + getTranslation(minRows > 1 ? labels.plural : labels.singular, i18n) || t(minRows > 1 ? 'general:row' : 'general:rows'), })} diff --git a/packages/ui/src/fields/Blocks/index.tsx b/packages/ui/src/fields/Blocks/index.tsx index 6387d7c897..f730cbace4 100644 --- a/packages/ui/src/fields/Blocks/index.tsx +++ b/packages/ui/src/fields/Blocks/index.tsx @@ -67,7 +67,7 @@ const _BlocksField: React.FC = (props) => { labels: labelsFromProps, localized, maxRows, - minRows, + minRows: minRowsProp, path: pathFromProps, readOnly: readOnlyFromProps, required, @@ -76,6 +76,7 @@ const _BlocksField: React.FC = (props) => { const { indexPath, readOnly: readOnlyFromContext } = useFieldProps() const readOnly = readOnlyFromProps || readOnlyFromContext + const minRows = minRowsProp ?? required ? 1 : 0 const { setDocFieldPreferences } = useDocumentInfo() const { addFieldRow, dispatchFields, setModified } = useForm() @@ -313,12 +314,9 @@ const _BlocksField: React.FC = (props) => { {t('validation:requiresAtLeast', { count: minRows, - label: getTranslation( - minRows === 1 || typeof minRows === 'undefined' - ? labels.singular - : labels.plural, - i18n, - ), + label: + getTranslation(minRows > 1 ? labels.plural : labels.singular, i18n) || + t(minRows > 1 ? 'general:row' : 'general:rows'), })} )} diff --git a/test/admin/e2e.spec.ts b/test/admin/e2e.spec.ts index 0e2e4d36dc..bbf156c32e 100644 --- a/test/admin/e2e.spec.ts +++ b/test/admin/e2e.spec.ts @@ -15,6 +15,7 @@ import { exactText, initPageConsoleErrorCatch, openDocControls, + openDocDrawer, openNav, saveDocAndAssert, saveDocHotkeyAndAssert, @@ -1052,8 +1053,8 @@ describe('admin', () => { await createPost() await page.goto(postsUrl.create) - // Open the drawer - await page.locator('.rich-text .list-drawer__toggler').click() + await openDocDrawer(page, '.rich-text .list-drawer__toggler') + const listDrawer = page.locator('[id^=list-drawer_1_]') await expect(listDrawer).toBeVisible() @@ -1092,7 +1093,7 @@ describe('admin', () => { await page.goto(postsUrl.create) // Open the drawer - await page.locator('.rich-text .list-drawer__toggler').click() + await openDocDrawer(page, '.rich-text .list-drawer__toggler') const listDrawer = page.locator('[id^=list-drawer_1_]') await expect(listDrawer).toBeVisible() diff --git a/test/buildConfigWithDefaults.ts b/test/buildConfigWithDefaults.ts index c10b1d8313..dfd9a630e7 100644 --- a/test/buildConfigWithDefaults.ts +++ b/test/buildConfigWithDefaults.ts @@ -25,11 +25,11 @@ import { UploadFeature, lexicalEditor, } from '@payloadcms/richtext-lexical' -import { de } from '@payloadcms/translations/languages/de' -import { en } from '@payloadcms/translations/languages/en' -import { es } from '@payloadcms/translations/languages/es' // import { slateEditor } from '@payloadcms/richtext-slate' import { type Config, buildConfig } from 'payload/config' +import { de } from 'payload/i18n/de' +import { en } from 'payload/i18n/en' +import { es } from 'payload/i18n/es' import sharp from 'sharp' import { reInitEndpoint } from './helpers/reInit.js' diff --git a/test/fields/e2e.spec.ts b/test/fields/e2e.spec.ts index b44855585a..f12e206aeb 100644 --- a/test/fields/e2e.spec.ts +++ b/test/fields/e2e.spec.ts @@ -12,6 +12,7 @@ import { ensureAutoLoginAndCompilationIsDone, initPageConsoleErrorCatch, navigateToListCellLink, + openDocDrawer, saveDocAndAssert, switchTab, } from '../helpers.js' @@ -767,8 +768,9 @@ describe('fields', () => { await uploadImage() await wait(500) // Open the media drawer and create a png upload - await page.locator('.field-type.upload .upload__toggler.doc-drawer__toggler').click() - await wait(1000) // TODO: Fix this. Need to wait a bit until the form in the drawer mounted, otherwise values sometimes disappear. This is an issue for all drawers + + await openDocDrawer(page, '.field-type.upload .upload__toggler.doc-drawer__toggler') + await page .locator('[id^=doc-drawer_uploads_1_] .file-field__upload input[type="file"]') .setInputFiles(path.resolve(dirname, './uploads/payload.png')) @@ -795,7 +797,8 @@ describe('fields', () => { test('should clear selected upload', async () => { await uploadImage() await wait(1000) // TODO: Fix this. Need to wait a bit until the form in the drawer mounted, otherwise values sometimes disappear. This is an issue for all drawers - await page.locator('.field-type.upload .upload__toggler.doc-drawer__toggler').click() + + await openDocDrawer(page, '.field-type.upload .upload__toggler.doc-drawer__toggler') await page .locator('[id^=doc-drawer_uploads_1_] .file-field__upload input[type="file"]') @@ -811,8 +814,7 @@ describe('fields', () => { test('should select using the list drawer and restrict mimetype based on filterOptions', async () => { await uploadImage() - await page.locator('.field-type.upload .upload__toggler.list-drawer__toggler').click() - await wait(500) // TODO: Fix this. Need to wait a bit until the form in the drawer mounted, otherwise values sometimes disappear. This is an issue for all drawers + await openDocDrawer(page, '.field-type.upload .upload__toggler.list-drawer__toggler') const jpgImages = page.locator('[id^=list-drawer_1_] .upload-gallery img[src$=".jpg"]') await expect @@ -834,7 +836,7 @@ describe('fields', () => { await wait(200) // open drawer - await page.locator('.field-type.upload .list-drawer__toggler').click() + await openDocDrawer(page, '.field-type.upload .list-drawer__toggler') // check title await expect(page.locator('.list-drawer__header-text')).toContainText('Uploads 3') }) diff --git a/test/helpers.ts b/test/helpers.ts index 7ae6847d00..c082739190 100644 --- a/test/helpers.ts +++ b/test/helpers.ts @@ -130,6 +130,11 @@ export async function openNav(page: Page): Promise { await expect(page.locator('.template-default.template-default--nav-open')).toBeVisible() } +export async function openDocDrawer(page: Page, selector: string): Promise { + await page.locator(selector).click() + await wait(300) // wait for drawer form state to initialize +} + export async function closeNav(page: Page): Promise { if (!(await page.locator('.template-default.template-default--nav-open').isVisible())) return await page.locator('.nav-toggler >> visible=true').click() diff --git a/test/uploads/e2e.spec.ts b/test/uploads/e2e.spec.ts index 0597406e7b..00ffd7ba05 100644 --- a/test/uploads/e2e.spec.ts +++ b/test/uploads/e2e.spec.ts @@ -11,6 +11,7 @@ import type { Media } from './payload-types.js' import { ensureAutoLoginAndCompilationIsDone, initPageConsoleErrorCatch, + openDocDrawer, saveDocAndAssert, } from '../helpers.js' import { AdminUrlUtil } from '../helpers/adminUrlUtil.js' @@ -203,7 +204,7 @@ describe('uploads', () => { await page.locator('.field-type:nth-of-type(2) .icon--x').click() // choose from existing - await page.locator('.list-drawer__toggler').click() + await openDocDrawer(page, '.list-drawer__toggler') await expect(page.locator('.cell-title')).toContainText('draft') }) @@ -214,13 +215,16 @@ describe('uploads', () => { // remove the selection and open the list drawer await page.locator('.file-details__remove').click() - await page.locator('.upload__toggler.list-drawer__toggler').click() + + await openDocDrawer(page, '.upload__toggler.list-drawer__toggler') + const listDrawer = page.locator('[id^=list-drawer_1_]') await expect(listDrawer).toBeVisible() - // upload an image and try to select it - await listDrawer.locator('button.list-drawer__create-new-button.doc-drawer__toggler').click() + await openDocDrawer(page, 'button.list-drawer__create-new-button.doc-drawer__toggler') await expect(page.locator('[id^=doc-drawer_media_2_]')).toBeVisible() + + // upload an image and try to select it await page .locator('[id^=doc-drawer_media_2_] .file-field__upload input[type="file"]') .setInputFiles(path.resolve(dirname, './image.png')) From 4f9fdb6c145549d5788c77d44ca8344fec9e1044 Mon Sep 17 00:00:00 2001 From: James Date: Wed, 10 Apr 2024 16:01:28 -0400 Subject: [PATCH 063/177] fix: number ids were not sanitized to number in rest api --- .../src/queries/buildSearchParams.ts | 24 ++++--------- packages/db-postgres/src/schema/build.ts | 10 +++--- .../src/routes/rest/collections/deleteByID.ts | 15 +++++++- .../src/routes/rest/collections/duplicate.ts | 14 +++++++- .../src/routes/rest/collections/findByID.ts | 14 +++++++- .../rest/collections/findVersionByID.ts | 14 +++++++- .../routes/rest/collections/restoreVersion.ts | 14 +++++++- .../src/routes/rest/collections/updateByID.ts | 14 +++++++- .../rest/utilities/sanitizeCollectionID.ts | 23 +++++++++++++ .../payload/src/collections/config/types.ts | 1 + .../payload/src/collections/dataloader.ts | 10 ++---- .../src/collections/operations/create.ts | 6 +--- packages/payload/src/exports/utilities.ts | 1 - packages/payload/src/fields/validations.ts | 26 ++++---------- packages/payload/src/index.ts | 11 ++++++ packages/payload/src/utilities/getIDType.ts | 12 ------- .../src/field/features/upload/validate.ts | 16 +++------ packages/ui/src/elements/Publish/index.tsx | 2 +- test/database/config.ts | 13 +++++++ test/database/int.spec.ts | 34 ++++++++++++++++++- tsconfig.json | 4 +-- 21 files changed, 189 insertions(+), 89 deletions(-) create mode 100644 packages/next/src/routes/rest/utilities/sanitizeCollectionID.ts delete mode 100644 packages/payload/src/utilities/getIDType.ts diff --git a/packages/db-mongodb/src/queries/buildSearchParams.ts b/packages/db-mongodb/src/queries/buildSearchParams.ts index 538d749497..9bf73a87c9 100644 --- a/packages/db-mongodb/src/queries/buildSearchParams.ts +++ b/packages/db-mongodb/src/queries/buildSearchParams.ts @@ -59,17 +59,12 @@ export async function buildSearchParam({ let hasCustomID = false if (sanitizedPath === '_id') { - const customIDfield = payload.collections[collectionSlug]?.config.fields.find( - (field) => fieldAffectsData(field) && field.name === 'id', - ) + const customIDFieldType = payload.collections[collectionSlug]?.customIDType let idFieldType: 'number' | 'text' = 'text' - if (customIDfield) { - if (customIDfield?.type === 'text' || customIDfield?.type === 'number') { - idFieldType = customIDfield.type - } - + if (customIDFieldType) { + idFieldType = customIDFieldType hasCustomID = true } @@ -213,18 +208,11 @@ export async function buildSearchParam({ } else { ;(Array.isArray(field.relationTo) ? field.relationTo : [field.relationTo]).forEach( (relationTo) => { - const isRelatedToCustomNumberID = payload.collections[ - relationTo - ]?.config?.fields.find((relatedField) => { - return ( - fieldAffectsData(relatedField) && - relatedField.name === 'id' && - relatedField.type === 'number' - ) - }) + const isRelatedToCustomNumberID = + payload.collections[relationTo]?.customIDType === 'number' if (isRelatedToCustomNumberID) { - if (isRelatedToCustomNumberID.type === 'number') hasNumberIDRelation = true + hasNumberIDRelation = true } }, ) diff --git a/packages/db-postgres/src/schema/build.ts b/packages/db-postgres/src/schema/build.ts index e6b846790f..2fc2275d7e 100644 --- a/packages/db-postgres/src/schema/build.ts +++ b/packages/db-postgres/src/schema/build.ts @@ -298,11 +298,11 @@ export const buildTable = ({ throwValidationError: true, }) let colType = adapter.idType === 'uuid' ? 'uuid' : 'integer' - const relatedCollectionCustomID = relationshipConfig.fields.find( - (field) => fieldAffectsData(field) && field.name === 'id', - ) - if (relatedCollectionCustomID?.type === 'number') colType = 'numeric' - if (relatedCollectionCustomID?.type === 'text') colType = 'varchar' + + const relatedCollectionCustomIDType = adapter.payload[relationshipConfig.slug]?.customIDType + + if (relatedCollectionCustomIDType === 'number') colType = 'numeric' + if (relatedCollectionCustomIDType === 'text') colType = 'varchar' relationshipColumns[`${relationTo}ID`] = parentIDColumnMap[colType]( `${formattedRelationTo}_id`, diff --git a/packages/next/src/routes/rest/collections/deleteByID.ts b/packages/next/src/routes/rest/collections/deleteByID.ts index cb9ef65515..55646e7074 100644 --- a/packages/next/src/routes/rest/collections/deleteByID.ts +++ b/packages/next/src/routes/rest/collections/deleteByID.ts @@ -4,9 +4,22 @@ import { isNumber } from 'payload/utilities' import type { CollectionRouteHandlerWithID } from '../types.js' -export const deleteByID: CollectionRouteHandlerWithID = async ({ id, collection, req }) => { +import { sanitizeCollectionID } from '../utilities/sanitizeCollectionID.js' + +export const deleteByID: CollectionRouteHandlerWithID = async ({ + id: incomingID, + collection, + req, +}) => { const { searchParams } = req const depth = searchParams.get('depth') + + const id = sanitizeCollectionID({ + id: incomingID, + collectionSlug: collection.config.slug, + payload: req.payload, + }) + const doc = await deleteByIDOperation({ id, collection, diff --git a/packages/next/src/routes/rest/collections/duplicate.ts b/packages/next/src/routes/rest/collections/duplicate.ts index 622da78bbc..b488653f2d 100644 --- a/packages/next/src/routes/rest/collections/duplicate.ts +++ b/packages/next/src/routes/rest/collections/duplicate.ts @@ -5,12 +5,24 @@ import { isNumber } from 'payload/utilities' import type { CollectionRouteHandlerWithID } from '../types.js' -export const duplicate: CollectionRouteHandlerWithID = async ({ id, collection, req }) => { +import { sanitizeCollectionID } from '../utilities/sanitizeCollectionID.js' + +export const duplicate: CollectionRouteHandlerWithID = async ({ + id: incomingID, + collection, + req, +}) => { const { searchParams } = req const depth = searchParams.get('depth') // draft defaults to true, unless explicitly set requested as false to prevent the newly duplicated document from being published const draft = searchParams.get('draft') !== 'false' + const id = sanitizeCollectionID({ + id: incomingID, + collectionSlug: collection.config.slug, + payload: req.payload, + }) + const doc = await duplicateOperation({ id, collection, diff --git a/packages/next/src/routes/rest/collections/findByID.ts b/packages/next/src/routes/rest/collections/findByID.ts index 545d8eccc8..5ec704b8d4 100644 --- a/packages/next/src/routes/rest/collections/findByID.ts +++ b/packages/next/src/routes/rest/collections/findByID.ts @@ -4,10 +4,22 @@ import { isNumber } from 'payload/utilities' import type { CollectionRouteHandlerWithID } from '../types.js' -export const findByID: CollectionRouteHandlerWithID = async ({ id, collection, req }) => { +import { sanitizeCollectionID } from '../utilities/sanitizeCollectionID.js' + +export const findByID: CollectionRouteHandlerWithID = async ({ + id: incomingID, + collection, + req, +}) => { const { searchParams } = req const depth = searchParams.get('depth') + const id = sanitizeCollectionID({ + id: incomingID, + collectionSlug: collection.config.slug, + payload: req.payload, + }) + const result = await findByIDOperation({ id, collection, diff --git a/packages/next/src/routes/rest/collections/findVersionByID.ts b/packages/next/src/routes/rest/collections/findVersionByID.ts index f85ca76c94..b3b1bd24fc 100644 --- a/packages/next/src/routes/rest/collections/findVersionByID.ts +++ b/packages/next/src/routes/rest/collections/findVersionByID.ts @@ -4,10 +4,22 @@ import { isNumber } from 'payload/utilities' import type { CollectionRouteHandlerWithID } from '../types.js' -export const findVersionByID: CollectionRouteHandlerWithID = async ({ id, collection, req }) => { +import { sanitizeCollectionID } from '../utilities/sanitizeCollectionID.js' + +export const findVersionByID: CollectionRouteHandlerWithID = async ({ + id: incomingID, + collection, + req, +}) => { const { searchParams } = req const depth = searchParams.get('depth') + const id = sanitizeCollectionID({ + id: incomingID, + collectionSlug: collection.config.slug, + payload: req.payload, + }) + const result = await findVersionByIDOperation({ id, collection, diff --git a/packages/next/src/routes/rest/collections/restoreVersion.ts b/packages/next/src/routes/rest/collections/restoreVersion.ts index 9224691861..66c1278eb3 100644 --- a/packages/next/src/routes/rest/collections/restoreVersion.ts +++ b/packages/next/src/routes/rest/collections/restoreVersion.ts @@ -4,10 +4,22 @@ import { isNumber } from 'payload/utilities' import type { CollectionRouteHandlerWithID } from '../types.js' -export const restoreVersion: CollectionRouteHandlerWithID = async ({ id, collection, req }) => { +import { sanitizeCollectionID } from '../utilities/sanitizeCollectionID.js' + +export const restoreVersion: CollectionRouteHandlerWithID = async ({ + id: incomingID, + collection, + req, +}) => { const { searchParams } = req const depth = searchParams.get('depth') + const id = sanitizeCollectionID({ + id: incomingID, + collectionSlug: collection.config.slug, + payload: req.payload, + }) + const result = await restoreVersionOperation({ id, collection, diff --git a/packages/next/src/routes/rest/collections/updateByID.ts b/packages/next/src/routes/rest/collections/updateByID.ts index af42d1ca94..d10205a46c 100644 --- a/packages/next/src/routes/rest/collections/updateByID.ts +++ b/packages/next/src/routes/rest/collections/updateByID.ts @@ -4,12 +4,24 @@ import { isNumber } from 'payload/utilities' import type { CollectionRouteHandlerWithID } from '../types.js' -export const updateByID: CollectionRouteHandlerWithID = async ({ id, collection, req }) => { +import { sanitizeCollectionID } from '../utilities/sanitizeCollectionID.js' + +export const updateByID: CollectionRouteHandlerWithID = async ({ + id: incomingID, + collection, + req, +}) => { const { searchParams } = req const depth = searchParams.get('depth') const autosave = searchParams.get('autosave') === 'true' const draft = searchParams.get('draft') === 'true' + const id = sanitizeCollectionID({ + id: incomingID, + collectionSlug: collection.config.slug, + payload: req.payload, + }) + const doc = await updateByIDOperation({ id, autosave, diff --git a/packages/next/src/routes/rest/utilities/sanitizeCollectionID.ts b/packages/next/src/routes/rest/utilities/sanitizeCollectionID.ts new file mode 100644 index 0000000000..98165dcd15 --- /dev/null +++ b/packages/next/src/routes/rest/utilities/sanitizeCollectionID.ts @@ -0,0 +1,23 @@ +import type { Payload } from 'payload/types' + +type Args = { + collectionSlug: string + id: string + payload: Payload +} + +export const sanitizeCollectionID = ({ id, collectionSlug, payload }: Args): number | string => { + let sanitizedID: number | string = id + const collection = payload.collections[collectionSlug] + + // If default db ID type is a number, we should sanitize + let shouldSanitize = Boolean(payload.db.defaultIDType === 'number') + + // UNLESS the customIDType for this collection is text.... then we leave it + if (shouldSanitize && collection.customIDType === 'text') shouldSanitize = false + + // If we still should sanitize, parse float + if (shouldSanitize) sanitizedID = parseFloat(sanitizedID) + + return sanitizedID +} diff --git a/packages/payload/src/collections/config/types.ts b/packages/payload/src/collections/config/types.ts index 0decc884ea..01ee0edaee 100644 --- a/packages/payload/src/collections/config/types.ts +++ b/packages/payload/src/collections/config/types.ts @@ -408,6 +408,7 @@ export interface SanitizedCollectionConfig export type Collection = { config: SanitizedCollectionConfig + customIDType?: 'number' | 'text' graphQL?: { JWT: GraphQLObjectType mutationInputType: GraphQLNonNull diff --git a/packages/payload/src/collections/dataloader.ts b/packages/payload/src/collections/dataloader.ts index e7081d609b..1686ef2e6e 100644 --- a/packages/payload/src/collections/dataloader.ts +++ b/packages/payload/src/collections/dataloader.ts @@ -5,8 +5,6 @@ import DataLoader from 'dataloader' import type { PayloadRequest } from '../types/index.js' import type { TypeWithID } from './config/types.js' -import { fieldAffectsData } from '../fields/config/types.js' -import { getIDType } from '../utilities/getIDType.js' import { isValidID } from '../utilities/isValidID.js' // Payload uses `dataloader` to solve the classic GraphQL N+1 problem. @@ -71,15 +69,13 @@ const batchAndLoadDocs = const batchKey = JSON.stringify(batchKeyArray) - const idField = payload.collections?.[collection].config.fields.find( - (field) => fieldAffectsData(field) && field.name === 'id', - ) + const idType = payload.collections?.[collection].customIDType || payload.db.defaultIDType let sanitizedID: number | string = id - if (idField?.type === 'number') sanitizedID = parseFloat(id) + if (idType === 'number') sanitizedID = parseFloat(id) - if (isValidID(sanitizedID, getIDType(idField, payload?.db?.defaultIDType))) { + if (isValidID(sanitizedID, idType)) { return { ...batches, [batchKey]: [...(batches[batchKey] || []), sanitizedID], diff --git a/packages/payload/src/collections/operations/create.ts b/packages/payload/src/collections/operations/create.ts index 1cd90fc00a..fd67ed628c 100644 --- a/packages/payload/src/collections/operations/create.ts +++ b/packages/payload/src/collections/operations/create.ts @@ -22,7 +22,6 @@ import { generateFileData } from '../../uploads/generateFileData.js' import { unlinkTempFiles } from '../../uploads/unlinkTempFiles.js' import { uploadFiles } from '../../uploads/uploadFiles.js' import { commitTransaction } from '../../utilities/commitTransaction.js' -import flattenFields from '../../utilities/flattenTopLevelFields.js' import { initTransaction } from '../../utilities/initTransaction.js' import { killTransaction } from '../../utilities/killTransaction.js' import sanitizeInternalFields from '../../utilities/sanitizeInternalFields.js' @@ -106,11 +105,8 @@ export const createOperation = async field.name === 'id') > -1 - if (hasIdField) { + if (payload.collections[collectionConfig.slug].customIDType) { data = { _id: data.id, ...data, diff --git a/packages/payload/src/exports/utilities.ts b/packages/payload/src/exports/utilities.ts index 1e50cea389..976a1a061c 100644 --- a/packages/payload/src/exports/utilities.ts +++ b/packages/payload/src/exports/utilities.ts @@ -25,7 +25,6 @@ export { default as flattenTopLevelFields } from '../utilities/flattenTopLevelFi export { formatLabels, formatNames, toWords } from '../utilities/formatLabels.js' export { getCollectionIDFieldTypes } from '../utilities/getCollectionIDFieldTypes.js' -export { getIDType } from '../utilities/getIDType.js' export { getObjectDotNotation } from '../utilities/getObjectDotNotation.js' export { default as getUniqueListBy } from '../utilities/getUniqueListBy.js' diff --git a/packages/payload/src/fields/validations.ts b/packages/payload/src/fields/validations.ts index 7d24f2e63c..f048e82348 100644 --- a/packages/payload/src/fields/validations.ts +++ b/packages/payload/src/fields/validations.ts @@ -21,10 +21,8 @@ import type { Validate, } from './config/types.js' -import { getIDType } from '../utilities/getIDType.js' import { isNumber } from '../utilities/isNumber.js' import { isValidID } from '../utilities/isValidID.js' -import { fieldAffectsData } from './config/types.js' export const text: Validate = ( value, @@ -425,13 +423,11 @@ export const upload: Validate = ( } if (typeof value !== 'undefined' && value !== null) { - const idField = options?.req?.payload?.config?.collections - ?.find((collection) => collection.slug === options.relationTo) - ?.fields?.find((field) => fieldAffectsData(field) && field.name === 'id') + const idType = + options?.req?.payload?.collections[options.relationTo]?.customIDType || + options?.req?.payload?.db?.defaultIDType - const type = getIDType(idField, options?.req?.payload?.db?.defaultIDType) - - if (!isValidID(value, type)) { + if (!isValidID(value, idType)) { return options.req?.t('validation:validUploadID') } } @@ -449,11 +445,7 @@ export const relationship: Validate< maxRows, minRows, relationTo, - req: { - payload, - payload: { config }, - t, - }, + req: { payload, t }, required, } = options @@ -502,13 +494,9 @@ export const relationship: Validate< if (requestedID === null) return false - const idField = config?.collections - ?.find((collection) => collection.slug === collectionSlug) - ?.fields?.find((field) => fieldAffectsData(field) && field.name === 'id') + const idType = payload.collections[collectionSlug]?.customIDType || payload.db.defaultIDType - const type = getIDType(idField, payload?.db?.defaultIDType) - - return !isValidID(requestedID, type) + return !isValidID(requestedID, idType) }) if (invalidRelationships.length > 0) { diff --git a/packages/payload/src/index.ts b/packages/payload/src/index.ts index ddc62d82cb..7a57519afc 100644 --- a/packages/payload/src/index.ts +++ b/packages/payload/src/index.ts @@ -52,7 +52,9 @@ import { validateSchema } from './config/validate.js' import buildEmail from './email/build.js' import { defaults as emailDefaults } from './email/defaults.js' import sendEmail from './email/sendEmail.js' +import { fieldAffectsData } from './exports/types.js' import localGlobalOperations from './globals/operations/local/index.js' +import flattenFields from './utilities/flattenTopLevelFields.js' import Logger from './utilities/logger.js' import { serverInit as serverInitTelemetry } from './utilities/telemetry/events/serverInit.js' @@ -340,8 +342,17 @@ export class BasePayload { } this.config.collections.forEach((collection) => { + const customID = flattenFields(collection.fields).find( + (field) => fieldAffectsData(field) && field.name === 'id', + ) + + let customIDType + + if (customID?.type === 'number' || customID?.type === 'text') customIDType = customID.type + this.collections[collection.slug] = { config: collection, + customIDType, } }) diff --git a/packages/payload/src/utilities/getIDType.ts b/packages/payload/src/utilities/getIDType.ts deleted file mode 100644 index 355e56b6c6..0000000000 --- a/packages/payload/src/utilities/getIDType.ts +++ /dev/null @@ -1,12 +0,0 @@ -import type { BaseDatabaseAdapter } from '../database/types.js' -import type { Field } from '../fields/config/types.js' - -export const getIDType = ( - idField: Field | null, - defaultIDType: BaseDatabaseAdapter['defaultIDType'] | null, -): 'ObjectID' | 'number' | 'text' => { - if (idField) { - return idField.type === 'number' ? 'number' : 'text' - } - return defaultIDType || 'ObjectID' -} diff --git a/packages/richtext-lexical/src/field/features/upload/validate.ts b/packages/richtext-lexical/src/field/features/upload/validate.ts index 1672ec6de2..e7979f4dab 100644 --- a/packages/richtext-lexical/src/field/features/upload/validate.ts +++ b/packages/richtext-lexical/src/field/features/upload/validate.ts @@ -1,5 +1,4 @@ -import { fieldAffectsData } from 'payload/types' -import { getIDType, isValidID } from 'payload/utilities' +import { isValidID } from 'payload/utilities' import type { NodeValidation } from '../types.js' import type { SerializedUploadNode } from './nodes/UploadNode.js' @@ -11,21 +10,14 @@ export const uploadValidation = (): NodeValidation => { node, validation: { options: { - req: { - payload: { config, db }, - t, - }, + req: { payload, t }, }, }, }) => { if (!CAN_USE_DOM) { - const idField = config.collections - .find(({ slug }) => slug === node.relationTo) - .fields.find((field) => fieldAffectsData(field) && field.name === 'id') + const idType = payload.collections[node.relationTo].customIDType || payload.db.defaultIDType - const type = getIDType(idField, db?.defaultIDType) - - if (!isValidID(node.value?.id, type)) { + if (!isValidID(node.value?.id, idType)) { return t('validation:validUploadID') } } diff --git a/packages/ui/src/elements/Publish/index.tsx b/packages/ui/src/elements/Publish/index.tsx index 2044e57140..e5215779a8 100644 --- a/packages/ui/src/elements/Publish/index.tsx +++ b/packages/ui/src/elements/Publish/index.tsx @@ -75,7 +75,7 @@ export const DefaultPublishButton: React.FC<{ label?: string }> = ({ label: labe void fetchPublishAccess() }, [api, code, collectionSlug, getData, globalSlug, id, serverURL]) - if (!canPublish) return null + if (!hasPublishPermission) return null return ( { + if (operation === 'update') { + const defaultIDType = req.payload.db.defaultIDType + + if (defaultIDType === 'number' && typeof args.id === 'string') { + throw new Error('ID was not sanitized to a number properly') + } + } + }, + ], + }, fields: [ { name: 'title', diff --git a/test/database/int.spec.ts b/test/database/int.spec.ts index c9cc8104ee..9ff9980bde 100644 --- a/test/database/int.spec.ts +++ b/test/database/int.spec.ts @@ -1,4 +1,5 @@ import type { PostgresAdapter } from '@payloadcms/db-postgres/types' +import type { NextRESTClient } from 'helpers/NextRESTClient.js' import type { Payload } from 'payload' import type { PayloadRequest, TypeWithID } from 'payload/types' @@ -18,13 +19,15 @@ const dirname = path.dirname(filename) let payload: Payload let user: TypeWithID & Record +let token: string +let restClient: NextRESTClient const collection = 'posts' const title = 'title' process.env.PAYLOAD_CONFIG_PATH = path.join(dirname, 'config.ts') describe('database', () => { beforeAll(async () => { - ;({ payload } = await initPayloadInt(configPromise)) + ;({ payload, restClient } = await initPayloadInt(configPromise)) payload.db.migrationDir = path.join(dirname, './migrations') const loginResult = await payload.login({ @@ -36,6 +39,7 @@ describe('database', () => { }) user = loginResult.user + token = loginResult.token }) afterAll(async () => { @@ -184,6 +188,34 @@ describe('database', () => { }) }) + describe('id type', () => { + it('should sanitize incoming IDs if ID type is number', async () => { + const { doc } = await restClient + .POST(`/posts`, { + body: JSON.stringify({ + title: 'post to test that ID comes in as proper type', + }), + headers: { + Authorization: `Bearer ${token}`, + }, + }) + .then((res) => res.json()) + + const { doc: updated } = await restClient + .PATCH(`/posts/${doc.id}`, { + body: JSON.stringify({ + title: 'hello', + }), + headers: { + Authorization: `Bearer ${token}`, + }, + }) + .then((res) => res.json()) + + expect(updated.id).toStrictEqual(doc.id) + }) + }) + describe('transactions', () => { describe('local api', () => { it('should commit multiple operations in isolation', async () => { diff --git a/tsconfig.json b/tsconfig.json index 07cf2e3abc..d55001935b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -37,7 +37,7 @@ ], "paths": { "@payload-config": [ - "./test/fields/config.ts" + "./test/_community/config.ts" ], "@payloadcms/live-preview": [ "./packages/live-preview/src" @@ -161,4 +161,4 @@ ".next/types/**/*.ts", "scripts/**/*.ts" ] -} \ No newline at end of file +} From 312dca003bac5b95517ed730b53c7870315f1f8e Mon Sep 17 00:00:00 2001 From: Elliot DeNolf Date: Wed, 10 Apr 2024 16:32:19 -0400 Subject: [PATCH 064/177] feat(cpa): CJS next config AST parsing --- .../create-payload-app/src/lib/init-next.ts | 66 ++++++- .../src/lib/wrap-next-config.spec.ts | 168 +++++++++++++----- .../src/lib/wrap-next-config.ts | 139 ++++++++++----- 3 files changed, 273 insertions(+), 100 deletions(-) diff --git a/packages/create-payload-app/src/lib/init-next.ts b/packages/create-payload-app/src/lib/init-next.ts index f7c1e980f9..afdf23609d 100644 --- a/packages/create-payload-app/src/lib/init-next.ts +++ b/packages/create-payload-app/src/lib/init-next.ts @@ -4,6 +4,7 @@ import * as p from '@clack/prompts' import { parse, stringify } from 'comment-json' import execa from 'execa' import fs from 'fs' +import fse from 'fs-extra' import globby from 'globby' import path from 'path' import { promisify } from 'util' @@ -31,6 +32,8 @@ type InitNextArgs = Pick & { useDistFiles?: boolean } +type NextConfigType = 'cjs' | 'esm' + type InitNextResult = | { isSrcDir: boolean @@ -45,11 +48,22 @@ export async function initNext(args: InitNextArgs): Promise { const nextAppDetails = args.nextAppDetails || (await getNextAppDetails(projectDir)) - const { hasTopLevelLayout, isSrcDir, nextAppDir } = - nextAppDetails || (await getNextAppDetails(projectDir)) + if (!nextAppDetails.nextAppDir) { + warning(`Could not find app directory in ${projectDir}, creating...`) + const createdAppDir = path.resolve(projectDir, nextAppDetails.isSrcDir ? 'src/app' : 'app') + fse.mkdirSync(createdAppDir, { recursive: true }) + nextAppDetails.nextAppDir = createdAppDir + } - if (!nextAppDir) { - return { isSrcDir, reason: `Could not find app directory in ${projectDir}`, success: false } + const { hasTopLevelLayout, isSrcDir, nextAppDir, nextConfigType } = nextAppDetails + + if (!nextConfigType) { + return { + isSrcDir, + nextAppDir, + reason: `Could not determine Next Config type in ${projectDir}. Possibly try renaming next.config.js to next.config.cjs or next.config.mjs.`, + success: false, + } } if (hasTopLevelLayout) { @@ -69,6 +83,7 @@ export async function initNext(args: InitNextArgs): Promise { const configurationResult = installAndConfigurePayload({ ...args, nextAppDetails, + nextConfigType, useDistFiles: true, // Requires running 'pnpm pack-template-files' in cpa }) @@ -96,6 +111,13 @@ export async function initNext(args: InitNextArgs): Promise { async function addPayloadConfigToTsConfig(projectDir: string, isSrcDir: boolean) { const tsConfigPath = path.resolve(projectDir, 'tsconfig.json') + + // Check if tsconfig.json exists + if (!fs.existsSync(tsConfigPath)) { + warning(`Could not find tsconfig.json to add @payload-config path.`) + return + } + const userTsConfigContent = await readFile(tsConfigPath, { encoding: 'utf8', }) @@ -119,13 +141,18 @@ async function addPayloadConfigToTsConfig(projectDir: string, isSrcDir: boolean) } function installAndConfigurePayload( - args: InitNextArgs & { nextAppDetails: NextAppDetails; useDistFiles?: boolean }, + args: InitNextArgs & { + nextAppDetails: NextAppDetails + nextConfigType: NextConfigType + useDistFiles?: boolean + }, ): | { payloadConfigPath: string; success: true } | { payloadConfigPath?: string; reason: string; success: false } { const { '--debug': debug, nextAppDetails: { isSrcDir, nextAppDir, nextConfigPath } = {}, + nextConfigType, projectDir, useDistFiles, } = args @@ -172,6 +199,7 @@ function installAndConfigurePayload( logDebug(`nextAppDir: ${nextAppDir}`) logDebug(`projectDir: ${projectDir}`) logDebug(`nextConfigPath: ${nextConfigPath}`) + logDebug(`payloadConfigPath: ${path.resolve(projectDir, 'payload.config.ts')}`) logDebug( `isSrcDir: ${isSrcDir}. source: ${templateSrcDir}. dest: ${path.dirname(nextConfigPath)}`, @@ -181,7 +209,7 @@ function installAndConfigurePayload( copyRecursiveSync(templateSrcDir, path.dirname(nextConfigPath), debug) // Wrap next.config.js with withPayload - wrapNextConfig({ nextConfigPath }) + wrapNextConfig({ nextConfigPath, nextConfigType }) return { payloadConfigPath: path.resolve(nextAppDir, '../payload.config.ts'), @@ -226,6 +254,7 @@ type NextAppDetails = { isSrcDir: boolean nextAppDir?: string nextConfigPath?: string + nextConfigType?: NextConfigType } export async function getNextAppDetails(projectDir: string): Promise { @@ -246,6 +275,7 @@ export async function getNextAppDetails(projectDir: string): Promise { + if (nextConfigPath.endsWith('.mjs')) { + return 'esm' + } + if (nextConfigPath.endsWith('.cjs')) { + return 'cjs' + } + + const packageObj = await fse.readJson(path.resolve(projectDir, 'package.json')) + const packageJsonType = packageObj.type + if (packageJsonType === 'module') { + return 'esm' + } + if (packageJsonType === 'commonjs') { + return 'cjs' + } + + return 'cjs' } diff --git a/packages/create-payload-app/src/lib/wrap-next-config.spec.ts b/packages/create-payload-app/src/lib/wrap-next-config.spec.ts index be41216f0f..968b8a79ef 100644 --- a/packages/create-payload-app/src/lib/wrap-next-config.spec.ts +++ b/packages/create-payload-app/src/lib/wrap-next-config.spec.ts @@ -1,61 +1,133 @@ -import { parseAndModifyConfigContent, withPayloadImportStatement } from './wrap-next-config.js' +import { parseAndModifyConfigContent, withPayloadStatement } from './wrap-next-config.js' import * as p from '@clack/prompts' -const defaultNextConfig = `/** @type {import('next').NextConfig} */ +const esmConfigs = { + defaultNextConfig: `/** @type {import('next').NextConfig} */ const nextConfig = {}; - export default nextConfig; -` - -const nextConfigWithFunc = `const nextConfig = { - // Your Next.js config here -} - -export default someFunc(nextConfig) -` -const nextConfigWithFuncMultiline = `const nextConfig = { - // Your Next.js config here -} - +`, + nextConfigWithFunc: `const nextConfig = {}; +export default someFunc(nextConfig); +`, + nextConfigWithFuncMultiline: `const nextConfig = {};; export default someFunc( nextConfig -) -` - -const nextConfigExportNamedDefault = `const nextConfig = { - // Your Next.js config here +); +`, + nextConfigExportNamedDefault: `const nextConfig = {}; +const wrapped = someFunc(asdf); +export { wrapped as default }; +`, +} + +const cjsConfigs = { + defaultNextConfig: ` + /** @type {import('next').NextConfig} */ +const nextConfig = {}; +module.exports = nextConfig; +`, + anonConfig: `module.exports = {};`, + nextConfigWithFunc: `const nextConfig = {}; +module.exports = someFunc(nextConfig); +`, + nextConfigWithFuncMultiline: `const nextConfig = {}; +module.exports = someFunc( + nextConfig +); +`, + nextConfigExportNamedDefault: `const nextConfig = {}; +const wrapped = someFunc(asdf); +module.exports = wrapped; +`, } -const wrapped = someFunc(asdf) -export { wrapped as default } -` describe('parseAndInsertWithPayload', () => { - it('should parse the default next config', () => { - const { modifiedConfigContent } = parseAndModifyConfigContent(defaultNextConfig) - expect(modifiedConfigContent).toContain(withPayloadImportStatement) - expect(modifiedConfigContent).toContain('withPayload(nextConfig)') - }) - it('should parse the config with a function', () => { - const { modifiedConfigContent } = parseAndModifyConfigContent(nextConfigWithFunc) - expect(modifiedConfigContent).toContain('withPayload(someFunc(nextConfig))') + describe('esm', () => { + const configType = 'esm' + const importStatement = withPayloadStatement[configType] + it('should parse the default next config', () => { + const { modifiedConfigContent } = parseAndModifyConfigContent( + esmConfigs.defaultNextConfig, + configType, + ) + expect(modifiedConfigContent).toContain(importStatement) + expect(modifiedConfigContent).toContain('withPayload(nextConfig)') + }) + it('should parse the config with a function', () => { + const { modifiedConfigContent } = parseAndModifyConfigContent( + esmConfigs.nextConfigWithFunc, + configType, + ) + expect(modifiedConfigContent).toContain('withPayload(someFunc(nextConfig))') + }) + + it('should parse the config with a function on a new line', () => { + const { modifiedConfigContent } = parseAndModifyConfigContent( + esmConfigs.nextConfigWithFuncMultiline, + configType, + ) + expect(modifiedConfigContent).toContain(importStatement) + expect(modifiedConfigContent).toMatch(/withPayload\(someFunc\(\n nextConfig\n\)\)/) + }) + + // Unsupported: export { wrapped as default } + it('should give warning with a named export as default', () => { + const warnLogSpy = jest.spyOn(p.log, 'warn').mockImplementation(() => {}) + + const { modifiedConfigContent, success } = parseAndModifyConfigContent( + esmConfigs.nextConfigExportNamedDefault, + configType, + ) + expect(modifiedConfigContent).toContain(importStatement) + expect(success).toBe(false) + + expect(warnLogSpy).toHaveBeenCalledWith( + expect.stringContaining('Could not automatically wrap'), + ) + }) }) - it('should parse the config with a function on a new line', () => { - const { modifiedConfigContent } = parseAndModifyConfigContent(nextConfigWithFuncMultiline) - expect(modifiedConfigContent).toContain(withPayloadImportStatement) - expect(modifiedConfigContent).toMatch(/withPayload\(someFunc\(\n nextConfig\n\)\)/) - }) - - // Unsupported: export { wrapped as default } - it('should give warning with a named export as default', () => { - const warnLogSpy = jest.spyOn(p.log, 'warn').mockImplementation(() => {}) - - const { modifiedConfigContent, success } = parseAndModifyConfigContent( - nextConfigExportNamedDefault, - ) - expect(modifiedConfigContent).toContain(withPayloadImportStatement) - expect(success).toBe(false) - - expect(warnLogSpy).toHaveBeenCalledWith(expect.stringContaining('Could not automatically wrap')) + describe('cjs', () => { + const configType = 'cjs' + const requireStatement = withPayloadStatement[configType] + it('should parse the default next config', () => { + const { modifiedConfigContent } = parseAndModifyConfigContent( + cjsConfigs.defaultNextConfig, + configType, + ) + expect(modifiedConfigContent).toContain(requireStatement) + expect(modifiedConfigContent).toContain('withPayload(nextConfig)') + }) + it('should parse anonymous default config', () => { + const { modifiedConfigContent } = parseAndModifyConfigContent( + cjsConfigs.anonConfig, + configType, + ) + expect(modifiedConfigContent).toContain(requireStatement) + expect(modifiedConfigContent).toContain('withPayload({})') + }) + it('should parse the config with a function', () => { + const { modifiedConfigContent } = parseAndModifyConfigContent( + cjsConfigs.nextConfigWithFunc, + configType, + ) + expect(modifiedConfigContent).toContain('withPayload(someFunc(nextConfig))') + }) + it('should parse the config with a function on a new line', () => { + const { modifiedConfigContent } = parseAndModifyConfigContent( + cjsConfigs.nextConfigWithFuncMultiline, + configType, + ) + expect(modifiedConfigContent).toContain(requireStatement) + expect(modifiedConfigContent).toMatch(/withPayload\(someFunc\(\n nextConfig\n\)\)/) + }) + it('should parse the config with a named export as default', () => { + const { modifiedConfigContent } = parseAndModifyConfigContent( + cjsConfigs.nextConfigExportNamedDefault, + configType, + ) + expect(modifiedConfigContent).toContain(requireStatement) + expect(modifiedConfigContent).toContain('withPayload(wrapped)') + }) }) }) diff --git a/packages/create-payload-app/src/lib/wrap-next-config.ts b/packages/create-payload-app/src/lib/wrap-next-config.ts index 93722e0c37..ccc6ecdb98 100644 --- a/packages/create-payload-app/src/lib/wrap-next-config.ts +++ b/packages/create-payload-app/src/lib/wrap-next-config.ts @@ -5,12 +5,23 @@ import fs from 'fs' import { warning } from '../utils/log.js' import { log } from '../utils/log.js' -export const withPayloadImportStatement = `import { withPayload } from '@payloadcms/next'\n` +export const withPayloadStatement = { + cjs: `const { withPayload } = require('@payloadcms/next/withPayload')\n`, + esm: `import { withPayload } from '@payloadcms/next/withPayload'\n`, +} -export const wrapNextConfig = (args: { nextConfigPath: string }) => { - const { nextConfigPath } = args +type NextConfigType = 'cjs' | 'esm' + +export const wrapNextConfig = (args: { + nextConfigPath: string + nextConfigType: NextConfigType +}) => { + const { nextConfigPath, nextConfigType: configType } = args const configContent = fs.readFileSync(nextConfigPath, 'utf8') - const { modifiedConfigContent: newConfig, success } = parseAndModifyConfigContent(configContent) + const { modifiedConfigContent: newConfig, success } = parseAndModifyConfigContent( + configContent, + configType, + ) if (!success) { return @@ -22,72 +33,110 @@ export const wrapNextConfig = (args: { nextConfigPath: string }) => { /** * Parses config content with AST and wraps it with withPayload function */ -export function parseAndModifyConfigContent(content: string): { - modifiedConfigContent: string - success: boolean -} { - content = withPayloadImportStatement + content +export function parseAndModifyConfigContent( + content: string, + configType: NextConfigType, +): { modifiedConfigContent: string; success: boolean } { + content = withPayloadStatement[configType] + content const ast = parseModule(content, { loc: true }) - const exportDefaultDeclaration = ast.body.find((p) => p.type === 'ExportDefaultDeclaration') as - | Directive - | undefined - const exportNamedDeclaration = ast.body.find((p) => p.type === 'ExportNamedDeclaration') as - | ExportNamedDeclaration - | undefined + if (configType === 'esm') { + const exportDefaultDeclaration = ast.body.find((p) => p.type === 'ExportDefaultDeclaration') as + | Directive + | undefined - if (!exportDefaultDeclaration && !exportNamedDeclaration) { - throw new Error('Could not find ExportDefaultDeclaration in next.config.js') - } + const exportNamedDeclaration = ast.body.find((p) => p.type === 'ExportNamedDeclaration') as + | ExportNamedDeclaration + | undefined - if (exportDefaultDeclaration && exportDefaultDeclaration.declaration?.loc) { - const modifiedConfigContent = insertBeforeAndAfter( - content, - exportDefaultDeclaration.declaration.loc, - ) - return { modifiedConfigContent, success: true } - } else if (exportNamedDeclaration) { - const exportSpecifier = exportNamedDeclaration.specifiers.find( - (s) => - s.type === 'ExportSpecifier' && - s.exported?.name === 'default' && - s.local?.type === 'Identifier' && - s.local?.name, - ) + if (!exportDefaultDeclaration && !exportNamedDeclaration) { + throw new Error('Could not find ExportDefaultDeclaration in next.config.js') + } - if (exportSpecifier) { - warning('Could not automatically wrap next.config.js with withPayload.') - warning('Automatic wrapping of named exports as default not supported yet.') + if (exportDefaultDeclaration && exportDefaultDeclaration.declaration?.loc) { + const modifiedConfigContent = insertBeforeAndAfter( + content, + exportDefaultDeclaration.declaration.loc, + configType, + ) + return { modifiedConfigContent, success: true } + } else if (exportNamedDeclaration) { + const exportSpecifier = exportNamedDeclaration.specifiers.find( + (s) => + s.type === 'ExportSpecifier' && + s.exported?.name === 'default' && + s.local?.type === 'Identifier' && + s.local?.name, + ) - warnUserWrapNotSuccessful() - return { - modifiedConfigContent: content, - success: false, + if (exportSpecifier) { + warning('Could not automatically wrap next.config.js with withPayload.') + warning('Automatic wrapping of named exports as default not supported yet.') + + warnUserWrapNotSuccessful(configType) + return { + modifiedConfigContent: content, + success: false, + } } } + + warning('Could not automatically wrap Next config with withPayload.') + warnUserWrapNotSuccessful(configType) + return { + modifiedConfigContent: content, + success: false, + } + } else if (configType === 'cjs') { + // Find `module.exports = X` + const moduleExports = ast.body.find( + (p) => + p.type === 'ExpressionStatement' && + p.expression?.type === 'AssignmentExpression' && + p.expression.left?.type === 'MemberExpression' && + p.expression.left.object?.type === 'Identifier' && + p.expression.left.object.name === 'module' && + p.expression.left.property?.type === 'Identifier' && + p.expression.left.property.name === 'exports', + // eslint-disable-next-line @typescript-eslint/no-explicit-any + ) as any + + if (moduleExports && moduleExports.expression.right?.loc) { + const modifiedConfigContent = insertBeforeAndAfter( + content, + moduleExports.expression.right.loc, + configType, + ) + return { modifiedConfigContent, success: true } + } + + return { + modifiedConfigContent: content, + success: false, + } } - warning('Could not automatically wrap next.config.js with withPayload.') - warnUserWrapNotSuccessful() + warning('Could not automatically wrap Next config with withPayload.') + warnUserWrapNotSuccessful(configType) return { modifiedConfigContent: content, success: false, } } -function warnUserWrapNotSuccessful() { +function warnUserWrapNotSuccessful(configType: NextConfigType) { // Output directions for user to update next.config.js const withPayloadMessage = ` ${chalk.bold(`Please manually wrap your existing next.config.js with the withPayload function. Here is an example:`)} - import withPayload from '@payloadcms/next/withPayload' + ${withPayloadStatement[configType]} const nextConfig = { // Your Next.js config here } - export default withPayload(nextConfig) + ${configType === 'esm' ? 'export default withPayload(nextConfig)' : 'module.exports = withPayload(nextConfig)'} ` @@ -125,7 +174,7 @@ type Loc = { start: { column: number; line: number } } -function insertBeforeAndAfter(content: string, loc: Loc) { +function insertBeforeAndAfter(content: string, loc: Loc, configType: NextConfigType) { const { end, start } = loc const lines = content.split('\n') From 6accc705be93c89976146813654728f278b963ac Mon Sep 17 00:00:00 2001 From: Elliot DeNolf Date: Wed, 10 Apr 2024 16:32:36 -0400 Subject: [PATCH 065/177] chore(next): cjs build --- packages/next/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/next/package.json b/packages/next/package.json index c0f7c122fa..7cabe2e594 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -12,7 +12,7 @@ }, "scripts": { "build:cjs": "swc ./src/withPayload.js -o ./dist/cjs/withPayload.cjs --config-file .swcrc-cjs", - "build": "pnpm copyfiles && pnpm build:swc && p build:cjs && pnpm build:types && pnpm build:webpack && rm dist/prod/index.js", + "build": "pnpm copyfiles && pnpm build:swc && pnpm build:cjs && 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", From 96dbab8834631af83ec3967e1f434835423f80dd Mon Sep 17 00:00:00 2001 From: James Date: Wed, 10 Apr 2024 16:58:08 -0400 Subject: [PATCH 066/177] chore: misc fixes --- packages/db-mongodb/src/init.ts | 6 --- packages/db-postgres/src/schema/build.ts | 3 +- packages/next/src/utilities/getPayloadHMR.ts | 5 +- test/database/config.ts | 2 + test/database/int.spec.ts | 56 ++++++++++---------- 5 files changed, 36 insertions(+), 36 deletions(-) diff --git a/packages/db-mongodb/src/init.ts b/packages/db-mongodb/src/init.ts index 3aad0f4ab2..7ae4260489 100644 --- a/packages/db-mongodb/src/init.ts +++ b/packages/db-mongodb/src/init.ts @@ -56,12 +56,6 @@ export const init: Init = function init(this: MongooseAdapter) { this.autoPluralization === true ? undefined : collection.slug, ) as CollectionModel this.collections[collection.slug] = model - - // TS expect error only needed until we launch 2.0.0 - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - this.payload.collections[collection.slug] = { - config: collection, - } }) const model = buildGlobalModel(this.payload.config) diff --git a/packages/db-postgres/src/schema/build.ts b/packages/db-postgres/src/schema/build.ts index 2fc2275d7e..c193b1081d 100644 --- a/packages/db-postgres/src/schema/build.ts +++ b/packages/db-postgres/src/schema/build.ts @@ -299,7 +299,8 @@ export const buildTable = ({ }) let colType = adapter.idType === 'uuid' ? 'uuid' : 'integer' - const relatedCollectionCustomIDType = adapter.payload[relationshipConfig.slug]?.customIDType + const relatedCollectionCustomIDType = + adapter.payload.collections[relationshipConfig.slug]?.customIDType if (relatedCollectionCustomIDType === 'number') colType = 'numeric' if (relatedCollectionCustomIDType === 'text') colType = 'varchar' diff --git a/packages/next/src/utilities/getPayloadHMR.ts b/packages/next/src/utilities/getPayloadHMR.ts index d6ef9a35d9..dc00b54338 100644 --- a/packages/next/src/utilities/getPayloadHMR.ts +++ b/packages/next/src/utilities/getPayloadHMR.ts @@ -35,7 +35,10 @@ export const getPayloadHMR = async (options: InitOptions): Promise => { cached.payload.config = config cached.payload.collections = config.collections.reduce((collections, collection) => { - collections[collection.slug] = { config: collection } + collections[collection.slug] = { + config: collection, + customIDType: cached.payload.collections[collection.slug]?.customIDType, + } return collections }, {}) diff --git a/test/database/config.ts b/test/database/config.ts index f9be67eef3..156d1397b6 100644 --- a/test/database/config.ts +++ b/test/database/config.ts @@ -15,6 +15,8 @@ export default buildConfigWithDefaults({ throw new Error('ID was not sanitized to a number properly') } } + + return args }, ], }, diff --git a/test/database/int.spec.ts b/test/database/int.spec.ts index 9ff9980bde..e1f0d049dc 100644 --- a/test/database/int.spec.ts +++ b/test/database/int.spec.ts @@ -48,6 +48,34 @@ describe('database', () => { } }) + describe('id type', () => { + it('should sanitize incoming IDs if ID type is number', async () => { + const created = await restClient + .POST(`/posts`, { + body: JSON.stringify({ + title: 'post to test that ID comes in as proper type', + }), + headers: { + Authorization: `Bearer ${token}`, + }, + }) + .then((res) => res.json()) + + const { doc: updated } = await restClient + .PATCH(`/posts/${created.doc.id}`, { + body: JSON.stringify({ + title: 'hello', + }), + headers: { + Authorization: `Bearer ${token}`, + }, + }) + .then((res) => res.json()) + + expect(updated.id).toStrictEqual(created.doc.id) + }) + }) + describe('migrations', () => { beforeAll(async () => { if (process.env.PAYLOAD_DROP_DATABASE === 'true' && 'drizzle' in payload.db) { @@ -188,34 +216,6 @@ describe('database', () => { }) }) - describe('id type', () => { - it('should sanitize incoming IDs if ID type is number', async () => { - const { doc } = await restClient - .POST(`/posts`, { - body: JSON.stringify({ - title: 'post to test that ID comes in as proper type', - }), - headers: { - Authorization: `Bearer ${token}`, - }, - }) - .then((res) => res.json()) - - const { doc: updated } = await restClient - .PATCH(`/posts/${doc.id}`, { - body: JSON.stringify({ - title: 'hello', - }), - headers: { - Authorization: `Bearer ${token}`, - }, - }) - .then((res) => res.json()) - - expect(updated.id).toStrictEqual(doc.id) - }) - }) - describe('transactions', () => { describe('local api', () => { it('should commit multiple operations in isolation', async () => { From 414b03ce742d7f28dc03e3e5c0c98d1460e07c42 Mon Sep 17 00:00:00 2001 From: James Date: Wed, 10 Apr 2024 17:03:37 -0400 Subject: [PATCH 067/177] chore: fix to unit tests --- packages/payload/src/fields/config/sanitize.spec.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/payload/src/fields/config/sanitize.spec.ts b/packages/payload/src/fields/config/sanitize.spec.ts index 8c55515609..fa52e16a8d 100644 --- a/packages/payload/src/fields/config/sanitize.spec.ts +++ b/packages/payload/src/fields/config/sanitize.spec.ts @@ -14,7 +14,10 @@ import type { BaseDatabaseAdapter } from '../../database/types.js' const dummyConfig: Config = { collections: [], - db: () => ({}) as BaseDatabaseAdapter, + db: { + defaultIDType: 'text', + init: () => ({}) as BaseDatabaseAdapter['init'], + } as BaseDatabaseAdapter, } describe('sanitizeFields', () => { From d4e5d3df54bf3afccf6aeb8add2bd23a8101acf5 Mon Sep 17 00:00:00 2001 From: James Date: Wed, 10 Apr 2024 17:05:44 -0400 Subject: [PATCH 068/177] chore: fixes to unit tests --- packages/payload/src/fields/validations.spec.ts | 7 ++++++- packages/payload/src/fields/validations.ts | 3 ++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/payload/src/fields/validations.spec.ts b/packages/payload/src/fields/validations.spec.ts index a43194f593..b555e01010 100644 --- a/packages/payload/src/fields/validations.spec.ts +++ b/packages/payload/src/fields/validations.spec.ts @@ -12,7 +12,12 @@ let options: ValidateOptions = { t, context: {}, payload: { - config: {}, + config: { + db: { + defaultIDType: 'text', + init: () => null, + }, + }, }, }, } diff --git a/packages/payload/src/fields/validations.ts b/packages/payload/src/fields/validations.ts index f048e82348..80dbdd6f8d 100644 --- a/packages/payload/src/fields/validations.ts +++ b/packages/payload/src/fields/validations.ts @@ -494,7 +494,8 @@ export const relationship: Validate< if (requestedID === null) return false - const idType = payload.collections[collectionSlug]?.customIDType || payload.db.defaultIDType + const idType = + payload.collections[collectionSlug]?.customIDType || payload?.db?.defaultIDType || 'text' return !isValidID(requestedID, idType) }) From cddb08de1a7f0d88d3a1530badd469a09f48bf18 Mon Sep 17 00:00:00 2001 From: Elliot DeNolf Date: Wed, 10 Apr 2024 17:11:20 -0400 Subject: [PATCH 069/177] chore: ignore payload/i18n --- packages/payload/.gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/payload/.gitignore b/packages/payload/.gitignore index ffc0797a2d..0a54c684f1 100644 --- a/packages/payload/.gitignore +++ b/packages/payload/.gitignore @@ -24,3 +24,4 @@ /node.d.ts /uploads.js /uploads.d.ts +/i18n From d8783eaad4cefa5a778566c23d02414e323f16d5 Mon Sep 17 00:00:00 2001 From: Elliot DeNolf Date: Wed, 10 Apr 2024 17:16:20 -0400 Subject: [PATCH 070/177] chore(release): v3.0.0-beta.1 [skip ci] --- package.json | 2 +- packages/create-payload-app/package.json | 2 +- packages/db-mongodb/package.json | 2 +- packages/db-postgres/package.json | 2 +- packages/graphql/package.json | 2 +- packages/next/package.json | 2 +- packages/payload/package.json | 2 +- packages/plugin-cloud-storage/package.json | 2 +- packages/plugin-cloud/package.json | 2 +- packages/plugin-form-builder/package.json | 2 +- packages/plugin-nested-docs/package.json | 2 +- packages/plugin-redirects/package.json | 2 +- packages/plugin-search/package.json | 2 +- packages/plugin-seo/package.json | 2 +- packages/richtext-lexical/package.json | 2 +- packages/richtext-slate/package.json | 2 +- packages/translations/package.json | 2 +- packages/ui/package.json | 2 +- 18 files changed, 18 insertions(+), 18 deletions(-) diff --git a/package.json b/package.json index 5202af45f4..b71e2c216b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "payload-monorepo", - "version": "3.0.0-beta.0", + "version": "3.0.0-beta.1", "private": true, "type": "module", "workspaces:": [ diff --git a/packages/create-payload-app/package.json b/packages/create-payload-app/package.json index 04b4f342b1..435a55c235 100644 --- a/packages/create-payload-app/package.json +++ b/packages/create-payload-app/package.json @@ -1,6 +1,6 @@ { "name": "create-payload-app", - "version": "3.0.0-beta.0", + "version": "3.0.0-beta.1", "license": "MIT", "type": "module", "homepage": "https://payloadcms.com", diff --git a/packages/db-mongodb/package.json b/packages/db-mongodb/package.json index 8e26f3ebde..c52643e089 100644 --- a/packages/db-mongodb/package.json +++ b/packages/db-mongodb/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/db-mongodb", - "version": "3.0.0-beta.0", + "version": "3.0.0-beta.1", "description": "The officially supported MongoDB database adapter for Payload", "repository": { "type": "git", diff --git a/packages/db-postgres/package.json b/packages/db-postgres/package.json index 9d4c59a40f..1b528ca55d 100644 --- a/packages/db-postgres/package.json +++ b/packages/db-postgres/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/db-postgres", - "version": "3.0.0-beta.0", + "version": "3.0.0-beta.1", "description": "The officially supported Postgres database adapter for Payload", "repository": { "type": "git", diff --git a/packages/graphql/package.json b/packages/graphql/package.json index c18ccbea69..46bd9b337f 100644 --- a/packages/graphql/package.json +++ b/packages/graphql/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/graphql", - "version": "3.0.0-beta.0", + "version": "3.0.0-beta.1", "main": "./src/index.ts", "types": "./src/index.d.ts", "type": "module", diff --git a/packages/next/package.json b/packages/next/package.json index 7cabe2e594..6f68343076 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/next", - "version": "3.0.0-beta.0", + "version": "3.0.0-beta.1", "main": "./src/index.js", "types": "./src/index.js", "type": "module", diff --git a/packages/payload/package.json b/packages/payload/package.json index 4f92eb0d56..e824f6c047 100644 --- a/packages/payload/package.json +++ b/packages/payload/package.json @@ -1,6 +1,6 @@ { "name": "payload", - "version": "3.0.0-beta.0", + "version": "3.0.0-beta.1", "description": "Node, React and MongoDB Headless CMS and Application Framework", "license": "MIT", "main": "./src/index.ts", diff --git a/packages/plugin-cloud-storage/package.json b/packages/plugin-cloud-storage/package.json index 136ace5bdb..2462f08ceb 100644 --- a/packages/plugin-cloud-storage/package.json +++ b/packages/plugin-cloud-storage/package.json @@ -1,7 +1,7 @@ { "name": "@payloadcms/plugin-cloud-storage", "description": "The official cloud storage plugin for Payload CMS", - "version": "3.0.0-beta.0", + "version": "3.0.0-beta.1", "main": "./src/index.ts", "types": "./src/index.ts", "type": "module", diff --git a/packages/plugin-cloud/package.json b/packages/plugin-cloud/package.json index 57b70198d8..266806d8af 100644 --- a/packages/plugin-cloud/package.json +++ b/packages/plugin-cloud/package.json @@ -1,7 +1,7 @@ { "name": "@payloadcms/plugin-cloud", "description": "The official Payload Cloud plugin", - "version": "3.0.0-beta.0", + "version": "3.0.0-beta.1", "main": "./src/index.ts", "types": "./src/index.ts", "license": "MIT", diff --git a/packages/plugin-form-builder/package.json b/packages/plugin-form-builder/package.json index e74c5484a9..647303bee5 100644 --- a/packages/plugin-form-builder/package.json +++ b/packages/plugin-form-builder/package.json @@ -1,7 +1,7 @@ { "name": "@payloadcms/plugin-form-builder", "description": "Form builder plugin for Payload CMS", - "version": "3.0.0-beta.0", + "version": "3.0.0-beta.1", "homepage:": "https://payloadcms.com", "repository": { "type": "git", diff --git a/packages/plugin-nested-docs/package.json b/packages/plugin-nested-docs/package.json index 4ff7eb95cf..753a50b9b2 100644 --- a/packages/plugin-nested-docs/package.json +++ b/packages/plugin-nested-docs/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-nested-docs", - "version": "3.0.0-beta.0", + "version": "3.0.0-beta.1", "description": "The official Nested Docs plugin for Payload", "repository": { "type": "git", diff --git a/packages/plugin-redirects/package.json b/packages/plugin-redirects/package.json index 7f9295d782..de56e96293 100644 --- a/packages/plugin-redirects/package.json +++ b/packages/plugin-redirects/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-redirects", - "version": "3.0.0-beta.0", + "version": "3.0.0-beta.1", "homepage:": "https://payloadcms.com", "repository": { "type": "git", diff --git a/packages/plugin-search/package.json b/packages/plugin-search/package.json index 7429bc2e28..0eefca23c6 100644 --- a/packages/plugin-search/package.json +++ b/packages/plugin-search/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-search", - "version": "3.0.0-beta.0", + "version": "3.0.0-beta.1", "homepage:": "https://payloadcms.com", "repository": { "type": "git", diff --git a/packages/plugin-seo/package.json b/packages/plugin-seo/package.json index c8ed820a74..241015bf31 100644 --- a/packages/plugin-seo/package.json +++ b/packages/plugin-seo/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-seo", - "version": "3.0.0-beta.0", + "version": "3.0.0-beta.1", "homepage:": "https://payloadcms.com", "repository": { "type": "git", diff --git a/packages/richtext-lexical/package.json b/packages/richtext-lexical/package.json index 22f3a4b128..ea3ca30fb1 100644 --- a/packages/richtext-lexical/package.json +++ b/packages/richtext-lexical/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/richtext-lexical", - "version": "3.0.0-beta.0", + "version": "3.0.0-beta.1", "description": "The officially supported Lexical richtext adapter for Payload", "repository": { "type": "git", diff --git a/packages/richtext-slate/package.json b/packages/richtext-slate/package.json index 3fec2c4eca..788bb53fd2 100644 --- a/packages/richtext-slate/package.json +++ b/packages/richtext-slate/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/richtext-slate", - "version": "3.0.0-beta.0", + "version": "3.0.0-beta.1", "description": "The officially supported Slate richtext adapter for Payload", "repository": { "type": "git", diff --git a/packages/translations/package.json b/packages/translations/package.json index bddb870efb..c8a8b9f345 100644 --- a/packages/translations/package.json +++ b/packages/translations/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/translations", - "version": "3.0.0-beta.0", + "version": "3.0.0-beta.1", "main": "./src/exports/index.ts", "types": "./src/types.ts", "type": "module", diff --git a/packages/ui/package.json b/packages/ui/package.json index c31f298643..3624b680c1 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/ui", - "version": "3.0.0-beta.0", + "version": "3.0.0-beta.1", "type": "module", "homepage": "https://payloadcms.com", "repository": { From 2ebda95036265f295f6558864e9b002ae8dcde56 Mon Sep 17 00:00:00 2001 From: Elliot DeNolf Date: Wed, 10 Apr 2024 17:30:47 -0400 Subject: [PATCH 071/177] fix(next): proper named export of withPayload --- packages/next/src/withPayload.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/next/src/withPayload.js b/packages/next/src/withPayload.js index d4c1ad4568..3ccda9c97c 100644 --- a/packages/next/src/withPayload.js +++ b/packages/next/src/withPayload.js @@ -3,7 +3,7 @@ * * @returns {import('next').NextConfig} * */ -const withPayload = (nextConfig = {}) => { +export const withPayload = (nextConfig = {}) => { return { ...nextConfig, experimental: { From 736e7b822e65738726b511d9d3df59cf84e919a6 Mon Sep 17 00:00:00 2001 From: Elliot DeNolf Date: Wed, 10 Apr 2024 17:32:32 -0400 Subject: [PATCH 072/177] chore(release): v3.0.0-beta.2 [skip ci] --- package.json | 2 +- packages/create-payload-app/package.json | 2 +- packages/db-mongodb/package.json | 2 +- packages/db-postgres/package.json | 2 +- packages/graphql/package.json | 2 +- packages/next/package.json | 2 +- packages/payload/package.json | 2 +- packages/plugin-cloud-storage/package.json | 2 +- packages/plugin-cloud/package.json | 2 +- packages/plugin-form-builder/package.json | 2 +- packages/plugin-nested-docs/package.json | 2 +- packages/plugin-redirects/package.json | 2 +- packages/plugin-search/package.json | 2 +- packages/plugin-seo/package.json | 2 +- packages/richtext-lexical/package.json | 2 +- packages/richtext-slate/package.json | 2 +- packages/translations/package.json | 2 +- packages/ui/package.json | 2 +- 18 files changed, 18 insertions(+), 18 deletions(-) diff --git a/package.json b/package.json index b71e2c216b..1be8b58c18 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "payload-monorepo", - "version": "3.0.0-beta.1", + "version": "3.0.0-beta.2", "private": true, "type": "module", "workspaces:": [ diff --git a/packages/create-payload-app/package.json b/packages/create-payload-app/package.json index 435a55c235..329ea832fe 100644 --- a/packages/create-payload-app/package.json +++ b/packages/create-payload-app/package.json @@ -1,6 +1,6 @@ { "name": "create-payload-app", - "version": "3.0.0-beta.1", + "version": "3.0.0-beta.2", "license": "MIT", "type": "module", "homepage": "https://payloadcms.com", diff --git a/packages/db-mongodb/package.json b/packages/db-mongodb/package.json index c52643e089..4c9cb3f686 100644 --- a/packages/db-mongodb/package.json +++ b/packages/db-mongodb/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/db-mongodb", - "version": "3.0.0-beta.1", + "version": "3.0.0-beta.2", "description": "The officially supported MongoDB database adapter for Payload", "repository": { "type": "git", diff --git a/packages/db-postgres/package.json b/packages/db-postgres/package.json index 1b528ca55d..9d3b0081d5 100644 --- a/packages/db-postgres/package.json +++ b/packages/db-postgres/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/db-postgres", - "version": "3.0.0-beta.1", + "version": "3.0.0-beta.2", "description": "The officially supported Postgres database adapter for Payload", "repository": { "type": "git", diff --git a/packages/graphql/package.json b/packages/graphql/package.json index 46bd9b337f..ce462620c3 100644 --- a/packages/graphql/package.json +++ b/packages/graphql/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/graphql", - "version": "3.0.0-beta.1", + "version": "3.0.0-beta.2", "main": "./src/index.ts", "types": "./src/index.d.ts", "type": "module", diff --git a/packages/next/package.json b/packages/next/package.json index 6f68343076..c7d46d8027 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/next", - "version": "3.0.0-beta.1", + "version": "3.0.0-beta.2", "main": "./src/index.js", "types": "./src/index.js", "type": "module", diff --git a/packages/payload/package.json b/packages/payload/package.json index e824f6c047..23604149ff 100644 --- a/packages/payload/package.json +++ b/packages/payload/package.json @@ -1,6 +1,6 @@ { "name": "payload", - "version": "3.0.0-beta.1", + "version": "3.0.0-beta.2", "description": "Node, React and MongoDB Headless CMS and Application Framework", "license": "MIT", "main": "./src/index.ts", diff --git a/packages/plugin-cloud-storage/package.json b/packages/plugin-cloud-storage/package.json index 2462f08ceb..d2bcba80ce 100644 --- a/packages/plugin-cloud-storage/package.json +++ b/packages/plugin-cloud-storage/package.json @@ -1,7 +1,7 @@ { "name": "@payloadcms/plugin-cloud-storage", "description": "The official cloud storage plugin for Payload CMS", - "version": "3.0.0-beta.1", + "version": "3.0.0-beta.2", "main": "./src/index.ts", "types": "./src/index.ts", "type": "module", diff --git a/packages/plugin-cloud/package.json b/packages/plugin-cloud/package.json index 266806d8af..bfb69e7403 100644 --- a/packages/plugin-cloud/package.json +++ b/packages/plugin-cloud/package.json @@ -1,7 +1,7 @@ { "name": "@payloadcms/plugin-cloud", "description": "The official Payload Cloud plugin", - "version": "3.0.0-beta.1", + "version": "3.0.0-beta.2", "main": "./src/index.ts", "types": "./src/index.ts", "license": "MIT", diff --git a/packages/plugin-form-builder/package.json b/packages/plugin-form-builder/package.json index 647303bee5..6b420c3b29 100644 --- a/packages/plugin-form-builder/package.json +++ b/packages/plugin-form-builder/package.json @@ -1,7 +1,7 @@ { "name": "@payloadcms/plugin-form-builder", "description": "Form builder plugin for Payload CMS", - "version": "3.0.0-beta.1", + "version": "3.0.0-beta.2", "homepage:": "https://payloadcms.com", "repository": { "type": "git", diff --git a/packages/plugin-nested-docs/package.json b/packages/plugin-nested-docs/package.json index 753a50b9b2..461d239d7f 100644 --- a/packages/plugin-nested-docs/package.json +++ b/packages/plugin-nested-docs/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-nested-docs", - "version": "3.0.0-beta.1", + "version": "3.0.0-beta.2", "description": "The official Nested Docs plugin for Payload", "repository": { "type": "git", diff --git a/packages/plugin-redirects/package.json b/packages/plugin-redirects/package.json index de56e96293..58470a9912 100644 --- a/packages/plugin-redirects/package.json +++ b/packages/plugin-redirects/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-redirects", - "version": "3.0.0-beta.1", + "version": "3.0.0-beta.2", "homepage:": "https://payloadcms.com", "repository": { "type": "git", diff --git a/packages/plugin-search/package.json b/packages/plugin-search/package.json index 0eefca23c6..4eec4bd9b0 100644 --- a/packages/plugin-search/package.json +++ b/packages/plugin-search/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-search", - "version": "3.0.0-beta.1", + "version": "3.0.0-beta.2", "homepage:": "https://payloadcms.com", "repository": { "type": "git", diff --git a/packages/plugin-seo/package.json b/packages/plugin-seo/package.json index 241015bf31..13224dba23 100644 --- a/packages/plugin-seo/package.json +++ b/packages/plugin-seo/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-seo", - "version": "3.0.0-beta.1", + "version": "3.0.0-beta.2", "homepage:": "https://payloadcms.com", "repository": { "type": "git", diff --git a/packages/richtext-lexical/package.json b/packages/richtext-lexical/package.json index ea3ca30fb1..417147cec3 100644 --- a/packages/richtext-lexical/package.json +++ b/packages/richtext-lexical/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/richtext-lexical", - "version": "3.0.0-beta.1", + "version": "3.0.0-beta.2", "description": "The officially supported Lexical richtext adapter for Payload", "repository": { "type": "git", diff --git a/packages/richtext-slate/package.json b/packages/richtext-slate/package.json index 788bb53fd2..9b0776938a 100644 --- a/packages/richtext-slate/package.json +++ b/packages/richtext-slate/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/richtext-slate", - "version": "3.0.0-beta.1", + "version": "3.0.0-beta.2", "description": "The officially supported Slate richtext adapter for Payload", "repository": { "type": "git", diff --git a/packages/translations/package.json b/packages/translations/package.json index c8a8b9f345..d36c34eb3a 100644 --- a/packages/translations/package.json +++ b/packages/translations/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/translations", - "version": "3.0.0-beta.1", + "version": "3.0.0-beta.2", "main": "./src/exports/index.ts", "types": "./src/types.ts", "type": "module", diff --git a/packages/ui/package.json b/packages/ui/package.json index 3624b680c1..9581e64090 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/ui", - "version": "3.0.0-beta.1", + "version": "3.0.0-beta.2", "type": "module", "homepage": "https://payloadcms.com", "repository": { From aa22344cdb6835e2b7b0c45cef574739a454a752 Mon Sep 17 00:00:00 2001 From: Elliot DeNolf Date: Wed, 10 Apr 2024 20:16:53 -0400 Subject: [PATCH 073/177] fix(cpa): append to existing .env --- .../src/lib/write-env-file.ts | 51 +++++++++++-------- 1 file changed, 30 insertions(+), 21 deletions(-) diff --git a/packages/create-payload-app/src/lib/write-env-file.ts b/packages/create-payload-app/src/lib/write-env-file.ts index 04c10455eb..36bcc41429 100644 --- a/packages/create-payload-app/src/lib/write-env-file.ts +++ b/packages/create-payload-app/src/lib/write-env-file.ts @@ -20,32 +20,41 @@ export async function writeEnvFile(args: { return } + const envOutputPath = path.join(projectDir, '.env') + try { - if (template?.type === 'starter' && fs.existsSync(path.join(projectDir, '.env.example'))) { - // Parse .env file into key/value pairs - const envFile = await fs.readFile(path.join(projectDir, '.env.example'), 'utf8') - const envWithValues: string[] = envFile - .split('\n') - .filter((e) => e) - .map((line) => { - if (line.startsWith('#') || !line.includes('=')) return line + if (fs.existsSync(envOutputPath)) { + if (template?.type === 'starter') { + // Parse .env file into key/value pairs + const envFile = await fs.readFile(path.join(projectDir, '.env.example'), 'utf8') + const envWithValues: string[] = envFile + .split('\n') + .filter((e) => e) + .map((line) => { + if (line.startsWith('#') || !line.includes('=')) return line - const split = line.split('=') - const key = split[0] - let value = split[1] + const split = line.split('=') + const key = split[0] + let value = split[1] - if (key === 'MONGODB_URI' || key === 'MONGO_URL' || key === 'DATABASE_URI') { - value = databaseUri - } - if (key === 'PAYLOAD_SECRET' || key === 'PAYLOAD_SECRET_KEY') { - value = payloadSecret - } + if (key === 'MONGODB_URI' || key === 'MONGO_URL' || key === 'DATABASE_URI') { + value = databaseUri + } + if (key === 'PAYLOAD_SECRET' || key === 'PAYLOAD_SECRET_KEY') { + value = payloadSecret + } - return `${key}=${value}` - }) + return `${key}=${value}` + }) - // Write new .env file - await fs.writeFile(path.join(projectDir, '.env'), envWithValues.join('\n')) + // Write new .env file + await fs.writeFile(envOutputPath, envWithValues.join('\n')) + } else { + const existingEnv = await fs.readFile(envOutputPath, 'utf8') + const newEnv = + existingEnv + `\nDATABASE_URI=${databaseUri}\nPAYLOAD_SECRET=${payloadSecret}\n` + await fs.writeFile(envOutputPath, newEnv) + } } else { const content = `DATABASE_URI=${databaseUri}\nPAYLOAD_SECRET=${payloadSecret}` await fs.outputFile(`${projectDir}/.env`, content) From d194493e9ad07b692249fe23895a1bb56ecc8e7f Mon Sep 17 00:00:00 2001 From: Elliot DeNolf Date: Wed, 10 Apr 2024 20:24:51 -0400 Subject: [PATCH 074/177] chore(cpa): update help --- packages/create-payload-app/src/utils/messages.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/create-payload-app/src/utils/messages.ts b/packages/create-payload-app/src/utils/messages.ts index 3d5caa9765..347dd95293 100644 --- a/packages/create-payload-app/src/utils/messages.ts +++ b/packages/create-payload-app/src/utils/messages.ts @@ -21,6 +21,12 @@ export function helpMessage(): void { console.log(chalk` {bold USAGE} + {dim Inside of an existing Next.js project} + + {dim $} {bold npx create-payload-app} + + {dim Create a new project from scratch} + {dim $} {bold npx create-payload-app} {dim $} {bold npx create-payload-app} my-project {dim $} {bold npx create-payload-app} -n my-project -t template-name From 9037b9b4fa4908cae404288cb5429d5db3f510db Mon Sep 17 00:00:00 2001 From: Elliot DeNolf Date: Wed, 10 Apr 2024 20:25:20 -0400 Subject: [PATCH 075/177] chore(cpa): remove 2.0 templates until updated --- .../create-payload-app/src/lib/templates.ts | 77 ++++++++++--------- 1 file changed, 40 insertions(+), 37 deletions(-) diff --git a/packages/create-payload-app/src/lib/templates.ts b/packages/create-payload-app/src/lib/templates.ts index 5ab635de39..76a8897226 100644 --- a/packages/create-payload-app/src/lib/templates.ts +++ b/packages/create-payload-app/src/lib/templates.ts @@ -18,43 +18,46 @@ export function getValidTemplates(): ProjectTemplate[] { name: 'blank-3.0', type: 'starter', description: 'Blank 3.0 Template', - url: 'https://github.com/payloadcms/payload/templates/blank-3.0', - }, - { - name: 'blank', - type: 'starter', - description: 'Blank Template', - url: 'https://github.com/payloadcms/payload/templates/blank', - }, - { - name: 'website', - type: 'starter', - description: 'Website Template', - url: 'https://github.com/payloadcms/payload/templates/website', - }, - { - name: 'ecommerce', - type: 'starter', - description: 'E-commerce Template', - url: 'https://github.com/payloadcms/payload/templates/ecommerce', - }, - { - name: 'plugin', - type: 'plugin', - description: 'Template for creating a Payload plugin', - url: 'https://github.com/payloadcms/payload-plugin-template', - }, - { - name: 'payload-demo', - type: 'starter', - description: 'Payload demo site at https://demo.payloadcms.com', - url: 'https://github.com/payloadcms/public-demo', - }, - { - name: 'payload-website', - type: 'starter', - description: 'Payload website CMS at https://payloadcms.com', - url: 'https://github.com/payloadcms/website-cms', + url: 'https://github.com/payloadcms/payload/templates/blank-3.0#beta', }, + + // Remove these until they have been updated for 3.0 + + // { + // name: 'blank', + // type: 'starter', + // description: 'Blank Template', + // url: 'https://github.com/payloadcms/payload/templates/blank', + // }, + // { + // name: 'website', + // type: 'starter', + // description: 'Website Template', + // url: 'https://github.com/payloadcms/payload/templates/website', + // }, + // { + // name: 'ecommerce', + // type: 'starter', + // description: 'E-commerce Template', + // url: 'https://github.com/payloadcms/payload/templates/ecommerce', + // }, + // { + // name: 'plugin', + // type: 'plugin', + // description: 'Template for creating a Payload plugin', + // url: 'https://github.com/payloadcms/payload-plugin-template', + // }, + // { + // name: 'payload-demo', + // type: 'starter', + // description: 'Payload demo site at https://demo.payloadcms.com', + // url: 'https://github.com/payloadcms/public-demo', + // }, + // { + // name: 'payload-website', + // type: 'starter', + // description: 'Payload website CMS at https://payloadcms.com', + // url: 'https://github.com/payloadcms/website-cms', + // }, ] } From 0bc103658a1f4199fc1002df5dd831b34947b322 Mon Sep 17 00:00:00 2001 From: Elliot DeNolf Date: Wed, 10 Apr 2024 20:29:57 -0400 Subject: [PATCH 076/177] chore(cpa): improve move message --- packages/create-payload-app/src/utils/messages.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/create-payload-app/src/utils/messages.ts b/packages/create-payload-app/src/utils/messages.ts index 347dd95293..79dc5552b0 100644 --- a/packages/create-payload-app/src/utils/messages.ts +++ b/packages/create-payload-app/src/utils/messages.ts @@ -86,7 +86,7 @@ export function successfulNextInit(): string { } export function moveMessage(args: { nextAppDir: string; projectDir: string }): string { - const relativePath = path.relative(process.cwd(), args.nextAppDir) + const relativeAppDir = path.relative(process.cwd(), args.nextAppDir) return ` ${header('Next Steps:')} @@ -94,7 +94,10 @@ Payload does not support a top-level layout.tsx file in the app directory. ${chalk.bold('To continue:')} -Move all files from ./${relativePath} to a named directory such as ./${relativePath}/${chalk.bold('(app)')} +- Create a new directory in ./${relativeAppDir} such as ./${relativeAppDir}/${chalk.bold('(app)')} +- Move all files from ./${relativeAppDir} into that directory + +It is recommended to do this from your IDE if your app has existing file references. Once moved, rerun the create-payload-app command again. ` From e286519cb10f5437ad61ec9e580094bf8eb436b9 Mon Sep 17 00:00:00 2001 From: Elliot DeNolf Date: Wed, 10 Apr 2024 20:46:22 -0400 Subject: [PATCH 077/177] chore(release): v3.0.0-beta.3 [skip ci] --- package.json | 2 +- packages/create-payload-app/package.json | 2 +- packages/db-mongodb/package.json | 2 +- packages/db-postgres/package.json | 2 +- packages/graphql/package.json | 2 +- packages/next/package.json | 2 +- packages/payload/package.json | 2 +- packages/plugin-cloud-storage/package.json | 2 +- packages/plugin-cloud/package.json | 2 +- packages/plugin-form-builder/package.json | 2 +- packages/plugin-nested-docs/package.json | 2 +- packages/plugin-redirects/package.json | 2 +- packages/plugin-search/package.json | 2 +- packages/plugin-seo/package.json | 2 +- packages/richtext-lexical/package.json | 2 +- packages/richtext-slate/package.json | 2 +- packages/translations/package.json | 2 +- packages/ui/package.json | 2 +- 18 files changed, 18 insertions(+), 18 deletions(-) diff --git a/package.json b/package.json index 1be8b58c18..e16085626c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "payload-monorepo", - "version": "3.0.0-beta.2", + "version": "3.0.0-beta.3", "private": true, "type": "module", "workspaces:": [ diff --git a/packages/create-payload-app/package.json b/packages/create-payload-app/package.json index 329ea832fe..0d925ac6a8 100644 --- a/packages/create-payload-app/package.json +++ b/packages/create-payload-app/package.json @@ -1,6 +1,6 @@ { "name": "create-payload-app", - "version": "3.0.0-beta.2", + "version": "3.0.0-beta.3", "license": "MIT", "type": "module", "homepage": "https://payloadcms.com", diff --git a/packages/db-mongodb/package.json b/packages/db-mongodb/package.json index 4c9cb3f686..1fa88b9a88 100644 --- a/packages/db-mongodb/package.json +++ b/packages/db-mongodb/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/db-mongodb", - "version": "3.0.0-beta.2", + "version": "3.0.0-beta.3", "description": "The officially supported MongoDB database adapter for Payload", "repository": { "type": "git", diff --git a/packages/db-postgres/package.json b/packages/db-postgres/package.json index 9d3b0081d5..a52d15eec8 100644 --- a/packages/db-postgres/package.json +++ b/packages/db-postgres/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/db-postgres", - "version": "3.0.0-beta.2", + "version": "3.0.0-beta.3", "description": "The officially supported Postgres database adapter for Payload", "repository": { "type": "git", diff --git a/packages/graphql/package.json b/packages/graphql/package.json index ce462620c3..aacc724aab 100644 --- a/packages/graphql/package.json +++ b/packages/graphql/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/graphql", - "version": "3.0.0-beta.2", + "version": "3.0.0-beta.3", "main": "./src/index.ts", "types": "./src/index.d.ts", "type": "module", diff --git a/packages/next/package.json b/packages/next/package.json index c7d46d8027..d928541994 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/next", - "version": "3.0.0-beta.2", + "version": "3.0.0-beta.3", "main": "./src/index.js", "types": "./src/index.js", "type": "module", diff --git a/packages/payload/package.json b/packages/payload/package.json index 23604149ff..be111fa6da 100644 --- a/packages/payload/package.json +++ b/packages/payload/package.json @@ -1,6 +1,6 @@ { "name": "payload", - "version": "3.0.0-beta.2", + "version": "3.0.0-beta.3", "description": "Node, React and MongoDB Headless CMS and Application Framework", "license": "MIT", "main": "./src/index.ts", diff --git a/packages/plugin-cloud-storage/package.json b/packages/plugin-cloud-storage/package.json index d2bcba80ce..f20b51289e 100644 --- a/packages/plugin-cloud-storage/package.json +++ b/packages/plugin-cloud-storage/package.json @@ -1,7 +1,7 @@ { "name": "@payloadcms/plugin-cloud-storage", "description": "The official cloud storage plugin for Payload CMS", - "version": "3.0.0-beta.2", + "version": "3.0.0-beta.3", "main": "./src/index.ts", "types": "./src/index.ts", "type": "module", diff --git a/packages/plugin-cloud/package.json b/packages/plugin-cloud/package.json index bfb69e7403..f39d043f5c 100644 --- a/packages/plugin-cloud/package.json +++ b/packages/plugin-cloud/package.json @@ -1,7 +1,7 @@ { "name": "@payloadcms/plugin-cloud", "description": "The official Payload Cloud plugin", - "version": "3.0.0-beta.2", + "version": "3.0.0-beta.3", "main": "./src/index.ts", "types": "./src/index.ts", "license": "MIT", diff --git a/packages/plugin-form-builder/package.json b/packages/plugin-form-builder/package.json index 6b420c3b29..6b78bc7a23 100644 --- a/packages/plugin-form-builder/package.json +++ b/packages/plugin-form-builder/package.json @@ -1,7 +1,7 @@ { "name": "@payloadcms/plugin-form-builder", "description": "Form builder plugin for Payload CMS", - "version": "3.0.0-beta.2", + "version": "3.0.0-beta.3", "homepage:": "https://payloadcms.com", "repository": { "type": "git", diff --git a/packages/plugin-nested-docs/package.json b/packages/plugin-nested-docs/package.json index 461d239d7f..4267311d33 100644 --- a/packages/plugin-nested-docs/package.json +++ b/packages/plugin-nested-docs/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-nested-docs", - "version": "3.0.0-beta.2", + "version": "3.0.0-beta.3", "description": "The official Nested Docs plugin for Payload", "repository": { "type": "git", diff --git a/packages/plugin-redirects/package.json b/packages/plugin-redirects/package.json index 58470a9912..89f98ce5ba 100644 --- a/packages/plugin-redirects/package.json +++ b/packages/plugin-redirects/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-redirects", - "version": "3.0.0-beta.2", + "version": "3.0.0-beta.3", "homepage:": "https://payloadcms.com", "repository": { "type": "git", diff --git a/packages/plugin-search/package.json b/packages/plugin-search/package.json index 4eec4bd9b0..00ef5e5f21 100644 --- a/packages/plugin-search/package.json +++ b/packages/plugin-search/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-search", - "version": "3.0.0-beta.2", + "version": "3.0.0-beta.3", "homepage:": "https://payloadcms.com", "repository": { "type": "git", diff --git a/packages/plugin-seo/package.json b/packages/plugin-seo/package.json index 13224dba23..79550865fb 100644 --- a/packages/plugin-seo/package.json +++ b/packages/plugin-seo/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-seo", - "version": "3.0.0-beta.2", + "version": "3.0.0-beta.3", "homepage:": "https://payloadcms.com", "repository": { "type": "git", diff --git a/packages/richtext-lexical/package.json b/packages/richtext-lexical/package.json index 417147cec3..76a829782c 100644 --- a/packages/richtext-lexical/package.json +++ b/packages/richtext-lexical/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/richtext-lexical", - "version": "3.0.0-beta.2", + "version": "3.0.0-beta.3", "description": "The officially supported Lexical richtext adapter for Payload", "repository": { "type": "git", diff --git a/packages/richtext-slate/package.json b/packages/richtext-slate/package.json index 9b0776938a..9a44d77b82 100644 --- a/packages/richtext-slate/package.json +++ b/packages/richtext-slate/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/richtext-slate", - "version": "3.0.0-beta.2", + "version": "3.0.0-beta.3", "description": "The officially supported Slate richtext adapter for Payload", "repository": { "type": "git", diff --git a/packages/translations/package.json b/packages/translations/package.json index d36c34eb3a..b4275e5221 100644 --- a/packages/translations/package.json +++ b/packages/translations/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/translations", - "version": "3.0.0-beta.2", + "version": "3.0.0-beta.3", "main": "./src/exports/index.ts", "types": "./src/types.ts", "type": "module", diff --git a/packages/ui/package.json b/packages/ui/package.json index 9581e64090..cd655d9069 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/ui", - "version": "3.0.0-beta.2", + "version": "3.0.0-beta.3", "type": "module", "homepage": "https://payloadcms.com", "repository": { From 14d683fb9ab2f841a6493fd04c72066a6e3ad209 Mon Sep 17 00:00:00 2001 From: Elliot DeNolf Date: Wed, 10 Apr 2024 21:26:31 -0400 Subject: [PATCH 078/177] chore(scripts): update release script --- scripts/release.ts | 38 +++++++++++--------------------------- 1 file changed, 11 insertions(+), 27 deletions(-) diff --git a/scripts/release.ts b/scripts/release.ts index 6eeb1ac4eb..171f8f016a 100755 --- a/scripts/release.ts +++ b/scripts/release.ts @@ -6,7 +6,6 @@ import execa from 'execa' import fse from 'fs-extra' import minimist from 'minimist' import { fileURLToPath } from 'node:url' -import pLimit from 'p-limit' import path from 'path' import prompts from 'prompts' import semver from 'semver' @@ -17,8 +16,6 @@ import type { PackageDetails } from './lib/getPackageDetails.js' import { getPackageDetails } from './lib/getPackageDetails.js' import { updateChangelog } from './utils/updateChangelog.js' -const npmPublishLimit = pLimit(2) - // Update this list with any packages to publish const packageWhitelist = [ 'payload', @@ -126,7 +123,7 @@ async function main() { return // For TS type checking } - const packageDetails = await getPackageDetails(packageWhitelist) + let packageDetails = await getPackageDetails(packageWhitelist) console.log(chalk.bold(`\n Version: ${monorepoVersion} => ${chalk.green(nextReleaseVersion)}\n`)) console.log(chalk.bold.yellow(` Bump: ${bump}`)) @@ -194,16 +191,17 @@ async function main() { header(`🏷️ Tagging release v${nextReleaseVersion}`, { enable: gitTag }) runCmd(`git tag -a v${nextReleaseVersion} -m "v${nextReleaseVersion}"`, execOpts) - const otp = dryRun ? undefined : await question('Enter your 2FA code') + // Publish only payload to get 5 min auth token + packageDetails = packageDetails.filter((p) => p.name !== 'payload') + runCmd(`pnpm publish -C packages/payload --no-git-checks --json --tag ${tag}`, execOpts) - if (!dryRun && !otp) { - abort('2FA code is required') + const results: { name: string; success: boolean; details?: string }[] = [] + // Sequential publish + for (const pkg of packageDetails) { + const result = await publishSinglePackage(pkg, { dryRun }) + results.push(result) } - const results = await Promise.all( - packageDetails.map((pkg) => publishPackageThrottled(pkg, { dryRun, otp })), - ) - console.log(chalk.bold.green(`\n\nResults:\n`)) // New results format @@ -234,26 +232,12 @@ main().catch((error) => { process.exit(1) }) -/** Publish with promise concurrency throttling */ -async function publishPackageThrottled( - pkg: PackageDetails, - opts?: { dryRun?: boolean; otp?: string }, -) { - const { dryRun = false, otp } = opts ?? {} - return npmPublishLimit(() => publishSinglePackage(pkg, { dryRun, otp })) -} - -async function publishSinglePackage( - pkg: PackageDetails, - opts?: { dryRun?: boolean; otp?: string }, -) { - const { dryRun = false, otp } = opts ?? {} +async function publishSinglePackage(pkg: PackageDetails, opts?: { dryRun?: boolean }) { + const { dryRun = false } = opts ?? {} console.log(chalk.bold(`🚀 ${pkg.name} publishing...`)) const cmdArgs = ['publish', '-C', pkg.packagePath, '--no-git-checks', '--json', '--tag', tag] if (dryRun) { cmdArgs.push('--dry-run') - } else { - cmdArgs.push('--otp', otp) } const { exitCode, stderr } = await execa('pnpm', cmdArgs, { cwd, From 2fc9885abc76fa32f630e898ee826fabb6ed4f3f Mon Sep 17 00:00:00 2001 From: Elliot DeNolf Date: Wed, 10 Apr 2024 21:26:50 -0400 Subject: [PATCH 079/177] chore(scripts): add getPackageRegistryVersions script --- scripts/lib/getPackageDetails.ts | 4 ++ scripts/lib/getPackageRegistryVersions.ts | 46 +++++++++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 scripts/lib/getPackageRegistryVersions.ts diff --git a/scripts/lib/getPackageDetails.ts b/scripts/lib/getPackageDetails.ts index 2831617260..5845b05275 100644 --- a/scripts/lib/getPackageDetails.ts +++ b/scripts/lib/getPackageDetails.ts @@ -8,9 +8,13 @@ const __dirname = path.dirname(__filename) const packagesDir = path.resolve(__dirname, '../../packages') export type PackageDetails = { + /** Name in package.json / npm registry */ name: string + /** Full path to package */ packagePath: string + /** Short name is the directory name */ shortName: string + /** Version in package.json */ version: string } diff --git a/scripts/lib/getPackageRegistryVersions.ts b/scripts/lib/getPackageRegistryVersions.ts new file mode 100644 index 0000000000..5b50a628fe --- /dev/null +++ b/scripts/lib/getPackageRegistryVersions.ts @@ -0,0 +1,46 @@ +import chalk from 'chalk' + +import { getPackageDetails } from './getPackageDetails.js' + +const packages = [ + 'payload', + 'translations', + 'ui', + 'next', + 'graphql', + 'db-mongodb', + 'db-postgres', + 'richtext-slate', + 'richtext-lexical', + + 'create-payload-app', + + // Plugins + 'plugin-cloud', + 'plugin-cloud-storage', + 'plugin-form-builder', + 'plugin-nested-docs', + 'plugin-redirects', + 'plugin-search', + 'plugin-seo', + // 'plugin-stripe', + // 'plugin-sentry', +] + +export const getPackageRegistryVersions = async (): Promise => { + const packageDetails = await getPackageDetails(packages) + + await Promise.all( + packageDetails.map(async (pkg) => { + // Get published version from npm + const json = await fetch(`https://registry.npmjs.org/${pkg.name}`).then((res) => res.json()) + const { latest, beta } = json['dist-tags'] + const msg = `${chalk.bold(pkg.name.padEnd(32))} latest: ${latest?.padEnd(16)} beta: ${beta?.padEnd(16)}` + console.log(msg) + }), + ) +} + +if (import.meta.url === new URL(import.meta.url).href) { + await getPackageRegistryVersions() +} From a0dd750a527a422fec6d7c586d1b89794c80be56 Mon Sep 17 00:00:00 2001 From: Elliot DeNolf Date: Wed, 10 Apr 2024 22:17:43 -0400 Subject: [PATCH 080/177] chore(cpa): add or operator to process.env.DATABASE_URI [skip ci] --- packages/create-payload-app/src/lib/packages.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/create-payload-app/src/lib/packages.ts b/packages/create-payload-app/src/lib/packages.ts index 29f9a11226..f3fff3a506 100644 --- a/packages/create-payload-app/src/lib/packages.ts +++ b/packages/create-payload-app/src/lib/packages.ts @@ -10,14 +10,18 @@ const mongodbReplacement: DbAdapterReplacement = { importReplacement: "import { mongooseAdapter } from '@payloadcms/db-mongodb'", packageName: '@payloadcms/db-mongodb', // Replacement between `// database-adapter-config-start` and `// database-adapter-config-end` - configReplacement: [' db: mongooseAdapter({', ' url: process.env.DATABASE_URI,', ' }),'], + configReplacement: [ + ' db: mongooseAdapter({', + " url: process.env.DATABASE_URI || '',", + ' }),', + ], } const postgresReplacement: DbAdapterReplacement = { configReplacement: [ ' db: postgresAdapter({', ' pool: {', - ' connectionString: process.env.DATABASE_URI,', + " connectionString: process.env.DATABASE_URI || '',", ' },', ' }),', ], From 1eabf316d671aa18bc118bee0d3d87bd5c617ed7 Mon Sep 17 00:00:00 2001 From: Elliot DeNolf Date: Wed, 10 Apr 2024 22:30:56 -0400 Subject: [PATCH 081/177] chore(templates): add generate:types to blank --- templates/blank-3.0/package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/templates/blank-3.0/package.json b/templates/blank-3.0/package.json index 6235afd3ad..f5906e1136 100644 --- a/templates/blank-3.0/package.json +++ b/templates/blank-3.0/package.json @@ -10,7 +10,8 @@ "build": "cross-env NODE_OPTIONS=--no-deprecation next build", "payload": "cross-env NODE_OPTIONS=--no-deprecation payload", "start": "cross-env NODE_OPTIONS=--no-deprecation next start", - "lint": "cross-env NODE_OPTIONS=--no-deprecation next lint" + "lint": "cross-env NODE_OPTIONS=--no-deprecation next lint", + "generate:types": "payload generate:types" }, "engines": { "node": ">=18.19.0" From d0869d908761132000ff03d5c6fe9e1102598e06 Mon Sep 17 00:00:00 2001 From: Elliot DeNolf Date: Thu, 11 Apr 2024 10:22:06 -0400 Subject: [PATCH 082/177] chore: unused file [skip ci] --- emptyModule.js | 1 - 1 file changed, 1 deletion(-) delete mode 100644 emptyModule.js diff --git a/emptyModule.js b/emptyModule.js deleted file mode 100644 index b1c6ea436a..0000000000 --- a/emptyModule.js +++ /dev/null @@ -1 +0,0 @@ -export default {} From 2061f38d9e0af62e985c6c159a6caf11a5ee8864 Mon Sep 17 00:00:00 2001 From: Paul Popus Date: Thu, 11 Apr 2024 11:53:07 -0300 Subject: [PATCH 083/177] feat: add new type generation for the auth operation --- .../payload/src/auth/executeAuthStrategies.ts | 3 ++- packages/payload/src/auth/operations/auth.ts | 3 ++- packages/payload/src/index.ts | 1 + .../src/utilities/configToJSONSchema.ts | 27 ++++++++++++++++++- 4 files changed, 31 insertions(+), 3 deletions(-) diff --git a/packages/payload/src/auth/executeAuthStrategies.ts b/packages/payload/src/auth/executeAuthStrategies.ts index 4d292313fb..83b68316ad 100644 --- a/packages/payload/src/auth/executeAuthStrategies.ts +++ b/packages/payload/src/auth/executeAuthStrategies.ts @@ -1,8 +1,9 @@ +import type { GeneratedTypes } from '../index.js' import type { AuthStrategyFunctionArgs, User } from './index.js' export const executeAuthStrategies = async ( args: AuthStrategyFunctionArgs, -): Promise => { +): Promise => { return args.payload.authStrategies.reduce(async (accumulatorPromise, strategy) => { const authUser = await accumulatorPromise if (!authUser) { diff --git a/packages/payload/src/auth/operations/auth.ts b/packages/payload/src/auth/operations/auth.ts index 37e45782c2..4c71b006ff 100644 --- a/packages/payload/src/auth/operations/auth.ts +++ b/packages/payload/src/auth/operations/auth.ts @@ -1,3 +1,4 @@ +import type { GeneratedTypes } from '../../index.js' import type { PayloadRequest } from '../../types/index.js' import type { Permissions, User } from '../types.js' @@ -16,7 +17,7 @@ export type AuthArgs = { export type AuthResult = { cookies: Map permissions: Permissions - user: User | null + user: GeneratedTypes['user'] | null } export const auth = async (args: Required): Promise => { diff --git a/packages/payload/src/index.ts b/packages/payload/src/index.ts index ddc62d82cb..4853b72400 100644 --- a/packages/payload/src/index.ts +++ b/packages/payload/src/index.ts @@ -473,6 +473,7 @@ type GeneratedTypes = { globals: { [slug: number | string | symbol]: GlobalTypeWithID & Record } + user: TypeWithID & Record & { collection: string } } type Payload = BasePayload diff --git a/packages/payload/src/utilities/configToJSONSchema.ts b/packages/payload/src/utilities/configToJSONSchema.ts index e4133a9cd3..c5c22e071a 100644 --- a/packages/payload/src/utilities/configToJSONSchema.ts +++ b/packages/payload/src/utilities/configToJSONSchema.ts @@ -67,6 +67,30 @@ function generateEntitySchemas( } } +function generateAuthEntitySchemas(entities: SanitizedCollectionConfig[]): JSONSchema4 { + const properties: JSONSchema4[] = [...entities] + .filter(({ auth }) => Boolean(auth)) + .map(({ slug }) => { + return { + allOf: [ + { $ref: `#/definitions/${slug}` }, + { + type: 'object', + additionalProperties: false, + properties: { + collection: { type: 'string', enum: [slug] }, + }, + required: ['collection'], + }, + ], + } + }, {}) + + return { + oneOf: properties, + } +} + /** * Returns a JSON Schema Type with 'null' added if the field is not required. */ @@ -553,8 +577,9 @@ export function configToJSONSchema( properties: { collections: generateEntitySchemas(config.collections || []), globals: generateEntitySchemas(config.globals || []), + user: generateAuthEntitySchemas(config.collections), }, - required: ['collections', 'globals'], + required: ['user', 'collections', 'globals'], title: 'Config', } } From bcccefe98e2c54e2662b2b1d8790abdd28300ceb Mon Sep 17 00:00:00 2001 From: Paul Popus Date: Thu, 11 Apr 2024 11:53:32 -0300 Subject: [PATCH 084/177] chore: add int test for local API login function --- test/auth/int.spec.ts | 14 +++++ test/auth/payload-types.ts | 122 ++++++++++++++++++++++++------------- 2 files changed, 92 insertions(+), 44 deletions(-) diff --git a/test/auth/int.spec.ts b/test/auth/int.spec.ts index 99b6a50323..383fe12971 100644 --- a/test/auth/int.spec.ts +++ b/test/auth/int.spec.ts @@ -622,4 +622,18 @@ describe('Auth', () => { expect(fail.status).toStrictEqual(404) }) }) + + describe('Local API', () => { + it('should login via the local API', async () => { + const authenticated = await payload.login({ + collection: slug, + data: { + email: devUser.email, + password: devUser.password, + }, + }) + + expect(authenticated.token).toBeTruthy() + }) + }) }) diff --git a/test/auth/payload-types.ts b/test/auth/payload-types.ts index 19ce576c79..17b24758de 100644 --- a/test/auth/payload-types.ts +++ b/test/auth/payload-types.ts @@ -7,73 +7,112 @@ */ export interface Config { + user: + | (User & { + collection: 'users' + }) + | (ApiKey & { + collection: 'api-keys' + }) + | (PublicUser & { + collection: 'public-users' + }) collections: { users: User 'api-keys': ApiKey 'public-users': PublicUser + relationsCollection: RelationsCollection 'payload-preferences': PayloadPreference 'payload-migrations': PayloadMigration } globals: {} } +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "users". + */ export interface User { id: string + adminOnlyField?: string | null roles: ('admin' | 'editor' | 'moderator' | 'user' | 'viewer')[] - namedSaveToJWT?: string + namedSaveToJWT?: string | null group?: { - liftedSaveToJWT?: string + liftedSaveToJWT?: string | null } groupSaveToJWT?: { - saveToJWTString?: string - saveToJWTFalse?: string + saveToJWTString?: string | null + saveToJWTFalse?: string | null } saveToJWTTab: { - test?: string + test?: string | null } tabSaveToJWTString: { - includedByDefault?: string + includedByDefault?: string | null } - tabLiftedSaveToJWT?: string - unnamedTabSaveToJWTString?: string - unnamedTabSaveToJWTFalse?: string - custom?: string + tabLiftedSaveToJWT?: string | null + unnamedTabSaveToJWTString?: string | null + unnamedTabSaveToJWTFalse?: string | null + custom?: string | null updatedAt: string createdAt: string - enableAPIKey?: boolean - apiKey?: string - apiKeyIndex?: string + enableAPIKey?: boolean | null + apiKey?: string | null + apiKeyIndex?: string | null email: string - resetPasswordToken?: string - resetPasswordExpiration?: string - salt?: string - hash?: string - loginAttempts?: number - lockUntil?: string - password?: string + resetPasswordToken?: string | null + resetPasswordExpiration?: string | null + salt?: string | null + hash?: string | null + loginAttempts?: number | null + lockUntil?: string | null + password?: string | null } +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "api-keys". + */ export interface ApiKey { id: string updatedAt: string createdAt: string - enableAPIKey?: boolean - apiKey?: string - apiKeyIndex?: string + enableAPIKey?: boolean | null + apiKey?: string | null + apiKeyIndex?: string | null } +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "public-users". + */ export interface PublicUser { id: string updatedAt: string createdAt: string email: string - resetPasswordToken?: string - resetPasswordExpiration?: string - salt?: string - hash?: string - _verified?: boolean - _verificationToken?: string - loginAttempts?: number - lockUntil?: string - password?: string + resetPasswordToken?: string | null + resetPasswordExpiration?: string | null + salt?: string | null + hash?: string | null + _verified?: boolean | null + _verificationToken?: string | null + loginAttempts?: number | null + lockUntil?: string | null + password?: string | null } +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "relationsCollection". + */ +export interface RelationsCollection { + id: string + rel?: (string | null) | User + text?: string | null + updatedAt: string + createdAt: string +} +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "payload-preferences". + */ export interface PayloadPreference { id: string user: @@ -89,7 +128,7 @@ export interface PayloadPreference { relationTo: 'public-users' value: string | PublicUser } - key?: string + key?: string | null value?: | { [k: string]: unknown @@ -102,19 +141,14 @@ export interface PayloadPreference { updatedAt: string createdAt: string } +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "payload-migrations". + */ export interface PayloadMigration { id: string - name?: string - batch?: number - schema?: - | { - [k: string]: unknown - } - | unknown[] - | string - | number - | boolean - | null + name?: string | null + batch?: number | null updatedAt: string createdAt: string } From be69fc448d5accdfedf1d8281a781ead227c44e1 Mon Sep 17 00:00:00 2001 From: James Date: Thu, 11 Apr 2024 10:59:26 -0400 Subject: [PATCH 085/177] chore: de-flake --- test/fields/collections/Relationship/e2e.spec.ts | 4 ++-- test/fields/e2e.spec.ts | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/test/fields/collections/Relationship/e2e.spec.ts b/test/fields/collections/Relationship/e2e.spec.ts index a38bec314c..2badcdcf72 100644 --- a/test/fields/collections/Relationship/e2e.spec.ts +++ b/test/fields/collections/Relationship/e2e.spec.ts @@ -293,9 +293,9 @@ describe('relationship', () => { // opened through the edit button can be saved using the hotkey. test('should save using hotkey in edit document drawer', async () => { await page.goto(url.create) - // First fill out the relationship field, as it's required - await page.locator('#relationship-add-new .relationship-add-new__add-button').click() + await wait(500) await page.locator('#field-relationship .value-container').click() + await wait(500) // Select "Seeded text document" relationship await page.getByText('Seeded text document', { exact: true }).click() diff --git a/test/fields/e2e.spec.ts b/test/fields/e2e.spec.ts index f12e206aeb..19a9956e5f 100644 --- a/test/fields/e2e.spec.ts +++ b/test/fields/e2e.spec.ts @@ -800,6 +800,8 @@ describe('fields', () => { await openDocDrawer(page, '.field-type.upload .upload__toggler.doc-drawer__toggler') + await wait(1000) + await page .locator('[id^=doc-drawer_uploads_1_] .file-field__upload input[type="file"]') .setInputFiles(path.resolve(dirname, './uploads/payload.png')) From 1275c70187246542b39a1da9562b3d8d945ed364 Mon Sep 17 00:00:00 2001 From: Jacob Fletcher Date: Thu, 11 Apr 2024 11:16:15 -0400 Subject: [PATCH 086/177] feat(ui): provides payload as prop to all custom server components (#5775) --- packages/next/src/layouts/Root/index.tsx | 3 + .../next/src/views/CreateFirstUser/index.tsx | 9 +- packages/payload/src/admin/RichText.ts | 2 + .../src/admin/elements/PreviewButton.ts | 4 +- .../src/admin/elements/PublishButton.ts | 4 +- .../payload/src/admin/elements/SaveButton.ts | 4 +- .../src/admin/elements/SaveDraftButton.ts | 4 +- .../src/admin/elements/WithServerSideProps.ts | 4 + .../src/admin/forms/FieldDescription.ts | 6 +- packages/payload/src/admin/forms/RowLabel.ts | 4 +- packages/payload/src/admin/types.ts | 1 + .../payload/src/collections/config/types.ts | 11 +-- packages/payload/src/config/types.ts | 34 +++++--- packages/payload/src/exports/utilities.ts | 7 +- packages/payload/src/fields/config/types.ts | 86 +++++++++---------- .../payload/src/utilities/isReactComponent.ts | 19 ++-- .../src/generateComponentMap.tsx | 6 +- .../src/generateComponentMap.tsx | 4 +- .../ui/src/elements/withMergedProps/index.tsx | 10 +++ packages/ui/src/fields/HiddenInput/index.tsx | 2 +- .../buildComponentMap/WithServerSideProps.tsx | 21 +++++ .../buildComponentMap/actions.tsx | 13 ++- .../buildComponentMap/collections.tsx | 55 ++++++++---- .../ComponentMap/buildComponentMap/fields.tsx | 56 ++++++++---- .../buildComponentMap/globals.tsx | 27 ++++-- .../ComponentMap/buildComponentMap/index.tsx | 28 ++++-- .../ui/src/providers/ComponentMap/index.tsx | 2 + test/admin/components/AdminButton/index.tsx | 4 +- .../admin/components/AfterDashboard/index.tsx | 4 +- test/admin/components/AfterNavLinks/index.tsx | 4 +- test/admin/components/BeforeLogin/index.tsx | 5 +- .../components/CollectionAPIButton/index.tsx | 4 +- .../components/CollectionEditButton/index.tsx | 4 +- .../components/CollectionListButton/index.tsx | 4 +- tsconfig.json | 2 +- 35 files changed, 324 insertions(+), 133 deletions(-) create mode 100644 packages/payload/src/admin/elements/WithServerSideProps.ts create mode 100644 packages/ui/src/providers/ComponentMap/buildComponentMap/WithServerSideProps.tsx diff --git a/packages/next/src/layouts/Root/index.tsx b/packages/next/src/layouts/Root/index.tsx index 059920498b..d9145cc16c 100644 --- a/packages/next/src/layouts/Root/index.tsx +++ b/packages/next/src/layouts/Root/index.tsx @@ -12,6 +12,7 @@ import { createClientConfig } from 'payload/config' import React from 'react' import 'react-toastify/dist/ReactToastify.css' +import { getPayloadHMR } from '../../utilities/getPayloadHMR.js' import { getRequestLanguage } from '../../utilities/getRequestLanguage.js' import { DefaultEditView } from '../../views/Edit/Default/index.js' import { DefaultListView } from '../../views/List/Default/index.js' @@ -39,6 +40,7 @@ export const RootLayout = async ({ headers, }) + const payload = await getPayloadHMR({ config }) const i18n = await initI18n({ config: config.i18n, context: 'client', language: languageCode }) const clientConfig = await createClientConfig({ config, t: i18n.t }) @@ -76,6 +78,7 @@ export const RootLayout = async ({ children, config, i18n, + payload, }) return ( diff --git a/packages/next/src/views/CreateFirstUser/index.tsx b/packages/next/src/views/CreateFirstUser/index.tsx index 2c8e557167..bb6917ecc3 100644 --- a/packages/next/src/views/CreateFirstUser/index.tsx +++ b/packages/next/src/views/CreateFirstUser/index.tsx @@ -1,9 +1,10 @@ -import type { Field } from 'payload/types' +import type { Field, WithServerSideProps as WithServerSidePropsType } from 'payload/types' import type { AdminViewProps } from 'payload/types' import { Form } from '@payloadcms/ui/forms/Form' import { FormSubmit } from '@payloadcms/ui/forms/Submit' import { buildStateFromSchema } from '@payloadcms/ui/forms/buildStateFromSchema' +import { WithServerSideProps as WithServerSidePropsGeneric } from '@payloadcms/ui/providers/ComponentMap' import { mapFields } from '@payloadcms/ui/utilities/buildComponentMap' import React from 'react' @@ -17,6 +18,7 @@ export const CreateFirstUserView: React.FC = async ({ initPageRe req, req: { i18n, + payload, payload: { config, config: { @@ -49,7 +51,12 @@ export const CreateFirstUserView: React.FC = async ({ initPageRe }, ] + const WithServerSideProps: WithServerSidePropsType = ({ Component, ...rest }) => { + return + } + const createFirstUserFieldMap = mapFields({ + WithServerSideProps, config, fieldSchema: fields, i18n, diff --git a/packages/payload/src/admin/RichText.ts b/packages/payload/src/admin/RichText.ts index 36d4eb59e8..6f67ae8b92 100644 --- a/packages/payload/src/admin/RichText.ts +++ b/packages/payload/src/admin/RichText.ts @@ -4,6 +4,7 @@ import type { JSONSchema4 } from 'json-schema' import type { SanitizedConfig } from '../config/types.js' import type { Field, RichTextField, Validate } from '../fields/config/types.js' import type { PayloadRequest, RequestContext } from '../types/index.js' +import type { WithServerSideProps } from './elements/WithServerSideProps.js' export type RichTextFieldProps< Value extends object, @@ -28,6 +29,7 @@ type RichTextAdapterBase< siblingDoc: Record }) => Promise | null generateComponentMap: (args: { + WithServerSideProps: WithServerSideProps config: SanitizedConfig i18n: I18n schemaPath: string diff --git a/packages/payload/src/admin/elements/PreviewButton.ts b/packages/payload/src/admin/elements/PreviewButton.ts index 3763db6848..dad525625b 100644 --- a/packages/payload/src/admin/elements/PreviewButton.ts +++ b/packages/payload/src/admin/elements/PreviewButton.ts @@ -1 +1,3 @@ -export type CustomPreviewButton = React.ComponentType +import type { CustomComponent } from '../../config/types.js' + +export type CustomPreviewButton = CustomComponent diff --git a/packages/payload/src/admin/elements/PublishButton.ts b/packages/payload/src/admin/elements/PublishButton.ts index 40fb78c03f..8fabd59c2f 100644 --- a/packages/payload/src/admin/elements/PublishButton.ts +++ b/packages/payload/src/admin/elements/PublishButton.ts @@ -1 +1,3 @@ -export type CustomPublishButton = React.ComponentType +import type { CustomComponent } from '../../config/types.js' + +export type CustomPublishButton = CustomComponent diff --git a/packages/payload/src/admin/elements/SaveButton.ts b/packages/payload/src/admin/elements/SaveButton.ts index 81b232cffc..917775cc66 100644 --- a/packages/payload/src/admin/elements/SaveButton.ts +++ b/packages/payload/src/admin/elements/SaveButton.ts @@ -1 +1,3 @@ -export type CustomSaveButton = React.ComponentType +import type { CustomComponent } from '../../config/types.js' + +export type CustomSaveButton = CustomComponent diff --git a/packages/payload/src/admin/elements/SaveDraftButton.ts b/packages/payload/src/admin/elements/SaveDraftButton.ts index 6e7c04b996..ff2f410ae8 100644 --- a/packages/payload/src/admin/elements/SaveDraftButton.ts +++ b/packages/payload/src/admin/elements/SaveDraftButton.ts @@ -1 +1,3 @@ -export type CustomSaveDraftButton = React.ComponentType +import type { CustomComponent } from '../../config/types.js' + +export type CustomSaveDraftButton = CustomComponent diff --git a/packages/payload/src/admin/elements/WithServerSideProps.ts b/packages/payload/src/admin/elements/WithServerSideProps.ts new file mode 100644 index 0000000000..2cd3149ed6 --- /dev/null +++ b/packages/payload/src/admin/elements/WithServerSideProps.ts @@ -0,0 +1,4 @@ +export type WithServerSideProps = (args: { + [key: string]: any + Component: React.ComponentType +}) => React.ReactNode diff --git a/packages/payload/src/admin/forms/FieldDescription.ts b/packages/payload/src/admin/forms/FieldDescription.ts index cd2c2fd9f5..7974559dfd 100644 --- a/packages/payload/src/admin/forms/FieldDescription.ts +++ b/packages/payload/src/admin/forms/FieldDescription.ts @@ -1,10 +1,11 @@ import type React from 'react' -import type { LabelFunction } from '../../config/types.js' +import type { CustomComponent, LabelFunction } from '../../config/types.js' +import type { Payload } from '../../index.js' export type DescriptionFunction = LabelFunction -export type DescriptionComponent = React.ComponentType +export type DescriptionComponent = CustomComponent export type Description = | DescriptionComponent @@ -17,4 +18,5 @@ export type FieldDescriptionProps = { className?: string description?: Record | string marginPlacement?: 'bottom' | 'top' + payload?: Payload } diff --git a/packages/payload/src/admin/forms/RowLabel.ts b/packages/payload/src/admin/forms/RowLabel.ts index 6a7dc0533a..d75d7b0a78 100644 --- a/packages/payload/src/admin/forms/RowLabel.ts +++ b/packages/payload/src/admin/forms/RowLabel.ts @@ -1,3 +1,5 @@ -export type RowLabelComponent = React.ComponentType +import type { CustomComponent } from '../../config/types.js' + +export type RowLabelComponent = CustomComponent export type RowLabel = Record | RowLabelComponent | string diff --git a/packages/payload/src/admin/types.ts b/packages/payload/src/admin/types.ts index cf85d435a7..efd4ddb7b5 100644 --- a/packages/payload/src/admin/types.ts +++ b/packages/payload/src/admin/types.ts @@ -13,6 +13,7 @@ export type { DocumentTabConfig, DocumentTabProps, } from './elements/Tab.js' +export type { WithServerSideProps } from './elements/WithServerSideProps.js' export type { ErrorProps } from './forms/Error.js' export type { Description, diff --git a/packages/payload/src/collections/config/types.ts b/packages/payload/src/collections/config/types.ts index 0decc884ea..1d3344bb1e 100644 --- a/packages/payload/src/collections/config/types.ts +++ b/packages/payload/src/collections/config/types.ts @@ -10,6 +10,7 @@ import type { import type { Auth, ClientUser, IncomingAuthType } from '../../auth/types.js' import type { Access, + CustomComponent, EditConfig, Endpoint, EntityDescription, @@ -201,10 +202,10 @@ export type CollectionAdminOptions = { * Custom admin components */ components?: { - AfterList?: React.ComponentType[] - AfterListTable?: React.ComponentType[] - BeforeList?: React.ComponentType[] - BeforeListTable?: React.ComponentType[] + AfterList?: CustomComponent[] + AfterListTable?: CustomComponent[] + BeforeList?: CustomComponent[] + BeforeListTable?: CustomComponent[] /** * Components within the edit view */ @@ -239,7 +240,7 @@ export type CollectionAdminOptions = { List?: | { Component?: React.ComponentType - actions?: React.ComponentType[] + actions?: CustomComponent[] } | React.ComponentType } diff --git a/packages/payload/src/config/types.ts b/packages/payload/src/config/types.ts index 7dbc69c052..4799b0632c 100644 --- a/packages/payload/src/config/types.ts +++ b/packages/payload/src/config/types.ts @@ -279,7 +279,7 @@ export type EditViewConfig = path: string } | { - actions?: React.ComponentType[] + actions?: CustomComponent[] } /** @@ -291,6 +291,14 @@ export type EditViewConfig = */ export type EditView = EditViewComponent | EditViewConfig +export type ServerProps = { + payload: Payload +} + +export const serverProps: (keyof ServerProps)[] = ['payload'] + +export type CustomComponent = React.ComponentType + export type Locale = { /** * value of supported locale @@ -420,46 +428,46 @@ export type Config = { /** * Replace the navigation with a custom component */ - Nav?: React.ComponentType + Nav?: CustomComponent /** * Add custom components to the top right of the Admin Panel */ - actions?: React.ComponentType[] + actions?: CustomComponent[] /** * Add custom components after the collection overview */ - afterDashboard?: React.ComponentType[] + afterDashboard?: CustomComponent[] /** * Add custom components after the email/password field */ - afterLogin?: React.ComponentType[] + afterLogin?: CustomComponent[] /** * Add custom components after the navigation links */ - afterNavLinks?: React.ComponentType[] + afterNavLinks?: CustomComponent[] /** * Add custom components before the collection overview */ - beforeDashboard?: React.ComponentType[] + beforeDashboard?: CustomComponent[] /** * Add custom components before the email/password field */ - beforeLogin?: React.ComponentType[] + beforeLogin?: CustomComponent[] /** * Add custom components before the navigation links */ - beforeNavLinks?: React.ComponentType[] + beforeNavLinks?: CustomComponent[] /** Replace graphical components */ graphics?: { /** Replace the icon in the navigation */ - Icon?: React.ComponentType + Icon?: CustomComponent /** Replace the logo on the login page */ - Logo?: React.ComponentType + Logo?: CustomComponent } /** Replace logout related components */ logout?: { /** Replace the logout button */ - Button?: React.ComponentType + Button?: CustomComponent } /** * Wrap the admin dashboard in custom context providers @@ -716,7 +724,7 @@ export type EditConfig = ) | EditViewComponent -export type EntityDescriptionComponent = React.ComponentType +export type EntityDescriptionComponent = CustomComponent export type EntityDescriptionFunction = () => string diff --git a/packages/payload/src/exports/utilities.ts b/packages/payload/src/exports/utilities.ts index 1e50cea389..54e426ce11 100644 --- a/packages/payload/src/exports/utilities.ts +++ b/packages/payload/src/exports/utilities.ts @@ -34,7 +34,12 @@ export { isEntityHidden } from '../utilities/isEntityHidden.js' export { isNumber } from '../utilities/isNumber.js' export { isPlainObject } from '../utilities/isPlainObject.js' -export { isPlainFunction, isReactComponent } from '../utilities/isReactComponent.js' +export { + isPlainFunction, + isReactClientComponent, + isReactComponent, + isReactServerComponent, +} from '../utilities/isReactComponent.js' export { isValidID } from '../utilities/isValidID.js' export { default as isolateObjectProperty } from '../utilities/isolateObjectProperty.js' diff --git a/packages/payload/src/fields/config/types.ts b/packages/payload/src/fields/config/types.ts index ad656e66a0..946d0f4a8e 100644 --- a/packages/payload/src/fields/config/types.ts +++ b/packages/payload/src/fields/config/types.ts @@ -17,7 +17,7 @@ import type { } from '../../admin/types.js' import type { User } from '../../auth/index.js' import type { SanitizedCollectionConfig, TypeWithID } from '../../collections/config/types.js' -import type { LabelFunction } from '../../config/types.js' +import type { CustomComponent, LabelFunction } from '../../config/types.js' import type { DBIdentifierName } from '../../database/types.js' import type { SanitizedGlobalConfig } from '../../globals/config/types.js' import type { Operation, PayloadRequest, RequestContext, Where } from '../../types/index.js' @@ -115,8 +115,8 @@ export type FilterOptions = type Admin = { className?: string components?: { - Cell?: React.ComponentType - Field?: React.ComponentType + Cell?: CustomComponent + Field?: CustomComponent Filter?: React.ComponentType } /** @@ -208,10 +208,10 @@ export type NumberField = FieldBase & { /** Set this property to a string that will be used for browser autocomplete. */ autoComplete?: string components?: { - Error?: React.ComponentType - Label?: React.ComponentType - afterInput?: React.ComponentType[] - beforeInput?: React.ComponentType[] + Error?: CustomComponent + Label?: CustomComponent + afterInput?: CustomComponent[] + beforeInput?: CustomComponent[] } /** Set this property to define a placeholder string for the field. */ placeholder?: Record | string @@ -246,10 +246,10 @@ export type TextField = FieldBase & { admin?: Admin & { autoComplete?: string components?: { - Error?: React.ComponentType - Label?: React.ComponentType - afterInput?: React.ComponentType[] - beforeInput?: React.ComponentType[] + Error?: CustomComponent + Label?: CustomComponent + afterInput?: CustomComponent[] + beforeInput?: CustomComponent[] } placeholder?: Record | string rtl?: boolean @@ -280,10 +280,10 @@ export type EmailField = FieldBase & { admin?: Admin & { autoComplete?: string components?: { - Error?: React.ComponentType - Label?: React.ComponentType - afterInput?: React.ComponentType[] - beforeInput?: React.ComponentType[] + Error?: CustomComponent + Label?: CustomComponent + afterInput?: CustomComponent[] + beforeInput?: CustomComponent[] } placeholder?: Record | string } @@ -293,10 +293,10 @@ export type EmailField = FieldBase & { export type TextareaField = FieldBase & { admin?: Admin & { components?: { - Error?: React.ComponentType - Label?: React.ComponentType - afterInput?: React.ComponentType[] - beforeInput?: React.ComponentType[] + Error?: CustomComponent + Label?: CustomComponent + afterInput?: CustomComponent[] + beforeInput?: CustomComponent[] } placeholder?: Record | string rows?: number @@ -310,10 +310,10 @@ export type TextareaField = FieldBase & { export type CheckboxField = FieldBase & { admin?: Admin & { components?: { - Error?: React.ComponentType - Label?: React.ComponentType - afterInput?: React.ComponentType[] - beforeInput?: React.ComponentType[] + Error?: CustomComponent + Label?: CustomComponent + afterInput?: CustomComponent[] + beforeInput?: CustomComponent[] } } type: 'checkbox' @@ -322,10 +322,10 @@ export type CheckboxField = FieldBase & { export type DateField = FieldBase & { admin?: Admin & { components?: { - Error?: React.ComponentType - Label?: React.ComponentType - afterInput?: React.ComponentType[] - beforeInput?: React.ComponentType[] + Error?: CustomComponent + Label?: CustomComponent + afterInput?: CustomComponent[] + beforeInput?: CustomComponent[] } date?: ConditionalDateProps placeholder?: Record | string @@ -416,8 +416,8 @@ export type TabAsField = Tab & { export type UIField = { admin: { components?: { - Cell?: React.ComponentType - Field: React.ComponentType + Cell?: CustomComponent + Field: CustomComponent Filter?: React.ComponentType } condition?: Condition @@ -435,8 +435,8 @@ export type UIField = { export type UploadField = FieldBase & { admin?: { components?: { - Error?: React.ComponentType - Label?: React.ComponentType + Error?: CustomComponent + Label?: CustomComponent } } filterOptions?: FilterOptions @@ -447,8 +447,8 @@ export type UploadField = FieldBase & { type CodeAdmin = Admin & { components?: { - Error?: React.ComponentType - Label?: React.ComponentType + Error?: CustomComponent + Label?: CustomComponent } editorOptions?: EditorProps['options'] language?: string @@ -463,8 +463,8 @@ export type CodeField = Omit & { type JSONAdmin = Admin & { components?: { - Error?: React.ComponentType - Label?: React.ComponentType + Error?: CustomComponent + Label?: CustomComponent } editorOptions?: EditorProps['options'] } @@ -477,8 +477,8 @@ export type JSONField = Omit & { export type SelectField = FieldBase & { admin?: Admin & { components?: { - Error?: React.ComponentType - Label?: React.ComponentType + Error?: CustomComponent + Label?: CustomComponent } isClearable?: boolean isSortable?: boolean @@ -533,8 +533,8 @@ type SharedRelationshipProperties = FieldBase & { type RelationshipAdmin = Admin & { allowCreate?: boolean components?: { - Error?: React.ComponentType - Label?: React.ComponentType + Error?: CustomComponent + Label?: CustomComponent } isSortable?: boolean } @@ -574,8 +574,8 @@ export type RichTextField< > = FieldBase & { admin?: Admin & { components?: { - Error?: React.ComponentType - Label?: React.ComponentType + Error?: CustomComponent + Label?: CustomComponent } } editor?: RichTextAdapter @@ -618,8 +618,8 @@ export type ArrayField = FieldBase & { export type RadioField = FieldBase & { admin?: Admin & { components?: { - Error?: React.ComponentType - Label?: React.ComponentType + Error?: CustomComponent + Label?: CustomComponent } layout?: 'horizontal' | 'vertical' } diff --git a/packages/payload/src/utilities/isReactComponent.ts b/packages/payload/src/utilities/isReactComponent.ts index ddba16ce64..3910f1c4a4 100644 --- a/packages/payload/src/utilities/isReactComponent.ts +++ b/packages/payload/src/utilities/isReactComponent.ts @@ -4,14 +4,23 @@ import { isValidElement } from 'react' import { isPlainObject } from './isPlainObject.js' +export function isReactServerComponent( + component: React.ComponentType | any, +): component is T { + return typeof component === 'function' && isValidElement(component) +} + +export function isReactClientComponent( + component: React.ComponentType | any, +): component is T { + // Do this to test for client components (`use client` directive) bc they import as empty objects + return typeof component === 'object' && !isPlainObject(component) +} + export function isReactComponent( component: React.ComponentType | any, ): component is T { - return ( - (typeof component === 'function' && isValidElement(component)) || - // Do this to test for client components (`use client` directive) bc they import as empty objects - (typeof component === 'object' && !isPlainObject(component)) - ) + return isReactServerComponent(component) || isReactClientComponent(component) } export function isPlainFunction(fn: any): fn is T { diff --git a/packages/richtext-lexical/src/generateComponentMap.tsx b/packages/richtext-lexical/src/generateComponentMap.tsx index e9002b1fd5..480c018530 100644 --- a/packages/richtext-lexical/src/generateComponentMap.tsx +++ b/packages/richtext-lexical/src/generateComponentMap.tsx @@ -13,7 +13,7 @@ export const getGenerateComponentMap = (args: { resolvedFeatureMap: ResolvedServerFeatureMap }): RichTextAdapter['generateComponentMap'] => - ({ config, i18n, schemaPath }) => { + ({ WithServerSideProps, config, i18n, schemaPath }) => { const validRelationships = config.collections.map((c) => c.slug) || [] const componentMap = new Map() @@ -50,7 +50,8 @@ export const getGenerateComponentMap = if (Component) { componentMap.set( `feature.${featureKey}.components.${componentKey}`, - - ({ config, i18n }) => { + ({ WithServerSideProps, config, i18n }) => { const componentMap = new Map() const validRelationships = config.collections.map((c) => c.slug) || [] @@ -73,6 +73,7 @@ export const getGenerateComponentMap = }) const mappedFields = mapFields({ + WithServerSideProps, config, fieldSchema: linkFields, i18n, @@ -104,6 +105,7 @@ export const getGenerateComponentMap = }) const mappedFields = mapFields({ + WithServerSideProps, config, fieldSchema: uploadFields, i18n, diff --git a/packages/ui/src/elements/withMergedProps/index.tsx b/packages/ui/src/elements/withMergedProps/index.tsx index e84ab4b720..03ebd71d33 100644 --- a/packages/ui/src/elements/withMergedProps/index.tsx +++ b/packages/ui/src/elements/withMergedProps/index.tsx @@ -1,3 +1,4 @@ +import { serverProps } from 'payload/config' import { deepMerge } from 'payload/utilities' import React from 'react' @@ -21,14 +22,23 @@ import React from 'react' */ export function withMergedProps({ Component, + sanitizeServerOnlyProps = true, toMergeIntoProps, }: { Component: React.FC + sanitizeServerOnlyProps?: boolean toMergeIntoProps: ToMergeIntoProps }): React.FC { // A wrapper around the args.Component to inject the args.toMergeArgs as props, which are merged with the passed props const MergedPropsComponent: React.FC = (passedProps) => { const mergedProps = deepMerge(passedProps, toMergeIntoProps) + + if (sanitizeServerOnlyProps) { + serverProps.forEach((prop) => { + delete (mergedProps)[prop] + }) + } + return } diff --git a/packages/ui/src/fields/HiddenInput/index.tsx b/packages/ui/src/fields/HiddenInput/index.tsx index 358661a9f1..c25aac57af 100644 --- a/packages/ui/src/fields/HiddenInput/index.tsx +++ b/packages/ui/src/fields/HiddenInput/index.tsx @@ -10,7 +10,7 @@ import { withCondition } from '../../forms/withCondition/index.js' export type HiddenInputFieldProps = FormFieldBase & { disableModifyingForm?: false forceUsePathFromProps?: boolean - name: string + name?: string path?: string value?: unknown } diff --git a/packages/ui/src/providers/ComponentMap/buildComponentMap/WithServerSideProps.tsx b/packages/ui/src/providers/ComponentMap/buildComponentMap/WithServerSideProps.tsx new file mode 100644 index 0000000000..44d2ab7737 --- /dev/null +++ b/packages/ui/src/providers/ComponentMap/buildComponentMap/WithServerSideProps.tsx @@ -0,0 +1,21 @@ +import type { WithServerSideProps as WithServerSidePropsType } from 'payload/types' + +import { isReactServerComponent } from 'payload/utilities' +import React from 'react' + +export const WithServerSideProps: WithServerSidePropsType = ({ Component, payload, ...rest }) => { + if (Component) { + const WithServerSideProps: React.FC = (passedProps) => { + const propsWithPayload = { + ...passedProps, + ...(isReactServerComponent(Component) ? { payload } : {}), + } + + return + } + + return + } + + return null +} diff --git a/packages/ui/src/providers/ComponentMap/buildComponentMap/actions.tsx b/packages/ui/src/providers/ComponentMap/buildComponentMap/actions.tsx index 56c3cc592a..7dbb253d8d 100644 --- a/packages/ui/src/providers/ComponentMap/buildComponentMap/actions.tsx +++ b/packages/ui/src/providers/ComponentMap/buildComponentMap/actions.tsx @@ -1,14 +1,19 @@ -import type { SanitizedCollectionConfig, SanitizedGlobalConfig } from 'payload/types' +import type { + SanitizedCollectionConfig, + SanitizedGlobalConfig, + WithServerSideProps as WithServerSidePropsType, +} from 'payload/types' import React from 'react' import type { ActionMap } from './types.js' export const mapActions = (args: { + WithServerSideProps: WithServerSidePropsType collectionConfig?: SanitizedCollectionConfig globalConfig?: SanitizedGlobalConfig }): ActionMap => { - const { collectionConfig, globalConfig } = args + const { WithServerSideProps, collectionConfig, globalConfig } = args const editViews = (collectionConfig || globalConfig)?.admin?.components?.views?.Edit @@ -28,7 +33,7 @@ export const mapActions = (args: { view.actions.forEach((action) => { const Action = action if (typeof Action === 'function') { - result.Edit[key] = [...(result[key] || []), ] + result.Edit[key] = [...(result[key] || []), ] } }) } @@ -40,7 +45,7 @@ export const mapActions = (args: { const Action = action if (typeof Action === 'function') { // eslint-disable-next-line @typescript-eslint/no-floating-promises - result.List = [...result.List, ] + result.List = [...result.List, ] } }) } diff --git a/packages/ui/src/providers/ComponentMap/buildComponentMap/collections.tsx b/packages/ui/src/providers/ComponentMap/buildComponentMap/collections.tsx index b06caeaa68..ccfa0023fc 100644 --- a/packages/ui/src/providers/ComponentMap/buildComponentMap/collections.tsx +++ b/packages/ui/src/providers/ComponentMap/buildComponentMap/collections.tsx @@ -7,6 +7,7 @@ import type { EntityDescriptionFunction, SanitizedCollectionConfig, SanitizedConfig, + WithServerSideProps as WithServerSidePropsType, } from 'payload/types' import { ViewDescription } from '@payloadcms/ui/elements/ViewDescription' @@ -21,6 +22,7 @@ import { mapFields } from './fields.js' export const mapCollections = ({ DefaultEditView, DefaultListView, + WithServerSideProps, collections, config, i18n, @@ -28,6 +30,7 @@ export const mapCollections = ({ }: { DefaultEditView: React.FC DefaultListView: React.FC + WithServerSideProps: WithServerSidePropsType collections: SanitizedCollectionConfig[] config: SanitizedConfig i18n: I18n @@ -71,44 +74,60 @@ export const mapCollections = ({ const List = CustomListView || DefaultListView - const beforeList = collectionConfig?.admin?.components?.BeforeList - - const beforeListTable = collectionConfig?.admin?.components?.BeforeListTable - - const afterList = collectionConfig?.admin?.components?.AfterList - - const afterListTable = collectionConfig?.admin?.components?.AfterListTable - const SaveButtonComponent = collectionConfig?.admin?.components?.edit?.SaveButton - const SaveButton = SaveButtonComponent ? : undefined + + const SaveButton = SaveButtonComponent ? ( + + ) : undefined const SaveDraftButtonComponent = collectionConfig?.admin?.components?.edit?.SaveDraftButton - const SaveDraftButton = SaveDraftButtonComponent ? : undefined + + const SaveDraftButton = SaveDraftButtonComponent ? ( + + ) : undefined const PreviewButtonComponent = collectionConfig?.admin?.components?.edit?.PreviewButton - const PreviewButton = PreviewButtonComponent ? : undefined + + const PreviewButton = PreviewButtonComponent ? ( + + ) : undefined const PublishButtonComponent = collectionConfig?.admin?.components?.edit?.PublishButton - const PublishButton = PublishButtonComponent ? : undefined + + const PublishButton = PublishButtonComponent ? ( + + ) : undefined + + const beforeList = collectionConfig?.admin?.components?.BeforeList const BeforeList = - (beforeList && Array.isArray(beforeList) && beforeList?.map((Component) => )) || + (beforeList && + Array.isArray(beforeList) && + beforeList?.map((Component) => )) || null + const beforeListTable = collectionConfig?.admin?.components?.BeforeListTable + const BeforeListTable = (beforeListTable && Array.isArray(beforeListTable) && - beforeListTable?.map((Component) => )) || + beforeListTable?.map((Component) => )) || null + const afterList = collectionConfig?.admin?.components?.AfterList + const AfterList = - (afterList && Array.isArray(afterList) && afterList?.map((Component) => )) || + (afterList && + Array.isArray(afterList) && + afterList?.map((Component) => )) || null + const afterListTable = collectionConfig?.admin?.components?.AfterListTable + const AfterListTable = (afterListTable && Array.isArray(afterListTable) && - afterListTable?.map((Component) => )) || + afterListTable?.map((Component) => )) || null const descriptionProps: ViewDescriptionProps = { @@ -134,7 +153,7 @@ export const mapCollections = ({ const Description = DescriptionComponent !== undefined ? ( - + ) : undefined const componentMap: CollectionComponentMap = { @@ -150,9 +169,11 @@ export const mapCollections = ({ SaveButton, SaveDraftButton, actionsMap: mapActions({ + WithServerSideProps, collectionConfig, }), fieldMap: mapFields({ + WithServerSideProps, config, fieldSchema: fields, i18n, diff --git a/packages/ui/src/providers/ComponentMap/buildComponentMap/fields.tsx b/packages/ui/src/providers/ComponentMap/buildComponentMap/fields.tsx index c55bd4b43a..d09d3cc308 100644 --- a/packages/ui/src/providers/ComponentMap/buildComponentMap/fields.tsx +++ b/packages/ui/src/providers/ComponentMap/buildComponentMap/fields.tsx @@ -1,4 +1,5 @@ import type { I18n } from '@payloadcms/translations' +import type { CustomComponent } from 'packages/payload/src/config/types.js' import type { CellComponentProps, DescriptionComponent, @@ -11,11 +12,17 @@ import type { Option, RowLabelComponent, SanitizedConfig, + WithServerSideProps as WithServerSidePropsType, } from 'payload/types' import { FieldDescription } from '@payloadcms/ui/forms/FieldDescription' import { fieldAffectsData, fieldIsPresentationalOnly } from 'payload/types' -import { isPlainFunction, isReactComponent } from 'payload/utilities' +import { + isPlainFunction, + isReactClientComponent, + isReactComponent, + isReactServerComponent, +} from 'payload/utilities' import React, { Fragment } from 'react' import type { ArrayFieldProps } from '../../../fields/Array/index.js' @@ -50,6 +57,7 @@ import type { import { HiddenInput } from '../../../fields/HiddenInput/index.js' export const mapFields = (args: { + WithServerSideProps: WithServerSidePropsType config: SanitizedConfig /** * If mapFields is used outside of collections, you might not want it to add an id field @@ -62,6 +70,7 @@ export const mapFields = (args: { readOnly?: boolean }): FieldMap => { const { + WithServerSideProps, config, disableAddingID, fieldSchema, @@ -74,8 +83,7 @@ export const mapFields = (args: { const result: FieldMap = fieldSchema.reduce((acc, field): FieldMap => { const fieldIsPresentational = fieldIsPresentationalOnly(field) - let CustomFieldComponent: React.ComponentType = - field.admin?.components?.Field + let CustomFieldComponent: CustomComponent = field.admin?.components?.Field const CustomCellComponent = field.admin?.components?.Cell @@ -102,7 +110,7 @@ export const mapFields = (args: { Array.isArray(field.admin?.components?.afterInput) && ( {field.admin.components.afterInput.map((Component, i) => ( - + ))} )) || @@ -115,7 +123,7 @@ export const mapFields = (args: { Array.isArray(field.admin.components.beforeInput) && ( {field.admin.components.beforeInput.map((Component, i) => ( - + ))} )) || @@ -133,12 +141,12 @@ export const mapFields = (args: { ('admin' in field && field.admin?.components && 'Label' in field.admin.components && - field.admin?.components?.Label) || + field.admin.components?.Label) || undefined const CustomLabel = CustomLabelComponent !== undefined ? ( - + ) : undefined const descriptionProps: FieldDescriptionProps = { @@ -164,7 +172,10 @@ export const mapFields = (args: { const CustomDescription = CustomDescriptionComponent !== undefined ? ( - + ) : undefined const errorProps = { @@ -180,7 +191,7 @@ export const mapFields = (args: { const CustomError = CustomErrorComponent !== undefined ? ( - + ) : undefined const baseFieldProps: FormFieldBase = { @@ -239,7 +250,7 @@ export const mapFields = (args: { isReactComponent(field.admin.components.RowLabel) ) { const CustomRowLabelComponent = field.admin.components.RowLabel - CustomRowLabel = + CustomRowLabel = } const arrayFieldProps: Omit = { @@ -249,6 +260,7 @@ export const mapFields = (args: { className: field.admin?.className, disabled: field.admin?.disabled, fieldMap: mapFields({ + WithServerSideProps, config, fieldSchema: field.fields, filter, @@ -272,6 +284,7 @@ export const mapFields = (args: { case 'blocks': { const blocks = field.blocks.map((block) => { const blockFieldMap = mapFields({ + WithServerSideProps, config, fieldSchema: block.fields, filter, @@ -355,7 +368,9 @@ export const mapFields = (args: { if (isReactComponent(field.label) || isPlainFunction(field.label)) { const CustomCollapsibleLabelComponent = field.label as RowLabelComponent - CustomCollapsibleLabel = + CustomCollapsibleLabel = ( + + ) } const collapsibleField: Omit = { @@ -364,6 +379,7 @@ export const mapFields = (args: { className: field.admin?.className, disabled: field.admin?.disabled, fieldMap: mapFields({ + WithServerSideProps, config, disableAddingID: true, fieldSchema: field.fields, @@ -426,6 +442,7 @@ export const mapFields = (args: { className: field.admin?.className, disabled: field.admin?.disabled, fieldMap: mapFields({ + WithServerSideProps, config, disableAddingID: true, fieldSchema: field.fields, @@ -553,7 +570,12 @@ export const mapFields = (args: { const RichTextCellComponent = field.editor.CellComponent if (typeof field.editor.generateComponentMap === 'function') { - const result = field.editor.generateComponentMap({ config, i18n, schemaPath: path }) + const result = field.editor.generateComponentMap({ + WithServerSideProps, + config, + i18n, + schemaPath: path, + }) richTextField.richTextComponentMap = result cellComponentProps.richTextComponentMap = result } @@ -563,7 +585,9 @@ export const mapFields = (args: { } if (RichTextCellComponent) { - cellComponentProps.CellComponentOverride = + cellComponentProps.CellComponentOverride = ( + + ) } fieldComponentProps = richTextField @@ -576,6 +600,7 @@ export const mapFields = (args: { className: field.admin?.className, disabled: field.admin?.disabled, fieldMap: mapFields({ + WithServerSideProps, config, disableAddingID: true, fieldSchema: field.fields, @@ -597,6 +622,7 @@ export const mapFields = (args: { // `tabs` fields require a field map of each of its tab's nested fields const tabs = field.tabs.map((tab) => { const tabFieldMap = mapFields({ + WithServerSideProps, config, disableAddingID: true, fieldSchema: tab.fields, @@ -722,10 +748,10 @@ export const mapFields = (args: { name: 'name' in field ? field.name : undefined, type: field.type, CustomCell: CustomCellComponent ? ( - + ) : undefined, CustomField: CustomFieldComponent ? ( - + ) : undefined, cellComponentProps, disableBulkEdit: diff --git a/packages/ui/src/providers/ComponentMap/buildComponentMap/globals.tsx b/packages/ui/src/providers/ComponentMap/buildComponentMap/globals.tsx index 1a78700e05..10d44da0f4 100644 --- a/packages/ui/src/providers/ComponentMap/buildComponentMap/globals.tsx +++ b/packages/ui/src/providers/ComponentMap/buildComponentMap/globals.tsx @@ -5,6 +5,7 @@ import type { EntityDescriptionFunction, SanitizedConfig, SanitizedGlobalConfig, + WithServerSideProps as WithServerSidePropsType, } from 'payload/types' import { ViewDescription, type ViewDescriptionProps } from '@payloadcms/ui/elements/ViewDescription' @@ -18,12 +19,14 @@ import { mapFields } from './fields.js' export const mapGlobals = ({ DefaultEditView, + WithServerSideProps, config, globals, i18n, readOnly: readOnlyOverride, }: { DefaultEditView: React.FC + WithServerSideProps: WithServerSidePropsType config: SanitizedConfig globals: SanitizedGlobalConfig[] i18n: I18n @@ -37,16 +40,28 @@ export const mapGlobals = ({ const editViewFromConfig = globalConfig?.admin?.components?.views?.Edit const SaveButton = globalConfig?.admin?.components?.elements?.SaveButton - const SaveButtonComponent = SaveButton ? : undefined + + const SaveButtonComponent = SaveButton ? ( + + ) : undefined const SaveDraftButton = globalConfig?.admin?.components?.elements?.SaveDraftButton - const SaveDraftButtonComponent = SaveDraftButton ? : undefined + + const SaveDraftButtonComponent = SaveDraftButton ? ( + + ) : undefined const PreviewButton = globalConfig?.admin?.components?.elements?.PreviewButton - const PreviewButtonComponent = PreviewButton ? : undefined + + const PreviewButtonComponent = PreviewButton ? ( + + ) : undefined const PublishButton = globalConfig?.admin?.components?.elements?.PublishButton - const PublishButtonComponent = PublishButton ? : undefined + + const PublishButtonComponent = PublishButton ? ( + + ) : undefined const CustomEditView = typeof editViewFromConfig === 'function' @@ -84,7 +99,7 @@ export const mapGlobals = ({ const Description = DescriptionComponent !== undefined ? ( - + ) : undefined const componentMap: GlobalComponentMap = { @@ -95,9 +110,11 @@ export const mapGlobals = ({ SaveButton: SaveButtonComponent, SaveDraftButton: SaveDraftButtonComponent, actionsMap: mapActions({ + WithServerSideProps, globalConfig, }), fieldMap: mapFields({ + WithServerSideProps, config, fieldSchema: fields, i18n, diff --git a/packages/ui/src/providers/ComponentMap/buildComponentMap/index.tsx b/packages/ui/src/providers/ComponentMap/buildComponentMap/index.tsx index 954a8c2b87..8abade7e50 100644 --- a/packages/ui/src/providers/ComponentMap/buildComponentMap/index.tsx +++ b/packages/ui/src/providers/ComponentMap/buildComponentMap/index.tsx @@ -1,10 +1,17 @@ import type { I18n } from '@payloadcms/translations' -import type { AdminViewProps, EditViewProps, SanitizedConfig } from 'payload/types' +import type { + AdminViewProps, + EditViewProps, + Payload, + SanitizedConfig, + WithServerSideProps as WithServerSidePropsType, +} from 'payload/types' import React from 'react' import type { ComponentMap } from './types.js' +import { WithServerSideProps as WithServerSidePropsGeneric } from './WithServerSideProps.js' import { mapCollections } from './collections.js' import { mapGlobals } from './globals.js' @@ -14,16 +21,22 @@ export const buildComponentMap = (args: { children: React.ReactNode config: SanitizedConfig i18n: I18n + payload: Payload readOnly?: boolean }): { componentMap: ComponentMap wrappedChildren: React.ReactNode } => { - const { DefaultEditView, DefaultListView, children, config, i18n, readOnly } = args + const { DefaultEditView, DefaultListView, children, config, i18n, payload, readOnly } = args + + const WithServerSideProps: WithServerSidePropsType = ({ Component, ...rest }) => { + return + } const collections = mapCollections({ DefaultEditView, DefaultListView, + WithServerSideProps, collections: config.collections, config, i18n, @@ -32,6 +45,7 @@ export const buildComponentMap = (args: { const globals = mapGlobals({ DefaultEditView, + WithServerSideProps, config, globals: config.globals, i18n, @@ -52,17 +66,21 @@ export const buildComponentMap = (args: { const LogoutButtonComponent = config.admin?.components?.logout?.Button - const LogoutButton = LogoutButtonComponent ? : null + const LogoutButton = LogoutButtonComponent ? ( + + ) : null const IconComponent = config.admin?.components?.graphics?.Icon - const Icon = IconComponent ? : null + const Icon = IconComponent ? : null return { componentMap: { Icon, LogoutButton, - actions: config.admin?.components?.actions?.map((Component) => ), + actions: config.admin?.components?.actions?.map((Component) => ( + + )), collections, globals, }, diff --git a/packages/ui/src/providers/ComponentMap/index.tsx b/packages/ui/src/providers/ComponentMap/index.tsx index 79e0b4efbb..e0b3785323 100644 --- a/packages/ui/src/providers/ComponentMap/index.tsx +++ b/packages/ui/src/providers/ComponentMap/index.tsx @@ -17,6 +17,8 @@ export type IComponentMapContext = { }) => MappedField | undefined } +export { WithServerSideProps } from './buildComponentMap/WithServerSideProps.js' + const ComponentMapContext = createContext({} as IComponentMapContext) export const ComponentMapProvider: React.FC<{ diff --git a/test/admin/components/AdminButton/index.tsx b/test/admin/components/AdminButton/index.tsx index 459d2c8a25..5cd5438e6e 100644 --- a/test/admin/components/AdminButton/index.tsx +++ b/test/admin/components/AdminButton/index.tsx @@ -1,8 +1,10 @@ +import type { SanitizedConfig } from 'payload/types' + import React from 'react' const baseClass = 'admin-button' -export const AdminButton: React.FC = () => { +export const AdminButton: SanitizedConfig['admin']['components']['actions'][0] = () => { return (
{ +export const AfterDashboard: SanitizedConfig['admin']['components']['afterDashboard'][0] = () => { return (

Test Config

diff --git a/test/admin/components/AfterNavLinks/index.tsx b/test/admin/components/AfterNavLinks/index.tsx index 84ecfb99b6..cb881f215c 100644 --- a/test/admin/components/AfterNavLinks/index.tsx +++ b/test/admin/components/AfterNavLinks/index.tsx @@ -1,5 +1,7 @@ 'use client' +import type { SanitizedConfig } from 'payload/types' + import { useConfig } from '@payloadcms/ui/providers/Config' import LinkImport from 'next/link.js' const Link = (LinkImport.default || LinkImport) as unknown as typeof LinkImport.default @@ -8,7 +10,7 @@ import React from 'react' const baseClass = 'after-nav-links' -export const AfterNavLinks: React.FC = () => { +export const AfterNavLinks: SanitizedConfig['admin']['components']['afterNavLinks'][0] = () => { const { routes: { admin: adminRoute }, } = useConfig() diff --git a/test/admin/components/BeforeLogin/index.tsx b/test/admin/components/BeforeLogin/index.tsx index d3be5424ce..c9be4fb006 100644 --- a/test/admin/components/BeforeLogin/index.tsx +++ b/test/admin/components/BeforeLogin/index.tsx @@ -1,10 +1,13 @@ 'use client' +import type { SanitizedConfig } from 'payload/types' + import { useTranslation } from '@payloadcms/ui/providers/Translation' import React from 'react' -export const BeforeLogin: React.FC = () => { +export const BeforeLogin: SanitizedConfig['admin']['components']['beforeLogin'][0] = () => { const translation = useTranslation() + return (

{translation.t('general:welcome')}

diff --git a/test/admin/components/CollectionAPIButton/index.tsx b/test/admin/components/CollectionAPIButton/index.tsx index 3d15673dce..b4f8ac915d 100644 --- a/test/admin/components/CollectionAPIButton/index.tsx +++ b/test/admin/components/CollectionAPIButton/index.tsx @@ -1,8 +1,10 @@ +import type { CustomComponent } from 'payload/config' + import React from 'react' const baseClass = 'collection-api-button' -export const CollectionAPIButton: React.FC = () => { +export const CollectionAPIButton: CustomComponent = () => { return (
{ +export const CollectionEditButton: CustomComponent = () => { return (
{ +export const CollectionListButton: CustomComponent = () => { return (
Date: Thu, 11 Apr 2024 11:17:59 -0400 Subject: [PATCH 087/177] more de-flake --- test/fields-relationship/e2e.spec.ts | 5 ++++- test/fields/e2e.spec.ts | 5 ++--- test/helpers.ts | 2 +- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/test/fields-relationship/e2e.spec.ts b/test/fields-relationship/e2e.spec.ts index db42490b19..c692bdca8c 100644 --- a/test/fields-relationship/e2e.spec.ts +++ b/test/fields-relationship/e2e.spec.ts @@ -394,9 +394,12 @@ describe('fields - relationship', () => { const button = field.locator( 'button.relationship--single-value__drawer-toggler.doc-drawer__toggler', ) + + await wait(1000) + await button.click() - await wait(500) + await wait(1000) const documentDrawer = page.locator('[id^=doc-drawer_relation-one_1_]') await expect(documentDrawer).toBeVisible() diff --git a/test/fields/e2e.spec.ts b/test/fields/e2e.spec.ts index 19a9956e5f..014eea03e1 100644 --- a/test/fields/e2e.spec.ts +++ b/test/fields/e2e.spec.ts @@ -746,8 +746,7 @@ describe('fields', () => { .locator('.file-field__upload input[type="file"]') .setInputFiles(path.resolve(dirname, './collections/Upload/payload.jpg')) await expect(page.locator('.file-field .file-field__filename')).toHaveValue('payload.jpg') - await page.locator('#action-save').click() - await expect(page.locator('.Toastify')).toContainText('successfully') + await saveDocAndAssert(page) } // eslint-disable-next-line playwright/expect-expect @@ -766,7 +765,7 @@ describe('fields', () => { test('should upload using the document drawer', async () => { await uploadImage() - await wait(500) + await wait(1000) // Open the media drawer and create a png upload await openDocDrawer(page, '.field-type.upload .upload__toggler.doc-drawer__toggler') diff --git a/test/helpers.ts b/test/helpers.ts index c082739190..1e2a1bc1cd 100644 --- a/test/helpers.ts +++ b/test/helpers.ts @@ -132,7 +132,7 @@ export async function openNav(page: Page): Promise { export async function openDocDrawer(page: Page, selector: string): Promise { await page.locator(selector).click() - await wait(300) // wait for drawer form state to initialize + await wait(1000) // wait for drawer form state to initialize } export async function closeNav(page: Page): Promise { From 5119c51439ff2cfb6585a9112fffb4166fdc92af Mon Sep 17 00:00:00 2001 From: Paul Popus Date: Thu, 11 Apr 2024 12:19:11 -0300 Subject: [PATCH 088/177] chore: type request too --- packages/payload/src/types/index.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/payload/src/types/index.ts b/packages/payload/src/types/index.ts index 940918381e..40a19af666 100644 --- a/packages/payload/src/types/index.ts +++ b/packages/payload/src/types/index.ts @@ -4,6 +4,7 @@ import type DataLoader from 'dataloader' import type { User } from '../auth/types.js' import type { TypeWithID, TypeWithTimestamps } from '../collections/config/types.js' import type payload from '../index.js' +import type { GeneratedTypes } from '../index.js' import type { validOperators } from './constants.js' export type { Payload as Payload } from '../index.js' @@ -20,7 +21,7 @@ export type UploadEdits = { } } -export type CustomPayloadRequest = { +export type CustomPayloadRequest = { context: RequestContext /** Data from the request body */ data?: Record @@ -73,12 +74,12 @@ export type CustomPayloadRequest = { */ transactionIDPromise?: Promise /** The signed in user */ - user: (U & User) | null + user: (U & GeneratedTypes['user']) | null } & Pick< URL, 'hash' | 'host' | 'href' | 'origin' | 'pathname' | 'port' | 'protocol' | 'search' | 'searchParams' > -export type PayloadRequest = Partial & +export type PayloadRequest = Partial & Required> & CustomPayloadRequest export interface RequestContext { From a4956dc64906853c3ac476c7c6d7521c120ba52f Mon Sep 17 00:00:00 2001 From: Elliot DeNolf Date: Thu, 11 Apr 2024 12:01:16 -0400 Subject: [PATCH 089/177] fix(cpa): ast parse error handling (#5793) --- packages/create-payload-app/package.json | 2 +- .../src/lib/wrap-next-config.spec.ts | 26 +++++++++++ .../src/lib/wrap-next-config.ts | 45 ++++++++++++------- pnpm-lock.yaml | 12 +++-- 4 files changed, 65 insertions(+), 20 deletions(-) diff --git a/packages/create-payload-app/package.json b/packages/create-payload-app/package.json index 0d925ac6a8..70bfd31869 100644 --- a/packages/create-payload-app/package.json +++ b/packages/create-payload-app/package.json @@ -35,7 +35,7 @@ "comment-json": "^4.2.3", "degit": "^2.8.4", "detect-package-manager": "^3.0.1", - "esprima": "^4.0.1", + "esprima-next": "^6.0.3", "execa": "^5.0.0", "figures": "^6.1.0", "fs-extra": "^9.0.1", diff --git a/packages/create-payload-app/src/lib/wrap-next-config.spec.ts b/packages/create-payload-app/src/lib/wrap-next-config.spec.ts index 968b8a79ef..1099336232 100644 --- a/packages/create-payload-app/src/lib/wrap-next-config.spec.ts +++ b/packages/create-payload-app/src/lib/wrap-next-config.spec.ts @@ -17,6 +17,11 @@ export default someFunc( nextConfigExportNamedDefault: `const nextConfig = {}; const wrapped = someFunc(asdf); export { wrapped as default }; +`, + nextConfigWithSpread: `const nextConfig = { + ...someConfig, +}; +export default nextConfig; `, } @@ -38,6 +43,9 @@ module.exports = someFunc( nextConfigExportNamedDefault: `const nextConfig = {}; const wrapped = someFunc(asdf); module.exports = wrapped; +`, + nextConfigWithSpread: `const nextConfig = { ...someConfig }; +module.exports = nextConfig; `, } @@ -70,6 +78,15 @@ describe('parseAndInsertWithPayload', () => { expect(modifiedConfigContent).toMatch(/withPayload\(someFunc\(\n nextConfig\n\)\)/) }) + it('should parse the config with a spread', () => { + const { modifiedConfigContent } = parseAndModifyConfigContent( + esmConfigs.nextConfigWithSpread, + configType, + ) + expect(modifiedConfigContent).toContain(importStatement) + expect(modifiedConfigContent).toContain('withPayload(nextConfig)') + }) + // Unsupported: export { wrapped as default } it('should give warning with a named export as default', () => { const warnLogSpy = jest.spyOn(p.log, 'warn').mockImplementation(() => {}) @@ -129,5 +146,14 @@ describe('parseAndInsertWithPayload', () => { expect(modifiedConfigContent).toContain(requireStatement) expect(modifiedConfigContent).toContain('withPayload(wrapped)') }) + + it('should parse the config with a spread', () => { + const { modifiedConfigContent } = parseAndModifyConfigContent( + cjsConfigs.nextConfigWithSpread, + configType, + ) + expect(modifiedConfigContent).toContain(requireStatement) + expect(modifiedConfigContent).toContain('withPayload(nextConfig)') + }) }) }) diff --git a/packages/create-payload-app/src/lib/wrap-next-config.ts b/packages/create-payload-app/src/lib/wrap-next-config.ts index ccc6ecdb98..f19d4eedb4 100644 --- a/packages/create-payload-app/src/lib/wrap-next-config.ts +++ b/packages/create-payload-app/src/lib/wrap-next-config.ts @@ -1,5 +1,7 @@ +import type { Program } from 'esprima-next' + import chalk from 'chalk' -import { parseModule } from 'esprima' +import { Syntax, parseModule } from 'esprima-next' import fs from 'fs' import { warning } from '../utils/log.js' @@ -38,16 +40,29 @@ export function parseAndModifyConfigContent( configType: NextConfigType, ): { modifiedConfigContent: string; success: boolean } { content = withPayloadStatement[configType] + content - const ast = parseModule(content, { loc: true }) + + let ast: Program | undefined + try { + ast = parseModule(content, { loc: true }) + } catch (error: unknown) { + if (error instanceof Error) { + warning(`Unable to parse Next config. Error: ${error.message} `) + warnUserWrapNotSuccessful(configType) + } + return { + modifiedConfigContent: content, + success: false, + } + } if (configType === 'esm') { - const exportDefaultDeclaration = ast.body.find((p) => p.type === 'ExportDefaultDeclaration') as - | Directive - | undefined + const exportDefaultDeclaration = ast.body.find( + (p) => p.type === Syntax.ExportDefaultDeclaration, + ) as Directive | undefined - const exportNamedDeclaration = ast.body.find((p) => p.type === 'ExportNamedDeclaration') as - | ExportNamedDeclaration - | undefined + const exportNamedDeclaration = ast.body.find( + (p) => p.type === Syntax.ExportNamedDeclaration, + ) as ExportNamedDeclaration | undefined if (!exportDefaultDeclaration && !exportNamedDeclaration) { throw new Error('Could not find ExportDefaultDeclaration in next.config.js') @@ -57,7 +72,6 @@ export function parseAndModifyConfigContent( const modifiedConfigContent = insertBeforeAndAfter( content, exportDefaultDeclaration.declaration.loc, - configType, ) return { modifiedConfigContent, success: true } } else if (exportNamedDeclaration) { @@ -91,12 +105,12 @@ export function parseAndModifyConfigContent( // Find `module.exports = X` const moduleExports = ast.body.find( (p) => - p.type === 'ExpressionStatement' && - p.expression?.type === 'AssignmentExpression' && - p.expression.left?.type === 'MemberExpression' && - p.expression.left.object?.type === 'Identifier' && + p.type === Syntax.ExpressionStatement && + p.expression?.type === Syntax.AssignmentExpression && + p.expression.left?.type === Syntax.MemberExpression && + p.expression.left.object?.type === Syntax.Identifier && p.expression.left.object.name === 'module' && - p.expression.left.property?.type === 'Identifier' && + p.expression.left.property?.type === Syntax.Identifier && p.expression.left.property.name === 'exports', // eslint-disable-next-line @typescript-eslint/no-explicit-any ) as any @@ -105,7 +119,6 @@ export function parseAndModifyConfigContent( const modifiedConfigContent = insertBeforeAndAfter( content, moduleExports.expression.right.loc, - configType, ) return { modifiedConfigContent, success: true } } @@ -174,7 +187,7 @@ type Loc = { start: { column: number; line: number } } -function insertBeforeAndAfter(content: string, loc: Loc, configType: NextConfigType) { +function insertBeforeAndAfter(content: string, loc: Loc) { const { end, start } = loc const lines = content.split('\n') diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 62136a1675..6cdf1e1cda 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -319,9 +319,9 @@ importers: detect-package-manager: specifier: ^3.0.1 version: 3.0.1 - esprima: - specifier: ^4.0.1 - version: 4.0.1 + esprima-next: + specifier: ^6.0.3 + version: 6.0.3 execa: specifier: ^5.0.0 version: 5.1.1 @@ -9396,6 +9396,12 @@ packages: acorn-jsx: 5.3.2(acorn@8.11.3) eslint-visitor-keys: 3.4.3 + /esprima-next@6.0.3: + resolution: {integrity: sha512-fVfE+9qIOJSbS3AR7roIuL0gCeS+tC86bJV9GlJtwXCRoo67q6tsGGUjThW+JtR5IQSShnHqaDqX8D0IYDfRGA==} + engines: {node: '>=12'} + hasBin: true + dev: false + /esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} From 55bf5436e4599c88ba1aa1ade264236917b9a084 Mon Sep 17 00:00:00 2001 From: Paul Popus Date: Thu, 11 Apr 2024 13:09:39 -0300 Subject: [PATCH 090/177] fix type issues --- packages/payload/src/auth/getFieldsToSign.ts | 3 ++- packages/payload/src/fields/config/types.ts | 4 ++-- packages/payload/src/fields/getDefaultValue.ts | 3 ++- packages/payload/src/preferences/types.ts | 2 +- packages/payload/src/utilities/telemetry/events/adminInit.ts | 3 ++- 5 files changed, 9 insertions(+), 6 deletions(-) diff --git a/packages/payload/src/auth/getFieldsToSign.ts b/packages/payload/src/auth/getFieldsToSign.ts index 0058b5fe9b..784f3af3cb 100644 --- a/packages/payload/src/auth/getFieldsToSign.ts +++ b/packages/payload/src/auth/getFieldsToSign.ts @@ -1,6 +1,7 @@ /* eslint-disable no-param-reassign */ import type { CollectionConfig } from '../collections/config/types.js' import type { Field, TabAsField } from '../fields/config/types.js' +import type { PayloadRequest } from '../types/index.js' import type { User } from './index.js' import { fieldAffectsData, tabHasName } from '../fields/config/types.js' @@ -105,7 +106,7 @@ const traverseFields = ({ export const getFieldsToSign = (args: { collectionConfig: CollectionConfig email: string - user: User + user: PayloadRequest['user'] }): Record => { const { collectionConfig, email, user } = args diff --git a/packages/payload/src/fields/config/types.ts b/packages/payload/src/fields/config/types.ts index ad656e66a0..ee3d12eb0f 100644 --- a/packages/payload/src/fields/config/types.ts +++ b/packages/payload/src/fields/config/types.ts @@ -81,7 +81,7 @@ export type FieldAccess = (args: { export type Condition = ( data: Partial, siblingData: Partial

, - { user }: { user: User }, + { user }: { user: PayloadRequest['user'] }, ) => boolean export type FilterOptionsProps = { @@ -104,7 +104,7 @@ export type FilterOptionsProps = { /** * An object containing the currently authenticated user. */ - user: Partial + user: Partial } export type FilterOptions = diff --git a/packages/payload/src/fields/getDefaultValue.ts b/packages/payload/src/fields/getDefaultValue.ts index db255d707c..c33c6e07c5 100644 --- a/packages/payload/src/fields/getDefaultValue.ts +++ b/packages/payload/src/fields/getDefaultValue.ts @@ -1,11 +1,12 @@ import type { User } from '../auth/index.js' +import type { PayloadRequest } from '../types/index.js' import { deepCopyObject } from '../utilities/deepCopyObject.js' type Args = { defaultValue: unknown locale: string | undefined - user: User + user: PayloadRequest['user'] value?: unknown } diff --git a/packages/payload/src/preferences/types.ts b/packages/payload/src/preferences/types.ts index c09febda3c..b1819b961e 100644 --- a/packages/payload/src/preferences/types.ts +++ b/packages/payload/src/preferences/types.ts @@ -5,7 +5,7 @@ export type PreferenceRequest = { key: string overrideAccess?: boolean req: PayloadRequest - user: User + user: PayloadRequest['user'] } export type PreferenceUpdateRequest = PreferenceRequest & { value: unknown } diff --git a/packages/payload/src/utilities/telemetry/events/adminInit.ts b/packages/payload/src/utilities/telemetry/events/adminInit.ts index cbf6290997..a9b0f8c376 100644 --- a/packages/payload/src/utilities/telemetry/events/adminInit.ts +++ b/packages/payload/src/utilities/telemetry/events/adminInit.ts @@ -1,5 +1,6 @@ import type { User } from '../../../auth/types.js' import type { Payload } from '../../../index.js' +import type { PayloadRequest } from '../../../types/index.js' import { sendEvent } from '../index.js' import { oneWayHash } from '../oneWayHash.js' @@ -13,7 +14,7 @@ export type AdminInitEvent = { type Args = { headers: Request['headers'] payload: Payload - user: User | null + user: PayloadRequest['user'] } export const adminInit = ({ headers, payload, user }: Args): void => { const host = headers.get('host') From 30da5a8643aaf8246a2be4b700ecded91cf0e395 Mon Sep 17 00:00:00 2001 From: Ritsu Date: Thu, 11 Apr 2024 19:46:14 +0300 Subject: [PATCH 091/177] fix: generated ids for array items the same as global id --- packages/next/src/routes/rest/buildFormState.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/next/src/routes/rest/buildFormState.ts b/packages/next/src/routes/rest/buildFormState.ts index 14c103d436..6c828b9bc3 100644 --- a/packages/next/src/routes/rest/buildFormState.ts +++ b/packages/next/src/routes/rest/buildFormState.ts @@ -156,7 +156,7 @@ export const buildFormState = async ({ req }: { req: PayloadRequest }) => { }) } - if (globalSlug) { + if (globalSlug && schemaPath === globalSlug) { resolvedData = await req.payload.findGlobal({ slug: globalSlug, depth: 0, From c1081ccfe27148716a766d6d1ff9dac94384b1ef Mon Sep 17 00:00:00 2001 From: Jarrod Flesch <30633324+JarrodMFlesch@users.noreply.github.com> Date: Thu, 11 Apr 2024 12:57:19 -0400 Subject: [PATCH 092/177] chore(tests): flakey drawer, tab, navigation tests (#5792) --- test/admin/e2e.spec.ts | 5 +- test/fields-relationship/e2e.spec.ts | 18 +++---- .../collections/Relationship/e2e.spec.ts | 47 +++++++++++-------- test/fields/e2e.spec.ts | 5 +- test/helpers.ts | 5 +- test/helpers/sdk/endpoint.ts | 6 +-- test/helpers/sdk/index.ts | 26 +++++++--- test/helpers/sdk/types.ts | 10 +++- .../(pages)/[slug]/page.client.tsx | 2 +- .../app/live-preview/(pages)/[slug]/page.tsx | 3 +- .../(pages)/posts/[slug]/page.tsx | 1 + test/uploads/e2e.spec.ts | 1 + 12 files changed, 79 insertions(+), 50 deletions(-) diff --git a/test/admin/e2e.spec.ts b/test/admin/e2e.spec.ts index bbf156c32e..ec233e4756 100644 --- a/test/admin/e2e.spec.ts +++ b/test/admin/e2e.spec.ts @@ -429,7 +429,10 @@ describe('admin', () => { test('collection — should render `id` as `useAsTitle` fallback', async () => { const { id } = await createPost() - await page.goto(postsUrl.edit(id)) + const postURL = postsUrl.edit(id) + await page.goto(postURL) + await page.waitForURL(postURL) + await wait(500) await page.locator('#field-title')?.fill('') await expect(page.locator('.doc-header__title.render-title:has-text("ID:")')).toBeVisible() await saveDocAndAssert(page) diff --git a/test/fields-relationship/e2e.spec.ts b/test/fields-relationship/e2e.spec.ts index c692bdca8c..7d01c16a8c 100644 --- a/test/fields-relationship/e2e.spec.ts +++ b/test/fields-relationship/e2e.spec.ts @@ -19,6 +19,7 @@ import { ensureAutoLoginAndCompilationIsDone, initPageConsoleErrorCatch, openDocControls, + openDocDrawer, saveDocAndAssert, } from '../helpers.js' import { AdminUrlUtil } from '../helpers/adminUrlUtil.js' @@ -387,20 +388,15 @@ describe('fields - relationship', () => { }) test('should open document drawer from read-only relationships', async () => { - await page.goto(url.edit(docWithExistingRelations.id)) + const editURL = url.edit(docWithExistingRelations.id) + await page.goto(editURL) + await page.waitForURL(editURL) - const field = page.locator('#field-relationshipReadOnly') - - const button = field.locator( - 'button.relationship--single-value__drawer-toggler.doc-drawer__toggler', + await openDocDrawer( + page, + '#field-relationshipReadOnly button.relationship--single-value__drawer-toggler.doc-drawer__toggler', ) - await wait(1000) - - await button.click() - - await wait(1000) - const documentDrawer = page.locator('[id^=doc-drawer_relation-one_1_]') await expect(documentDrawer).toBeVisible() }) diff --git a/test/fields/collections/Relationship/e2e.spec.ts b/test/fields/collections/Relationship/e2e.spec.ts index 2badcdcf72..e85f52baae 100644 --- a/test/fields/collections/Relationship/e2e.spec.ts +++ b/test/fields/collections/Relationship/e2e.spec.ts @@ -12,6 +12,7 @@ import { ensureAutoLoginAndCompilationIsDone, exactText, initPageConsoleErrorCatch, + openDocDrawer, saveDocAndAssert, saveDocHotkeyAndAssert, } from '../../../helpers.js' @@ -70,8 +71,8 @@ describe('relationship', () => { test('should create inline relationship within field with many relations', async () => { await page.goto(url.create) - const button = page.locator('#relationship-add-new .relationship-add-new__add-button') - await button.click() + await openDocDrawer(page, '#relationship-add-new .relationship-add-new__add-button') + await page .locator('#field-relationship .relationship-add-new__relation-button--text-fields') .click() @@ -97,7 +98,7 @@ describe('relationship', () => { await page.goto(url.create) await page.waitForURL(`**/${url.create}`) // Open first modal - await page.locator('#relationToSelf-add-new .relationship-add-new__add-button').click() + await openDocDrawer(page, '#relationToSelf-add-new .relationship-add-new__add-button') // Fill first modal's required relationship field await page.locator('[id^=doc-drawer_relationship-fields_1_] #field-relationship').click() @@ -108,9 +109,10 @@ describe('relationship', () => { .click() // Open second modal - await page - .locator('[id^=doc-drawer_relationship-fields_1_] #relationToSelf-add-new button') - .click() + await openDocDrawer( + page, + '[id^=doc-drawer_relationship-fields_1_] #relationToSelf-add-new button', + ) // Fill second modal's required relationship field await page.locator('[id^=doc-drawer_relationship-fields_2_] #field-relationship').click() @@ -174,6 +176,7 @@ describe('relationship', () => { // TODO: React-Select not loading things sometimes. Fix later test.skip('should display `hasMany` polymorphic relationships', async () => { await page.goto(url.create) + await page.waitForURL(url.create) const field = page.locator('#field-relationHasManyPolymorphic') await field.click() @@ -209,6 +212,7 @@ describe('relationship', () => { test('should populate relationship dynamic default value', async () => { await page.goto(url.create) + await page.waitForURL(url.create) await expect( page.locator('#field-relationWithDynamicDefault .relationship--single-value__text'), ).toContainText('dev@payloadcms.com') @@ -230,7 +234,7 @@ describe('relationship', () => { await page.goto(url.create) await page.waitForURL(`**/${url.create}`) // First fill out the relationship field, as it's required - await page.locator('#relationship-add-new .relationship-add-new__add-button').click() + await openDocDrawer(page, '#relationship-add-new .relationship-add-new__add-button') await page .locator('#field-relationship .relationship-add-new__relation-button--text-fields') .click() @@ -245,7 +249,7 @@ describe('relationship', () => { // Create a new doc for the `relationshipHasMany` field await expect.poll(() => page.url(), { timeout: POLL_TOPASS_TIMEOUT }).not.toContain('create') - await page.locator('#field-relationshipHasMany .relationship-add-new__add-button').click() + await openDocDrawer(page, '#field-relationshipHasMany .relationship-add-new__add-button') const value = 'Hello, world!' await page.locator('.drawer__content #field-text').fill(value) @@ -293,7 +297,8 @@ describe('relationship', () => { // opened through the edit button can be saved using the hotkey. test('should save using hotkey in edit document drawer', async () => { await page.goto(url.create) - await wait(500) + // First fill out the relationship field, as it's required + await openDocDrawer(page, '#relationship-add-new .relationship-add-new__add-button') await page.locator('#field-relationship .value-container').click() await wait(500) // Select "Seeded text document" relationship @@ -334,7 +339,7 @@ describe('relationship', () => { test.skip('should bypass min rows validation when no rows present and field is not required', async () => { await page.goto(url.create) // First fill out the relationship field, as it's required - await page.locator('#relationship-add-new .relationship-add-new__add-button').click() + await openDocDrawer(page, '#relationship-add-new .relationship-add-new__add-button') await page.locator('#field-relationship .value-container').click() await page.getByText('Seeded text document', { exact: true }).click() @@ -344,8 +349,9 @@ describe('relationship', () => { test('should fail min rows validation when rows are present', async () => { await page.goto(url.create) + await page.waitForURL(url.create) // First fill out the relationship field, as it's required - await page.locator('#relationship-add-new .relationship-add-new__add-button').click() + await openDocDrawer(page, '#relationship-add-new .relationship-add-new__add-button') await page.locator('#field-relationship .value-container').click() await page.getByText('Seeded text document', { exact: true }).click() @@ -366,26 +372,28 @@ describe('relationship', () => { test('should sort relationship options by sortOptions property (ID in ascending order)', async () => { await page.goto(url.create) + await page.waitForURL(url.create) const field = page.locator('#field-relationship') await field.click() - const firstOption = page.locator('.rs__option').first() - await expect(firstOption).toBeVisible() - const firstOptionText = await firstOption.textContent() - expect(firstOptionText.trim()).toBe('Another text document') + const textDocsGroup = page.locator('.rs__group-heading:has-text("Text Fields")') + const firstTextDocOption = textDocsGroup.locator('+div .rs__option').first() + const firstOptionLabel = await firstTextDocOption.textContent() + expect(firstOptionLabel.trim()).toBe('Another text document') }) test('should sort relationHasManyPolymorphic options by sortOptions property: text-fields collection (items in descending order)', async () => { await page.goto(url.create) + await page.waitForURL(url.create) const field = page.locator('#field-relationHasManyPolymorphic') await field.click() - const firstOption = page.locator('.rs__option').first() - await expect(firstOption).toBeVisible() - const firstOptionText = await firstOption.textContent() - expect(firstOptionText.trim()).toBe('Seeded text document') + const textDocsGroup = page.locator('.rs__group-heading:has-text("Text Fields")') + const firstTextDocOption = textDocsGroup.locator('+div .rs__option').first() + const firstOptionLabel = await firstTextDocOption.textContent() + expect(firstOptionLabel).toBe('Seeded text document') }) test('should allow filtering by relationship field / equals', async () => { @@ -393,6 +401,7 @@ describe('relationship', () => { await createRelationshipFieldDoc({ value: textDoc.id, relationTo: 'text-fields' }) await page.goto(url.list) + await page.waitForURL(url.list) await page.locator('.list-controls__toggle-columns').click() await page.locator('.list-controls__toggle-where').click() diff --git a/test/fields/e2e.spec.ts b/test/fields/e2e.spec.ts index 014eea03e1..8f28702710 100644 --- a/test/fields/e2e.spec.ts +++ b/test/fields/e2e.spec.ts @@ -685,10 +685,7 @@ describe('fields', () => { // enter date in default date field await dateField.fill('02/07/2023') - await page.locator('#action-save').click() - - // wait for navigation to update route - await expect.poll(() => page.url(), { timeout: 1000 }).not.toContain('create') + await saveDocAndAssert(page) // get the ID of the doc const routeSegments = page.url().split('/') diff --git a/test/helpers.ts b/test/helpers.ts index 1e2a1bc1cd..8211346fd9 100644 --- a/test/helpers.ts +++ b/test/helpers.ts @@ -131,8 +131,9 @@ export async function openNav(page: Page): Promise { } export async function openDocDrawer(page: Page, selector: string): Promise { - await page.locator(selector).click() - await wait(1000) // wait for drawer form state to initialize + await wait(300) // wait for parent form state to initialize + await page.locator(selector).click({ delay: 100 }) + await wait(500) // wait for drawer form state to initializ } export async function closeNav(page: Page): Promise { diff --git a/test/helpers/sdk/endpoint.ts b/test/helpers/sdk/endpoint.ts index 5974dc42f8..2dd5210edb 100644 --- a/test/helpers/sdk/endpoint.ts +++ b/test/helpers/sdk/endpoint.ts @@ -3,11 +3,11 @@ import type { Endpoint, PayloadHandler } from 'payload/config' import httpStatus from 'http-status' export const handler: PayloadHandler = async ({ payload, data, user }) => { - const method = String(data.method) + const operation = String(data.operation) - if (typeof payload[method] === 'function') { + if (typeof payload[operation] === 'function') { try { - const result = await payload[method]({ + const result = await payload[operation]({ ...(typeof data.args === 'object' ? data.args : {}), user, }) diff --git a/test/helpers/sdk/index.ts b/test/helpers/sdk/index.ts index 041481e3e9..c89c13e889 100644 --- a/test/helpers/sdk/index.ts +++ b/test/helpers/sdk/index.ts @@ -8,6 +8,7 @@ import type { FindArgs, GeneratedTypes, UpdateArgs, + UpdateGlobalArgs, } from './types.js' type Args = { @@ -15,7 +16,7 @@ type Args = { } export class PayloadTestSDK> { - private fetch = async ({ jwt, reduceJSON, args, method }: FetchOptions): Promise => { + private fetch = async ({ jwt, reduceJSON, args, operation }: FetchOptions): Promise => { const headers: HeadersInit = { 'Content-Type': 'application/json', } @@ -27,7 +28,7 @@ export class PayloadTestSDK res.json()) @@ -41,7 +42,7 @@ export class PayloadTestSDK) => { return this.fetch({ - method: 'create', + operation: 'create', args, jwt, }) @@ -52,7 +53,7 @@ export class PayloadTestSDK) => { return this.fetch>({ - method: 'delete', + operation: 'delete', args, jwt, }) @@ -63,7 +64,7 @@ export class PayloadTestSDK) => { return this.fetch>({ - method: 'find', + operation: 'find', args, jwt, }) @@ -71,7 +72,7 @@ export class PayloadTestSDK => { return this.fetch({ - method: 'sendEmail', + operation: 'sendEmail', args, jwt, }) @@ -84,7 +85,18 @@ export class PayloadTestSDK) => { return this.fetch({ - method: 'update', + operation: 'update', + args, + jwt, + }) + } + + updateGlobal = async ({ + jwt, + ...args + }: UpdateGlobalArgs) => { + return this.fetch({ + operation: 'updateGlobal', args, jwt, }) diff --git a/test/helpers/sdk/types.ts b/test/helpers/sdk/types.ts index f7317b5f30..f107a5a623 100644 --- a/test/helpers/sdk/types.ts +++ b/test/helpers/sdk/types.ts @@ -25,7 +25,7 @@ export type GeneratedTypes = { export type FetchOptions = { args?: Record jwt?: string - method: 'create' | 'delete' | 'find' | 'sendEmail' | 'update' + operation: 'create' | 'delete' | 'find' | 'sendEmail' | 'update' | 'updateGlobal' reduceJSON?: (json: any) => R } @@ -94,6 +94,14 @@ export type UpdateArgs< TSlug extends keyof TGeneratedTypes['collections'], > = UpdateByIDArgs | UpdateManyArgs +export type UpdateGlobalArgs< + TGeneratedTypes extends GeneratedTypes, + TSlug extends keyof TGeneratedTypes['globals'], +> = { + data: DeepPartial + slug: TSlug +} & BaseArgs + export type FindArgs< TGeneratedTypes extends GeneratedTypes, TSlug extends keyof TGeneratedTypes['collections'], diff --git a/test/live-preview/app/live-preview/(pages)/[slug]/page.client.tsx b/test/live-preview/app/live-preview/(pages)/[slug]/page.client.tsx index 3abad9a7be..8bc88906f2 100644 --- a/test/live-preview/app/live-preview/(pages)/[slug]/page.client.tsx +++ b/test/live-preview/app/live-preview/(pages)/[slug]/page.client.tsx @@ -3,7 +3,7 @@ import { useLivePreview } from '@payloadcms/live-preview-react' import React from 'react' -import type { Page as PageType } from '../../../../test/live-preview/payload-types.js' +import type { Page as PageType } from '../../../../payload-types.js' import { PAYLOAD_SERVER_URL } from '../../_api/serverURL.js' import { Blocks } from '../../_components/Blocks/index.js' diff --git a/test/live-preview/app/live-preview/(pages)/[slug]/page.tsx b/test/live-preview/app/live-preview/(pages)/[slug]/page.tsx index 11d1bc8d18..8eee3e2bc1 100644 --- a/test/live-preview/app/live-preview/(pages)/[slug]/page.tsx +++ b/test/live-preview/app/live-preview/(pages)/[slug]/page.tsx @@ -1,7 +1,7 @@ import { notFound } from 'next/navigation.js' import React from 'react' -import type { Page } from '../../../../test/live-preview/payload-types.js' +import type { Page } from '../../../../payload-types.js' import { fetchDoc } from '../../_api/fetchDoc.js' import { fetchDocs } from '../../_api/fetchDocs.js' @@ -28,6 +28,7 @@ export default async function Page({ params: { slug = 'home' } }) { } export async function generateStaticParams() { + process.env.PAYLOAD_DROP_DATABASE = 'false' try { const pages = await fetchDocs('pages') return pages?.map(({ slug }) => slug) diff --git a/test/live-preview/app/live-preview/(pages)/posts/[slug]/page.tsx b/test/live-preview/app/live-preview/(pages)/posts/[slug]/page.tsx index c6476a1304..ea9a68c7b8 100644 --- a/test/live-preview/app/live-preview/(pages)/posts/[slug]/page.tsx +++ b/test/live-preview/app/live-preview/(pages)/posts/[slug]/page.tsx @@ -27,6 +27,7 @@ export default async function Post({ params: { slug = '' } }) { } export async function generateStaticParams() { + process.env.PAYLOAD_DROP_DATABASE = 'false' try { const posts = await fetchDocs('posts') return posts?.map(({ slug }) => slug) diff --git a/test/uploads/e2e.spec.ts b/test/uploads/e2e.spec.ts index 00ffd7ba05..2e937195d4 100644 --- a/test/uploads/e2e.spec.ts +++ b/test/uploads/e2e.spec.ts @@ -214,6 +214,7 @@ describe('uploads', () => { await page.waitForURL(audioURL.edit(audioDoc.id)) // remove the selection and open the list drawer + await wait(500) // flake workaround await page.locator('.file-details__remove').click() await openDocDrawer(page, '.upload__toggler.list-drawer__toggler') From 17298695b16409f1258667551e00ce72d6774dc6 Mon Sep 17 00:00:00 2001 From: Paul Popus Date: Thu, 11 Apr 2024 14:01:22 -0300 Subject: [PATCH 093/177] fix: provide request to the previewFunction and fix type --- packages/next/src/routes/rest/collections/preview.ts | 6 +++++- packages/payload/src/config/types.ts | 3 ++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/next/src/routes/rest/collections/preview.ts b/packages/next/src/routes/rest/collections/preview.ts index a54e9e9242..d2d3a9190d 100644 --- a/packages/next/src/routes/rest/collections/preview.ts +++ b/packages/next/src/routes/rest/collections/preview.ts @@ -1,4 +1,5 @@ import httpStatus from 'http-status' +import { extractJWT } from 'payload/auth' import { findByIDOperation } from 'payload/operations' import { isNumber } from 'payload/utilities' @@ -24,11 +25,14 @@ export const preview: CollectionRouteHandlerWithID = async ({ id, collection, re (config) => config.slug === collection.config.slug, )?.admin?.preview + const token = extractJWT(req) + if (typeof generatePreviewURL === 'function') { try { previewURL = await generatePreviewURL(result, { locale: req.locale, - token: req.user?.token, + req, + token, }) } catch (err) { routeError({ diff --git a/packages/payload/src/config/types.ts b/packages/payload/src/config/types.ts index 7dbc69c052..1ae8c37da4 100644 --- a/packages/payload/src/config/types.ts +++ b/packages/payload/src/config/types.ts @@ -76,7 +76,8 @@ export type ServerOnlyLivePreviewProperties = keyof Pick Date: Thu, 11 Apr 2024 14:12:03 -0300 Subject: [PATCH 094/177] update further types --- packages/next/src/routes/rest/globals/preview.ts | 6 +++++- packages/payload/src/globals/config/types.ts | 2 +- packages/payload/src/utilities/isEntityHidden.ts | 4 ++-- packages/ui/src/elements/HydrateClientUser/index.tsx | 11 ++++++----- 4 files changed, 14 insertions(+), 9 deletions(-) diff --git a/packages/next/src/routes/rest/globals/preview.ts b/packages/next/src/routes/rest/globals/preview.ts index 5e0662ccd8..5a174f3bc5 100644 --- a/packages/next/src/routes/rest/globals/preview.ts +++ b/packages/next/src/routes/rest/globals/preview.ts @@ -1,4 +1,5 @@ import httpStatus from 'http-status' +import { extractJWT } from 'payload/auth' import { findOneOperation } from 'payload/operations' import { isNumber } from 'payload/utilities' @@ -24,11 +25,14 @@ export const preview: GlobalRouteHandler = async ({ globalConfig, req }) => { (config) => config.slug === globalConfig.slug, )?.admin?.preview + const token = extractJWT(req) + if (typeof generatePreviewURL === 'function') { try { previewURL = await generatePreviewURL(result, { locale: req.locale, - token: req.user?.token, + req, + token, }) } catch (err) { routeError({ diff --git a/packages/payload/src/globals/config/types.ts b/packages/payload/src/globals/config/types.ts index 3587c27c43..7466cf53cb 100644 --- a/packages/payload/src/globals/config/types.ts +++ b/packages/payload/src/globals/config/types.ts @@ -117,7 +117,7 @@ export type GlobalAdminOptions = { /** * Exclude the global from the admin nav and routes */ - hidden?: ((args: { user: User }) => boolean) | boolean + hidden?: ((args: { user: PayloadRequest['user'] }) => boolean) | boolean /** * Hide the API URL within the Edit view */ diff --git a/packages/payload/src/utilities/isEntityHidden.ts b/packages/payload/src/utilities/isEntityHidden.ts index 1a0d636aaf..0406674794 100644 --- a/packages/payload/src/utilities/isEntityHidden.ts +++ b/packages/payload/src/utilities/isEntityHidden.ts @@ -1,4 +1,4 @@ -import type { User } from 'payload/auth' +import type { PayloadRequest } from 'payload/types' import type { SanitizedCollectionConfig } from '../collections/config/types.js' import type { SanitizedGlobalConfig } from '../globals/config/types.js' @@ -8,7 +8,7 @@ export const isEntityHidden = ({ user, }: { hidden: SanitizedCollectionConfig['admin']['hidden'] | SanitizedGlobalConfig['admin']['hidden'] - user: User + user: PayloadRequest['user'] }) => { return typeof hidden === 'function' ? hidden({ user }) : hidden === true } diff --git a/packages/ui/src/elements/HydrateClientUser/index.tsx b/packages/ui/src/elements/HydrateClientUser/index.tsx index f483d38d53..dc58b561d7 100644 --- a/packages/ui/src/elements/HydrateClientUser/index.tsx +++ b/packages/ui/src/elements/HydrateClientUser/index.tsx @@ -1,15 +1,16 @@ 'use client' -import type { Permissions, User } from 'payload/auth' +import type { Permissions } from 'payload/auth' +import type { PayloadRequest } from 'payload/types' import { useEffect } from 'react' import { useAuth } from '../../providers/Auth/index.js' -export const HydrateClientUser: React.FC<{ permissions: Permissions; user: User }> = ({ - permissions, - user, -}) => { +export const HydrateClientUser: React.FC<{ + permissions: Permissions + user: PayloadRequest['user'] +}> = ({ permissions, user }) => { const { setPermissions, setUser } = useAuth() useEffect(() => { From 330e4a772458130d4080f0fcd20837a4a99076a5 Mon Sep 17 00:00:00 2001 From: Jacob Fletcher Date: Thu, 11 Apr 2024 13:42:21 -0400 Subject: [PATCH 095/177] fix(next): safely handles missing json body in post requests --- packages/next/src/utilities/getDataAndFile.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/next/src/utilities/getDataAndFile.ts b/packages/next/src/utilities/getDataAndFile.ts index 181cd7e990..de4699c4eb 100644 --- a/packages/next/src/utilities/getDataAndFile.ts +++ b/packages/next/src/utilities/getDataAndFile.ts @@ -18,7 +18,11 @@ export const getDataAndFile: GetDataAndFile = async ({ collection, config, reque const [contentType] = (request.headers.get('Content-Type') || '').split(';') if (contentType === 'application/json') { - data = await request.json() + try { + data = await request.json() + } catch (error) { + data = {} + } } else if (contentType === 'multipart/form-data') { // possible upload request if (collection?.config?.upload) { From 216934145ce5e142faa8f50e6ab44ddb60dca50e Mon Sep 17 00:00:00 2001 From: Elliot DeNolf Date: Thu, 11 Apr 2024 13:52:35 -0400 Subject: [PATCH 096/177] fix: default baseUrl in loader if not set (#5798) --- packages/payload/src/bin/loader/index.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/payload/src/bin/loader/index.ts b/packages/payload/src/bin/loader/index.ts index 9379d8ab04..d447588146 100644 --- a/packages/payload/src/bin/loader/index.ts +++ b/packages/payload/src/bin/loader/index.ts @@ -26,6 +26,11 @@ type ResolveFn = (...args: Required) => Promise const locatedConfig = getTsconfig() const tsconfig = locatedConfig.config.compilerOptions as unknown as ts.CompilerOptions +// Ensure baseUrl is set in order to support paths +if (!tsconfig.baseUrl) { + tsconfig.baseUrl = '.' +} + // Don't resolve d.ts files, because we aren't type-checking tsconfig.noDtsResolution = true tsconfig.module = ts.ModuleKind.ESNext From 1119cf3af948fe32a9ba44fe4f1a5c78425640b0 Mon Sep 17 00:00:00 2001 From: Elliot DeNolf Date: Thu, 11 Apr 2024 14:02:17 -0400 Subject: [PATCH 097/177] chore(release): v3.0.0-beta.4 [skip ci] --- package.json | 2 +- packages/create-payload-app/package.json | 2 +- packages/db-mongodb/package.json | 2 +- packages/db-postgres/package.json | 2 +- packages/graphql/package.json | 2 +- packages/next/package.json | 2 +- packages/payload/package.json | 2 +- packages/plugin-cloud-storage/package.json | 2 +- packages/plugin-cloud/package.json | 2 +- packages/plugin-form-builder/package.json | 2 +- packages/plugin-nested-docs/package.json | 2 +- packages/plugin-redirects/package.json | 2 +- packages/plugin-search/package.json | 2 +- packages/plugin-seo/package.json | 2 +- packages/richtext-lexical/package.json | 2 +- packages/richtext-slate/package.json | 2 +- packages/translations/package.json | 2 +- packages/ui/package.json | 2 +- 18 files changed, 18 insertions(+), 18 deletions(-) diff --git a/package.json b/package.json index e16085626c..57debe39be 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "payload-monorepo", - "version": "3.0.0-beta.3", + "version": "3.0.0-beta.4", "private": true, "type": "module", "workspaces:": [ diff --git a/packages/create-payload-app/package.json b/packages/create-payload-app/package.json index 70bfd31869..d43c6f04c3 100644 --- a/packages/create-payload-app/package.json +++ b/packages/create-payload-app/package.json @@ -1,6 +1,6 @@ { "name": "create-payload-app", - "version": "3.0.0-beta.3", + "version": "3.0.0-beta.4", "license": "MIT", "type": "module", "homepage": "https://payloadcms.com", diff --git a/packages/db-mongodb/package.json b/packages/db-mongodb/package.json index 1fa88b9a88..c68e61eeef 100644 --- a/packages/db-mongodb/package.json +++ b/packages/db-mongodb/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/db-mongodb", - "version": "3.0.0-beta.3", + "version": "3.0.0-beta.4", "description": "The officially supported MongoDB database adapter for Payload", "repository": { "type": "git", diff --git a/packages/db-postgres/package.json b/packages/db-postgres/package.json index a52d15eec8..b90cd9697c 100644 --- a/packages/db-postgres/package.json +++ b/packages/db-postgres/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/db-postgres", - "version": "3.0.0-beta.3", + "version": "3.0.0-beta.4", "description": "The officially supported Postgres database adapter for Payload", "repository": { "type": "git", diff --git a/packages/graphql/package.json b/packages/graphql/package.json index aacc724aab..cd221a18e7 100644 --- a/packages/graphql/package.json +++ b/packages/graphql/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/graphql", - "version": "3.0.0-beta.3", + "version": "3.0.0-beta.4", "main": "./src/index.ts", "types": "./src/index.d.ts", "type": "module", diff --git a/packages/next/package.json b/packages/next/package.json index d928541994..e8f6bd1421 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/next", - "version": "3.0.0-beta.3", + "version": "3.0.0-beta.4", "main": "./src/index.js", "types": "./src/index.js", "type": "module", diff --git a/packages/payload/package.json b/packages/payload/package.json index be111fa6da..28bea19ec9 100644 --- a/packages/payload/package.json +++ b/packages/payload/package.json @@ -1,6 +1,6 @@ { "name": "payload", - "version": "3.0.0-beta.3", + "version": "3.0.0-beta.4", "description": "Node, React and MongoDB Headless CMS and Application Framework", "license": "MIT", "main": "./src/index.ts", diff --git a/packages/plugin-cloud-storage/package.json b/packages/plugin-cloud-storage/package.json index f20b51289e..5f391a20fb 100644 --- a/packages/plugin-cloud-storage/package.json +++ b/packages/plugin-cloud-storage/package.json @@ -1,7 +1,7 @@ { "name": "@payloadcms/plugin-cloud-storage", "description": "The official cloud storage plugin for Payload CMS", - "version": "3.0.0-beta.3", + "version": "3.0.0-beta.4", "main": "./src/index.ts", "types": "./src/index.ts", "type": "module", diff --git a/packages/plugin-cloud/package.json b/packages/plugin-cloud/package.json index f39d043f5c..8138655cfd 100644 --- a/packages/plugin-cloud/package.json +++ b/packages/plugin-cloud/package.json @@ -1,7 +1,7 @@ { "name": "@payloadcms/plugin-cloud", "description": "The official Payload Cloud plugin", - "version": "3.0.0-beta.3", + "version": "3.0.0-beta.4", "main": "./src/index.ts", "types": "./src/index.ts", "license": "MIT", diff --git a/packages/plugin-form-builder/package.json b/packages/plugin-form-builder/package.json index 6b78bc7a23..3182f7a04e 100644 --- a/packages/plugin-form-builder/package.json +++ b/packages/plugin-form-builder/package.json @@ -1,7 +1,7 @@ { "name": "@payloadcms/plugin-form-builder", "description": "Form builder plugin for Payload CMS", - "version": "3.0.0-beta.3", + "version": "3.0.0-beta.4", "homepage:": "https://payloadcms.com", "repository": { "type": "git", diff --git a/packages/plugin-nested-docs/package.json b/packages/plugin-nested-docs/package.json index 4267311d33..de0f3a2485 100644 --- a/packages/plugin-nested-docs/package.json +++ b/packages/plugin-nested-docs/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-nested-docs", - "version": "3.0.0-beta.3", + "version": "3.0.0-beta.4", "description": "The official Nested Docs plugin for Payload", "repository": { "type": "git", diff --git a/packages/plugin-redirects/package.json b/packages/plugin-redirects/package.json index 89f98ce5ba..bb4abd045e 100644 --- a/packages/plugin-redirects/package.json +++ b/packages/plugin-redirects/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-redirects", - "version": "3.0.0-beta.3", + "version": "3.0.0-beta.4", "homepage:": "https://payloadcms.com", "repository": { "type": "git", diff --git a/packages/plugin-search/package.json b/packages/plugin-search/package.json index 00ef5e5f21..764faef81c 100644 --- a/packages/plugin-search/package.json +++ b/packages/plugin-search/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-search", - "version": "3.0.0-beta.3", + "version": "3.0.0-beta.4", "homepage:": "https://payloadcms.com", "repository": { "type": "git", diff --git a/packages/plugin-seo/package.json b/packages/plugin-seo/package.json index 79550865fb..3742a93252 100644 --- a/packages/plugin-seo/package.json +++ b/packages/plugin-seo/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-seo", - "version": "3.0.0-beta.3", + "version": "3.0.0-beta.4", "homepage:": "https://payloadcms.com", "repository": { "type": "git", diff --git a/packages/richtext-lexical/package.json b/packages/richtext-lexical/package.json index 76a829782c..6504db2e27 100644 --- a/packages/richtext-lexical/package.json +++ b/packages/richtext-lexical/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/richtext-lexical", - "version": "3.0.0-beta.3", + "version": "3.0.0-beta.4", "description": "The officially supported Lexical richtext adapter for Payload", "repository": { "type": "git", diff --git a/packages/richtext-slate/package.json b/packages/richtext-slate/package.json index 9a44d77b82..7b6d5e3518 100644 --- a/packages/richtext-slate/package.json +++ b/packages/richtext-slate/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/richtext-slate", - "version": "3.0.0-beta.3", + "version": "3.0.0-beta.4", "description": "The officially supported Slate richtext adapter for Payload", "repository": { "type": "git", diff --git a/packages/translations/package.json b/packages/translations/package.json index b4275e5221..f04d1cb81c 100644 --- a/packages/translations/package.json +++ b/packages/translations/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/translations", - "version": "3.0.0-beta.3", + "version": "3.0.0-beta.4", "main": "./src/exports/index.ts", "types": "./src/types.ts", "type": "module", diff --git a/packages/ui/package.json b/packages/ui/package.json index cd655d9069..bbe13bfd51 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/ui", - "version": "3.0.0-beta.3", + "version": "3.0.0-beta.4", "type": "module", "homepage": "https://payloadcms.com", "repository": { From bcb538aee2154d3b903f93849bce1ecddc60fdde Mon Sep 17 00:00:00 2001 From: Jacob Fletcher Date: Thu, 11 Apr 2024 14:57:04 -0400 Subject: [PATCH 098/177] fix(next): awaits logout operation in api route handler --- packages/next/src/routes/rest/auth/logout.ts | 2 +- packages/next/src/routes/rest/routeError.ts | 2 +- tsconfig.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/next/src/routes/rest/auth/logout.ts b/packages/next/src/routes/rest/auth/logout.ts index e68589a340..0f9168daf8 100644 --- a/packages/next/src/routes/rest/auth/logout.ts +++ b/packages/next/src/routes/rest/auth/logout.ts @@ -5,7 +5,7 @@ import { logoutOperation } from 'payload/operations' import type { CollectionRouteHandler } from '../types.js' export const logout: CollectionRouteHandler = async ({ collection, req }) => { - const result = logoutOperation({ + const result = await logoutOperation({ collection, req, }) diff --git a/packages/next/src/routes/rest/routeError.ts b/packages/next/src/routes/rest/routeError.ts index 9ab56800ce..acaf94f6da 100644 --- a/packages/next/src/routes/rest/routeError.ts +++ b/packages/next/src/routes/rest/routeError.ts @@ -1,7 +1,7 @@ import type { Collection, PayloadRequest } from 'payload/types' import httpStatus from 'http-status' -import { APIError, ValidationError } from 'payload/errors' +import { APIError } from 'payload/errors' export type ErrorResponse = { data?: any; errors: unknown[]; stack?: string } diff --git a/tsconfig.json b/tsconfig.json index d55001935b..f09927d183 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -161,4 +161,4 @@ ".next/types/**/*.ts", "scripts/**/*.ts" ] -} +} \ No newline at end of file From 1393c722815a115b49ba4dfce6727acacbd55903 Mon Sep 17 00:00:00 2001 From: Elliot DeNolf Date: Thu, 11 Apr 2024 15:06:09 -0400 Subject: [PATCH 099/177] fix: improve config finding --- packages/payload/src/config/find.ts | 42 ++++++++++++++++++++++------- 1 file changed, 33 insertions(+), 9 deletions(-) diff --git a/packages/payload/src/config/find.ts b/packages/payload/src/config/find.ts index 26ab846fb3..2ff9a16f90 100644 --- a/packages/payload/src/config/find.ts +++ b/packages/payload/src/config/find.ts @@ -7,11 +7,18 @@ import path from 'path' * If no tsconfig.json file is found, returns the current working directory. * @returns An object containing the source and output paths. */ -const getTSConfigPaths = (): { outPath: string; srcPath: string } => { +const getTSConfigPaths = (): { + configPath?: string + outPath?: string + rootPath?: string + srcPath?: string +} => { const tsConfigPath = findUp.sync('tsconfig.json') if (!tsConfigPath) { - return { outPath: process.cwd(), srcPath: process.cwd() } + return { + rootPath: process.cwd(), + } } try { @@ -23,13 +30,25 @@ const getTSConfigPaths = (): { outPath: string; srcPath: string } => { const tsConfig = JSON.parse(rawTsConfig) - const srcPath = tsConfig.compilerOptions?.rootDir || process.cwd() - const outPath = tsConfig.compilerOptions?.outDir || process.cwd() - - return { outPath, srcPath } + const rootPath = process.cwd() + const srcPath = tsConfig.compilerOptions?.rootDir || path.resolve(process.cwd(), 'src') + const outPath = tsConfig.compilerOptions?.outDir || path.resolve(process.cwd(), 'dist') + const tsConfigDir = path.dirname(tsConfigPath) + let configPath = tsConfig.compilerOptions?.paths?.['@payload-config']?.[0] + if (configPath) { + configPath = path.resolve(tsConfigDir, configPath) + } + return { + configPath, + outPath, + rootPath, + srcPath, + } } catch (error) { console.error(`Error parsing tsconfig.json: ${error}`) // Do not throw the error, as we can still continue with the other config path finding methods - return { outPath: process.cwd(), srcPath: process.cwd() } + return { + rootPath: process.cwd(), + } } } @@ -49,12 +68,17 @@ export const findConfig = (): string => { return path.resolve(process.cwd(), process.env.PAYLOAD_CONFIG_PATH) } - const { outPath, srcPath } = getTSConfigPaths() + const { configPath, outPath, rootPath, srcPath } = getTSConfigPaths() - const searchPaths = process.env.NODE_ENV === 'production' ? [outPath, srcPath] : [srcPath] + const searchPaths = + process.env.NODE_ENV === 'production' + ? [configPath, outPath, srcPath, rootPath] + : [configPath, srcPath, rootPath] // eslint-disable-next-line no-restricted-syntax for (const searchPath of searchPaths) { + if (!searchPath) continue + const configPath = findUp.sync( (dir) => { const tsPath = path.join(dir, 'payload.config.ts') From 9b86de1f9d6ca4a3b5c12e4833999ae60c5d6931 Mon Sep 17 00:00:00 2001 From: Elliot DeNolf Date: Thu, 11 Apr 2024 15:06:27 -0400 Subject: [PATCH 100/177] fix(ui): scss paths --- packages/ui/package.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/ui/package.json b/packages/ui/package.json index bbe13bfd51..7af9b25650 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -82,9 +82,9 @@ "types": "./src/utilities/*.ts" }, "./scss": { - "import": "./src/scss.scss", - "require": "./src/scss.scss", - "default": "./src/scss.scss" + "import": "./src/styles.scss", + "require": "./src/styles.scss", + "default": "./src/styles.scss" }, "./scss/app.scss": "./src/scss/app.scss" }, @@ -163,9 +163,9 @@ "default": "./dist/prod/styles.css" }, "./scss": { - "import": "./dist/scss.scss", - "require": "./dist/scss.scss", - "default": "./dist/scss.scss" + "import": "./dist/styles.scss", + "require": "./dist/styles.scss", + "default": "./dist/styles.scss" }, "./scss/app.scss": "./dist/scss/app.scss" } From 20ac2b86cf4799c04f19ba303ced09733458f732 Mon Sep 17 00:00:00 2001 From: Elliot DeNolf Date: Thu, 11 Apr 2024 15:11:14 -0400 Subject: [PATCH 101/177] chore(release): v3.0.0-beta.5 [skip ci] --- package.json | 2 +- packages/create-payload-app/package.json | 2 +- packages/db-mongodb/package.json | 2 +- packages/db-postgres/package.json | 2 +- packages/graphql/package.json | 2 +- packages/next/package.json | 2 +- packages/payload/package.json | 2 +- packages/plugin-cloud-storage/package.json | 2 +- packages/plugin-cloud/package.json | 2 +- packages/plugin-form-builder/package.json | 2 +- packages/plugin-nested-docs/package.json | 2 +- packages/plugin-redirects/package.json | 2 +- packages/plugin-search/package.json | 2 +- packages/plugin-seo/package.json | 2 +- packages/richtext-lexical/package.json | 2 +- packages/richtext-slate/package.json | 2 +- packages/translations/package.json | 2 +- packages/ui/package.json | 2 +- 18 files changed, 18 insertions(+), 18 deletions(-) diff --git a/package.json b/package.json index 57debe39be..da11ba0b55 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "payload-monorepo", - "version": "3.0.0-beta.4", + "version": "3.0.0-beta.5", "private": true, "type": "module", "workspaces:": [ diff --git a/packages/create-payload-app/package.json b/packages/create-payload-app/package.json index d43c6f04c3..844dbb3bf8 100644 --- a/packages/create-payload-app/package.json +++ b/packages/create-payload-app/package.json @@ -1,6 +1,6 @@ { "name": "create-payload-app", - "version": "3.0.0-beta.4", + "version": "3.0.0-beta.5", "license": "MIT", "type": "module", "homepage": "https://payloadcms.com", diff --git a/packages/db-mongodb/package.json b/packages/db-mongodb/package.json index c68e61eeef..f32b7bebd7 100644 --- a/packages/db-mongodb/package.json +++ b/packages/db-mongodb/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/db-mongodb", - "version": "3.0.0-beta.4", + "version": "3.0.0-beta.5", "description": "The officially supported MongoDB database adapter for Payload", "repository": { "type": "git", diff --git a/packages/db-postgres/package.json b/packages/db-postgres/package.json index b90cd9697c..7134ad1838 100644 --- a/packages/db-postgres/package.json +++ b/packages/db-postgres/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/db-postgres", - "version": "3.0.0-beta.4", + "version": "3.0.0-beta.5", "description": "The officially supported Postgres database adapter for Payload", "repository": { "type": "git", diff --git a/packages/graphql/package.json b/packages/graphql/package.json index cd221a18e7..dfab2c86bf 100644 --- a/packages/graphql/package.json +++ b/packages/graphql/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/graphql", - "version": "3.0.0-beta.4", + "version": "3.0.0-beta.5", "main": "./src/index.ts", "types": "./src/index.d.ts", "type": "module", diff --git a/packages/next/package.json b/packages/next/package.json index e8f6bd1421..0d6f0e8b10 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/next", - "version": "3.0.0-beta.4", + "version": "3.0.0-beta.5", "main": "./src/index.js", "types": "./src/index.js", "type": "module", diff --git a/packages/payload/package.json b/packages/payload/package.json index 28bea19ec9..9146b130ef 100644 --- a/packages/payload/package.json +++ b/packages/payload/package.json @@ -1,6 +1,6 @@ { "name": "payload", - "version": "3.0.0-beta.4", + "version": "3.0.0-beta.5", "description": "Node, React and MongoDB Headless CMS and Application Framework", "license": "MIT", "main": "./src/index.ts", diff --git a/packages/plugin-cloud-storage/package.json b/packages/plugin-cloud-storage/package.json index 5f391a20fb..f5dd6f50b8 100644 --- a/packages/plugin-cloud-storage/package.json +++ b/packages/plugin-cloud-storage/package.json @@ -1,7 +1,7 @@ { "name": "@payloadcms/plugin-cloud-storage", "description": "The official cloud storage plugin for Payload CMS", - "version": "3.0.0-beta.4", + "version": "3.0.0-beta.5", "main": "./src/index.ts", "types": "./src/index.ts", "type": "module", diff --git a/packages/plugin-cloud/package.json b/packages/plugin-cloud/package.json index 8138655cfd..4b9a5b3c3e 100644 --- a/packages/plugin-cloud/package.json +++ b/packages/plugin-cloud/package.json @@ -1,7 +1,7 @@ { "name": "@payloadcms/plugin-cloud", "description": "The official Payload Cloud plugin", - "version": "3.0.0-beta.4", + "version": "3.0.0-beta.5", "main": "./src/index.ts", "types": "./src/index.ts", "license": "MIT", diff --git a/packages/plugin-form-builder/package.json b/packages/plugin-form-builder/package.json index 3182f7a04e..9843df2f8b 100644 --- a/packages/plugin-form-builder/package.json +++ b/packages/plugin-form-builder/package.json @@ -1,7 +1,7 @@ { "name": "@payloadcms/plugin-form-builder", "description": "Form builder plugin for Payload CMS", - "version": "3.0.0-beta.4", + "version": "3.0.0-beta.5", "homepage:": "https://payloadcms.com", "repository": { "type": "git", diff --git a/packages/plugin-nested-docs/package.json b/packages/plugin-nested-docs/package.json index de0f3a2485..5ae4714ac0 100644 --- a/packages/plugin-nested-docs/package.json +++ b/packages/plugin-nested-docs/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-nested-docs", - "version": "3.0.0-beta.4", + "version": "3.0.0-beta.5", "description": "The official Nested Docs plugin for Payload", "repository": { "type": "git", diff --git a/packages/plugin-redirects/package.json b/packages/plugin-redirects/package.json index bb4abd045e..bed532e2f1 100644 --- a/packages/plugin-redirects/package.json +++ b/packages/plugin-redirects/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-redirects", - "version": "3.0.0-beta.4", + "version": "3.0.0-beta.5", "homepage:": "https://payloadcms.com", "repository": { "type": "git", diff --git a/packages/plugin-search/package.json b/packages/plugin-search/package.json index 764faef81c..0b0a30493f 100644 --- a/packages/plugin-search/package.json +++ b/packages/plugin-search/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-search", - "version": "3.0.0-beta.4", + "version": "3.0.0-beta.5", "homepage:": "https://payloadcms.com", "repository": { "type": "git", diff --git a/packages/plugin-seo/package.json b/packages/plugin-seo/package.json index 3742a93252..76e4d11105 100644 --- a/packages/plugin-seo/package.json +++ b/packages/plugin-seo/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-seo", - "version": "3.0.0-beta.4", + "version": "3.0.0-beta.5", "homepage:": "https://payloadcms.com", "repository": { "type": "git", diff --git a/packages/richtext-lexical/package.json b/packages/richtext-lexical/package.json index 6504db2e27..4ab01788e9 100644 --- a/packages/richtext-lexical/package.json +++ b/packages/richtext-lexical/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/richtext-lexical", - "version": "3.0.0-beta.4", + "version": "3.0.0-beta.5", "description": "The officially supported Lexical richtext adapter for Payload", "repository": { "type": "git", diff --git a/packages/richtext-slate/package.json b/packages/richtext-slate/package.json index 7b6d5e3518..99795269b4 100644 --- a/packages/richtext-slate/package.json +++ b/packages/richtext-slate/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/richtext-slate", - "version": "3.0.0-beta.4", + "version": "3.0.0-beta.5", "description": "The officially supported Slate richtext adapter for Payload", "repository": { "type": "git", diff --git a/packages/translations/package.json b/packages/translations/package.json index f04d1cb81c..273ea8f365 100644 --- a/packages/translations/package.json +++ b/packages/translations/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/translations", - "version": "3.0.0-beta.4", + "version": "3.0.0-beta.5", "main": "./src/exports/index.ts", "types": "./src/types.ts", "type": "module", diff --git a/packages/ui/package.json b/packages/ui/package.json index 7af9b25650..41926adb2b 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/ui", - "version": "3.0.0-beta.4", + "version": "3.0.0-beta.5", "type": "module", "homepage": "https://payloadcms.com", "repository": { From 6d41f6c56d486684e7decefa8f81b4f62ef4885d Mon Sep 17 00:00:00 2001 From: Elliot DeNolf Date: Thu, 11 Apr 2024 15:17:33 -0400 Subject: [PATCH 102/177] fix(ui): actual scss paths [skip ci] --- packages/ui/package.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/ui/package.json b/packages/ui/package.json index 41926adb2b..8d877555c8 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -82,9 +82,9 @@ "types": "./src/utilities/*.ts" }, "./scss": { - "import": "./src/styles.scss", - "require": "./src/styles.scss", - "default": "./src/styles.scss" + "import": "./src/scss/styles.scss", + "require": "./src/scss/styles.scss", + "default": "./src/scss/styles.scss" }, "./scss/app.scss": "./src/scss/app.scss" }, @@ -163,9 +163,9 @@ "default": "./dist/prod/styles.css" }, "./scss": { - "import": "./dist/styles.scss", - "require": "./dist/styles.scss", - "default": "./dist/styles.scss" + "import": "./dist/scss/styles.scss", + "require": "./dist/scss/styles.scss", + "default": "./dist/scss/styles.scss" }, "./scss/app.scss": "./dist/scss/app.scss" } From 429c6f7a48903143b27436dd64f738d2905cdad4 Mon Sep 17 00:00:00 2001 From: Elliot DeNolf Date: Thu, 11 Apr 2024 15:20:10 -0400 Subject: [PATCH 103/177] chore(release): v3.0.0-beta.6 [skip ci] --- package.json | 2 +- packages/create-payload-app/package.json | 2 +- packages/db-mongodb/package.json | 2 +- packages/db-postgres/package.json | 2 +- packages/graphql/package.json | 2 +- packages/next/package.json | 2 +- packages/payload/package.json | 2 +- packages/plugin-cloud-storage/package.json | 2 +- packages/plugin-cloud/package.json | 2 +- packages/plugin-form-builder/package.json | 2 +- packages/plugin-nested-docs/package.json | 2 +- packages/plugin-redirects/package.json | 2 +- packages/plugin-search/package.json | 2 +- packages/plugin-seo/package.json | 2 +- packages/richtext-lexical/package.json | 2 +- packages/richtext-slate/package.json | 2 +- packages/translations/package.json | 2 +- packages/ui/package.json | 2 +- 18 files changed, 18 insertions(+), 18 deletions(-) diff --git a/package.json b/package.json index da11ba0b55..d33c6fe3ff 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "payload-monorepo", - "version": "3.0.0-beta.5", + "version": "3.0.0-beta.6", "private": true, "type": "module", "workspaces:": [ diff --git a/packages/create-payload-app/package.json b/packages/create-payload-app/package.json index 844dbb3bf8..c89556a46b 100644 --- a/packages/create-payload-app/package.json +++ b/packages/create-payload-app/package.json @@ -1,6 +1,6 @@ { "name": "create-payload-app", - "version": "3.0.0-beta.5", + "version": "3.0.0-beta.6", "license": "MIT", "type": "module", "homepage": "https://payloadcms.com", diff --git a/packages/db-mongodb/package.json b/packages/db-mongodb/package.json index f32b7bebd7..4c8adeabf6 100644 --- a/packages/db-mongodb/package.json +++ b/packages/db-mongodb/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/db-mongodb", - "version": "3.0.0-beta.5", + "version": "3.0.0-beta.6", "description": "The officially supported MongoDB database adapter for Payload", "repository": { "type": "git", diff --git a/packages/db-postgres/package.json b/packages/db-postgres/package.json index 7134ad1838..ef0bc77fc7 100644 --- a/packages/db-postgres/package.json +++ b/packages/db-postgres/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/db-postgres", - "version": "3.0.0-beta.5", + "version": "3.0.0-beta.6", "description": "The officially supported Postgres database adapter for Payload", "repository": { "type": "git", diff --git a/packages/graphql/package.json b/packages/graphql/package.json index dfab2c86bf..ea62a60a0a 100644 --- a/packages/graphql/package.json +++ b/packages/graphql/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/graphql", - "version": "3.0.0-beta.5", + "version": "3.0.0-beta.6", "main": "./src/index.ts", "types": "./src/index.d.ts", "type": "module", diff --git a/packages/next/package.json b/packages/next/package.json index 0d6f0e8b10..cae7193813 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/next", - "version": "3.0.0-beta.5", + "version": "3.0.0-beta.6", "main": "./src/index.js", "types": "./src/index.js", "type": "module", diff --git a/packages/payload/package.json b/packages/payload/package.json index 9146b130ef..0d41819680 100644 --- a/packages/payload/package.json +++ b/packages/payload/package.json @@ -1,6 +1,6 @@ { "name": "payload", - "version": "3.0.0-beta.5", + "version": "3.0.0-beta.6", "description": "Node, React and MongoDB Headless CMS and Application Framework", "license": "MIT", "main": "./src/index.ts", diff --git a/packages/plugin-cloud-storage/package.json b/packages/plugin-cloud-storage/package.json index f5dd6f50b8..1ff1061faa 100644 --- a/packages/plugin-cloud-storage/package.json +++ b/packages/plugin-cloud-storage/package.json @@ -1,7 +1,7 @@ { "name": "@payloadcms/plugin-cloud-storage", "description": "The official cloud storage plugin for Payload CMS", - "version": "3.0.0-beta.5", + "version": "3.0.0-beta.6", "main": "./src/index.ts", "types": "./src/index.ts", "type": "module", diff --git a/packages/plugin-cloud/package.json b/packages/plugin-cloud/package.json index 4b9a5b3c3e..27a5282f91 100644 --- a/packages/plugin-cloud/package.json +++ b/packages/plugin-cloud/package.json @@ -1,7 +1,7 @@ { "name": "@payloadcms/plugin-cloud", "description": "The official Payload Cloud plugin", - "version": "3.0.0-beta.5", + "version": "3.0.0-beta.6", "main": "./src/index.ts", "types": "./src/index.ts", "license": "MIT", diff --git a/packages/plugin-form-builder/package.json b/packages/plugin-form-builder/package.json index 9843df2f8b..9f591ba807 100644 --- a/packages/plugin-form-builder/package.json +++ b/packages/plugin-form-builder/package.json @@ -1,7 +1,7 @@ { "name": "@payloadcms/plugin-form-builder", "description": "Form builder plugin for Payload CMS", - "version": "3.0.0-beta.5", + "version": "3.0.0-beta.6", "homepage:": "https://payloadcms.com", "repository": { "type": "git", diff --git a/packages/plugin-nested-docs/package.json b/packages/plugin-nested-docs/package.json index 5ae4714ac0..0ffbd899fa 100644 --- a/packages/plugin-nested-docs/package.json +++ b/packages/plugin-nested-docs/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-nested-docs", - "version": "3.0.0-beta.5", + "version": "3.0.0-beta.6", "description": "The official Nested Docs plugin for Payload", "repository": { "type": "git", diff --git a/packages/plugin-redirects/package.json b/packages/plugin-redirects/package.json index bed532e2f1..abab6f4e80 100644 --- a/packages/plugin-redirects/package.json +++ b/packages/plugin-redirects/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-redirects", - "version": "3.0.0-beta.5", + "version": "3.0.0-beta.6", "homepage:": "https://payloadcms.com", "repository": { "type": "git", diff --git a/packages/plugin-search/package.json b/packages/plugin-search/package.json index 0b0a30493f..8266350dd0 100644 --- a/packages/plugin-search/package.json +++ b/packages/plugin-search/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-search", - "version": "3.0.0-beta.5", + "version": "3.0.0-beta.6", "homepage:": "https://payloadcms.com", "repository": { "type": "git", diff --git a/packages/plugin-seo/package.json b/packages/plugin-seo/package.json index 76e4d11105..7229a68094 100644 --- a/packages/plugin-seo/package.json +++ b/packages/plugin-seo/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-seo", - "version": "3.0.0-beta.5", + "version": "3.0.0-beta.6", "homepage:": "https://payloadcms.com", "repository": { "type": "git", diff --git a/packages/richtext-lexical/package.json b/packages/richtext-lexical/package.json index 4ab01788e9..579aeabb6e 100644 --- a/packages/richtext-lexical/package.json +++ b/packages/richtext-lexical/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/richtext-lexical", - "version": "3.0.0-beta.5", + "version": "3.0.0-beta.6", "description": "The officially supported Lexical richtext adapter for Payload", "repository": { "type": "git", diff --git a/packages/richtext-slate/package.json b/packages/richtext-slate/package.json index 99795269b4..e8ba047023 100644 --- a/packages/richtext-slate/package.json +++ b/packages/richtext-slate/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/richtext-slate", - "version": "3.0.0-beta.5", + "version": "3.0.0-beta.6", "description": "The officially supported Slate richtext adapter for Payload", "repository": { "type": "git", diff --git a/packages/translations/package.json b/packages/translations/package.json index 273ea8f365..d3d27d553c 100644 --- a/packages/translations/package.json +++ b/packages/translations/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/translations", - "version": "3.0.0-beta.5", + "version": "3.0.0-beta.6", "main": "./src/exports/index.ts", "types": "./src/types.ts", "type": "module", diff --git a/packages/ui/package.json b/packages/ui/package.json index 8d877555c8..980914afa4 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/ui", - "version": "3.0.0-beta.5", + "version": "3.0.0-beta.6", "type": "module", "homepage": "https://payloadcms.com", "repository": { From 432dfef4355b99e0b0a47662408398ae97e16758 Mon Sep 17 00:00:00 2001 From: Jacob Fletcher Date: Thu, 11 Apr 2024 15:31:19 -0400 Subject: [PATCH 104/177] chore(next): installs merriweather as google font and removes static assets --- packages/next/src/layouts/Root/index.tsx | 12 +++++- packages/next/src/scss/app.scss | 1 - packages/richtext-lexical/src/scss/app.scss | 1 - packages/richtext-slate/src/scss/app.scss | 1 - .../fonts/merriweather-v30-latin-900.woff | Bin 24288 -> 0 bytes .../fonts/merriweather-v30-latin-900.woff2 | Bin 19816 -> 0 bytes .../merriweather-v30-latin-900italic.woff | Bin 24164 -> 0 bytes .../merriweather-v30-latin-900italic.woff2 | Bin 19844 -> 0 bytes .../fonts/merriweather-v30-latin-italic.woff | Bin 24228 -> 0 bytes .../fonts/merriweather-v30-latin-italic.woff2 | Bin 19780 -> 0 bytes .../fonts/merriweather-v30-latin-regular.woff | Bin 24560 -> 0 bytes .../merriweather-v30-latin-regular.woff2 | Bin 20028 -> 0 bytes packages/ui/src/scss/app.scss | 2 - packages/ui/src/scss/fonts.scss | 40 ------------------ tsconfig.json | 2 +- 15 files changed, 12 insertions(+), 47 deletions(-) delete mode 100644 packages/ui/src/assets/fonts/merriweather-v30-latin-900.woff delete mode 100644 packages/ui/src/assets/fonts/merriweather-v30-latin-900.woff2 delete mode 100644 packages/ui/src/assets/fonts/merriweather-v30-latin-900italic.woff delete mode 100644 packages/ui/src/assets/fonts/merriweather-v30-latin-900italic.woff2 delete mode 100644 packages/ui/src/assets/fonts/merriweather-v30-latin-italic.woff delete mode 100644 packages/ui/src/assets/fonts/merriweather-v30-latin-italic.woff2 delete mode 100644 packages/ui/src/assets/fonts/merriweather-v30-latin-regular.woff delete mode 100644 packages/ui/src/assets/fonts/merriweather-v30-latin-regular.woff2 diff --git a/packages/next/src/layouts/Root/index.tsx b/packages/next/src/layouts/Root/index.tsx index d9145cc16c..08b116bcc2 100644 --- a/packages/next/src/layouts/Root/index.tsx +++ b/packages/next/src/layouts/Root/index.tsx @@ -22,6 +22,16 @@ export const metadata = { title: 'Next.js', } +import { Merriweather } from 'next/font/google' + +const merriweather = Merriweather({ + display: 'swap', + style: ['normal', 'italic'], + subsets: ['latin'], + variable: '--font-serif', + weight: ['400', '900'], +}) + export const RootLayout = async ({ children, config: configPromise, @@ -82,7 +92,7 @@ export const RootLayout = async ({ }) return ( - + -3ZQE{dZMV0!t=IosZ>{f}WG6X0`%Gr$OeUE% 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

MuTxJ=>oe+q!rq*PE8Rm74f}D=aX36zTN3%M|<2 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 UDqX3Our-(n3!7~QMZG8k06JyfS^xk5 diff --git a/packages/ui/src/assets/fonts/merriweather-v30-latin-900italic.woff2 b/packages/ui/src/assets/fonts/merriweather-v30-latin-900italic.woff2 deleted file mode 100644 index d7cdeaa4fe51d5d976e089ec54367d64294e0013..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19844 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 diff --git a/packages/ui/src/assets/fonts/merriweather-v30-latin-regular.woff2 b/packages/ui/src/assets/fonts/merriweather-v30-latin-regular.woff2 deleted file mode 100644 index 6515c26fd0f5552c2330971c45135442baaaaf31..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20028 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

D-E)fd16 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 X%><{Zt#bz-K7;;F Date: Thu, 11 Apr 2024 12:29:49 -0400 Subject: [PATCH 105/177] fix(richtext-lexical): incorrect floating handle y-position calculation next to certain kinds of HTML elements like HR --- .../utils/doesLineHeightAffectElement.ts | 48 +++++++++++++++++++ .../handles/utils/setHandlePosition.ts | 12 +++-- 2 files changed, 57 insertions(+), 3 deletions(-) create mode 100644 packages/richtext-lexical/src/field/lexical/plugins/handles/utils/doesLineHeightAffectElement.ts diff --git a/packages/richtext-lexical/src/field/lexical/plugins/handles/utils/doesLineHeightAffectElement.ts b/packages/richtext-lexical/src/field/lexical/plugins/handles/utils/doesLineHeightAffectElement.ts new file mode 100644 index 0000000000..60f45b69db --- /dev/null +++ b/packages/richtext-lexical/src/field/lexical/plugins/handles/utils/doesLineHeightAffectElement.ts @@ -0,0 +1,48 @@ +const replacedElements = [ + 'IMG', + 'INPUT', + 'TEXTAREA', + 'SELECT', + 'BUTTON', + 'VIDEO', + 'OBJECT', + 'EMBED', + 'IFRAME', + 'HR', +] + +/** + * From ChatGPT, only that verified it works for HR elements. + * + * HTML Elements can have CSS lineHeight applied to them, but it doesn't always affect the visual layout. + * This function checks if the line-height property has an effect on the element's layout. + * @param htmlElem + */ +export function doesLineHeightAffectElement(htmlElem: HTMLElement) { + if (!htmlElem) return false + + // Check for replaced elements, elements that typically don't support line-height adjustments, + // and elements without visible content + + if ( + replacedElements.includes(htmlElem.tagName) || + htmlElem.offsetHeight === 0 || + htmlElem.offsetWidth === 0 + ) { + return false + } + + // Check for specific CSS properties that negate line-height's visual effects + const style = window.getComputedStyle(htmlElem) + if ( + style.display === 'table-cell' || + style.position === 'absolute' || + style.visibility === 'hidden' || + style.opacity === '0' + ) { + return false + } + + // This is a basic check, and there can be more complex scenarios where line-height doesn't have an effect. + return true +} diff --git a/packages/richtext-lexical/src/field/lexical/plugins/handles/utils/setHandlePosition.ts b/packages/richtext-lexical/src/field/lexical/plugins/handles/utils/setHandlePosition.ts index 3650bfef08..84763059b7 100644 --- a/packages/richtext-lexical/src/field/lexical/plugins/handles/utils/setHandlePosition.ts +++ b/packages/richtext-lexical/src/field/lexical/plugins/handles/utils/setHandlePosition.ts @@ -1,3 +1,5 @@ +import { doesLineHeightAffectElement } from './doesLineHeightAffectElement' + export function setHandlePosition( targetElem: HTMLElement | null, floatingElem: HTMLElement, @@ -15,10 +17,14 @@ export function setHandlePosition( const floatingElemRect = floatingElem.getBoundingClientRect() const anchorElementRect = anchorElem.getBoundingClientRect() + // No need to let line height affect the re-positioning of the floating element if line height has no + // visual effect on the element. Otherwise, the floating element will be positioned incorrectly. + const actualLineHeight = doesLineHeightAffectElement(targetElem) + ? parseInt(targetStyle.lineHeight, 10) + : 0 + const top = - targetRect.top + - (parseInt(targetStyle.lineHeight, 10) - floatingElemRect.height) / 2 - - anchorElementRect.top + targetRect.top + (actualLineHeight - floatingElemRect.height) / 2 - anchorElementRect.top const left = leftOffset From 055e6af7b7d2e3ef7c6190f8455bfde839d3f135 Mon Sep 17 00:00:00 2001 From: Alessio Gravili Date: Thu, 11 Apr 2024 13:50:24 -0400 Subject: [PATCH 106/177] feat(richtext-lexical): improve floating handle y-positioning by positioning it in the center for smaller elements. --- .../handles/utils/setHandlePosition.ts | 34 ++++++++++++------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/packages/richtext-lexical/src/field/lexical/plugins/handles/utils/setHandlePosition.ts b/packages/richtext-lexical/src/field/lexical/plugins/handles/utils/setHandlePosition.ts index 84763059b7..18cc0c2adc 100644 --- a/packages/richtext-lexical/src/field/lexical/plugins/handles/utils/setHandlePosition.ts +++ b/packages/richtext-lexical/src/field/lexical/plugins/handles/utils/setHandlePosition.ts @@ -2,32 +2,40 @@ import { doesLineHeightAffectElement } from './doesLineHeightAffectElement' export function setHandlePosition( targetElem: HTMLElement | null, - floatingElem: HTMLElement, + handleElem: HTMLElement, anchorElem: HTMLElement, leftOffset: number = 0, // SPACE ) { if (!targetElem) { - floatingElem.style.opacity = '0' - floatingElem.style.transform = 'translate(-10000px, -10000px)' + handleElem.style.opacity = '0' + handleElem.style.transform = 'translate(-10000px, -10000px)' return } const targetRect = targetElem.getBoundingClientRect() const targetStyle = window.getComputedStyle(targetElem) - const floatingElemRect = floatingElem.getBoundingClientRect() + const floatingElemRect = handleElem.getBoundingClientRect() const anchorElementRect = anchorElem.getBoundingClientRect() - // No need to let line height affect the re-positioning of the floating element if line height has no - // visual effect on the element. Otherwise, the floating element will be positioned incorrectly. - const actualLineHeight = doesLineHeightAffectElement(targetElem) - ? parseInt(targetStyle.lineHeight, 10) - : 0 + let top: number - const top = - targetRect.top + (actualLineHeight - floatingElemRect.height) / 2 - anchorElementRect.top + const shouldDisplayHandleInCenter = targetRect.height < 60 + + if (!shouldDisplayHandleInCenter) { + // No need to let line height affect the re-positioning of the floating element if line height has no + // visual effect on the element. Otherwise, the floating element will be positioned incorrectly. + const actualLineHeight = doesLineHeightAffectElement(targetElem) + ? parseInt(targetStyle.lineHeight, 10) + : 0 + + top = targetRect.top + (actualLineHeight - floatingElemRect.height) / 2 - anchorElementRect.top + } else { + top = + targetRect.top - floatingElemRect.height / 2 - anchorElementRect.top + targetRect.height / 2 + } const left = leftOffset - floatingElem.style.opacity = '1' - floatingElem.style.transform = `translate(${left}px, ${top}px)` + handleElem.style.opacity = '1' + handleElem.style.transform = `translate(${left}px, ${top}px)` } From 844663ce1a2caf60f432369a4108463e1990ea04 Mon Sep 17 00:00:00 2001 From: Alessio Gravili Date: Thu, 11 Apr 2024 14:12:59 -0400 Subject: [PATCH 107/177] fix(richtext-lexical): limit unnecessary floating handle positioning updates --- .../handles/AddBlockHandlePlugin/index.tsx | 16 ++++++++++------ .../handles/DraggableBlockPlugin/index.tsx | 10 +++++++--- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/packages/richtext-lexical/src/field/lexical/plugins/handles/AddBlockHandlePlugin/index.tsx b/packages/richtext-lexical/src/field/lexical/plugins/handles/AddBlockHandlePlugin/index.tsx index 9c758c99fd..8e9770bcd3 100644 --- a/packages/richtext-lexical/src/field/lexical/plugins/handles/AddBlockHandlePlugin/index.tsx +++ b/packages/richtext-lexical/src/field/lexical/plugins/handles/AddBlockHandlePlugin/index.tsx @@ -174,7 +174,9 @@ function useAddBlockHandle( pageX < left - horizontalBuffer || pageX > right + horizontalBuffer ) { - setHoveredElement(null) + if (hoveredElement !== null) { + setHoveredElement(null) + } return } @@ -198,10 +200,12 @@ function useAddBlockHandle( if (!_emptyBlockElem) { return } - setHoveredElement({ - elem: _emptyBlockElem, - node: blockNode, - }) + if (hoveredElement?.node !== blockNode || hoveredElement?.elem !== _emptyBlockElem) { + setHoveredElement({ + elem: _emptyBlockElem, + node: blockNode, + }) + } } // Since the draggableBlockElem is outside the actual editor, we need to listen to the document @@ -212,7 +216,7 @@ function useAddBlockHandle( return () => { document?.removeEventListener('mousemove', onDocumentMouseMove) } - }, [scrollerElem, anchorElem, editor]) + }, [scrollerElem, anchorElem, editor, hoveredElement]) useEffect(() => { if (menuRef.current && hoveredElement?.node) { diff --git a/packages/richtext-lexical/src/field/lexical/plugins/handles/DraggableBlockPlugin/index.tsx b/packages/richtext-lexical/src/field/lexical/plugins/handles/DraggableBlockPlugin/index.tsx index f1ac8fbc8b..5bfef8f827 100644 --- a/packages/richtext-lexical/src/field/lexical/plugins/handles/DraggableBlockPlugin/index.tsx +++ b/packages/richtext-lexical/src/field/lexical/plugins/handles/DraggableBlockPlugin/index.tsx @@ -159,7 +159,9 @@ function useDraggableBlockMenu( return } - setDraggableBlockElem(_draggableBlockElem) + if (draggableBlockElem !== _draggableBlockElem) { + setDraggableBlockElem(_draggableBlockElem) + } } // Since the draggableBlockElem is outside the actual editor, we need to listen to the document @@ -170,7 +172,7 @@ function useDraggableBlockMenu( return () => { document?.removeEventListener('mousemove', onDocumentMouseMove) } - }, [scrollerElem, anchorElem, editor, calculateDistanceFromScrollerElem]) + }, [scrollerElem, anchorElem, editor, calculateDistanceFromScrollerElem, draggableBlockElem]) useEffect(() => { if (menuRef.current) { @@ -324,7 +326,9 @@ function useDraggableBlockMenu( } else { targetNode.insertBefore(draggedNode) }*/ - setDraggableBlockElem(null) + if (draggableBlockElem !== null) { + setDraggableBlockElem(null) + } }) return true From c3d8597c130f3d563987edfa6b339db9daed12ab Mon Sep 17 00:00:00 2001 From: Alessio Gravili Date: Thu, 11 Apr 2024 16:24:04 -0400 Subject: [PATCH 108/177] feat(richtext-lexical): add HorizontalRuleFeature --- docs/rich-text/lexical.mdx | 5 +- .../horizontalrule/component/index.tsx | 80 ++++++++++++ .../horizontalrule/feature.client.tsx | 49 +++++++ .../features/horizontalrule/feature.server.ts | 37 ++++++ .../horizontalrule/markdownTransformer.ts | 26 ++++ .../nodes/HorizontalRuleNode.tsx | 123 ++++++++++++++++++ .../features/horizontalrule/plugin/index.scss | 20 +++ .../features/horizontalrule/plugin/index.tsx | 48 +++++++ .../field/lexical/config/server/default.ts | 2 + .../lexical/ui/icons/HorizontalRule/index.tsx | 16 +++ 10 files changed, 404 insertions(+), 2 deletions(-) create mode 100644 packages/richtext-lexical/src/field/features/horizontalrule/component/index.tsx create mode 100644 packages/richtext-lexical/src/field/features/horizontalrule/feature.client.tsx create mode 100644 packages/richtext-lexical/src/field/features/horizontalrule/feature.server.ts create mode 100644 packages/richtext-lexical/src/field/features/horizontalrule/markdownTransformer.ts create mode 100644 packages/richtext-lexical/src/field/features/horizontalrule/nodes/HorizontalRuleNode.tsx create mode 100644 packages/richtext-lexical/src/field/features/horizontalrule/plugin/index.scss create mode 100644 packages/richtext-lexical/src/field/features/horizontalrule/plugin/index.tsx create mode 100644 packages/richtext-lexical/src/field/lexical/ui/icons/HorizontalRule/index.tsx diff --git a/docs/rich-text/lexical.mdx b/docs/rich-text/lexical.mdx index 4a4367ab80..875fc2b504 100644 --- a/docs/rich-text/lexical.mdx +++ b/docs/rich-text/lexical.mdx @@ -138,7 +138,7 @@ import { CallToAction } from '../blocks/CallToAction' Here's an overview of all the included features: | Feature Name | Included by default | Description | -| ------------------------------ | ------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +|--------------------------------|---------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **`BoldTextFeature`** | Yes | Handles the bold text format | | **`ItalicTextFeature`** | Yes | Handles the italic text format | | **`UnderlineTextFeature`** | Yes | Handles the underline text format | @@ -157,7 +157,8 @@ Here's an overview of all the included features: | **`RelationshipFeature`** | Yes | Allows you to create block-level (not inline) relationships to other documents | | **`BlockQuoteFeature`** | Yes | Allows you to create block-level quotes | | **`UploadFeature`** | Yes | Allows you to create block-level upload nodes - this supports all kinds of uploads, not just images | -| **`BlocksFeature`** | No | Allows you to use Payload's [Blocks Field](/docs/fields/blocks) directly inside your editor. In the feature props, you can specify the allowed blocks - just like in the Blocks field. | +| **`HorizontalRuleFeature`** | Yes | Horizontal rules / separators. Basically displays an


element | +| **`BlocksFeature`** | No | Allows you to use Payload's [Blocks Field](/docs/fields/blocks) directly inside your editor. In the feature props, you can specify the allowed blocks - just like in the Blocks field. | | **`TreeViewFeature`** | No | Adds a debug box under the editor, which allows you to see the current editor state live, the dom, as well as time travel. Very useful for debugging | ## Creating your own, custom Feature diff --git a/packages/richtext-lexical/src/field/features/horizontalrule/component/index.tsx b/packages/richtext-lexical/src/field/features/horizontalrule/component/index.tsx new file mode 100644 index 0000000000..df70dd203a --- /dev/null +++ b/packages/richtext-lexical/src/field/features/horizontalrule/component/index.tsx @@ -0,0 +1,80 @@ +'use client' + +import type { NodeKey } from 'lexical' + +import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js' +import { useLexicalNodeSelection } from '@lexical/react/useLexicalNodeSelection.js' +import lexicalUtilsImport from '@lexical/utils' +const { mergeRegister } = lexicalUtilsImport + +import lexicalImport from 'lexical' +const { + $getNodeByKey, + $getSelection, + $isNodeSelection, + CLICK_COMMAND, + COMMAND_PRIORITY_LOW, + KEY_BACKSPACE_COMMAND, + KEY_DELETE_COMMAND, +} = lexicalImport +import { useCallback, useEffect } from 'react' + +import { $isHorizontalRuleNode } from '../nodes/HorizontalRuleNode.js' + +/** + * React component rendered in the lexical editor, WITHIN the hr element created by createDOM of the HorizontalRuleNode. + * + * @param nodeKey every node has a unique key (this key is not saved to the database and thus may differ between sessions). It's useful for working with the CURRENT lexical editor state + */ +export function HorizontalRuleComponent({ nodeKey }: { nodeKey: NodeKey }) { + const [editor] = useLexicalComposerContext() + const [isSelected, setSelected, clearSelection] = useLexicalNodeSelection(nodeKey) + + const onDelete = useCallback( + (event: KeyboardEvent) => { + if (isSelected && $isNodeSelection($getSelection())) { + event.preventDefault() + const node = $getNodeByKey(nodeKey) + if ($isHorizontalRuleNode(node)) { + node.remove() + return true + } + } + return false + }, + [isSelected, nodeKey], + ) + + useEffect(() => { + return mergeRegister( + editor.registerCommand( + CLICK_COMMAND, + (event: MouseEvent) => { + const hrElem = editor.getElementByKey(nodeKey) + + if (event.target === hrElem) { + if (!event.shiftKey) { + clearSelection() + } + setSelected(!isSelected) + return true + } + + return false + }, + COMMAND_PRIORITY_LOW, + ), + editor.registerCommand(KEY_DELETE_COMMAND, onDelete, COMMAND_PRIORITY_LOW), + editor.registerCommand(KEY_BACKSPACE_COMMAND, onDelete, COMMAND_PRIORITY_LOW), + ) + }, [clearSelection, editor, isSelected, nodeKey, onDelete, setSelected]) + + useEffect(() => { + const hrElem = editor.getElementByKey(nodeKey) + if (hrElem !== null) { + hrElem.className = isSelected ? 'selected' : '' + } + }, [editor, isSelected, nodeKey]) + + return null +} diff --git a/packages/richtext-lexical/src/field/features/horizontalrule/feature.client.tsx b/packages/richtext-lexical/src/field/features/horizontalrule/feature.client.tsx new file mode 100644 index 0000000000..fcc51f23bd --- /dev/null +++ b/packages/richtext-lexical/src/field/features/horizontalrule/feature.client.tsx @@ -0,0 +1,49 @@ +'use client' + +import type { FeatureProviderProviderClient } from '../types.js' + +import { SlashMenuOption } from '../../lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/types.js' +import { HorizontalRuleIcon } from '../../lexical/ui/icons/HorizontalRule/index.js' +import { createClientComponent } from '../createClientComponent.js' +import { MarkdownTransformer } from './markdownTransformer.js' +import { HorizontalRuleNode, INSERT_HORIZONTAL_RULE_COMMAND } from './nodes/HorizontalRuleNode.js' +import { HorizontalRulePlugin } from './plugin/index.js' + +const HorizontalRuleFeatureClient: FeatureProviderProviderClient = (props) => { + return { + clientFeatureProps: props, + feature: () => ({ + clientFeatureProps: props, + markdownTransformers: [MarkdownTransformer], + nodes: [HorizontalRuleNode], + plugins: [ + { + Component: HorizontalRulePlugin, + position: 'normal', + }, + ], + slashMenu: { + options: [ + { + displayName: 'Basic', + key: 'basic', + options: [ + new SlashMenuOption(`horizontalrule`, { + Icon: HorizontalRuleIcon, + displayName: `Horizontal Rule`, + keywords: ['hr', 'horizontal rule', 'line', 'separator'], + onSelect: ({ editor }) => { + editor.dispatchCommand(INSERT_HORIZONTAL_RULE_COMMAND, undefined) + }, + }), + ], + }, + ], + }, + }), + } +} + +export const HorizontalRuleFeatureClientComponent = createClientComponent( + HorizontalRuleFeatureClient, +) diff --git a/packages/richtext-lexical/src/field/features/horizontalrule/feature.server.ts b/packages/richtext-lexical/src/field/features/horizontalrule/feature.server.ts new file mode 100644 index 0000000000..ce24ba2936 --- /dev/null +++ b/packages/richtext-lexical/src/field/features/horizontalrule/feature.server.ts @@ -0,0 +1,37 @@ +import type { HTMLConverter } from '../converters/html/converter/types.js' +import type { FeatureProviderProviderServer } from '../types.js' +import type { SerializedHorizontalRuleNode } from './nodes/HorizontalRuleNode.js' + +import { HorizontalRuleFeatureClientComponent } from './feature.client.js' +import { MarkdownTransformer } from './markdownTransformer.js' +import { HorizontalRuleNode } from './nodes/HorizontalRuleNode.js' + +export const HorizontalRuleFeature: FeatureProviderProviderServer = ( + props, +) => { + return { + feature: () => { + return { + ClientComponent: HorizontalRuleFeatureClientComponent, + clientFeatureProps: null, + markdownTransformers: [MarkdownTransformer], + nodes: [ + { + converters: { + html: { + converter: () => { + return `
` + }, + nodeTypes: [HorizontalRuleNode.getType()], + } as HTMLConverter, + }, + node: HorizontalRuleNode, + }, + ], + serverFeatureProps: props, + } + }, + key: 'horizontalrule', + serverFeatureProps: props, + } +} diff --git a/packages/richtext-lexical/src/field/features/horizontalrule/markdownTransformer.ts b/packages/richtext-lexical/src/field/features/horizontalrule/markdownTransformer.ts new file mode 100644 index 0000000000..dfc94ddc15 --- /dev/null +++ b/packages/richtext-lexical/src/field/features/horizontalrule/markdownTransformer.ts @@ -0,0 +1,26 @@ +import type { ElementTransformer } from '@lexical/markdown' + +import { + $createHorizontalRuleNode, + $isHorizontalRuleNode, + HorizontalRuleNode, +} from './nodes/HorizontalRuleNode.js' + +export const MarkdownTransformer: ElementTransformer = { + type: 'element', + dependencies: [HorizontalRuleNode], + export: (node, exportChildren) => { + if (!$isHorizontalRuleNode(node)) { + return null + } + return '---' + }, + // match --- + regExp: /^---\s*$/, + replace: (parentNode) => { + const node = $createHorizontalRuleNode() + if (node) { + parentNode.replace(node) + } + }, +} diff --git a/packages/richtext-lexical/src/field/features/horizontalrule/nodes/HorizontalRuleNode.tsx b/packages/richtext-lexical/src/field/features/horizontalrule/nodes/HorizontalRuleNode.tsx new file mode 100644 index 0000000000..8d336a0473 --- /dev/null +++ b/packages/richtext-lexical/src/field/features/horizontalrule/nodes/HorizontalRuleNode.tsx @@ -0,0 +1,123 @@ +import type { + DOMConversionMap, + DOMConversionOutput, + DOMExportOutput, + LexicalCommand, + LexicalNode, + SerializedLexicalNode, +} from 'lexical' + +import lexicalImport from 'lexical' +const { $applyNodeReplacement, DecoratorNode, createCommand } = lexicalImport +import * as React from 'react' + +const HorizontalRuleComponent = React.lazy(() => + import('../component/index.js').then((module) => ({ + default: module.HorizontalRuleComponent, + })), +) + +/** + * Serialized representation of a horizontal rule node. Serialized = converted to JSON. This is what is stored in the database / in the lexical editor state. + */ +export type SerializedHorizontalRuleNode = SerializedLexicalNode + +export const INSERT_HORIZONTAL_RULE_COMMAND: LexicalCommand = createCommand( + 'INSERT_HORIZONTAL_RULE_COMMAND', +) + +/** + * This node is a DecoratorNode. DecoratorNodes allow you to render React components in the editor. + * + * They need both createDom and decorate functions. createDom => outside of the html. decorate => React Component inside of the html. + * + * If we used DecoratorBlockNode instead, we would only need a decorate method + */ +export class HorizontalRuleNode extends DecoratorNode { + static clone(node: HorizontalRuleNode): HorizontalRuleNode { + return new HorizontalRuleNode(node.__key) + } + + static getType(): string { + return 'horizontalrule' + } + + /** + * Defines what happens if you copy an hr element from another page and paste it into the lexical editor + * + * This also determines the behavior of lexical's internal HTML -> Lexical converter + */ + static importDOM(): DOMConversionMap | null { + return { + hr: () => ({ + conversion: convertHorizontalRuleElement, + priority: 0, + }), + } + } + + /** + * The data for this node is stored serialized as JSON. This is the "load function" of that node: it takes the saved data and converts it into a node. + */ + static importJSON(serializedNode: SerializedHorizontalRuleNode): HorizontalRuleNode { + return $createHorizontalRuleNode() + } + + /** + * Determines how the hr element is rendered in the lexical editor. This is only the "initial" / "outer" HTML element. + */ + createDOM(): HTMLElement { + return document.createElement('hr') + } + + /** + * Allows you to render a React component within whatever createDOM returns. + */ + decorate(): React.ReactElement { + return + } + + /** + * Opposite of importDOM, this function defines what happens when you copy an hr element from the lexical editor and paste it into another page. + * + * This also determines the behavior of lexical's internal Lexical -> HTML converter + */ + exportDOM(): DOMExportOutput { + return { element: document.createElement('hr') } + } + /** + * Opposite of importJSON. This determines what data is saved in the database / in the lexical editor state. + */ + exportJSON(): SerializedLexicalNode { + return { + type: 'horizontalrule', + version: 1, + } + } + + getTextContent(): string { + return '\n' + } + + isInline(): false { + return false + } + + updateDOM(): boolean { + return false + } +} + +function convertHorizontalRuleElement(): DOMConversionOutput { + return { node: $createHorizontalRuleNode() } +} + +export function $createHorizontalRuleNode(): HorizontalRuleNode { + return $applyNodeReplacement(new HorizontalRuleNode()) +} + +export function $isHorizontalRuleNode( + node: LexicalNode | null | undefined, +): node is HorizontalRuleNode { + return node instanceof HorizontalRuleNode +} diff --git a/packages/richtext-lexical/src/field/features/horizontalrule/plugin/index.scss b/packages/richtext-lexical/src/field/features/horizontalrule/plugin/index.scss new file mode 100644 index 0000000000..5b683225cc --- /dev/null +++ b/packages/richtext-lexical/src/field/features/horizontalrule/plugin/index.scss @@ -0,0 +1,20 @@ +@import '../../../../scss/styles.scss'; + +hr { + padding: 2px 2px; + border: none; + margin: 1rem 0; + cursor: pointer; +} + +hr:after { + content: ''; + display: block; + height: 2px; + background-color: var(--theme-elevation-250); +} + +hr.selected { + outline: 2px solid var(--theme-success-500); + user-select: none; +} diff --git a/packages/richtext-lexical/src/field/features/horizontalrule/plugin/index.tsx b/packages/richtext-lexical/src/field/features/horizontalrule/plugin/index.tsx new file mode 100644 index 0000000000..98fe12beee --- /dev/null +++ b/packages/richtext-lexical/src/field/features/horizontalrule/plugin/index.tsx @@ -0,0 +1,48 @@ +'use client' + +import lexicalComposerContextImport from '@lexical/react/LexicalComposerContext.js' +const { useLexicalComposerContext } = lexicalComposerContextImport +import lexicalUtilsImport from '@lexical/utils' +const { $insertNodeToNearestRoot } = lexicalUtilsImport + +import lexicalImport from 'lexical' +const { $getSelection, $isRangeSelection, COMMAND_PRIORITY_EDITOR } = lexicalImport +import { useEffect } from 'react' + +import { + $createHorizontalRuleNode, + INSERT_HORIZONTAL_RULE_COMMAND, +} from '../nodes/HorizontalRuleNode.js' +import './index.scss' + +/** + * Registers the INSERT_HORIZONTAL_RULE_COMMAND lexical command and defines the behavior for when it is called. + */ +export function HorizontalRulePlugin(): null { + const [editor] = useLexicalComposerContext() + + useEffect(() => { + return editor.registerCommand( + INSERT_HORIZONTAL_RULE_COMMAND, + (type) => { + const selection = $getSelection() + + if (!$isRangeSelection(selection)) { + return false + } + + const focusNode = selection.focus.getNode() + + if (focusNode !== null) { + const horizontalRuleNode = $createHorizontalRuleNode() + $insertNodeToNearestRoot(horizontalRuleNode) + } + + return true + }, + COMMAND_PRIORITY_EDITOR, + ) + }, [editor]) + + return null +} diff --git a/packages/richtext-lexical/src/field/lexical/config/server/default.ts b/packages/richtext-lexical/src/field/lexical/config/server/default.ts index 688a254005..15052ff33a 100644 --- a/packages/richtext-lexical/src/field/lexical/config/server/default.ts +++ b/packages/richtext-lexical/src/field/lexical/config/server/default.ts @@ -13,6 +13,7 @@ import { SubscriptFeature } from '../../../features/format/subscript/feature.ser import { SuperscriptFeature } from '../../../features/format/superscript/feature.server.js' import { UnderlineFeature } from '../../../features/format/underline/feature.server.js' import { HeadingFeature } from '../../../features/heading/feature.server.js' +import { HorizontalRuleFeature } from '../../../features/horizontalrule/feature.server.js' import { IndentFeature } from '../../../features/indent/feature.server.js' import { LinkFeature } from '../../../features/link/feature.server.js' import { CheckListFeature } from '../../../features/lists/checklist/feature.server.js' @@ -48,6 +49,7 @@ export const defaultEditorFeatures: FeatureProviderServer[] = RelationshipFeature(), BlockQuoteFeature(), UploadFeature(), + HorizontalRuleFeature(), ] export const defaultEditorConfig: ServerEditorConfig = { diff --git a/packages/richtext-lexical/src/field/lexical/ui/icons/HorizontalRule/index.tsx b/packages/richtext-lexical/src/field/lexical/ui/icons/HorizontalRule/index.tsx new file mode 100644 index 0000000000..efde2454d3 --- /dev/null +++ b/packages/richtext-lexical/src/field/lexical/ui/icons/HorizontalRule/index.tsx @@ -0,0 +1,16 @@ +import React from 'react' + +export const HorizontalRuleIcon: React.FC = () => ( + +) From a216800c72a88d04320bbf17b6625a1f5a97df59 Mon Sep 17 00:00:00 2001 From: Alessio Gravili Date: Thu, 11 Apr 2024 16:31:40 -0400 Subject: [PATCH 109/177] chore(richtext-lexical): fix build error --- .../field/lexical/plugins/handles/utils/setHandlePosition.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/richtext-lexical/src/field/lexical/plugins/handles/utils/setHandlePosition.ts b/packages/richtext-lexical/src/field/lexical/plugins/handles/utils/setHandlePosition.ts index 18cc0c2adc..2616d6c603 100644 --- a/packages/richtext-lexical/src/field/lexical/plugins/handles/utils/setHandlePosition.ts +++ b/packages/richtext-lexical/src/field/lexical/plugins/handles/utils/setHandlePosition.ts @@ -1,4 +1,4 @@ -import { doesLineHeightAffectElement } from './doesLineHeightAffectElement' +import { doesLineHeightAffectElement } from './doesLineHeightAffectElement.js' export function setHandlePosition( targetElem: HTMLElement | null, From 1456fcdcad29c15979eadfba5eed5204d02a20a5 Mon Sep 17 00:00:00 2001 From: Paul Date: Thu, 11 Apr 2024 17:38:35 -0300 Subject: [PATCH 110/177] chore: type locale from localization config on the payload request (#5801) --- packages/payload/src/index.ts | 1 + packages/payload/src/types/index.ts | 2 +- .../src/utilities/configToJSONSchema.ts | 22 ++++++++++++++++++- 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/packages/payload/src/index.ts b/packages/payload/src/index.ts index c56d0201fe..eb62456a60 100644 --- a/packages/payload/src/index.ts +++ b/packages/payload/src/index.ts @@ -484,6 +484,7 @@ type GeneratedTypes = { globals: { [slug: number | string | symbol]: GlobalTypeWithID & Record } + locale: null | string user: TypeWithID & Record & { collection: string } } diff --git a/packages/payload/src/types/index.ts b/packages/payload/src/types/index.ts index 40a19af666..f7d66ebd44 100644 --- a/packages/payload/src/types/index.ts +++ b/packages/payload/src/types/index.ts @@ -42,7 +42,7 @@ export type CustomPayloadRequest = { * The requested locale if specified * Only available for localized collections */ - locale?: string + locale?: GeneratedTypes['locale'] /** * The payload object */ diff --git a/packages/payload/src/utilities/configToJSONSchema.ts b/packages/payload/src/utilities/configToJSONSchema.ts index c5c22e071a..81c52ed5d1 100644 --- a/packages/payload/src/utilities/configToJSONSchema.ts +++ b/packages/payload/src/utilities/configToJSONSchema.ts @@ -67,6 +67,25 @@ function generateEntitySchemas( } } +function generateLocaleEntitySchemas(localization: SanitizedConfig['localization']): JSONSchema4 { + if (localization && 'locales' in localization && localization?.locales) { + const localesFromConfig = localization?.locales + + const locales = [...localesFromConfig].map((locale) => { + return locale.code + }, []) + + return { + type: 'string', + enum: locales, + } + } + + return { + type: 'null', + } +} + function generateAuthEntitySchemas(entities: SanitizedCollectionConfig[]): JSONSchema4 { const properties: JSONSchema4[] = [...entities] .filter(({ auth }) => Boolean(auth)) @@ -577,9 +596,10 @@ export function configToJSONSchema( properties: { collections: generateEntitySchemas(config.collections || []), globals: generateEntitySchemas(config.globals || []), + locale: generateLocaleEntitySchemas(config.localization), user: generateAuthEntitySchemas(config.collections), }, - required: ['user', 'collections', 'globals'], + required: ['user', 'locale', 'collections', 'globals'], title: 'Config', } } From 2486c7dba099fbff4ebde4a59d483e42f1dc2cd5 Mon Sep 17 00:00:00 2001 From: Alessio Gravili Date: Thu, 11 Apr 2024 16:42:35 -0400 Subject: [PATCH 111/177] fix(richtext-lexical): incorrect margin for nested unordered lists --- .../richtext-lexical/src/field/lexical/theme/EditorTheme.scss | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/richtext-lexical/src/field/lexical/theme/EditorTheme.scss b/packages/richtext-lexical/src/field/lexical/theme/EditorTheme.scss index dca9cb358b..f6e4cbb8c4 100644 --- a/packages/richtext-lexical/src/field/lexical/theme/EditorTheme.scss +++ b/packages/richtext-lexical/src/field/lexical/theme/EditorTheme.scss @@ -331,6 +331,10 @@ list-style-position: inside; } + &__ul ul { + margin: 0; + } + &__listItem { margin: 0 0px 0.4em 16px; } From b51b519d302b82e97dd5345110abf6427d50e256 Mon Sep 17 00:00:00 2001 From: Elliot DeNolf Date: Thu, 11 Apr 2024 22:58:55 -0400 Subject: [PATCH 112/177] feat(plugin-cloud-storage): vercel blob storage adapter --- packages/plugin-cloud-storage/package.json | 4 + .../src/adapters/vercelBlob/generateURL.ts | 14 ++++ .../src/adapters/vercelBlob/getFilePrefix.ts | 32 ++++++++ .../src/adapters/vercelBlob/handleDelete.ts | 19 +++++ .../src/adapters/vercelBlob/handleUpload.ts | 40 +++++++++ .../src/adapters/vercelBlob/index.ts | 82 +++++++++++++++++++ .../src/adapters/vercelBlob/staticHandler.ts | 81 ++++++++++++++++++ pnpm-lock.yaml | 31 ++++++- 8 files changed, 302 insertions(+), 1 deletion(-) create mode 100644 packages/plugin-cloud-storage/src/adapters/vercelBlob/generateURL.ts create mode 100644 packages/plugin-cloud-storage/src/adapters/vercelBlob/getFilePrefix.ts create mode 100644 packages/plugin-cloud-storage/src/adapters/vercelBlob/handleDelete.ts create mode 100644 packages/plugin-cloud-storage/src/adapters/vercelBlob/handleUpload.ts create mode 100644 packages/plugin-cloud-storage/src/adapters/vercelBlob/index.ts create mode 100644 packages/plugin-cloud-storage/src/adapters/vercelBlob/staticHandler.ts diff --git a/packages/plugin-cloud-storage/package.json b/packages/plugin-cloud-storage/package.json index 1ff1061faa..2784c0bd82 100644 --- a/packages/plugin-cloud-storage/package.json +++ b/packages/plugin-cloud-storage/package.json @@ -43,6 +43,9 @@ }, "@google-cloud/storage": { "optional": true + }, + "@vercel/blob": { + "optional": true } }, "files": [ @@ -56,6 +59,7 @@ "@azure/storage-blob": "^12.11.0", "@google-cloud/storage": "^7.7.0", "@types/find-node-modules": "^2.1.2", + "@vercel/blob": "^0.22.3", "payload": "workspace:*" }, "dependencies": { diff --git a/packages/plugin-cloud-storage/src/adapters/vercelBlob/generateURL.ts b/packages/plugin-cloud-storage/src/adapters/vercelBlob/generateURL.ts new file mode 100644 index 0000000000..fcd3ae98f0 --- /dev/null +++ b/packages/plugin-cloud-storage/src/adapters/vercelBlob/generateURL.ts @@ -0,0 +1,14 @@ +import type { GenerateURL } from '@payloadcms/plugin-cloud-storage/types' + +import path from 'path' + +type GenerateUrlArgs = { + baseUrl: string + prefix?: string +} + +export const getGenerateUrl = ({ baseUrl }: GenerateUrlArgs): GenerateURL => { + return ({ filename, prefix = '' }) => { + return `${baseUrl}/${path.posix.join(prefix, filename)}` + } +} diff --git a/packages/plugin-cloud-storage/src/adapters/vercelBlob/getFilePrefix.ts b/packages/plugin-cloud-storage/src/adapters/vercelBlob/getFilePrefix.ts new file mode 100644 index 0000000000..dfbbd7b066 --- /dev/null +++ b/packages/plugin-cloud-storage/src/adapters/vercelBlob/getFilePrefix.ts @@ -0,0 +1,32 @@ +import type { CollectionConfig, PayloadRequest, UploadConfig } from 'payload/types' + +export async function getFilePrefix({ + collection, + req, +}: { + collection: CollectionConfig + req: PayloadRequest +}): Promise { + const imageSizes = (collection?.upload as UploadConfig)?.imageSizes || [] + const { routeParams } = req + const filename = routeParams?.['filename'] + + const files = await req.payload.find({ + collection: collection.slug, + depth: 0, + limit: 1, + pagination: false, + where: { + or: [ + { + filename: { equals: filename }, + }, + ...imageSizes.map((imageSize) => ({ + [`sizes.${imageSize.name}.filename`]: { equals: filename }, + })), + ], + }, + }) + const prefix = files?.docs?.[0]?.prefix + return prefix ? (prefix as string) : '' +} diff --git a/packages/plugin-cloud-storage/src/adapters/vercelBlob/handleDelete.ts b/packages/plugin-cloud-storage/src/adapters/vercelBlob/handleDelete.ts new file mode 100644 index 0000000000..2fbc4bcf4c --- /dev/null +++ b/packages/plugin-cloud-storage/src/adapters/vercelBlob/handleDelete.ts @@ -0,0 +1,19 @@ +import type { HandleDelete } from '@payloadcms/plugin-cloud-storage/types' + +import { del } from '@vercel/blob' +import path from 'path' + +type HandleDeleteArgs = { + baseUrl: string + prefix?: string + token: string +} + +export const getHandleDelete = ({ baseUrl, token }: HandleDeleteArgs): HandleDelete => { + return async ({ doc: { prefix = '' }, filename }) => { + const fileUrl = `${baseUrl}/${path.posix.join(prefix, filename)}` + const deletedBlob = await del(fileUrl, { token }) + + return deletedBlob + } +} diff --git a/packages/plugin-cloud-storage/src/adapters/vercelBlob/handleUpload.ts b/packages/plugin-cloud-storage/src/adapters/vercelBlob/handleUpload.ts new file mode 100644 index 0000000000..9d127f4174 --- /dev/null +++ b/packages/plugin-cloud-storage/src/adapters/vercelBlob/handleUpload.ts @@ -0,0 +1,40 @@ +import type { HandleUpload } from '@payloadcms/plugin-cloud-storage/types' + +import { put } from '@vercel/blob' +import path from 'path' + +import type { VercelBlobAdapterUploadOptions } from './index.js' + +type HandleUploadArgs = VercelBlobAdapterUploadOptions & { + baseUrl: string + prefix?: string + token: string +} + +export const getHandleUpload = ({ + access = 'public', + addRandomSuffix, + baseUrl, + cacheControlMaxAge, + prefix = '', + token, +}: HandleUploadArgs): HandleUpload => { + return async ({ data, file: { buffer, filename, mimeType } }) => { + const fileKey = path.posix.join(data.prefix || prefix, filename) + + const result = await put(fileKey, buffer, { + access, + addRandomSuffix, + cacheControlMaxAge, + contentType: mimeType, + token, + }) + + // Get filename with suffix from returned url + if (addRandomSuffix) { + data.filename = result.url.replace(`${baseUrl}/`, '') + } + + return data + } +} diff --git a/packages/plugin-cloud-storage/src/adapters/vercelBlob/index.ts b/packages/plugin-cloud-storage/src/adapters/vercelBlob/index.ts new file mode 100644 index 0000000000..4b662775dd --- /dev/null +++ b/packages/plugin-cloud-storage/src/adapters/vercelBlob/index.ts @@ -0,0 +1,82 @@ +import type { Adapter, GeneratedAdapter } from '@payloadcms/plugin-cloud-storage/types' + +import { getGenerateUrl } from './generateURL.js' +import { getHandleDelete } from './handleDelete.js' +import { getHandleUpload } from './handleUpload.js' +import { getStaticHandler } from './staticHandler.js' + +export interface VercelBlobAdapterArgs { + options?: VercelBlobAdapterUploadOptions + + /** + * Vercel Blob storage read/write token + * + * Usually process.env.BLOB_READ_WRITE_TOKEN set by Vercel + */ + token: string +} + +export interface VercelBlobAdapterUploadOptions { + /** + * Access control level + * + * @default 'public' + */ + access?: 'public' + /** + * Add a random suffix to the uploaded file name + * + * @default false + */ + addRandomSuffix?: boolean + /** + * Cache-Control max-age in seconds + * + * @default 31536000 (1 year) + */ + cacheControlMaxAge?: number +} + +const defaultUploadOptions: VercelBlobAdapterUploadOptions = { + access: 'public', + addRandomSuffix: false, + cacheControlMaxAge: 60 * 60 * 24 * 365, // 1 year +} + +export const vercelBlobAdapter = + ({ options = {}, token }: VercelBlobAdapterArgs): Adapter => + ({ collection, prefix }): GeneratedAdapter => { + if (!token) { + throw new Error('The token argument is required for the Vercel Blob adapter.') + } + + // Parse storeId from token + const storeId = token.match(/^vercel_blob_rw_([a-z\d]+)_[a-z\d]+$/i)?.[1].toLowerCase() + + if (!storeId) { + throw new Error( + 'Invalid token format for Vercel Blob adapter. Should be vercel_blob_rw__.', + ) + } + + const { access, addRandomSuffix, cacheControlMaxAge } = { + ...defaultUploadOptions, + ...options, + } + + const baseUrl = `https://${storeId}.${access}.blob.vercel-storage.com` + + return { + generateURL: getGenerateUrl({ baseUrl, prefix }), + handleDelete: getHandleDelete({ baseUrl, prefix, token }), + handleUpload: getHandleUpload({ + access, + addRandomSuffix, + baseUrl, + cacheControlMaxAge, + prefix, + token, + }), + staticHandler: getStaticHandler({ baseUrl, token }, collection), + } + } diff --git a/packages/plugin-cloud-storage/src/adapters/vercelBlob/staticHandler.ts b/packages/plugin-cloud-storage/src/adapters/vercelBlob/staticHandler.ts new file mode 100644 index 0000000000..67bc29a9ed --- /dev/null +++ b/packages/plugin-cloud-storage/src/adapters/vercelBlob/staticHandler.ts @@ -0,0 +1,81 @@ +import type { StaticHandler } from '@payloadcms/plugin-cloud-storage/types' +import type { CollectionConfig, PayloadRequest, UploadConfig } from 'payload/types' + +import { head } from '@vercel/blob' +import path from 'path' + +type StaticHandlerArgs = { + baseUrl: string + token: string +} + +export const getStaticHandler = ( + { baseUrl, token }: StaticHandlerArgs, + collection: CollectionConfig, +): StaticHandler => { + return async (req, { params: { filename } }) => { + try { + const prefix = await getFilePrefix({ collection, req }) + + const fileUrl = `${baseUrl}/${path.posix.join(prefix, filename)}` + + const blobMetadata = await head(fileUrl, { token }) + if (!blobMetadata) { + return new Response(null, { status: 404, statusText: 'Not Found' }) + } + + const { contentDisposition, contentType, size } = blobMetadata + const response = await fetch(fileUrl) + const blob = await response.blob() + + if (!blob) { + return new Response(null, { status: 204, statusText: 'No Content' }) + } + + const bodyBuffer = await blob.arrayBuffer() + + return new Response(bodyBuffer, { + headers: new Headers({ + 'Content-Disposition': contentDisposition, + 'Content-Length': String(size), + 'Content-Type': contentType, + }), + status: 200, + }) + } catch (err: unknown) { + req.payload.logger.error({ err, msg: 'Unexpected error in staticHandler' }) + return new Response('Internal Server Error', { status: 500 }) + } + } +} + +async function getFilePrefix({ + collection, + req, +}: { + collection: CollectionConfig + req: PayloadRequest +}): Promise { + const imageSizes = (collection?.upload as UploadConfig)?.imageSizes || [] + const { routeParams } = req + const filename = routeParams?.['filename'] + + const files = await req.payload.find({ + collection: collection.slug, + depth: 0, + limit: 1, + pagination: false, + where: { + or: [ + { + filename: { equals: filename }, + }, + ...imageSizes.map((imageSize) => ({ + [`sizes.${imageSize.name}.filename`]: { equals: filename }, + })), + ], + }, + }) + const prefix = files?.docs?.[0]?.prefix + return prefix ? (prefix as string) : '' +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6cdf1e1cda..c72fe9817a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -982,6 +982,9 @@ importers: '@types/find-node-modules': specifier: ^2.1.2 version: 2.1.2 + '@vercel/blob': + specifier: ^0.22.3 + version: 0.22.3 payload: specifier: workspace:* version: link:../payload @@ -3743,6 +3746,11 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false + /@fastify/busboy@2.1.1: + resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} + engines: {node: '>=14'} + dev: true + /@floating-ui/core@1.6.0: resolution: {integrity: sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==} dependencies: @@ -6512,6 +6520,16 @@ packages: /@ungap/structured-clone@1.2.0: resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + /@vercel/blob@0.22.3: + resolution: {integrity: sha512-l0t2KhbOO/I8ZNOl9zypYf1NE0837aO4/CPQNGR/RAxtj8FpdYKjhyUADUXj2gERLQmnhun+teaVs/G7vZJ/TQ==} + engines: {node: '>=16.14'} + dependencies: + async-retry: 1.3.3 + bytes: 3.1.2 + is-buffer: 2.0.5 + undici: 5.28.4 + dev: true + /@webassemblyjs/ast@1.12.1: resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==} dependencies: @@ -7385,7 +7403,6 @@ packages: /bytes@3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} - dev: false /cacheable-lookup@5.0.4: resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} @@ -10648,6 +10665,11 @@ packages: resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} dev: false + /is-buffer@2.0.5: + resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} + engines: {node: '>=4'} + dev: true + /is-callable@1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} @@ -15951,6 +15973,13 @@ packages: /undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + /undici@5.28.4: + resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} + engines: {node: '>=14.0'} + dependencies: + '@fastify/busboy': 2.1.1 + dev: true + /unfetch@4.2.0: resolution: {integrity: sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==} dev: false From 86adc6f2825673820f43592a21b42448d4f21fb2 Mon Sep 17 00:00:00 2001 From: Elliot DeNolf Date: Thu, 11 Apr 2024 23:05:22 -0400 Subject: [PATCH 113/177] chore: add vercelBlob to exports --- packages/plugin-cloud-storage/src/exports/vercelBlob.ts | 1 + 1 file changed, 1 insertion(+) create mode 100644 packages/plugin-cloud-storage/src/exports/vercelBlob.ts diff --git a/packages/plugin-cloud-storage/src/exports/vercelBlob.ts b/packages/plugin-cloud-storage/src/exports/vercelBlob.ts new file mode 100644 index 0000000000..d48c179903 --- /dev/null +++ b/packages/plugin-cloud-storage/src/exports/vercelBlob.ts @@ -0,0 +1 @@ +export { vercelBlobAdapter } from '../adapters/vercelBlob/index.js' From e3e0998772430021f613afe483990a195d1d81f9 Mon Sep 17 00:00:00 2001 From: Elliot DeNolf Date: Fri, 12 Apr 2024 00:34:41 -0400 Subject: [PATCH 114/177] chore: ignore vercelBlob pointers, adjust peer deps --- packages/plugin-cloud-storage/.gitignore | 2 ++ packages/plugin-cloud-storage/package.json | 1 + 2 files changed, 3 insertions(+) diff --git a/packages/plugin-cloud-storage/.gitignore b/packages/plugin-cloud-storage/.gitignore index d3be98a69d..428127c30c 100644 --- a/packages/plugin-cloud-storage/.gitignore +++ b/packages/plugin-cloud-storage/.gitignore @@ -4,6 +4,8 @@ gcs.d.ts gcs.js s3.d.ts s3.js +vercelBlob.d.ts +vercelBlob.js dev/tmp dev/yarn.lock diff --git a/packages/plugin-cloud-storage/package.json b/packages/plugin-cloud-storage/package.json index 2784c0bd82..92ed296f46 100644 --- a/packages/plugin-cloud-storage/package.json +++ b/packages/plugin-cloud-storage/package.json @@ -26,6 +26,7 @@ "@azure/abort-controller": "^1.0.0", "@azure/storage-blob": "^12.11.0", "@google-cloud/storage": "^7.7.0", + "@vercel/blob": "^0.22.3", "payload": "workspace:*" }, "peerDependenciesMeta": { From 8043188f36a75cb40f326c9b6cab6683b2f6c757 Mon Sep 17 00:00:00 2001 From: Elliot DeNolf Date: Fri, 12 Apr 2024 09:12:34 -0400 Subject: [PATCH 115/177] chore(pcs): update README --- packages/plugin-cloud-storage/README.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/packages/plugin-cloud-storage/README.md b/packages/plugin-cloud-storage/README.md index 8764f9e5c5..839bbe27a0 100644 --- a/packages/plugin-cloud-storage/README.md +++ b/packages/plugin-cloud-storage/README.md @@ -63,6 +63,7 @@ This plugin supports the following adapters: - [Azure Blob Storage](#azure-blob-storage-adapter) - [AWS S3-style Storage](#s3-adapter) - [Google Cloud Storage](#gcs-adapter) +- [Vercel Blob Storage](#vercel-blob-adapter) However, you can create your own adapter for any third-party service you would like to use. @@ -176,6 +177,20 @@ const adapter = gcsAdapter({ // Now you can pass this adapter to the plugin ``` +### Vercel Blob Adapter + +To use the Vercel Blob adapter, you need to have `@vercel/blob` installed in your project dependencies. + +```ts +import { vercelBlobAdapter } from '@payloadcms/plugin-cloud-storage/vercelBlob' + +const adapter = vercelBlobAdapter({ + token: process.env.BLOB_READ_WRITE_TOKEN || '', +}) +``` + +Credit to @JarvisPrestidge for the original implementation of this plugin. + ### Payload Access Control Payload ships with access control that runs _even on statically served files_. The same `read` access control property on your `upload`-enabled collections is used, and it allows you to restrict who can request your uploaded files. From bfd5f13ee9c4c8e2a70db02a24d88d22dc7cfc48 Mon Sep 17 00:00:00 2001 From: Paul Date: Fri, 12 Apr 2024 10:15:57 -0300 Subject: [PATCH 116/177] chore: add types for local api find/update operations (#5808) --- packages/payload/src/collections/operations/local/create.ts | 4 ++-- packages/payload/src/collections/operations/local/delete.ts | 4 ++-- .../payload/src/collections/operations/local/duplicate.ts | 4 ++-- packages/payload/src/collections/operations/local/find.ts | 4 ++-- packages/payload/src/collections/operations/local/findByID.ts | 4 ++-- .../src/collections/operations/local/findVersionByID.ts | 4 ++-- .../payload/src/collections/operations/local/findVersions.ts | 4 ++-- .../src/collections/operations/local/restoreVersion.ts | 4 ++-- packages/payload/src/collections/operations/local/update.ts | 4 ++-- packages/payload/src/globals/operations/findOne.ts | 2 +- packages/payload/src/globals/operations/local/findOne.ts | 4 ++-- .../payload/src/globals/operations/local/findVersionByID.ts | 4 ++-- packages/payload/src/globals/operations/local/findVersions.ts | 4 ++-- .../payload/src/globals/operations/local/restoreVersion.ts | 4 ++-- packages/payload/src/globals/operations/local/update.ts | 4 ++-- 15 files changed, 29 insertions(+), 29 deletions(-) diff --git a/packages/payload/src/collections/operations/local/create.ts b/packages/payload/src/collections/operations/local/create.ts index e5986f7464..68d4a07c9c 100644 --- a/packages/payload/src/collections/operations/local/create.ts +++ b/packages/payload/src/collections/operations/local/create.ts @@ -23,10 +23,10 @@ export type Options = { depth?: number disableVerificationEmail?: boolean draft?: boolean - fallbackLocale?: string + fallbackLocale?: GeneratedTypes['locale'] file?: File filePath?: string - locale?: string + locale?: GeneratedTypes['locale'] overrideAccess?: boolean overwriteExistingFiles?: boolean req?: PayloadRequest diff --git a/packages/payload/src/collections/operations/local/delete.ts b/packages/payload/src/collections/operations/local/delete.ts index d9e558b9a8..64505b2a1d 100644 --- a/packages/payload/src/collections/operations/local/delete.ts +++ b/packages/payload/src/collections/operations/local/delete.ts @@ -16,8 +16,8 @@ export type BaseOptions = { */ context?: RequestContext depth?: number - fallbackLocale?: string - locale?: string + fallbackLocale?: GeneratedTypes['locale'] + locale?: GeneratedTypes['locale'] overrideAccess?: boolean req?: PayloadRequest showHiddenFields?: boolean diff --git a/packages/payload/src/collections/operations/local/duplicate.ts b/packages/payload/src/collections/operations/local/duplicate.ts index 7e7a79dbb9..c267b73c4d 100644 --- a/packages/payload/src/collections/operations/local/duplicate.ts +++ b/packages/payload/src/collections/operations/local/duplicate.ts @@ -14,9 +14,9 @@ export type Options = { context?: RequestContext depth?: number draft?: boolean - fallbackLocale?: string + fallbackLocale?: GeneratedTypes['locale'] id: number | string - locale?: string + locale?: GeneratedTypes['locale'] overrideAccess?: boolean req?: PayloadRequest showHiddenFields?: boolean diff --git a/packages/payload/src/collections/operations/local/find.ts b/packages/payload/src/collections/operations/local/find.ts index b667c0c579..287610d651 100644 --- a/packages/payload/src/collections/operations/local/find.ts +++ b/packages/payload/src/collections/operations/local/find.ts @@ -16,9 +16,9 @@ export type Options = { depth?: number disableErrors?: boolean draft?: boolean - fallbackLocale?: string + fallbackLocale?: GeneratedTypes['locale'] limit?: number - locale?: string + locale?: 'all' | GeneratedTypes['locale'] overrideAccess?: boolean page?: number pagination?: boolean diff --git a/packages/payload/src/collections/operations/local/findByID.ts b/packages/payload/src/collections/operations/local/findByID.ts index 5b2af8f6c4..ac09f75a43 100644 --- a/packages/payload/src/collections/operations/local/findByID.ts +++ b/packages/payload/src/collections/operations/local/findByID.ts @@ -15,9 +15,9 @@ export type Options = { depth?: number disableErrors?: boolean draft?: boolean - fallbackLocale?: string + fallbackLocale?: GeneratedTypes['locale'] id: number | string - locale?: string + locale?: 'all' | GeneratedTypes['locale'] overrideAccess?: boolean req?: PayloadRequest showHiddenFields?: boolean diff --git a/packages/payload/src/collections/operations/local/findVersionByID.ts b/packages/payload/src/collections/operations/local/findVersionByID.ts index 625dc0ec14..200e3ac993 100644 --- a/packages/payload/src/collections/operations/local/findVersionByID.ts +++ b/packages/payload/src/collections/operations/local/findVersionByID.ts @@ -15,9 +15,9 @@ export type Options = { depth?: number disableErrors?: boolean draft?: boolean - fallbackLocale?: string + fallbackLocale?: GeneratedTypes['locale'] id: string - locale?: string + locale?: 'all' | GeneratedTypes['locale'] overrideAccess?: boolean req?: PayloadRequest showHiddenFields?: boolean diff --git a/packages/payload/src/collections/operations/local/findVersions.ts b/packages/payload/src/collections/operations/local/findVersions.ts index 0d41f85dcf..da6fb63946 100644 --- a/packages/payload/src/collections/operations/local/findVersions.ts +++ b/packages/payload/src/collections/operations/local/findVersions.ts @@ -15,9 +15,9 @@ export type Options = { context?: RequestContext depth?: number draft?: boolean - fallbackLocale?: string + fallbackLocale?: GeneratedTypes['locale'] limit?: number - locale?: string + locale?: 'all' | GeneratedTypes['locale'] overrideAccess?: boolean page?: number req?: PayloadRequest diff --git a/packages/payload/src/collections/operations/local/restoreVersion.ts b/packages/payload/src/collections/operations/local/restoreVersion.ts index 8959b6659b..d1cdefa5e5 100644 --- a/packages/payload/src/collections/operations/local/restoreVersion.ts +++ b/packages/payload/src/collections/operations/local/restoreVersion.ts @@ -13,9 +13,9 @@ export type Options = { context?: RequestContext depth?: number draft?: boolean - fallbackLocale?: string + fallbackLocale?: GeneratedTypes['locale'] id: string - locale?: string + locale?: GeneratedTypes['locale'] overrideAccess?: boolean req?: PayloadRequest showHiddenFields?: boolean diff --git a/packages/payload/src/collections/operations/local/update.ts b/packages/payload/src/collections/operations/local/update.ts index dd9a5b1309..1f1248bedc 100644 --- a/packages/payload/src/collections/operations/local/update.ts +++ b/packages/payload/src/collections/operations/local/update.ts @@ -21,10 +21,10 @@ export type BaseOptions = { data: DeepPartial depth?: number draft?: boolean - fallbackLocale?: string + fallbackLocale?: GeneratedTypes['locale'] file?: File filePath?: string - locale?: string + locale?: GeneratedTypes['locale'] overrideAccess?: boolean overwriteExistingFiles?: boolean req?: PayloadRequest diff --git a/packages/payload/src/globals/operations/findOne.ts b/packages/payload/src/globals/operations/findOne.ts index 8bfb2e9376..c18b6ab345 100644 --- a/packages/payload/src/globals/operations/findOne.ts +++ b/packages/payload/src/globals/operations/findOne.ts @@ -1,4 +1,5 @@ import type { AccessResult } from '../../config/types.js' +import type { GeneratedTypes } from '../../index.js' import type { PayloadRequest, Where } from '../../types/index.js' import type { SanitizedGlobalConfig } from '../config/types.js' @@ -13,7 +14,6 @@ type Args = { depth?: number draft?: boolean globalConfig: SanitizedGlobalConfig - locale?: string overrideAccess?: boolean req: PayloadRequest showHiddenFields?: boolean diff --git a/packages/payload/src/globals/operations/local/findOne.ts b/packages/payload/src/globals/operations/local/findOne.ts index 40f251cfa4..9c86d5cad2 100644 --- a/packages/payload/src/globals/operations/local/findOne.ts +++ b/packages/payload/src/globals/operations/local/findOne.ts @@ -9,8 +9,8 @@ export type Options = { context?: RequestContext depth?: number draft?: boolean - fallbackLocale?: string - locale?: string + fallbackLocale?: GeneratedTypes['locale'] + locale?: 'all' | GeneratedTypes['locale'] overrideAccess?: boolean req?: PayloadRequest showHiddenFields?: boolean diff --git a/packages/payload/src/globals/operations/local/findVersionByID.ts b/packages/payload/src/globals/operations/local/findVersionByID.ts index 4eddd7f5bb..5944e2de15 100644 --- a/packages/payload/src/globals/operations/local/findVersionByID.ts +++ b/packages/payload/src/globals/operations/local/findVersionByID.ts @@ -10,9 +10,9 @@ export type Options = { context?: RequestContext depth?: number disableErrors?: boolean - fallbackLocale?: string + fallbackLocale?: GeneratedTypes['locale'] id: string - locale?: string + locale?: 'all' | GeneratedTypes['locale'] overrideAccess?: boolean req?: PayloadRequest showHiddenFields?: boolean diff --git a/packages/payload/src/globals/operations/local/findVersions.ts b/packages/payload/src/globals/operations/local/findVersions.ts index 8acea2465f..30dbdbdc5a 100644 --- a/packages/payload/src/globals/operations/local/findVersions.ts +++ b/packages/payload/src/globals/operations/local/findVersions.ts @@ -10,9 +10,9 @@ import { findVersionsOperation } from '../findVersions.js' export type Options = { context?: RequestContext depth?: number - fallbackLocale?: string + fallbackLocale?: GeneratedTypes['locale'] limit?: number - locale?: string + locale?: 'all' | GeneratedTypes['locale'] overrideAccess?: boolean page?: number req?: PayloadRequest diff --git a/packages/payload/src/globals/operations/local/restoreVersion.ts b/packages/payload/src/globals/operations/local/restoreVersion.ts index bea32490ee..29d933065e 100644 --- a/packages/payload/src/globals/operations/local/restoreVersion.ts +++ b/packages/payload/src/globals/operations/local/restoreVersion.ts @@ -8,9 +8,9 @@ import { restoreVersionOperation } from '../restoreVersion.js' export type Options = { context?: RequestContext depth?: number - fallbackLocale?: string + fallbackLocale?: GeneratedTypes['locale'] id: string - locale?: string + locale?: GeneratedTypes['locale'] overrideAccess?: boolean req?: PayloadRequest showHiddenFields?: boolean diff --git a/packages/payload/src/globals/operations/local/update.ts b/packages/payload/src/globals/operations/local/update.ts index 243ebd6eda..0cc8df0a20 100644 --- a/packages/payload/src/globals/operations/local/update.ts +++ b/packages/payload/src/globals/operations/local/update.ts @@ -12,8 +12,8 @@ export type Options = { data: DeepPartial> depth?: number draft?: boolean - fallbackLocale?: string - locale?: string + fallbackLocale?: GeneratedTypes['locale'] + locale?: GeneratedTypes['locale'] overrideAccess?: boolean req?: PayloadRequest showHiddenFields?: boolean From ff5e438d6d4992ae7c9b3c53a9a04967623dd76e Mon Sep 17 00:00:00 2001 From: Jacob Fletcher Date: Fri, 12 Apr 2024 09:16:43 -0400 Subject: [PATCH 117/177] chore(ui): replaces suisse-intl font with system fallbacks --- packages/next/src/scss/app.scss | 4 +- packages/next/src/scss/fonts.scss | 75 ------------------ packages/next/src/scss/vars.scss | 7 -- packages/richtext-lexical/src/scss/app.scss | 4 +- packages/richtext-lexical/src/scss/fonts.scss | 75 ------------------ packages/richtext-lexical/src/scss/vars.scss | 7 -- packages/richtext-slate/src/scss/app.scss | 4 +- packages/richtext-slate/src/scss/fonts.scss | 75 ------------------ packages/richtext-slate/src/scss/vars.scss | 7 -- .../ui/src/assets/fonts/SuisseIntl-Bold.woff | Bin 35168 -> 0 bytes .../ui/src/assets/fonts/SuisseIntl-Bold.woff2 | Bin 23580 -> 0 bytes .../src/assets/fonts/SuisseIntl-Medium.woff | Bin 87996 -> 0 bytes .../src/assets/fonts/SuisseIntl-Medium.woff2 | Bin 61412 -> 0 bytes .../src/assets/fonts/SuisseIntl-SemiBold.woff | Bin 35080 -> 0 bytes .../assets/fonts/SuisseIntl-SemiBold.woff2 | Bin 23928 -> 0 bytes packages/ui/src/assets/fonts/SuisseIntl.woff | Bin 34288 -> 0 bytes packages/ui/src/assets/fonts/SuisseIntl.woff2 | Bin 23104 -> 0 bytes packages/ui/src/scss/app.scss | 3 +- packages/ui/src/scss/fonts.scss | 35 -------- packages/ui/src/scss/vars.scss | 7 -- test/_community/collections/Posts/index.ts | 4 + 21 files changed, 12 insertions(+), 295 deletions(-) delete mode 100644 packages/next/src/scss/fonts.scss delete mode 100644 packages/richtext-lexical/src/scss/fonts.scss delete mode 100644 packages/richtext-slate/src/scss/fonts.scss delete mode 100644 packages/ui/src/assets/fonts/SuisseIntl-Bold.woff delete mode 100644 packages/ui/src/assets/fonts/SuisseIntl-Bold.woff2 delete mode 100644 packages/ui/src/assets/fonts/SuisseIntl-Medium.woff delete mode 100644 packages/ui/src/assets/fonts/SuisseIntl-Medium.woff2 delete mode 100644 packages/ui/src/assets/fonts/SuisseIntl-SemiBold.woff delete mode 100644 packages/ui/src/assets/fonts/SuisseIntl-SemiBold.woff2 delete mode 100644 packages/ui/src/assets/fonts/SuisseIntl.woff delete mode 100644 packages/ui/src/assets/fonts/SuisseIntl.woff2 delete mode 100644 packages/ui/src/scss/fonts.scss diff --git a/packages/next/src/scss/app.scss b/packages/next/src/scss/app.scss index 38d2554bf5..c87413e4fb 100644 --- a/packages/next/src/scss/app.scss +++ b/packages/next/src/scss/app.scss @@ -1,4 +1,3 @@ -@import './fonts.scss'; @import './styles.scss'; @import './toastify.scss'; @import './colors.scss'; @@ -20,7 +19,8 @@ --theme-overlay: rgba(5, 5, 5, 0.5); --theme-baseline: #{$baseline-px}; --theme-baseline-body-size: #{$baseline-body-size}; - --font-body: 'Suisse Intl', system-ui; + --font-body: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, + sans-serif; --font-mono: monospace; --style-radius-s: #{$style-radius-s}; diff --git a/packages/next/src/scss/fonts.scss b/packages/next/src/scss/fonts.scss deleted file mode 100644 index f40a8b722e..0000000000 --- a/packages/next/src/scss/fonts.scss +++ /dev/null @@ -1,75 +0,0 @@ -@font-face { - font-family: 'Suisse Intl'; - src: - url('../assets/fonts/SuisseIntl.woff2') format('woff2'), - url('../assets/fonts/SuisseIntl.woff') format('woff'); - font-weight: normal; - font-style: normal; -} - -@font-face { - font-family: 'Suisse Intl'; - src: - url('../assets/fonts/SuisseIntl-Medium.woff2') format('woff2'), - url('../assets/fonts/SuisseIntl-Medium.woff') format('woff'); - font-weight: 500; - font-style: normal; -} - -@font-face { - font-family: 'Suisse Intl'; - src: - url('../assets/fonts/SuisseIntl-SemiBold.woff2') format('woff2'), - url('../assets/fonts/SuisseIntl-SemiBold.woff') format('woff'); - font-weight: 600; - font-style: normal; -} - -@font-face { - font-family: 'Suisse Intl'; - src: - url('../assets/fonts/SuisseIntl-Bold.woff2') format('woff2'), - url('../assets/fonts/SuisseIntl-Bold.woff') format('woff'); - font-weight: bold; - font-style: normal; -} - -@font-face { - font-family: 'Merriweather'; - font-style: normal; - font-weight: 400; - src: - local(''), - url('../assets/fonts/merriweather-v30-latin-regular.woff2') format('woff2'), - url('../assets/fonts/merriweather-v30-latin-regular.woff') format('woff'); -} - -@font-face { - font-family: 'Merriweather'; - font-style: italic; - font-weight: 400; - src: - local(''), - url('../assets/fonts/merriweather-v30-latin-italic.woff2') format('woff2'), - url('../assets/fonts/merriweather-v30-latin-italic.woff') format('woff'); -} - -@font-face { - font-family: 'Merriweather'; - font-style: normal; - font-weight: 900; - src: - local(''), - url('../assets/fonts/merriweather-v30-latin-900.woff2') format('woff2'), - url('../assets/fonts/merriweather-v30-latin-900.woff') format('woff'); -} - -@font-face { - font-family: 'Merriweather'; - font-style: italic; - font-weight: 900; - src: - local(''), - url('../assets/fonts/merriweather-v30-latin-900italic.woff2') format('woff2'), - url('../assets/fonts/merriweather-v30-latin-900italic.woff') format('woff'); -} diff --git a/packages/next/src/scss/vars.scss b/packages/next/src/scss/vars.scss index ce16a434b7..00c7d34f8a 100644 --- a/packages/next/src/scss/vars.scss +++ b/packages/next/src/scss/vars.scss @@ -21,13 +21,6 @@ $baseline: math.div($baseline-px, $baseline-body-size) + rem; @return (math.div($baseline-px, $baseline-body-size) * $multiplier) + rem; } -////////////////////////////// -// FONTS (DEPRECATED. DO NOT USE. PREFER CSS VARIABLES) -////////////////////////////// - -$font-body: 'Suisse Intl' !default; -$font-mono: monospace !default; - ////////////////////////////// // COLORS (DEPRECATED. DO NOT USE. PREFER CSS VARIABLES) ////////////////////////////// diff --git a/packages/richtext-lexical/src/scss/app.scss b/packages/richtext-lexical/src/scss/app.scss index aefd7ced20..d2424f66e0 100644 --- a/packages/richtext-lexical/src/scss/app.scss +++ b/packages/richtext-lexical/src/scss/app.scss @@ -1,4 +1,3 @@ -@import 'fonts'; @import 'styles'; @import './toastify.scss'; @import './colors.scss'; @@ -20,7 +19,8 @@ --theme-overlay: rgba(5, 5, 5, 0.5); --theme-baseline: #{$baseline-px}; --theme-baseline-body-size: #{$baseline-body-size}; - --font-body: 'Suisse Intl', system-ui; + --font-body: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, + sans-serif; --font-mono: monospace; --style-radius-s: #{$style-radius-s}; diff --git a/packages/richtext-lexical/src/scss/fonts.scss b/packages/richtext-lexical/src/scss/fonts.scss deleted file mode 100644 index f40a8b722e..0000000000 --- a/packages/richtext-lexical/src/scss/fonts.scss +++ /dev/null @@ -1,75 +0,0 @@ -@font-face { - font-family: 'Suisse Intl'; - src: - url('../assets/fonts/SuisseIntl.woff2') format('woff2'), - url('../assets/fonts/SuisseIntl.woff') format('woff'); - font-weight: normal; - font-style: normal; -} - -@font-face { - font-family: 'Suisse Intl'; - src: - url('../assets/fonts/SuisseIntl-Medium.woff2') format('woff2'), - url('../assets/fonts/SuisseIntl-Medium.woff') format('woff'); - font-weight: 500; - font-style: normal; -} - -@font-face { - font-family: 'Suisse Intl'; - src: - url('../assets/fonts/SuisseIntl-SemiBold.woff2') format('woff2'), - url('../assets/fonts/SuisseIntl-SemiBold.woff') format('woff'); - font-weight: 600; - font-style: normal; -} - -@font-face { - font-family: 'Suisse Intl'; - src: - url('../assets/fonts/SuisseIntl-Bold.woff2') format('woff2'), - url('../assets/fonts/SuisseIntl-Bold.woff') format('woff'); - font-weight: bold; - font-style: normal; -} - -@font-face { - font-family: 'Merriweather'; - font-style: normal; - font-weight: 400; - src: - local(''), - url('../assets/fonts/merriweather-v30-latin-regular.woff2') format('woff2'), - url('../assets/fonts/merriweather-v30-latin-regular.woff') format('woff'); -} - -@font-face { - font-family: 'Merriweather'; - font-style: italic; - font-weight: 400; - src: - local(''), - url('../assets/fonts/merriweather-v30-latin-italic.woff2') format('woff2'), - url('../assets/fonts/merriweather-v30-latin-italic.woff') format('woff'); -} - -@font-face { - font-family: 'Merriweather'; - font-style: normal; - font-weight: 900; - src: - local(''), - url('../assets/fonts/merriweather-v30-latin-900.woff2') format('woff2'), - url('../assets/fonts/merriweather-v30-latin-900.woff') format('woff'); -} - -@font-face { - font-family: 'Merriweather'; - font-style: italic; - font-weight: 900; - src: - local(''), - url('../assets/fonts/merriweather-v30-latin-900italic.woff2') format('woff2'), - url('../assets/fonts/merriweather-v30-latin-900italic.woff') format('woff'); -} diff --git a/packages/richtext-lexical/src/scss/vars.scss b/packages/richtext-lexical/src/scss/vars.scss index ce16a434b7..00c7d34f8a 100644 --- a/packages/richtext-lexical/src/scss/vars.scss +++ b/packages/richtext-lexical/src/scss/vars.scss @@ -21,13 +21,6 @@ $baseline: math.div($baseline-px, $baseline-body-size) + rem; @return (math.div($baseline-px, $baseline-body-size) * $multiplier) + rem; } -////////////////////////////// -// FONTS (DEPRECATED. DO NOT USE. PREFER CSS VARIABLES) -////////////////////////////// - -$font-body: 'Suisse Intl' !default; -$font-mono: monospace !default; - ////////////////////////////// // COLORS (DEPRECATED. DO NOT USE. PREFER CSS VARIABLES) ////////////////////////////// diff --git a/packages/richtext-slate/src/scss/app.scss b/packages/richtext-slate/src/scss/app.scss index aefd7ced20..d2424f66e0 100644 --- a/packages/richtext-slate/src/scss/app.scss +++ b/packages/richtext-slate/src/scss/app.scss @@ -1,4 +1,3 @@ -@import 'fonts'; @import 'styles'; @import './toastify.scss'; @import './colors.scss'; @@ -20,7 +19,8 @@ --theme-overlay: rgba(5, 5, 5, 0.5); --theme-baseline: #{$baseline-px}; --theme-baseline-body-size: #{$baseline-body-size}; - --font-body: 'Suisse Intl', system-ui; + --font-body: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, + sans-serif; --font-mono: monospace; --style-radius-s: #{$style-radius-s}; diff --git a/packages/richtext-slate/src/scss/fonts.scss b/packages/richtext-slate/src/scss/fonts.scss deleted file mode 100644 index f40a8b722e..0000000000 --- a/packages/richtext-slate/src/scss/fonts.scss +++ /dev/null @@ -1,75 +0,0 @@ -@font-face { - font-family: 'Suisse Intl'; - src: - url('../assets/fonts/SuisseIntl.woff2') format('woff2'), - url('../assets/fonts/SuisseIntl.woff') format('woff'); - font-weight: normal; - font-style: normal; -} - -@font-face { - font-family: 'Suisse Intl'; - src: - url('../assets/fonts/SuisseIntl-Medium.woff2') format('woff2'), - url('../assets/fonts/SuisseIntl-Medium.woff') format('woff'); - font-weight: 500; - font-style: normal; -} - -@font-face { - font-family: 'Suisse Intl'; - src: - url('../assets/fonts/SuisseIntl-SemiBold.woff2') format('woff2'), - url('../assets/fonts/SuisseIntl-SemiBold.woff') format('woff'); - font-weight: 600; - font-style: normal; -} - -@font-face { - font-family: 'Suisse Intl'; - src: - url('../assets/fonts/SuisseIntl-Bold.woff2') format('woff2'), - url('../assets/fonts/SuisseIntl-Bold.woff') format('woff'); - font-weight: bold; - font-style: normal; -} - -@font-face { - font-family: 'Merriweather'; - font-style: normal; - font-weight: 400; - src: - local(''), - url('../assets/fonts/merriweather-v30-latin-regular.woff2') format('woff2'), - url('../assets/fonts/merriweather-v30-latin-regular.woff') format('woff'); -} - -@font-face { - font-family: 'Merriweather'; - font-style: italic; - font-weight: 400; - src: - local(''), - url('../assets/fonts/merriweather-v30-latin-italic.woff2') format('woff2'), - url('../assets/fonts/merriweather-v30-latin-italic.woff') format('woff'); -} - -@font-face { - font-family: 'Merriweather'; - font-style: normal; - font-weight: 900; - src: - local(''), - url('../assets/fonts/merriweather-v30-latin-900.woff2') format('woff2'), - url('../assets/fonts/merriweather-v30-latin-900.woff') format('woff'); -} - -@font-face { - font-family: 'Merriweather'; - font-style: italic; - font-weight: 900; - src: - local(''), - url('../assets/fonts/merriweather-v30-latin-900italic.woff2') format('woff2'), - url('../assets/fonts/merriweather-v30-latin-900italic.woff') format('woff'); -} diff --git a/packages/richtext-slate/src/scss/vars.scss b/packages/richtext-slate/src/scss/vars.scss index ce16a434b7..00c7d34f8a 100644 --- a/packages/richtext-slate/src/scss/vars.scss +++ b/packages/richtext-slate/src/scss/vars.scss @@ -21,13 +21,6 @@ $baseline: math.div($baseline-px, $baseline-body-size) + rem; @return (math.div($baseline-px, $baseline-body-size) * $multiplier) + rem; } -////////////////////////////// -// FONTS (DEPRECATED. DO NOT USE. PREFER CSS VARIABLES) -////////////////////////////// - -$font-body: 'Suisse Intl' !default; -$font-mono: monospace !default; - ////////////////////////////// // COLORS (DEPRECATED. DO NOT USE. PREFER CSS VARIABLES) ////////////////////////////// diff --git a/packages/ui/src/assets/fonts/SuisseIntl-Bold.woff b/packages/ui/src/assets/fonts/SuisseIntl-Bold.woff deleted file mode 100644 index 063560bc0772de0926a67b7f3053643ce40a4c60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35168 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 DP`r|j diff --git a/packages/ui/src/assets/fonts/SuisseIntl-Bold.woff2 b/packages/ui/src/assets/fonts/SuisseIntl-Bold.woff2 deleted file mode 100644 index aaf4a07c6bfdbda2bf99ec53b8cae32208d7e31f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23580 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 diff --git a/packages/ui/src/assets/fonts/SuisseIntl-Medium.woff b/packages/ui/src/assets/fonts/SuisseIntl-Medium.woff deleted file mode 100644 index 1bab02008310a448be013febf7dfc21a4b8dfa5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 87996 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�_zs{6Wl5*XEzTxu;MA8i7Shp}y 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 C@k%`a diff --git a/packages/ui/src/assets/fonts/SuisseIntl-SemiBold.woff b/packages/ui/src/assets/fonts/SuisseIntl-SemiBold.woff deleted file mode 100644 index 529e69f0affe0753eac1d1e881ba7f1ad8b49009..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35080 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 f2F9cRq4+}71~vU`6$&lsjkdZcC&pF;5uB!j diff --git a/packages/ui/src/scss/app.scss b/packages/ui/src/scss/app.scss index e3f78e265e..d2424f66e0 100644 --- a/packages/ui/src/scss/app.scss +++ b/packages/ui/src/scss/app.scss @@ -19,7 +19,8 @@ --theme-overlay: rgba(5, 5, 5, 0.5); --theme-baseline: #{$baseline-px}; --theme-baseline-body-size: #{$baseline-body-size}; - --font-body: 'Suisse Intl', system-ui; + --font-body: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, + sans-serif; --font-mono: monospace; --style-radius-s: #{$style-radius-s}; diff --git a/packages/ui/src/scss/fonts.scss b/packages/ui/src/scss/fonts.scss deleted file mode 100644 index 65e8d877f7..0000000000 --- a/packages/ui/src/scss/fonts.scss +++ /dev/null @@ -1,35 +0,0 @@ -@font-face { - font-family: 'Suisse Intl'; - src: - url('../assets/fonts/SuisseIntl.woff2') format('woff2'), - url('../assets/fonts/SuisseIntl.woff') format('woff'); - font-weight: normal; - font-style: normal; -} - -@font-face { - font-family: 'Suisse Intl'; - src: - url('../assets/fonts/SuisseIntl-Medium.woff2') format('woff2'), - url('../assets/fonts/SuisseIntl-Medium.woff') format('woff'); - font-weight: 500; - font-style: normal; -} - -@font-face { - font-family: 'Suisse Intl'; - src: - url('../assets/fonts/SuisseIntl-SemiBold.woff2') format('woff2'), - url('../assets/fonts/SuisseIntl-SemiBold.woff') format('woff'); - font-weight: 600; - font-style: normal; -} - -@font-face { - font-family: 'Suisse Intl'; - src: - url('../assets/fonts/SuisseIntl-Bold.woff2') format('woff2'), - url('../assets/fonts/SuisseIntl-Bold.woff') format('woff'); - font-weight: bold; - font-style: normal; -} diff --git a/packages/ui/src/scss/vars.scss b/packages/ui/src/scss/vars.scss index ce16a434b7..00c7d34f8a 100644 --- a/packages/ui/src/scss/vars.scss +++ b/packages/ui/src/scss/vars.scss @@ -21,13 +21,6 @@ $baseline: math.div($baseline-px, $baseline-body-size) + rem; @return (math.div($baseline-px, $baseline-body-size) * $multiplier) + rem; } -////////////////////////////// -// FONTS (DEPRECATED. DO NOT USE. PREFER CSS VARIABLES) -////////////////////////////// - -$font-body: 'Suisse Intl' !default; -$font-mono: monospace !default; - ////////////////////////////// // COLORS (DEPRECATED. DO NOT USE. PREFER CSS VARIABLES) ////////////////////////////// diff --git a/test/_community/collections/Posts/index.ts b/test/_community/collections/Posts/index.ts index 46c29853bb..3eadb517f0 100644 --- a/test/_community/collections/Posts/index.ts +++ b/test/_community/collections/Posts/index.ts @@ -14,6 +14,10 @@ export const PostsCollection: CollectionConfig = { name: 'text', type: 'text', }, + { + name: 'richText', + type: 'richText', + }, // { // type: 'row', // fields: [], From 5db2863d08f4cbaa4faae53669a923d91bc743cb Mon Sep 17 00:00:00 2001 From: Elliot DeNolf Date: Fri, 12 Apr 2024 09:25:13 -0400 Subject: [PATCH 118/177] feat(pcs): export utilities --- packages/plugin-cloud-storage/.gitignore | 2 ++ packages/plugin-cloud-storage/src/exports/utilities.ts | 1 + 2 files changed, 3 insertions(+) create mode 100644 packages/plugin-cloud-storage/src/exports/utilities.ts diff --git a/packages/plugin-cloud-storage/.gitignore b/packages/plugin-cloud-storage/.gitignore index 428127c30c..28200c7237 100644 --- a/packages/plugin-cloud-storage/.gitignore +++ b/packages/plugin-cloud-storage/.gitignore @@ -6,6 +6,8 @@ s3.d.ts s3.js vercelBlob.d.ts vercelBlob.js +utilities.d.ts +utilities.js dev/tmp dev/yarn.lock diff --git a/packages/plugin-cloud-storage/src/exports/utilities.ts b/packages/plugin-cloud-storage/src/exports/utilities.ts new file mode 100644 index 0000000000..e36f9b33ec --- /dev/null +++ b/packages/plugin-cloud-storage/src/exports/utilities.ts @@ -0,0 +1 @@ +export { getFilePrefix } from '../utilities/getFilePrefix.js' From d98d0fd5bd0f736b1d3b03e4cf9666e3af787bef Mon Sep 17 00:00:00 2001 From: Elliot DeNolf Date: Fri, 12 Apr 2024 09:28:32 -0400 Subject: [PATCH 119/177] chore(pcs): use proper getFilePrefix --- .../src/adapters/vercelBlob/getFilePrefix.ts | 32 ------------------ .../src/adapters/vercelBlob/staticHandler.ts | 33 ++----------------- 2 files changed, 2 insertions(+), 63 deletions(-) delete mode 100644 packages/plugin-cloud-storage/src/adapters/vercelBlob/getFilePrefix.ts diff --git a/packages/plugin-cloud-storage/src/adapters/vercelBlob/getFilePrefix.ts b/packages/plugin-cloud-storage/src/adapters/vercelBlob/getFilePrefix.ts deleted file mode 100644 index dfbbd7b066..0000000000 --- a/packages/plugin-cloud-storage/src/adapters/vercelBlob/getFilePrefix.ts +++ /dev/null @@ -1,32 +0,0 @@ -import type { CollectionConfig, PayloadRequest, UploadConfig } from 'payload/types' - -export async function getFilePrefix({ - collection, - req, -}: { - collection: CollectionConfig - req: PayloadRequest -}): Promise { - const imageSizes = (collection?.upload as UploadConfig)?.imageSizes || [] - const { routeParams } = req - const filename = routeParams?.['filename'] - - const files = await req.payload.find({ - collection: collection.slug, - depth: 0, - limit: 1, - pagination: false, - where: { - or: [ - { - filename: { equals: filename }, - }, - ...imageSizes.map((imageSize) => ({ - [`sizes.${imageSize.name}.filename`]: { equals: filename }, - })), - ], - }, - }) - const prefix = files?.docs?.[0]?.prefix - return prefix ? (prefix as string) : '' -} diff --git a/packages/plugin-cloud-storage/src/adapters/vercelBlob/staticHandler.ts b/packages/plugin-cloud-storage/src/adapters/vercelBlob/staticHandler.ts index 67bc29a9ed..48037a5dce 100644 --- a/packages/plugin-cloud-storage/src/adapters/vercelBlob/staticHandler.ts +++ b/packages/plugin-cloud-storage/src/adapters/vercelBlob/staticHandler.ts @@ -4,6 +4,8 @@ import type { CollectionConfig, PayloadRequest, UploadConfig } from 'payload/typ import { head } from '@vercel/blob' import path from 'path' +import { getFilePrefix } from '../../utilities/getFilePrefix.js' + type StaticHandlerArgs = { baseUrl: string token: string @@ -48,34 +50,3 @@ export const getStaticHandler = ( } } } - -async function getFilePrefix({ - collection, - req, -}: { - collection: CollectionConfig - req: PayloadRequest -}): Promise { - const imageSizes = (collection?.upload as UploadConfig)?.imageSizes || [] - const { routeParams } = req - const filename = routeParams?.['filename'] - - const files = await req.payload.find({ - collection: collection.slug, - depth: 0, - limit: 1, - pagination: false, - where: { - or: [ - { - filename: { equals: filename }, - }, - ...imageSizes.map((imageSize) => ({ - [`sizes.${imageSize.name}.filename`]: { equals: filename }, - })), - ], - }, - }) - const prefix = files?.docs?.[0]?.prefix - return prefix ? (prefix as string) : '' -} From 70fcd6bf409b132bfbf310f6a52f6cd141b09fdf Mon Sep 17 00:00:00 2001 From: Elliot DeNolf Date: Fri, 12 Apr 2024 10:51:19 -0400 Subject: [PATCH 120/177] feat: rework image dimensions, use image-size --- packages/payload/package.json | 5 +- .../payload/src/uploads/generateFileData.ts | 2 +- packages/payload/src/uploads/getImageSize.ts | 27 ++++- packages/plugin-cloud-storage/package.json | 2 +- pnpm-lock.yaml | 101 ++++++++++-------- 5 files changed, 82 insertions(+), 55 deletions(-) diff --git a/packages/payload/package.json b/packages/payload/package.json index 0d41819680..47eae986c0 100644 --- a/packages/payload/package.json +++ b/packages/payload/package.json @@ -52,6 +52,7 @@ "find-up": "4.1.0", "get-tsconfig": "^4.7.2", "http-status": "1.6.2", + "image-size": "^1.1.1", "joi": "^17.12.1", "json-schema-to-typescript": "11.0.3", "jsonwebtoken": "9.0.1", @@ -62,10 +63,10 @@ "pino": "8.15.0", "pino-pretty": "10.2.0", "pluralize": "8.0.0", - "probe-image-size": "^7.2.3", "sanitize-filename": "1.6.3", "scheduler": "0.23.0", - "scmp": "2.1.0" + "scmp": "2.1.0", + "tempy": "^3.1.0" }, "devDependencies": { "@monaco-editor/react": "4.5.1", diff --git a/packages/payload/src/uploads/generateFileData.ts b/packages/payload/src/uploads/generateFileData.ts index cfd52d9c10..4879061e0c 100644 --- a/packages/payload/src/uploads/generateFileData.ts +++ b/packages/payload/src/uploads/generateFileData.ts @@ -133,7 +133,7 @@ export const generateFileData = async ({ } if (fileSupportsResize || isImage(file.mimetype)) { - dimensions = getImageSize(file) + dimensions = await getImageSize(file) fileData.width = dimensions.width fileData.height = dimensions.height } diff --git a/packages/payload/src/uploads/getImageSize.ts b/packages/payload/src/uploads/getImageSize.ts index 82450e3030..cda18d025c 100644 --- a/packages/payload/src/uploads/getImageSize.ts +++ b/packages/payload/src/uploads/getImageSize.ts @@ -1,14 +1,31 @@ import fs from 'fs' -import probeImageSize from 'probe-image-size' +import sizeOfImport from 'image-size' +import { temporaryFileTask } from 'tempy' +import { promisify } from 'util' import type { PayloadRequest } from '../types/index.js' import type { ProbedImageSize } from './types.js' -export function getImageSize(file: PayloadRequest['file']): ProbedImageSize { +const { imageSize } = sizeOfImport +const imageSizePromise = promisify(imageSize) + +export async function getImageSize(file: PayloadRequest['file']): Promise { if (file.tempFilePath) { - const data = fs.readFileSync(file.tempFilePath) - return probeImageSize.sync(data) + return imageSizePromise(file.tempFilePath) } - return probeImageSize.sync(file.data) + // Tiff file do not support buffers or streams, so we must write to file first + // then retrieve dimensions. https://github.com/image-size/image-size/issues/103 + if (file.mimetype === 'image/tiff') { + const dimensions = await temporaryFileTask( + async (filepath) => { + fs.writeFileSync(filepath, file.data) + return imageSizePromise(filepath) + }, + { extension: 'tiff' }, + ) + return dimensions + } + + return imageSize(file.data) } diff --git a/packages/plugin-cloud-storage/package.json b/packages/plugin-cloud-storage/package.json index 92ed296f46..a1bf52ad97 100644 --- a/packages/plugin-cloud-storage/package.json +++ b/packages/plugin-cloud-storage/package.json @@ -1,7 +1,7 @@ { "name": "@payloadcms/plugin-cloud-storage", "description": "The official cloud storage plugin for Payload CMS", - "version": "3.0.0-beta.6", + "version": "3.0.0-beta.6-86adc6f", "main": "./src/index.ts", "types": "./src/index.ts", "type": "module", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c72fe9817a..2614e4e0a9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -745,6 +745,9 @@ importers: http-status: specifier: 1.6.2 version: 1.6.2 + image-size: + specifier: ^1.1.1 + version: 1.1.1 joi: specifier: ^17.12.1 version: 17.12.3 @@ -775,9 +778,6 @@ importers: pluralize: specifier: 8.0.0 version: 8.0.0 - probe-image-size: - specifier: ^7.2.3 - version: 7.2.3 sanitize-filename: specifier: 1.6.3 version: 1.6.3 @@ -787,6 +787,9 @@ importers: scmp: specifier: 2.1.0 version: 2.1.0 + tempy: + specifier: ^3.1.0 + version: 3.1.0 devDependencies: '@monaco-editor/react': specifier: 4.5.1 @@ -8024,6 +8027,13 @@ packages: engines: {node: '>=8'} dev: true + /crypto-random-string@4.0.0: + resolution: {integrity: sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==} + engines: {node: '>=12'} + dependencies: + type-fest: 1.4.0 + dev: false + /css-blank-pseudo@6.0.1(postcss@8.4.38): resolution: {integrity: sha512-goSnEITByxTzU4Oh5oJZrEWudxTqk7L6IXj1UW69pO6Hv0UdX+Vsrt02FFu5DweRh2bLu6WpX/+zsQCu5O1gKw==} engines: {node: ^14 || ^16 || >=18} @@ -8346,17 +8356,6 @@ packages: dependencies: ms: 2.0.0 - /debug@3.2.7: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.3 - dev: false - /debug@4.3.4(supports-color@5.5.0): resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} @@ -10543,6 +10542,14 @@ packages: resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} engines: {node: '>= 4'} + /image-size@1.1.1: + resolution: {integrity: sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ==} + engines: {node: '>=16.x'} + hasBin: true + dependencies: + queue: 6.0.2 + dev: false + /immer@9.0.21: resolution: {integrity: sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==} @@ -10837,7 +10844,6 @@ packages: /is-stream@3.0.0: resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true /is-string@1.0.7: resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} @@ -12332,18 +12338,6 @@ packages: /natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - /needle@2.9.1: - resolution: {integrity: sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==} - engines: {node: '>= 4.4.x'} - hasBin: true - dependencies: - debug: 3.2.7 - iconv-lite: 0.4.24 - sax: 1.3.0 - transitivePeerDependencies: - - supports-color - dev: false - /negotiator@0.6.3: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} engines: {node: '>= 0.6'} @@ -13947,16 +13941,6 @@ packages: engines: {node: '>=6'} dev: false - /probe-image-size@7.2.3: - resolution: {integrity: sha512-HubhG4Rb2UH8YtV4ba0Vp5bQ7L78RTONYu/ujmCu5nBI8wGv24s4E9xSKBi0N1MowRpxk76pFCpJtW0KPzOK0w==} - dependencies: - lodash.merge: 4.6.2 - needle: 2.9.1 - stream-parser: 0.3.1 - transitivePeerDependencies: - - supports-color - dev: false - /process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} dev: true @@ -14053,6 +14037,12 @@ packages: resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} dev: true + /queue@6.0.2: + resolution: {integrity: sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==} + dependencies: + inherits: 2.0.4 + dev: false + /quick-format-unescaped@4.0.4: resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} @@ -14631,6 +14621,7 @@ packages: /sax@1.3.0: resolution: {integrity: sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==} + dev: true /saxes@6.0.0: resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} @@ -15090,14 +15081,6 @@ packages: stubs: 3.0.0 dev: true - /stream-parser@0.3.1: - resolution: {integrity: sha512-bJ/HgKq41nlKvlhccD5kaCr/P+Hu0wPNKPJOH7en+YrJu/9EgqUF+88w5Jb6KNcjOFMhfX4B2asfeAtIGuHObQ==} - dependencies: - debug: 2.6.9 - transitivePeerDependencies: - - supports-color - dev: false - /stream-shift@1.0.3: resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} dev: true @@ -15453,6 +15436,11 @@ packages: engines: {node: '>=8'} dev: true + /temp-dir@3.0.0: + resolution: {integrity: sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==} + engines: {node: '>=14.16'} + dev: false + /tempfile@3.0.0: resolution: {integrity: sha512-uNFCg478XovRi85iD42egu+eSFUmmka750Jy7L5tfHI5hQKKtbPnxaSaXAbBqCDYrw3wx4tXjKwci4/QmsZJxw==} engines: {node: '>=8'} @@ -15472,6 +15460,16 @@ packages: unique-string: 2.0.0 dev: true + /tempy@3.1.0: + resolution: {integrity: sha512-7jDLIdD2Zp0bDe5r3D2qtkd1QOCacylBuL7oa4udvN6v2pqr4+LcCr67C8DR1zkpaZ8XosF5m1yQSabKAW6f2g==} + engines: {node: '>=14.16'} + dependencies: + is-stream: 3.0.0 + temp-dir: 3.0.0 + type-fest: 2.19.0 + unique-string: 3.0.0 + dev: false + /terminal-link@2.1.1: resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==} engines: {node: '>=8'} @@ -15874,7 +15872,11 @@ packages: /type-fest@1.4.0: resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} engines: {node: '>=10'} - dev: true + + /type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + dev: false /type-fest@3.13.0: resolution: {integrity: sha512-Gur3yQGM9qiLNs0KPP7LPgeRbio2QTt4xXouobMCarR0/wyW3F+F/+OWwshg3NG0Adon7uQfSZBpB46NfhoF1A==} @@ -15991,6 +15993,13 @@ packages: crypto-random-string: 2.0.0 dev: true + /unique-string@3.0.0: + resolution: {integrity: sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==} + engines: {node: '>=12'} + dependencies: + crypto-random-string: 4.0.0 + dev: false + /universal-user-agent@6.0.1: resolution: {integrity: sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==} dev: true From 0d40d87b3100b9d389762cca04a493c364078a1c Mon Sep 17 00:00:00 2001 From: Dan Ribbens Date: Fri, 12 Apr 2024 11:18:40 -0400 Subject: [PATCH 121/177] fix(db-postgres): relationship query pagination (#5803) --- packages/db-postgres/src/find/findMany.ts | 2 +- test/collections-rest/int.spec.ts | 182 ++++++++++++++++++---- 2 files changed, 151 insertions(+), 33 deletions(-) diff --git a/packages/db-postgres/src/find/findMany.ts b/packages/db-postgres/src/find/findMany.ts index e93e8ac18d..0eaa79bd79 100644 --- a/packages/db-postgres/src/find/findMany.ts +++ b/packages/db-postgres/src/find/findMany.ts @@ -120,7 +120,7 @@ export const findMany = async function find({ const findPromise = db.query[tableName].findMany(findManyArgs) - if (pagination !== false && (orderedIDs ? orderedIDs?.length >= limit : true)) { + if (pagination !== false && (orderedIDs ? orderedIDs?.length <= limit : true)) { const selectCountMethods: ChainedMethods = [] joinAliases.forEach(({ condition, table }) => { diff --git a/test/collections-rest/int.spec.ts b/test/collections-rest/int.spec.ts index 11a5f1a5aa..d98a72e419 100644 --- a/test/collections-rest/int.spec.ts +++ b/test/collections-rest/int.spec.ts @@ -1248,46 +1248,164 @@ describe('collections-rest', () => { expect(result.docs).toEqual([post1]) }) - describe('limit', () => { + describe('pagination', () => { + let relatedDoc + beforeEach(async () => { - await mapAsync([...Array(50)], async (_, i) => - createPost({ number: i, title: 'limit-test' }), - ) - }) - - it('should query a limited set of docs', async () => { - const response = await restClient.GET(`/${slug}`, { - query: { - where: { - title: { - equals: 'limit-test', - }, - }, - limit: 15, + relatedDoc = await payload.create({ + collection: relationSlug, + data: { + name: 'test', }, }) - const result = await response.json() - - expect(response.status).toEqual(200) - expect(result.docs).toHaveLength(15) + await mapAsync([...Array(10)], async (_, i) => { + await createPost({ + number: i, + relationField: relatedDoc.id as string, + title: 'paginate-test', + }) + }) }) - it('should query all docs when limit=0', async () => { - const response = await restClient.GET(`/${slug}`, { - query: { - where: { - title: { - equals: 'limit-test', - }, + it('should paginate with where query', async () => { + const query = { + limit: 4, + where: { + title: { + equals: 'paginate-test', }, - limit: 0, }, - }) - const result = await response.json() + } + let response = await restClient.GET(`/${slug}`, { query }) + const page1 = await response.json() - expect(response.status).toEqual(200) - expect(result.docs).toHaveLength(50) - expect(result.totalPages).toEqual(1) + response = await restClient.GET(`/${slug}`, { query: { ...query, page: 2 } }) + const page2 = await response.json() + + response = await restClient.GET(`/${slug}`, { query: { ...query, page: 3 } }) + const page3 = await response.json() + + expect(page1.hasNextPage).toStrictEqual(true) + expect(page1.hasPrevPage).toStrictEqual(false) + expect(page1.limit).toStrictEqual(4) + expect(page1.nextPage).toStrictEqual(2) + expect(page1.page).toStrictEqual(1) + expect(page1.pagingCounter).toStrictEqual(1) + expect(page1.prevPage).toStrictEqual(null) + expect(page1.totalDocs).toStrictEqual(10) + expect(page1.totalPages).toStrictEqual(3) + + expect(page2.hasNextPage).toStrictEqual(true) + expect(page2.hasPrevPage).toStrictEqual(true) + expect(page2.limit).toStrictEqual(4) + expect(page2.nextPage).toStrictEqual(3) + expect(page2.page).toStrictEqual(2) + expect(page2.pagingCounter).toStrictEqual(5) + expect(page2.prevPage).toStrictEqual(1) + expect(page2.totalDocs).toStrictEqual(10) + expect(page2.totalPages).toStrictEqual(3) + + expect(page3.hasNextPage).toStrictEqual(false) + expect(page3.hasPrevPage).toStrictEqual(true) + expect(page3.limit).toStrictEqual(4) + expect(page3.nextPage).toStrictEqual(null) + expect(page3.page).toStrictEqual(3) + expect(page3.pagingCounter).toStrictEqual(9) + expect(page3.prevPage).toStrictEqual(2) + expect(page3.totalDocs).toStrictEqual(10) + expect(page3.totalPages).toStrictEqual(3) + }) + + it('should paginate with where query on relationships', async () => { + const query = { + limit: 4, + where: { + relationField: { + equals: relatedDoc.id, + }, + }, + } + let response = await restClient.GET(`/${slug}`, { query }) + const page1 = await response.json() + + response = await restClient.GET(`/${slug}`, { query: { ...query, page: 2 } }) + const page2 = await response.json() + + response = await restClient.GET(`/${slug}`, { query: { ...query, page: 3 } }) + const page3 = await response.json() + + expect(page1.hasNextPage).toStrictEqual(true) + expect(page1.hasPrevPage).toStrictEqual(false) + expect(page1.limit).toStrictEqual(4) + expect(page1.nextPage).toStrictEqual(2) + expect(page1.page).toStrictEqual(1) + expect(page1.pagingCounter).toStrictEqual(1) + expect(page1.prevPage).toStrictEqual(null) + expect(page1.totalDocs).toStrictEqual(10) + expect(page1.totalPages).toStrictEqual(3) + + expect(page2.hasNextPage).toStrictEqual(true) + expect(page2.hasPrevPage).toStrictEqual(true) + expect(page2.limit).toStrictEqual(4) + expect(page2.nextPage).toStrictEqual(3) + expect(page2.page).toStrictEqual(2) + expect(page2.pagingCounter).toStrictEqual(5) + expect(page2.prevPage).toStrictEqual(1) + expect(page2.totalDocs).toStrictEqual(10) + expect(page2.totalPages).toStrictEqual(3) + + expect(page3.hasNextPage).toStrictEqual(false) + expect(page3.hasPrevPage).toStrictEqual(true) + expect(page3.limit).toStrictEqual(4) + expect(page3.nextPage).toStrictEqual(null) + expect(page3.page).toStrictEqual(3) + expect(page3.pagingCounter).toStrictEqual(9) + expect(page3.prevPage).toStrictEqual(2) + expect(page3.totalDocs).toStrictEqual(10) + expect(page3.totalPages).toStrictEqual(3) + }) + + describe('limit', () => { + beforeEach(async () => { + await mapAsync([...Array(50)], async (_, i) => + createPost({ number: i, title: 'limit-test' }), + ) + }) + + it('should query a limited set of docs', async () => { + const response = await restClient.GET(`/${slug}`, { + query: { + where: { + title: { + equals: 'limit-test', + }, + }, + limit: 15, + }, + }) + const result = await response.json() + + expect(response.status).toEqual(200) + expect(result.docs).toHaveLength(15) + }) + + it('should query all docs when limit=0', async () => { + const response = await restClient.GET(`/${slug}`, { + query: { + where: { + title: { + equals: 'limit-test', + }, + }, + limit: 0, + }, + }) + const result = await response.json() + + expect(response.status).toEqual(200) + expect(result.docs).toHaveLength(50) + expect(result.totalPages).toEqual(1) + }) }) }) From 4f566b088c91e95f7aebd2c9af9da6f39c240b15 Mon Sep 17 00:00:00 2001 From: Elliot DeNolf Date: Fri, 12 Apr 2024 11:31:35 -0400 Subject: [PATCH 122/177] feat!: remove pointer files --- packages/payload/package.json | 2 +- packages/plugin-cloud-storage/package.json | 2 +- packages/richtext-lexical/package.json | 2 +- scripts/exportPointerFiles.ts | 110 --------------------- 4 files changed, 3 insertions(+), 113 deletions(-) delete mode 100644 scripts/exportPointerFiles.ts diff --git a/packages/payload/package.json b/packages/payload/package.json index 0d41819680..ad4ce91944 100644 --- a/packages/payload/package.json +++ b/packages/payload/package.json @@ -22,7 +22,7 @@ } }, "scripts": { - "build": "pnpm copyfiles && pnpm build:swc && pnpm build:types && tsx ../../scripts/exportPointerFiles.ts ../packages/payload dist/exports", + "build": "pnpm copyfiles && pnpm build:swc && pnpm build:types", "build:swc": "swc ./src -d ./dist --config-file .swcrc", "build:types": "tsc --emitDeclarationOnly --outDir dist", "build:watch": "nodemon --watch 'src/**' --ext 'ts,tsx' --exec \"pnpm build:tsc\"", diff --git a/packages/plugin-cloud-storage/package.json b/packages/plugin-cloud-storage/package.json index 92ed296f46..361a902641 100644 --- a/packages/plugin-cloud-storage/package.json +++ b/packages/plugin-cloud-storage/package.json @@ -13,7 +13,7 @@ "directory": "packages/plugin-cloud-storage" }, "scripts": { - "build": "pnpm build:swc && pnpm build:types && tsx ../../scripts/exportPointerFiles.ts ../packages/plugin-cloud-storage dist/exports", + "build": "pnpm build:swc && pnpm build:types", "build:swc": "swc ./src -d ./dist --config-file .swcrc", "build:types": "tsc --emitDeclarationOnly --outDir dist", "clean": "rimraf {dist,*.tsbuildinfo}", diff --git a/packages/richtext-lexical/package.json b/packages/richtext-lexical/package.json index 579aeabb6e..cde7481d26 100644 --- a/packages/richtext-lexical/package.json +++ b/packages/richtext-lexical/package.json @@ -14,7 +14,7 @@ "types": "./src/index.ts", "type": "module", "scripts": { - "build": "pnpm copyfiles && pnpm build:swc && pnpm build:types && tsx ../../scripts/exportPointerFiles.ts ../packages/richtext-lexical dist/exports", + "build": "pnpm copyfiles && pnpm build:swc && pnpm build:types", "build:swc": "swc ./src -d ./dist --config-file .swcrc", "build:types": "tsc --emitDeclarationOnly --outDir dist", "build:clean": "find . \\( -type d \\( -name build -o -name dist -o -name .cache \\) -o -type f -name tsconfig.tsbuildinfo \\) -exec rm -rf {} + && pnpm build", diff --git a/scripts/exportPointerFiles.ts b/scripts/exportPointerFiles.ts deleted file mode 100644 index 2e845ebc43..0000000000 --- a/scripts/exportPointerFiles.ts +++ /dev/null @@ -1,110 +0,0 @@ -import fs from 'fs' -import path from 'path' -import { fileURLToPath } from 'url' - -const __filename = fileURLToPath(import.meta.url) -const __dirname = path.dirname(__filename) - -const [baseDirRelativePath] = process.argv.slice(2) -const [sourceDirRelativePath] = process.argv.slice(3) - -// Base directory -const baseDir = path.resolve(__dirname, baseDirRelativePath) -const sourceDir = path.join(baseDir, sourceDirRelativePath) -const targetDir = baseDir - -// Helper function to read directories recursively and exclude .map files -function getFiles(dir: string): string[] { - const subDirs = fs.readdirSync(dir, { withFileTypes: true }) - const files = subDirs.map((dirEntry) => { - const res = path.resolve(dir, dirEntry.name) - if (dirEntry.isDirectory()) { - return getFiles(res) - } else { - // Exclude .map files - return res.endsWith('.map') ? [] : res - } - }) - return Array.prototype.concat(...files) -} - -function fixImports(fileExtension: string, content: string, depth: number): string { - const parentDirReference = '../'.repeat(depth + 1) // +1 to account for the original reference - const replacementPrefix = (depth === 0 ? './' : '../'.repeat(depth)) + 'dist/' - - if (fileExtension === '.scss') { - // Adjust paths in @import statements for SCSS - content = content.replace( - new RegExp(`(@import\\s+['"])${parentDirReference}`, 'gs'), - `$1${replacementPrefix}`, - ) - return content - } - - // Adjust paths in require statements - content = content.replace( - new RegExp(`(require\\()(['"])${parentDirReference}(.*?)\\2`, 'gs'), - `$1$2${replacementPrefix}$3$2`, - ) - content = content.replace( - new RegExp(`(require\\()(['"])\\.\\/${parentDirReference}(.*?)\\2`, 'gs'), - `$1$2${replacementPrefix}$3$2`, - ) - - // Adjust paths in import and export from statements - content = content.replace( - new RegExp(`(from\\s+['"])${parentDirReference}(.*?)\\1`, 'gs'), - `$1${replacementPrefix}$2$1`, - ) - content = content.replace( - new RegExp(`(from\\s+['"])\\.\\/${parentDirReference}(.*?)\\1`, 'gs'), - `$1${replacementPrefix}$2$1`, - ) - - // Adjust paths in simpler export statements - content = content.replace( - new RegExp(`(export.*?\\s+from\\s+['"])${parentDirReference}(.*?['"])`, 'gs'), - `$1${replacementPrefix}$2`, - ) - content = content.replace( - new RegExp(`(export.*?\\s+from\\s+['"])\\.\\/${parentDirReference}(.*?['"])`, 'gs'), - `$1${replacementPrefix}$2`, - ) - - return content -} - -const calculateDepth = (pathy: string): number => { - const parts = pathy.split(path.sep) - - // Find the index of "exports" - const exportsIndex = parts.indexOf('exports') - - if (exportsIndex === -1) { - return -1 // "exports" directory not found in the path - } - - // Calculate the depth by subtracting the number of parts up to and including "exports" from the total number of parts. - // Subtract 1 more to not count the file itself. - return parts.length - exportsIndex - 2 -} - -// Move files and adjust paths -getFiles(sourceDir).forEach((filePath) => { - const fileContent = fs.readFileSync(filePath, 'utf-8') - const relativePath = path.relative(sourceDir, filePath) - const targetPath = path.join(targetDir, relativePath) - - // Calculate the depth to correctly adjust imports - const depth = calculateDepth(filePath) - - // Create any non-existent directories - const dir = path.dirname(targetPath) - if (!fs.existsSync(dir)) { - fs.mkdirSync(dir, { recursive: true }) - } - - fs.writeFileSync(targetPath, fixImports(path.extname(filePath), fileContent, depth), 'utf-8') -}) - -console.log('Export pointer files moved and paths adjusted successfully.') From 2f446e11d60fe631bc81b523bae3f4cc2bd1d968 Mon Sep 17 00:00:00 2001 From: Paul Date: Fri, 12 Apr 2024 12:32:45 -0300 Subject: [PATCH 123/177] chore: bump nextjs dependencies to ^14.2 (#5820) fix(plugin-seo): overriding existing endpoints --- package.json | 2 +- packages/next/package.json | 2 +- packages/plugin-seo/src/index.tsx | 19 +- packages/ui/package.json | 2 +- pnpm-lock.yaml | 217 ++++---------------- test/access-control/e2e.spec.ts | 9 +- test/fields-relationship/e2e.spec.ts | 9 +- test/fields/collections/Lexical/e2e.spec.ts | 20 +- test/plugin-nested-docs/e2e.spec.ts | 7 +- test/plugin-nested-docs/payload-types.ts | 112 +++++++++- test/plugin-seo/config.ts | 4 - test/plugin-seo/e2e.spec.ts | 6 +- test/uploads/e2e.spec.ts | 9 +- 13 files changed, 199 insertions(+), 219 deletions(-) diff --git a/package.json b/package.json index d33c6fe3ff..5df248f467 100644 --- a/package.json +++ b/package.json @@ -127,7 +127,7 @@ "lint-staged": "^14.0.1", "minimist": "1.2.8", "mongodb-memory-server": "^9.0", - "next": "14.2.0-canary.22", + "next": "^14.2", "node-mocks-http": "^1.14.1", "nodemon": "3.0.3", "open": "^10.1.0", diff --git a/packages/next/package.json b/packages/next/package.json index cae7193813..b11117709b 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -77,7 +77,7 @@ }, "peerDependencies": { "http-status": "1.6.2", - "next": "14.2.0-canary.23", + "next": "^14.2", "payload": "workspace:*" }, "publishConfig": { diff --git a/packages/plugin-seo/src/index.tsx b/packages/plugin-seo/src/index.tsx index 16e5de9aab..c953ab21ff 100644 --- a/packages/plugin-seo/src/index.tsx +++ b/packages/plugin-seo/src/index.tsx @@ -45,7 +45,7 @@ const seo = Field: (props) => ( ), }, @@ -62,7 +62,7 @@ const seo = ), @@ -82,7 +82,7 @@ const seo = Field: (props) => ( ), }, @@ -105,7 +105,7 @@ const seo = Field: (props) => ( ), }, @@ -194,11 +194,12 @@ const seo = return collection }) || [], endpoints: [ + ...config.endpoints, { handler: async (req) => { const args: Parameters[0] = req.data as unknown as Parameters[0] - const result = await pluginConfig.generateTitle(args) + const result = pluginConfig.generateTitle ? await pluginConfig.generateTitle(args) : '' return new Response(JSON.stringify({ result }), { status: 200 }) }, method: 'post', @@ -208,7 +209,9 @@ const seo = handler: async (req) => { const args: Parameters[0] = req.data as unknown as Parameters[0] - const result = await pluginConfig.generateDescription(args) + const result = pluginConfig.generateDescription + ? await pluginConfig.generateDescription(args) + : '' return new Response(JSON.stringify({ result }), { status: 200 }) }, method: 'post', @@ -218,7 +221,7 @@ const seo = handler: async (req) => { const args: Parameters[0] = req.data as unknown as Parameters[0] - const result = await pluginConfig.generateURL(args) + const result = pluginConfig.generateURL ? await pluginConfig.generateURL(args) : '' return new Response(JSON.stringify({ result }), { status: 200 }) }, method: 'post', @@ -228,7 +231,7 @@ const seo = handler: async (req) => { const args: Parameters[0] = req.data as unknown as Parameters[0] - const result = await pluginConfig.generateImage(args) + const result = pluginConfig.generateImage ? await pluginConfig.generateImage(args) : '' return new Response(result, { status: 200 }) }, method: 'post', diff --git a/packages/ui/package.json b/packages/ui/package.json index 980914afa4..cbeed10dba 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -216,7 +216,7 @@ "uuid": "9.0.1" }, "peerDependencies": { - "next": "14.2.0-canary.23", + "next": "^14.2", "payload": "workspace:*", "react": "^18.0.0" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c72fe9817a..47b2c0c255 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -200,8 +200,8 @@ importers: specifier: ^9.0 version: 9.1.8 next: - specifier: 14.2.0-canary.22 - version: 14.2.0-canary.22(@babel/core@7.24.4)(react-dom@18.2.0)(react@18.2.0) + specifier: ^14.2 + version: 14.2.0(@babel/core@7.24.4)(@playwright/test@1.43.0)(react-dom@18.2.0)(react@18.2.0)(sass@1.74.1) node-mocks-http: specifier: ^1.14.1 version: 1.14.1 @@ -628,8 +628,8 @@ importers: specifier: 1.6.2 version: 1.6.2 next: - specifier: 14.2.0-canary.23 - version: 14.2.0-canary.23(@babel/core@7.24.4)(react-dom@18.2.0)(react@18.2.0)(sass@1.74.1) + specifier: ^14.2 + version: 14.2.0(@babel/core@7.24.4)(@playwright/test@1.43.0)(react-dom@18.2.0)(react@18.2.0)(sass@1.74.1) path-to-regexp: specifier: ^6.2.1 version: 6.2.2 @@ -1397,8 +1397,8 @@ importers: specifier: 2.3.0 version: 2.3.0 next: - specifier: 14.2.0-canary.23 - version: 14.2.0-canary.23(@babel/core@7.24.4)(react-dom@18.2.0)(react@18.2.0)(sass@1.74.1) + specifier: ^14.2 + version: 14.2.0(@babel/core@7.24.4)(@playwright/test@1.43.0)(react-dom@18.2.0)(react@18.2.0)(sass@1.74.1) object-to-formdata: specifier: 4.5.1 version: 4.5.1 @@ -4539,13 +4539,8 @@ packages: - utf-8-validate dev: true - /@next/env@14.2.0-canary.22: - resolution: {integrity: sha512-c72nBWQcgDwc711vtF0juZ81WPEHJbj22QzEkaqaS2cJty9IiyXTVTVzJHA1dueN9fDFCH3BeWDxoVn4y7MO8A==} - dev: true - - /@next/env@14.2.0-canary.23: - resolution: {integrity: sha512-cBlFB8Y/iE3K2NX/Km4tP4RZGLsv0D72KI9KxmZepKSkaQBSbtHM0YeHnZ51CFe9UQKzQ/1mPnCY89BjiyIQtQ==} - dev: false + /@next/env@14.2.0: + resolution: {integrity: sha512-4+70ELtSbRtYUuyRpAJmKC8NHBW2x1HMje9KO2Xd7IkoyucmV9SjgO+qeWMC0JWkRQXgydv1O7yKOK8nu/rITQ==} /@next/eslint-plugin-next@14.1.4: resolution: {integrity: sha512-n4zYNLSyCo0Ln5b7qxqQeQ34OZKXwgbdcx6kmkQbywr+0k6M3Vinft0T72R6CDAcDrne2IAgSud4uWCzFgc5HA==} @@ -4553,166 +4548,76 @@ packages: glob: 10.3.10 dev: true - /@next/swc-darwin-arm64@14.2.0-canary.22: - resolution: {integrity: sha512-aMU93w01wjqi5kfCS7Khot+lRvEtKxNrRv3KuQpXYrSaVCytMBqVwiyugo3IF5FPNuO0kMk90Wct4gxHE9jIGw==} + /@next/swc-darwin-arm64@14.2.0: + resolution: {integrity: sha512-kHktLlw0AceuDnkVljJ/4lTJagLzDiO3klR1Fzl2APDFZ8r+aTxNaNcPmpp0xLMkgRwwk6sggYeqq0Rz9K4zzA==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] requiresBuild: true - dev: true optional: true - /@next/swc-darwin-arm64@14.2.0-canary.23: - resolution: {integrity: sha512-K1f7A/0ljZO7IX+M+phguFP8lxdqMgEv1x1+gC+UmyZ1c8Na1PgirGgUwdLKxuNjyxlRqY5lkQ/FDk2FOYBSLA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@next/swc-darwin-x64@14.2.0-canary.22: - resolution: {integrity: sha512-188vbCauuryRk+ePTK6YJ5r+1tzDKVFeZmDK/1BHOeGqDUtzYqY0N+08iY4Nyg4rHb8OBO4CONfRSOTzGJw+Pg==} + /@next/swc-darwin-x64@14.2.0: + resolution: {integrity: sha512-HFSDu7lb1U3RDxXNeKH3NGRR5KyTPBSUTuIOr9jXoAso7i76gNYvnTjbuzGVWt2X5izpH908gmOYWtI7un+JrA==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] requiresBuild: true - dev: true optional: true - /@next/swc-darwin-x64@14.2.0-canary.23: - resolution: {integrity: sha512-3Zg0aZZV9Z0+4QCVNMH/LLW1dRD2mVNtuFBoTI6/7rWUiGrm/9+58sKyjjg+cE9S/zAKvJoFZP7Ask9vnrk4tg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@next/swc-linux-arm64-gnu@14.2.0-canary.22: - resolution: {integrity: sha512-RzKik7qYGzW2+UIw0SALjfsVqTF4iO5m8otBBz0Rst5poBtjPtY7Wkp362Y69g2BoNM03tG/QhsM3HGyoGKwQQ==} + /@next/swc-linux-arm64-gnu@14.2.0: + resolution: {integrity: sha512-iQsoWziO5ZMxDWZ4ZTCAc7hbJ1C9UDj/gATSqTaMjW2bJFwAsvf9UM79AKnljBl73uPZ+V0kH4rvnHTco4Ps2w==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] requiresBuild: true - dev: true optional: true - /@next/swc-linux-arm64-gnu@14.2.0-canary.23: - resolution: {integrity: sha512-OMt5uTXtEZNKaeSvviJQVXzARr3Jyk1BKUQVD10hKUa4edWBcmnrpdqiDVoDCGt9kMOdKdGqJHOJUk/jV/G15w==} + /@next/swc-linux-arm64-musl@14.2.0: + resolution: {integrity: sha512-0JOk2uzLUt8fJK5LpsKKZa74zAch7bJjjgJzR9aOMs231AlE4gPYzsSm430ckZitjPGKeH5bgDZjqwqJQKIS2w==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] requiresBuild: true - dev: false optional: true - /@next/swc-linux-arm64-musl@14.2.0-canary.22: - resolution: {integrity: sha512-u7egrTZPX+xHMc07bpICwb79omVC8oEjClOJrf2zsqExXaem2AzkGOeK6P+vPKwXOQ1dbTsdbEoYI02BCpUvmQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@next/swc-linux-arm64-musl@14.2.0-canary.23: - resolution: {integrity: sha512-vllciUQ4U99LCOBnsFt9QGf9AyE8yhBtNdNxbij5QsdQ/F53SamxrbYOgG7RisvRqFmWSQMfHdpGZOE0EUUsvQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@next/swc-linux-x64-gnu@14.2.0-canary.22: - resolution: {integrity: sha512-9cHF5tVln5yGGZJIbbRtKj0dCRB+ySnQa6/xS6e6Obe//+M8hpIuzYUJFbb7LIyAs5TL0pVs1wiFLilyZGWqtA==} + /@next/swc-linux-x64-gnu@14.2.0: + resolution: {integrity: sha512-uYHkuTzX0NM6biKNp7hdKTf+BF0iMV254SxO0B8PgrQkxUBKGmk5ysHKB+FYBfdf9xei/t8OIKlXJs9ckD943A==} engines: {node: '>= 10'} cpu: [x64] os: [linux] requiresBuild: true - dev: true optional: true - /@next/swc-linux-x64-gnu@14.2.0-canary.23: - resolution: {integrity: sha512-soKCxTCi0m0hOBSEchH2YTluvQzAEb8HIoQXxligU8C1fmFDX25pwQ4iSWmdvA6xDJn96PG2R64NyytTTMg9TQ==} + /@next/swc-linux-x64-musl@14.2.0: + resolution: {integrity: sha512-paN89nLs2dTBDtfXWty1/NVPit+q6ldwdktixYSVwiiAz647QDCd+EIYqoiS+/rPG3oXs/A7rWcJK9HVqfnMVg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] requiresBuild: true - dev: false optional: true - /@next/swc-linux-x64-musl@14.2.0-canary.22: - resolution: {integrity: sha512-tr/on4bRNu5uua86CnBVAoz7sYyoPn4n5k04hwlcHDVg08pi/DhmqPp1d7oJCSb7rY6imH3nSMqNqoAVROT2VQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@next/swc-linux-x64-musl@14.2.0-canary.23: - resolution: {integrity: sha512-Qr+4ySSYEh1hSSmUJ50oHtKopkqwo3RFb2CXpzcMqp+6U8WOMYBX+JTSCFdA3lSlUJqScIgoRoMDk9I3TZM71g==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@next/swc-win32-arm64-msvc@14.2.0-canary.22: - resolution: {integrity: sha512-H8cvi02H8uk9a1ZvtTpsaC8yxfKRFCgi8G/dMMknzHbepOMcYLa0tUJmGqDWklWZY8RnuupNqJIt/MhLmSdoTA==} + /@next/swc-win32-arm64-msvc@14.2.0: + resolution: {integrity: sha512-j1oiidZisnymYjawFqEfeGNcE22ZQ7lGUaa4pGOCVWrWeIDkPSj8zYgS9TzMNlg17Q3wSWCQC/F5uJAhSh7qcA==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] requiresBuild: true - dev: true optional: true - /@next/swc-win32-arm64-msvc@14.2.0-canary.23: - resolution: {integrity: sha512-94HGrBqz9s7z6d6hlukbkF4LiU4Bw+a+C3i+J7pBA+3BHtIyffuqmnrP3HY92trP3M328GBN01H7/zqahcvwPQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@next/swc-win32-ia32-msvc@14.2.0-canary.22: - resolution: {integrity: sha512-s8Jdg0CUp3OL5ccAMliIBzhKwSlwWDDSypjqkKcEVINnzJexgl7ymrCMzZWeNO0IOhJxMWaPdMf5xuEsSxBbKg==} + /@next/swc-win32-ia32-msvc@14.2.0: + resolution: {integrity: sha512-6ff6F4xb+QGD1jhx/dOT9Ot7PQ/GAYekV9ykwEh2EFS/cLTyU4Y3cXkX5cNtNIhpctS5NvyjW9gIksRNErYE0A==} engines: {node: '>= 10'} cpu: [ia32] os: [win32] requiresBuild: true - dev: true optional: true - /@next/swc-win32-ia32-msvc@14.2.0-canary.23: - resolution: {integrity: sha512-lrvn6ekxPyrBidQxA0kE3xyys8fCLlbhi1tl2FA0QUPHvgPbu2127Q7+UFnl/NGC9veZfCbw6b7TVFyvPseRsQ==} - engines: {node: '>= 10'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@next/swc-win32-x64-msvc@14.2.0-canary.22: - resolution: {integrity: sha512-6MrHjj76CeuYTJnVXyd43OF9fOkBSmDRbkLp+kwa+O1GZmkFZyqRNORdtMWNKbmiFPxfhd+FOgHG9fl1l05gUQ==} + /@next/swc-win32-x64-msvc@14.2.0: + resolution: {integrity: sha512-09DbG5vXAxz0eTFSf1uebWD36GF3D5toynRkgo2AlSrxwGZkWtJ1RhmrczRYQ17eD5bdo4FZ0ibiffdq5kc4vg==} engines: {node: '>= 10'} cpu: [x64] os: [win32] requiresBuild: true - dev: true - optional: true - - /@next/swc-win32-x64-msvc@14.2.0-canary.23: - resolution: {integrity: sha512-T8zZcK8M5GYWzIKOlxcothb0sixdFSowUztZTNb/kmUK8Vz1Z+TFBxU00WvBDx9ymrGP2f4EKL9YQqu2d+BmcA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: false optional: true /@nodelib/fs.scandir@2.1.5: @@ -4818,7 +4723,6 @@ packages: hasBin: true dependencies: playwright: 1.43.0(patch_hash=smjs6qro5qsqddamrqipwrbi5i) - dev: true /@polka/url@1.0.0-next.25: resolution: {integrity: sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==} @@ -9963,7 +9867,6 @@ packages: engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] requiresBuild: true - dev: true optional: true /fsevents@2.3.3: @@ -12364,61 +12267,26 @@ packages: /next-tick@1.1.0: resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} - /next@14.2.0-canary.22(@babel/core@7.24.4)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-nCqEuJLHRFDWpMfcql3D8V88GAGoEeZobxSCgi6ablFWMkzBGgrwZmsJi41OgtJnWwfF/c56MPXAgkFqbBcwyw==} + /next@14.2.0(@babel/core@7.24.4)(@playwright/test@1.43.0)(react-dom@18.2.0)(react@18.2.0)(sass@1.74.1): + resolution: {integrity: sha512-2T41HqJdKPqheR27ll7MFZ3gtTYvGew7cUc0PwPSyK9Ao5vvwpf9bYfP4V5YBGLckHF2kEGvrLte5BqLSv0s8g==} engines: {node: '>=18.17.0'} hasBin: true peerDependencies: '@opentelemetry/api': ^1.1.0 + '@playwright/test': ^1.41.2 react: ^18.2.0 react-dom: ^18.2.0 sass: ^1.3.0 peerDependenciesMeta: '@opentelemetry/api': optional: true - sass: - optional: true - dependencies: - '@next/env': 14.2.0-canary.22 - '@swc/helpers': 0.5.5 - busboy: 1.6.0 - caniuse-lite: 1.0.30001607 - graceful-fs: 4.2.11 - postcss: 8.4.31 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - styled-jsx: 5.1.1(@babel/core@7.24.4)(react@18.2.0) - optionalDependencies: - '@next/swc-darwin-arm64': 14.2.0-canary.22 - '@next/swc-darwin-x64': 14.2.0-canary.22 - '@next/swc-linux-arm64-gnu': 14.2.0-canary.22 - '@next/swc-linux-arm64-musl': 14.2.0-canary.22 - '@next/swc-linux-x64-gnu': 14.2.0-canary.22 - '@next/swc-linux-x64-musl': 14.2.0-canary.22 - '@next/swc-win32-arm64-msvc': 14.2.0-canary.22 - '@next/swc-win32-ia32-msvc': 14.2.0-canary.22 - '@next/swc-win32-x64-msvc': 14.2.0-canary.22 - transitivePeerDependencies: - - '@babel/core' - - babel-plugin-macros - dev: true - - /next@14.2.0-canary.23(@babel/core@7.24.4)(react-dom@18.2.0)(react@18.2.0)(sass@1.74.1): - resolution: {integrity: sha512-HuQYIeSlmBmTueVIxn0Zjxx5I4MD6vG3p6AsFySTF7/hMSF5qFUCHGIj3YJRWsDcUw/LQhuGPNLaGUg119YegQ==} - engines: {node: '>=18.17.0'} - hasBin: true - peerDependencies: - '@opentelemetry/api': ^1.1.0 - react: ^18.2.0 - react-dom: ^18.2.0 - sass: ^1.3.0 - peerDependenciesMeta: - '@opentelemetry/api': + '@playwright/test': optional: true sass: optional: true dependencies: - '@next/env': 14.2.0-canary.23 + '@next/env': 14.2.0 + '@playwright/test': 1.43.0 '@swc/helpers': 0.5.5 busboy: 1.6.0 caniuse-lite: 1.0.30001607 @@ -12429,19 +12297,18 @@ packages: sass: 1.74.1 styled-jsx: 5.1.1(@babel/core@7.24.4)(react@18.2.0) optionalDependencies: - '@next/swc-darwin-arm64': 14.2.0-canary.23 - '@next/swc-darwin-x64': 14.2.0-canary.23 - '@next/swc-linux-arm64-gnu': 14.2.0-canary.23 - '@next/swc-linux-arm64-musl': 14.2.0-canary.23 - '@next/swc-linux-x64-gnu': 14.2.0-canary.23 - '@next/swc-linux-x64-musl': 14.2.0-canary.23 - '@next/swc-win32-arm64-msvc': 14.2.0-canary.23 - '@next/swc-win32-ia32-msvc': 14.2.0-canary.23 - '@next/swc-win32-x64-msvc': 14.2.0-canary.23 + '@next/swc-darwin-arm64': 14.2.0 + '@next/swc-darwin-x64': 14.2.0 + '@next/swc-linux-arm64-gnu': 14.2.0 + '@next/swc-linux-arm64-musl': 14.2.0 + '@next/swc-linux-x64-gnu': 14.2.0 + '@next/swc-linux-x64-musl': 14.2.0 + '@next/swc-win32-arm64-msvc': 14.2.0 + '@next/swc-win32-ia32-msvc': 14.2.0 + '@next/swc-win32-x64-msvc': 14.2.0 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros - dev: false /node-abi@3.57.0: resolution: {integrity: sha512-Dp+A9JWxRaKuHP35H77I4kCKesDy5HUDEmScia2FyncMTOXASMyg251F5PhFoDA5uqBrDDffiLpbqnrZmNXW+g==} @@ -13111,7 +12978,6 @@ packages: resolution: {integrity: sha512-iWFjyBUH97+pUFiyTqSLd8cDMMOS0r2ZYz2qEsPjH8/bX++sbIJT35MSwKnp1r/OQBAqC5XO99xFbJ9XClhf4w==} engines: {node: '>=16'} hasBin: true - dev: true /playwright@1.43.0(patch_hash=smjs6qro5qsqddamrqipwrbi5i): resolution: {integrity: sha512-SiOKHbVjTSf6wHuGCbqrEyzlm6qvXcv7mENP+OZon1I07brfZLGdfWV0l/efAzVx7TF3Z45ov1gPEkku9q25YQ==} @@ -13121,7 +12987,6 @@ packages: playwright-core: 1.43.0 optionalDependencies: fsevents: 2.3.2 - dev: true patched: true /pluralize@8.0.0: diff --git a/test/access-control/e2e.spec.ts b/test/access-control/e2e.spec.ts index f5a94e91da..e14431dcd1 100644 --- a/test/access-control/e2e.spec.ts +++ b/test/access-control/e2e.spec.ts @@ -5,7 +5,8 @@ import { expect, test } from '@playwright/test' import path from 'path' import { fileURLToPath } from 'url' -import type { ReadOnlyCollection, RestrictedVersion } from './payload-types.js' +import type { PayloadTestSDK } from '../helpers/sdk/index.js' +import type { Config, ReadOnlyCollection, RestrictedVersion } from './payload-types.js' import { closeNav, @@ -17,7 +18,7 @@ import { saveDocAndAssert, } from '../helpers.js' import { AdminUrlUtil } from '../helpers/adminUrlUtil.js' -import { initPayloadE2E } from '../helpers/initPayloadE2E.js' +import { initPayloadE2ENoConfig } from '../helpers/initPayloadE2ENoConfig.js' import { POLL_TOPASS_TIMEOUT } from '../playwright.config.js' import { docLevelAccessSlug, @@ -40,7 +41,7 @@ const dirname = path.dirname(filename) */ const { beforeAll, describe } = test -let payload: Payload +let payload: PayloadTestSDK describe('access control', () => { let page: Page let url: AdminUrlUtil @@ -50,7 +51,7 @@ describe('access control', () => { let serverURL: string beforeAll(async ({ browser }) => { - ;({ payload, serverURL } = await initPayloadE2E({ dirname })) + ;({ payload, serverURL } = await initPayloadE2ENoConfig({ dirname })) url = new AdminUrlUtil(serverURL, slug) restrictedUrl = new AdminUrlUtil(serverURL, restrictedSlug) diff --git a/test/fields-relationship/e2e.spec.ts b/test/fields-relationship/e2e.spec.ts index 7d01c16a8c..922a64ba04 100644 --- a/test/fields-relationship/e2e.spec.ts +++ b/test/fields-relationship/e2e.spec.ts @@ -6,8 +6,10 @@ import path from 'path' import { wait } from 'payload/utilities' import { fileURLToPath } from 'url' +import type { PayloadTestSDK } from '../helpers/sdk/index.js' import type { FieldsRelationship as CollectionWithRelationships, + Config, RelationOne, RelationRestricted, RelationTwo, @@ -23,7 +25,7 @@ import { saveDocAndAssert, } from '../helpers.js' import { AdminUrlUtil } from '../helpers/adminUrlUtil.js' -import { initPayloadE2E } from '../helpers/initPayloadE2E.js' +import { initPayloadE2ENoConfig } from '../helpers/initPayloadE2ENoConfig.js' import { relationFalseFilterOptionSlug, relationOneSlug, @@ -34,12 +36,13 @@ import { relationWithTitleSlug, slug, } from './collectionSlugs.js' + const filename = fileURLToPath(import.meta.url) const dirname = path.dirname(filename) const { beforeAll, beforeEach, describe } = test -let payload: Payload +let payload: PayloadTestSDK describe('fields - relationship', () => { let url: AdminUrlUtil @@ -54,7 +57,7 @@ describe('fields - relationship', () => { let serverURL: string beforeAll(async ({ browser }) => { - ;({ payload, serverURL } = await initPayloadE2E({ dirname })) + ;({ payload, serverURL } = await initPayloadE2ENoConfig({ dirname })) url = new AdminUrlUtil(serverURL, slug) diff --git a/test/fields/collections/Lexical/e2e.spec.ts b/test/fields/collections/Lexical/e2e.spec.ts index b056a8fa26..ff08b17e6b 100644 --- a/test/fields/collections/Lexical/e2e.spec.ts +++ b/test/fields/collections/Lexical/e2e.spec.ts @@ -1,29 +1,30 @@ import type { SerializedBlockNode, SerializedLinkNode } from '@payloadcms/richtext-lexical' import type { Page } from '@playwright/test' +import type { PayloadTestSDK } from 'helpers/sdk/index.js' import type { SerializedEditorState, SerializedParagraphNode, SerializedTextNode } from 'lexical' -import type { Payload } from 'payload' import { expect, test } from '@playwright/test' +import { initPayloadE2ENoConfig } from 'helpers/initPayloadE2ENoConfig.js' +import { reInitializeDB } from 'helpers/reInit.js' import path from 'path' import { fileURLToPath } from 'url' -import type { LexicalField } from '../../payload-types.js' +import type { Config, LexicalField } from '../../payload-types.js' import { initPageConsoleErrorCatch, saveDocAndAssert } from '../../../helpers.js' import { AdminUrlUtil } from '../../../helpers/adminUrlUtil.js' -import { initPayloadE2E } from '../../../helpers/initPayloadE2E.js' import { RESTClient } from '../../../helpers/rest.js' import { POLL_TOPASS_TIMEOUT } from '../../../playwright.config.js' -import { clearAndSeedEverything } from '../../seed.js' import { lexicalFieldsSlug } from '../../slugs.js' import { lexicalDocData } from './data.js' + const filename = fileURLToPath(import.meta.url) const currentFolder = path.dirname(filename) const dirname = path.resolve(currentFolder, '../../') const { beforeAll, beforeEach, describe } = test -let payload: Payload +let payload: PayloadTestSDK let client: RESTClient let page: Page let serverURL: string @@ -49,7 +50,7 @@ async function navigateToLexicalFields(navigateToListView: boolean = true) { describe('lexical', () => { beforeAll(async ({ browser }) => { process.env.SEED_IN_CONFIG_ONINIT = 'false' // Makes it so the payload config onInit seed is not run. Otherwise, the seed would be run unnecessarily twice for the initial test run - once for beforeEach and once for onInit - ;({ payload, serverURL } = await initPayloadE2E({ dirname })) + ;({ payload, serverURL } = await initPayloadE2ENoConfig({ dirname })) const context = await browser.newContext() page = await context.newPage() @@ -57,7 +58,12 @@ describe('lexical', () => { initPageConsoleErrorCatch(page) }) beforeEach(async () => { - await clearAndSeedEverything(payload) + await reInitializeDB({ + serverURL, + snapshotKey: 'fieldsLexicalTest', + uploadsDir: path.resolve(dirname, '../Upload/uploads'), + }) + if (client) { await client.logout() } diff --git a/test/plugin-nested-docs/e2e.spec.ts b/test/plugin-nested-docs/e2e.spec.ts index 433bd1c2a5..7fe9a70c56 100644 --- a/test/plugin-nested-docs/e2e.spec.ts +++ b/test/plugin-nested-docs/e2e.spec.ts @@ -4,12 +4,11 @@ import { expect, test } from '@playwright/test' import path from 'path' import { fileURLToPath } from 'url' -import type { Page as PayloadPage } from './payload-types.js' +import type { Config, Page as PayloadPage } from './payload-types.js' import { ensureAutoLoginAndCompilationIsDone, initPageConsoleErrorCatch } from '../helpers.js' import { AdminUrlUtil } from '../helpers/adminUrlUtil.js' -import { initPayloadE2E } from '../helpers/initPayloadE2E.js' - +import { initPayloadE2ENoConfig } from '../helpers/initPayloadE2ENoConfig.js' const filename = fileURLToPath(import.meta.url) const dirname = path.dirname(filename) @@ -23,7 +22,7 @@ let childId: string describe('Nested Docs Plugin', () => { beforeAll(async ({ browser }) => { - const { serverURL, payload } = await initPayloadE2E({ dirname }) + const { serverURL, payload } = await initPayloadE2ENoConfig({ dirname }) url = new AdminUrlUtil(serverURL, 'pages') const context = await browser.newContext() page = await context.newPage() diff --git a/test/plugin-nested-docs/payload-types.ts b/test/plugin-nested-docs/payload-types.ts index 4380c19f35..68fdad6ce9 100644 --- a/test/plugin-nested-docs/payload-types.ts +++ b/test/plugin-nested-docs/payload-types.ts @@ -1,9 +1,115 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * This file was automatically generated by Payload. + * DO NOT MODIFY IT BY HAND. Instead, modify your source Payload config, + * and re-run `payload generate:types` to regenerate this file. + */ + +export interface Config { + collections: { + pages: Page + categories: Category + users: User + 'payload-preferences': PayloadPreference + 'payload-migrations': PayloadMigration + } + globals: {} + locale: 'en' | 'es' | 'de' + user: User & { + collection: 'users' + } +} +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "pages". + */ export interface Page { id: string - parent?: string + title: string slug: string - _status?: 'draft' | 'published' - title?: string + fullTitle?: string | null + parent?: (string | null) | Page + breadcrumbs?: + | { + doc?: (string | null) | Page + url?: string | null + label?: string | null + id?: string | null + }[] + | null + updatedAt: string + createdAt: string + _status?: ('draft' | 'published') | null +} +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "categories". + */ +export interface Category { + id: string + name: string + categorization?: + | { + doc?: (string | null) | Category + url?: string | null + label?: string | null + test?: string | null + id?: string | null + }[] + | null + owner?: (string | null) | Category + updatedAt: string + createdAt: string +} +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "users". + */ +export interface User { + id: string + updatedAt: string + createdAt: string + email: string + resetPasswordToken?: string | null + resetPasswordExpiration?: string | null + salt?: string | null + hash?: string | null + loginAttempts?: number | null + lockUntil?: string | null + password?: string | null +} +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "payload-preferences". + */ +export interface PayloadPreference { + id: string + user: { + relationTo: 'users' + value: string | User + } + key?: string | null + value?: + | { + [k: string]: unknown + } + | unknown[] + | string + | number + | boolean + | null + updatedAt: string + createdAt: string +} +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "payload-migrations". + */ +export interface PayloadMigration { + id: string + name?: string | null + batch?: number | null updatedAt: string createdAt: string } diff --git a/test/plugin-seo/config.ts b/test/plugin-seo/config.ts index 27f3720572..e59558a3a1 100644 --- a/test/plugin-seo/config.ts +++ b/test/plugin-seo/config.ts @@ -41,10 +41,6 @@ export default buildConfigWithDefaults({ await seed(payload) }, plugins: [ - seo({ - collections: ['users'], - tabbedUI: true, - }), seo({ collections: ['pages'], fieldOverrides: { diff --git a/test/plugin-seo/e2e.spec.ts b/test/plugin-seo/e2e.spec.ts index 0dcda420df..553235d492 100644 --- a/test/plugin-seo/e2e.spec.ts +++ b/test/plugin-seo/e2e.spec.ts @@ -5,11 +5,11 @@ import path from 'path' import { getFileByPath } from 'payload/uploads' import { fileURLToPath } from 'url' -import type { Page as PayloadPage } from './payload-types.js' +import type { Config, Page as PayloadPage } from './payload-types.js' import { ensureAutoLoginAndCompilationIsDone, initPageConsoleErrorCatch } from '../helpers.js' import { AdminUrlUtil } from '../helpers/adminUrlUtil.js' -import { initPayloadE2E } from '../helpers/initPayloadE2E.js' +import { initPayloadE2ENoConfig } from '../helpers/initPayloadE2ENoConfig.js' import { mediaSlug } from './shared.js' const filename = fileURLToPath(import.meta.url) @@ -23,7 +23,7 @@ let id: string describe('SEO Plugin', () => { beforeAll(async ({ browser }) => { - const { serverURL, payload } = await initPayloadE2E({ dirname }) + const { serverURL, payload } = await initPayloadE2ENoConfig({ dirname }) url = new AdminUrlUtil(serverURL, 'pages') const context = await browser.newContext() diff --git a/test/uploads/e2e.spec.ts b/test/uploads/e2e.spec.ts index 2e937195d4..c392d8f97e 100644 --- a/test/uploads/e2e.spec.ts +++ b/test/uploads/e2e.spec.ts @@ -6,7 +6,8 @@ import path from 'path' import { wait } from 'payload/utilities' import { fileURLToPath } from 'url' -import type { Media } from './payload-types.js' +import type { PayloadTestSDK } from '../helpers/sdk/index.js' +import type { Config, Media } from './payload-types.js' import { ensureAutoLoginAndCompilationIsDone, @@ -15,7 +16,7 @@ import { saveDocAndAssert, } from '../helpers.js' import { AdminUrlUtil } from '../helpers/adminUrlUtil.js' -import { initPayloadE2E } from '../helpers/initPayloadE2E.js' +import { initPayloadE2ENoConfig } from '../helpers/initPayloadE2ENoConfig.js' import { RESTClient } from '../helpers/rest.js' import { adminThumbnailFunctionSlug, @@ -29,7 +30,7 @@ const dirname = path.dirname(filename) const { beforeAll, describe } = test -let payload: Payload +let payload: PayloadTestSDK let client: RESTClient let serverURL: string let mediaURL: AdminUrlUtil @@ -44,7 +45,7 @@ describe('uploads', () => { let audioDoc: Media beforeAll(async ({ browser }) => { - ;({ payload, serverURL } = await initPayloadE2E({ dirname })) + ;({ payload, serverURL } = await initPayloadE2ENoConfig({ dirname })) client = new RESTClient(null, { defaultSlug: 'users', serverURL }) await client.login() From c2c637b359692dbc9a4de0fb9cd1dc92f190e359 Mon Sep 17 00:00:00 2001 From: Elliot DeNolf Date: Fri, 12 Apr 2024 11:35:25 -0400 Subject: [PATCH 124/177] chore: clean up unused files --- packages/payload/schema.graphql | 1712 ------------------------------- packages/payload/scss.scss | 6 - packages/payload/templates.ts | 2 - packages/payload/uploads.d.ts | 2 - packages/payload/uploads.js | 3 - 5 files changed, 1725 deletions(-) delete mode 100644 packages/payload/schema.graphql delete mode 100644 packages/payload/scss.scss delete mode 100644 packages/payload/templates.ts delete mode 100644 packages/payload/uploads.d.ts delete mode 100644 packages/payload/uploads.js diff --git a/packages/payload/schema.graphql b/packages/payload/schema.graphql deleted file mode 100644 index 8dc3f178eb..0000000000 --- a/packages/payload/schema.graphql +++ /dev/null @@ -1,1712 +0,0 @@ -type Query { - Post(id: String!, draft: Boolean): Post - Posts(where: Post_where, draft: Boolean, page: Int, limit: Int, sort: String): Posts - docAccessPost(id: String!): postsDocAccess - Media(id: String!, draft: Boolean): Media - allMedia(where: Media_where, draft: Boolean, page: Int, limit: Int, sort: String): allMedia - docAccessMedia(id: String!): mediaDocAccess - User(id: String!, draft: Boolean): User - Users(where: User_where, draft: Boolean, page: Int, limit: Int, sort: String): Users - docAccessUser(id: String!): usersDocAccess - meUser: usersMe - initializedUser: Boolean - Menu(draft: Boolean): Menu - docAccessMenu: menuDocAccess - Preference(key: String): Preference - Access: Access -} - -type Post { - id: String - text: String - associatedMedia(where: Post_AssociatedMedia_where): Media - updatedAt: DateTime - createdAt: DateTime -} - -type Media { - id: String - updatedAt: DateTime - createdAt: DateTime - url: String - filename: String - mimeType: String - filesize: Float - width: Float - height: Float -} - -""" -A date-time string at UTC, such as 2007-12-03T10:15:30Z, compliant with the `date-time` format outlined in section 5.6 of the RFC 3339 profile of the ISO 8601 standard for representation of dates and times using the Gregorian calendar. -""" -scalar DateTime - -input Post_AssociatedMedia_where { - updatedAt: Post_AssociatedMedia_updatedAt_operator - createdAt: Post_AssociatedMedia_createdAt_operator - url: Post_AssociatedMedia_url_operator - filename: Post_AssociatedMedia_filename_operator - mimeType: Post_AssociatedMedia_mimeType_operator - filesize: Post_AssociatedMedia_filesize_operator - width: Post_AssociatedMedia_width_operator - height: Post_AssociatedMedia_height_operator - id: Post_AssociatedMedia_id_operator - OR: [Post_AssociatedMedia_where_or] - AND: [Post_AssociatedMedia_where_and] -} - -input Post_AssociatedMedia_updatedAt_operator { - equals: DateTime - not_equals: DateTime - greater_than_equal: DateTime - greater_than: DateTime - less_than_equal: DateTime - less_than: DateTime - like: DateTime - exists: Boolean -} - -input Post_AssociatedMedia_createdAt_operator { - equals: DateTime - not_equals: DateTime - greater_than_equal: DateTime - greater_than: DateTime - less_than_equal: DateTime - less_than: DateTime - like: DateTime - exists: Boolean -} - -input Post_AssociatedMedia_url_operator { - equals: String - not_equals: String - like: String - contains: String - in: [String] - not_in: [[String]] - all: [[[String]]] - exists: Boolean -} - -input Post_AssociatedMedia_filename_operator { - equals: String - not_equals: String - like: String - contains: String - in: [String] - not_in: [[String]] - all: [[[String]]] - exists: Boolean -} - -input Post_AssociatedMedia_mimeType_operator { - equals: String - not_equals: String - like: String - contains: String - in: [String] - not_in: [[String]] - all: [[[String]]] - exists: Boolean -} - -input Post_AssociatedMedia_filesize_operator { - equals: Float - not_equals: Float - greater_than_equal: Float - greater_than: Float - less_than_equal: Float - less_than: Float - exists: Boolean -} - -input Post_AssociatedMedia_width_operator { - equals: Float - not_equals: Float - greater_than_equal: Float - greater_than: Float - less_than_equal: Float - less_than: Float - exists: Boolean -} - -input Post_AssociatedMedia_height_operator { - equals: Float - not_equals: Float - greater_than_equal: Float - greater_than: Float - less_than_equal: Float - less_than: Float - exists: Boolean -} - -input Post_AssociatedMedia_id_operator { - equals: String - not_equals: String - like: String - contains: String - in: [String] - not_in: [[String]] - all: [[[String]]] - exists: Boolean -} - -input Post_AssociatedMedia_where_or { - updatedAt: Post_AssociatedMedia_updatedAt_operator - createdAt: Post_AssociatedMedia_createdAt_operator - url: Post_AssociatedMedia_url_operator - filename: Post_AssociatedMedia_filename_operator - mimeType: Post_AssociatedMedia_mimeType_operator - filesize: Post_AssociatedMedia_filesize_operator - width: Post_AssociatedMedia_width_operator - height: Post_AssociatedMedia_height_operator - id: Post_AssociatedMedia_id_operator -} - -input Post_AssociatedMedia_where_and { - updatedAt: Post_AssociatedMedia_updatedAt_operator - createdAt: Post_AssociatedMedia_createdAt_operator - url: Post_AssociatedMedia_url_operator - filename: Post_AssociatedMedia_filename_operator - mimeType: Post_AssociatedMedia_mimeType_operator - filesize: Post_AssociatedMedia_filesize_operator - width: Post_AssociatedMedia_width_operator - height: Post_AssociatedMedia_height_operator - id: Post_AssociatedMedia_id_operator -} - -type Posts { - docs: [Post] - totalDocs: Int - offset: Int - limit: Int - totalPages: Int - page: Int - pagingCounter: Int - hasPrevPage: Boolean - hasNextPage: Boolean - prevPage: Int - nextPage: Int -} - -input Post_where { - text: Post_text_operator - associatedMedia: Post_associatedMedia_operator - updatedAt: Post_updatedAt_operator - createdAt: Post_createdAt_operator - id: Post_id_operator - OR: [Post_where_or] - AND: [Post_where_and] -} - -input Post_text_operator { - equals: String - not_equals: String - like: String - contains: String - in: [String] - not_in: [[String]] - all: [[[String]]] - exists: Boolean -} - -input Post_associatedMedia_operator { - equals: String - not_equals: String - exists: Boolean -} - -input Post_updatedAt_operator { - equals: DateTime - not_equals: DateTime - greater_than_equal: DateTime - greater_than: DateTime - less_than_equal: DateTime - less_than: DateTime - like: DateTime - exists: Boolean -} - -input Post_createdAt_operator { - equals: DateTime - not_equals: DateTime - greater_than_equal: DateTime - greater_than: DateTime - less_than_equal: DateTime - less_than: DateTime - like: DateTime - exists: Boolean -} - -input Post_id_operator { - equals: String - not_equals: String - like: String - contains: String - in: [String] - not_in: [[String]] - all: [[[String]]] - exists: Boolean -} - -input Post_where_or { - text: Post_text_operator - associatedMedia: Post_associatedMedia_operator - updatedAt: Post_updatedAt_operator - createdAt: Post_createdAt_operator - id: Post_id_operator -} - -input Post_where_and { - text: Post_text_operator - associatedMedia: Post_associatedMedia_operator - updatedAt: Post_updatedAt_operator - createdAt: Post_createdAt_operator - id: Post_id_operator -} - -type postsDocAccess { - fields: PostsDocAccessFields - create: PostsCreateDocAccess - read: PostsReadDocAccess - update: PostsUpdateDocAccess - delete: PostsDeleteDocAccess -} - -type PostsDocAccessFields { - text: PostsDocAccessFields_text - associatedMedia: PostsDocAccessFields_associatedMedia - updatedAt: PostsDocAccessFields_updatedAt - createdAt: PostsDocAccessFields_createdAt -} - -type PostsDocAccessFields_text { - create: PostsDocAccessFields_text_Create - read: PostsDocAccessFields_text_Read - update: PostsDocAccessFields_text_Update - delete: PostsDocAccessFields_text_Delete -} - -type PostsDocAccessFields_text_Create { - permission: Boolean! -} - -type PostsDocAccessFields_text_Read { - permission: Boolean! -} - -type PostsDocAccessFields_text_Update { - permission: Boolean! -} - -type PostsDocAccessFields_text_Delete { - permission: Boolean! -} - -type PostsDocAccessFields_associatedMedia { - create: PostsDocAccessFields_associatedMedia_Create - read: PostsDocAccessFields_associatedMedia_Read - update: PostsDocAccessFields_associatedMedia_Update - delete: PostsDocAccessFields_associatedMedia_Delete -} - -type PostsDocAccessFields_associatedMedia_Create { - permission: Boolean! -} - -type PostsDocAccessFields_associatedMedia_Read { - permission: Boolean! -} - -type PostsDocAccessFields_associatedMedia_Update { - permission: Boolean! -} - -type PostsDocAccessFields_associatedMedia_Delete { - permission: Boolean! -} - -type PostsDocAccessFields_updatedAt { - create: PostsDocAccessFields_updatedAt_Create - read: PostsDocAccessFields_updatedAt_Read - update: PostsDocAccessFields_updatedAt_Update - delete: PostsDocAccessFields_updatedAt_Delete -} - -type PostsDocAccessFields_updatedAt_Create { - permission: Boolean! -} - -type PostsDocAccessFields_updatedAt_Read { - permission: Boolean! -} - -type PostsDocAccessFields_updatedAt_Update { - permission: Boolean! -} - -type PostsDocAccessFields_updatedAt_Delete { - permission: Boolean! -} - -type PostsDocAccessFields_createdAt { - create: PostsDocAccessFields_createdAt_Create - read: PostsDocAccessFields_createdAt_Read - update: PostsDocAccessFields_createdAt_Update - delete: PostsDocAccessFields_createdAt_Delete -} - -type PostsDocAccessFields_createdAt_Create { - permission: Boolean! -} - -type PostsDocAccessFields_createdAt_Read { - permission: Boolean! -} - -type PostsDocAccessFields_createdAt_Update { - permission: Boolean! -} - -type PostsDocAccessFields_createdAt_Delete { - permission: Boolean! -} - -type PostsCreateDocAccess { - permission: Boolean! - where: JSONObject -} - -""" -The `JSONObject` scalar type represents JSON objects as specified by [ECMA-404](http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf). -""" -scalar JSONObject - -type PostsReadDocAccess { - permission: Boolean! - where: JSONObject -} - -type PostsUpdateDocAccess { - permission: Boolean! - where: JSONObject -} - -type PostsDeleteDocAccess { - permission: Boolean! - where: JSONObject -} - -type allMedia { - docs: [Media] - totalDocs: Int - offset: Int - limit: Int - totalPages: Int - page: Int - pagingCounter: Int - hasPrevPage: Boolean - hasNextPage: Boolean - prevPage: Int - nextPage: Int -} - -input Media_where { - updatedAt: Media_updatedAt_operator - createdAt: Media_createdAt_operator - url: Media_url_operator - filename: Media_filename_operator - mimeType: Media_mimeType_operator - filesize: Media_filesize_operator - width: Media_width_operator - height: Media_height_operator - id: Media_id_operator - OR: [Media_where_or] - AND: [Media_where_and] -} - -input Media_updatedAt_operator { - equals: DateTime - not_equals: DateTime - greater_than_equal: DateTime - greater_than: DateTime - less_than_equal: DateTime - less_than: DateTime - like: DateTime - exists: Boolean -} - -input Media_createdAt_operator { - equals: DateTime - not_equals: DateTime - greater_than_equal: DateTime - greater_than: DateTime - less_than_equal: DateTime - less_than: DateTime - like: DateTime - exists: Boolean -} - -input Media_url_operator { - equals: String - not_equals: String - like: String - contains: String - in: [String] - not_in: [[String]] - all: [[[String]]] - exists: Boolean -} - -input Media_filename_operator { - equals: String - not_equals: String - like: String - contains: String - in: [String] - not_in: [[String]] - all: [[[String]]] - exists: Boolean -} - -input Media_mimeType_operator { - equals: String - not_equals: String - like: String - contains: String - in: [String] - not_in: [[String]] - all: [[[String]]] - exists: Boolean -} - -input Media_filesize_operator { - equals: Float - not_equals: Float - greater_than_equal: Float - greater_than: Float - less_than_equal: Float - less_than: Float - exists: Boolean -} - -input Media_width_operator { - equals: Float - not_equals: Float - greater_than_equal: Float - greater_than: Float - less_than_equal: Float - less_than: Float - exists: Boolean -} - -input Media_height_operator { - equals: Float - not_equals: Float - greater_than_equal: Float - greater_than: Float - less_than_equal: Float - less_than: Float - exists: Boolean -} - -input Media_id_operator { - equals: String - not_equals: String - like: String - contains: String - in: [String] - not_in: [[String]] - all: [[[String]]] - exists: Boolean -} - -input Media_where_or { - updatedAt: Media_updatedAt_operator - createdAt: Media_createdAt_operator - url: Media_url_operator - filename: Media_filename_operator - mimeType: Media_mimeType_operator - filesize: Media_filesize_operator - width: Media_width_operator - height: Media_height_operator - id: Media_id_operator -} - -input Media_where_and { - updatedAt: Media_updatedAt_operator - createdAt: Media_createdAt_operator - url: Media_url_operator - filename: Media_filename_operator - mimeType: Media_mimeType_operator - filesize: Media_filesize_operator - width: Media_width_operator - height: Media_height_operator - id: Media_id_operator -} - -type mediaDocAccess { - fields: MediaDocAccessFields - create: MediaCreateDocAccess - read: MediaReadDocAccess - update: MediaUpdateDocAccess - delete: MediaDeleteDocAccess -} - -type MediaDocAccessFields { - updatedAt: MediaDocAccessFields_updatedAt - createdAt: MediaDocAccessFields_createdAt - url: MediaDocAccessFields_url - filename: MediaDocAccessFields_filename - mimeType: MediaDocAccessFields_mimeType - filesize: MediaDocAccessFields_filesize - width: MediaDocAccessFields_width - height: MediaDocAccessFields_height -} - -type MediaDocAccessFields_updatedAt { - create: MediaDocAccessFields_updatedAt_Create - read: MediaDocAccessFields_updatedAt_Read - update: MediaDocAccessFields_updatedAt_Update - delete: MediaDocAccessFields_updatedAt_Delete -} - -type MediaDocAccessFields_updatedAt_Create { - permission: Boolean! -} - -type MediaDocAccessFields_updatedAt_Read { - permission: Boolean! -} - -type MediaDocAccessFields_updatedAt_Update { - permission: Boolean! -} - -type MediaDocAccessFields_updatedAt_Delete { - permission: Boolean! -} - -type MediaDocAccessFields_createdAt { - create: MediaDocAccessFields_createdAt_Create - read: MediaDocAccessFields_createdAt_Read - update: MediaDocAccessFields_createdAt_Update - delete: MediaDocAccessFields_createdAt_Delete -} - -type MediaDocAccessFields_createdAt_Create { - permission: Boolean! -} - -type MediaDocAccessFields_createdAt_Read { - permission: Boolean! -} - -type MediaDocAccessFields_createdAt_Update { - permission: Boolean! -} - -type MediaDocAccessFields_createdAt_Delete { - permission: Boolean! -} - -type MediaDocAccessFields_url { - create: MediaDocAccessFields_url_Create - read: MediaDocAccessFields_url_Read - update: MediaDocAccessFields_url_Update - delete: MediaDocAccessFields_url_Delete -} - -type MediaDocAccessFields_url_Create { - permission: Boolean! -} - -type MediaDocAccessFields_url_Read { - permission: Boolean! -} - -type MediaDocAccessFields_url_Update { - permission: Boolean! -} - -type MediaDocAccessFields_url_Delete { - permission: Boolean! -} - -type MediaDocAccessFields_filename { - create: MediaDocAccessFields_filename_Create - read: MediaDocAccessFields_filename_Read - update: MediaDocAccessFields_filename_Update - delete: MediaDocAccessFields_filename_Delete -} - -type MediaDocAccessFields_filename_Create { - permission: Boolean! -} - -type MediaDocAccessFields_filename_Read { - permission: Boolean! -} - -type MediaDocAccessFields_filename_Update { - permission: Boolean! -} - -type MediaDocAccessFields_filename_Delete { - permission: Boolean! -} - -type MediaDocAccessFields_mimeType { - create: MediaDocAccessFields_mimeType_Create - read: MediaDocAccessFields_mimeType_Read - update: MediaDocAccessFields_mimeType_Update - delete: MediaDocAccessFields_mimeType_Delete -} - -type MediaDocAccessFields_mimeType_Create { - permission: Boolean! -} - -type MediaDocAccessFields_mimeType_Read { - permission: Boolean! -} - -type MediaDocAccessFields_mimeType_Update { - permission: Boolean! -} - -type MediaDocAccessFields_mimeType_Delete { - permission: Boolean! -} - -type MediaDocAccessFields_filesize { - create: MediaDocAccessFields_filesize_Create - read: MediaDocAccessFields_filesize_Read - update: MediaDocAccessFields_filesize_Update - delete: MediaDocAccessFields_filesize_Delete -} - -type MediaDocAccessFields_filesize_Create { - permission: Boolean! -} - -type MediaDocAccessFields_filesize_Read { - permission: Boolean! -} - -type MediaDocAccessFields_filesize_Update { - permission: Boolean! -} - -type MediaDocAccessFields_filesize_Delete { - permission: Boolean! -} - -type MediaDocAccessFields_width { - create: MediaDocAccessFields_width_Create - read: MediaDocAccessFields_width_Read - update: MediaDocAccessFields_width_Update - delete: MediaDocAccessFields_width_Delete -} - -type MediaDocAccessFields_width_Create { - permission: Boolean! -} - -type MediaDocAccessFields_width_Read { - permission: Boolean! -} - -type MediaDocAccessFields_width_Update { - permission: Boolean! -} - -type MediaDocAccessFields_width_Delete { - permission: Boolean! -} - -type MediaDocAccessFields_height { - create: MediaDocAccessFields_height_Create - read: MediaDocAccessFields_height_Read - update: MediaDocAccessFields_height_Update - delete: MediaDocAccessFields_height_Delete -} - -type MediaDocAccessFields_height_Create { - permission: Boolean! -} - -type MediaDocAccessFields_height_Read { - permission: Boolean! -} - -type MediaDocAccessFields_height_Update { - permission: Boolean! -} - -type MediaDocAccessFields_height_Delete { - permission: Boolean! -} - -type MediaCreateDocAccess { - permission: Boolean! - where: JSONObject -} - -type MediaReadDocAccess { - permission: Boolean! - where: JSONObject -} - -type MediaUpdateDocAccess { - permission: Boolean! - where: JSONObject -} - -type MediaDeleteDocAccess { - permission: Boolean! - where: JSONObject -} - -type User { - id: String - updatedAt: DateTime - createdAt: DateTime - email: EmailAddress - resetPasswordToken: String - resetPasswordExpiration: DateTime - loginAttempts: Float - lockUntil: DateTime - password: String! -} - -""" -A field whose value conforms to the standard internet email address format as specified in HTML Spec: https://html.spec.whatwg.org/multipage/input.html#valid-e-mail-address. -""" -scalar EmailAddress - @specifiedBy(url: "https://html.spec.whatwg.org/multipage/input.html#valid-e-mail-address") - -type Users { - docs: [User] - totalDocs: Int - offset: Int - limit: Int - totalPages: Int - page: Int - pagingCounter: Int - hasPrevPage: Boolean - hasNextPage: Boolean - prevPage: Int - nextPage: Int -} - -input User_where { - updatedAt: User_updatedAt_operator - createdAt: User_createdAt_operator - email: User_email_operator - id: User_id_operator - OR: [User_where_or] - AND: [User_where_and] -} - -input User_updatedAt_operator { - equals: DateTime - not_equals: DateTime - greater_than_equal: DateTime - greater_than: DateTime - less_than_equal: DateTime - less_than: DateTime - like: DateTime - exists: Boolean -} - -input User_createdAt_operator { - equals: DateTime - not_equals: DateTime - greater_than_equal: DateTime - greater_than: DateTime - less_than_equal: DateTime - less_than: DateTime - like: DateTime - exists: Boolean -} - -input User_email_operator { - equals: EmailAddress - not_equals: EmailAddress - like: EmailAddress - contains: EmailAddress - in: [EmailAddress] - not_in: [[EmailAddress]] - all: [[[EmailAddress]]] - exists: Boolean -} - -input User_id_operator { - equals: String - not_equals: String - like: String - contains: String - in: [String] - not_in: [[String]] - all: [[[String]]] - exists: Boolean -} - -input User_where_or { - updatedAt: User_updatedAt_operator - createdAt: User_createdAt_operator - email: User_email_operator - id: User_id_operator -} - -input User_where_and { - updatedAt: User_updatedAt_operator - createdAt: User_createdAt_operator - email: User_email_operator - id: User_id_operator -} - -type usersDocAccess { - fields: UsersDocAccessFields - create: UsersCreateDocAccess - read: UsersReadDocAccess - update: UsersUpdateDocAccess - delete: UsersDeleteDocAccess - unlock: UsersUnlockDocAccess -} - -type UsersDocAccessFields { - updatedAt: UsersDocAccessFields_updatedAt - createdAt: UsersDocAccessFields_createdAt - email: UsersDocAccessFields_email - password: UsersDocAccessFields_password -} - -type UsersDocAccessFields_updatedAt { - create: UsersDocAccessFields_updatedAt_Create - read: UsersDocAccessFields_updatedAt_Read - update: UsersDocAccessFields_updatedAt_Update - delete: UsersDocAccessFields_updatedAt_Delete -} - -type UsersDocAccessFields_updatedAt_Create { - permission: Boolean! -} - -type UsersDocAccessFields_updatedAt_Read { - permission: Boolean! -} - -type UsersDocAccessFields_updatedAt_Update { - permission: Boolean! -} - -type UsersDocAccessFields_updatedAt_Delete { - permission: Boolean! -} - -type UsersDocAccessFields_createdAt { - create: UsersDocAccessFields_createdAt_Create - read: UsersDocAccessFields_createdAt_Read - update: UsersDocAccessFields_createdAt_Update - delete: UsersDocAccessFields_createdAt_Delete -} - -type UsersDocAccessFields_createdAt_Create { - permission: Boolean! -} - -type UsersDocAccessFields_createdAt_Read { - permission: Boolean! -} - -type UsersDocAccessFields_createdAt_Update { - permission: Boolean! -} - -type UsersDocAccessFields_createdAt_Delete { - permission: Boolean! -} - -type UsersDocAccessFields_email { - create: UsersDocAccessFields_email_Create - read: UsersDocAccessFields_email_Read - update: UsersDocAccessFields_email_Update - delete: UsersDocAccessFields_email_Delete -} - -type UsersDocAccessFields_email_Create { - permission: Boolean! -} - -type UsersDocAccessFields_email_Read { - permission: Boolean! -} - -type UsersDocAccessFields_email_Update { - permission: Boolean! -} - -type UsersDocAccessFields_email_Delete { - permission: Boolean! -} - -type UsersDocAccessFields_password { - create: UsersDocAccessFields_password_Create - read: UsersDocAccessFields_password_Read - update: UsersDocAccessFields_password_Update - delete: UsersDocAccessFields_password_Delete -} - -type UsersDocAccessFields_password_Create { - permission: Boolean! -} - -type UsersDocAccessFields_password_Read { - permission: Boolean! -} - -type UsersDocAccessFields_password_Update { - permission: Boolean! -} - -type UsersDocAccessFields_password_Delete { - permission: Boolean! -} - -type UsersCreateDocAccess { - permission: Boolean! - where: JSONObject -} - -type UsersReadDocAccess { - permission: Boolean! - where: JSONObject -} - -type UsersUpdateDocAccess { - permission: Boolean! - where: JSONObject -} - -type UsersDeleteDocAccess { - permission: Boolean! - where: JSONObject -} - -type UsersUnlockDocAccess { - permission: Boolean! - where: JSONObject -} - -type usersMe { - token: String - user: User - exp: Int - collection: String -} - -type Menu { - globalText: String -} - -type menuDocAccess { - fields: MenuDocAccessFields - read: MenuReadDocAccess - update: MenuUpdateDocAccess -} - -type MenuDocAccessFields { - globalText: MenuDocAccessFields_globalText -} - -type MenuDocAccessFields_globalText { - create: MenuDocAccessFields_globalText_Create - read: MenuDocAccessFields_globalText_Read - update: MenuDocAccessFields_globalText_Update - delete: MenuDocAccessFields_globalText_Delete -} - -type MenuDocAccessFields_globalText_Create { - permission: Boolean! -} - -type MenuDocAccessFields_globalText_Read { - permission: Boolean! -} - -type MenuDocAccessFields_globalText_Update { - permission: Boolean! -} - -type MenuDocAccessFields_globalText_Delete { - permission: Boolean! -} - -type MenuReadDocAccess { - permission: Boolean! - where: JSONObject -} - -type MenuUpdateDocAccess { - permission: Boolean! - where: JSONObject -} - -type Preference { - key: String! - value: JSON - createdAt: DateTime! - updatedAt: DateTime! -} - -""" -The `JSON` scalar type represents JSON values as specified by [ECMA-404](http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf). -""" -scalar JSON - -type Access { - canAccessAdmin: Boolean! - posts: postsAccess - media: mediaAccess - users: usersAccess - menu: menuAccess -} - -type postsAccess { - fields: PostsFields - create: PostsCreateAccess - read: PostsReadAccess - update: PostsUpdateAccess - delete: PostsDeleteAccess -} - -type PostsFields { - text: PostsFields_text - associatedMedia: PostsFields_associatedMedia - updatedAt: PostsFields_updatedAt - createdAt: PostsFields_createdAt -} - -type PostsFields_text { - create: PostsFields_text_Create - read: PostsFields_text_Read - update: PostsFields_text_Update - delete: PostsFields_text_Delete -} - -type PostsFields_text_Create { - permission: Boolean! -} - -type PostsFields_text_Read { - permission: Boolean! -} - -type PostsFields_text_Update { - permission: Boolean! -} - -type PostsFields_text_Delete { - permission: Boolean! -} - -type PostsFields_associatedMedia { - create: PostsFields_associatedMedia_Create - read: PostsFields_associatedMedia_Read - update: PostsFields_associatedMedia_Update - delete: PostsFields_associatedMedia_Delete -} - -type PostsFields_associatedMedia_Create { - permission: Boolean! -} - -type PostsFields_associatedMedia_Read { - permission: Boolean! -} - -type PostsFields_associatedMedia_Update { - permission: Boolean! -} - -type PostsFields_associatedMedia_Delete { - permission: Boolean! -} - -type PostsFields_updatedAt { - create: PostsFields_updatedAt_Create - read: PostsFields_updatedAt_Read - update: PostsFields_updatedAt_Update - delete: PostsFields_updatedAt_Delete -} - -type PostsFields_updatedAt_Create { - permission: Boolean! -} - -type PostsFields_updatedAt_Read { - permission: Boolean! -} - -type PostsFields_updatedAt_Update { - permission: Boolean! -} - -type PostsFields_updatedAt_Delete { - permission: Boolean! -} - -type PostsFields_createdAt { - create: PostsFields_createdAt_Create - read: PostsFields_createdAt_Read - update: PostsFields_createdAt_Update - delete: PostsFields_createdAt_Delete -} - -type PostsFields_createdAt_Create { - permission: Boolean! -} - -type PostsFields_createdAt_Read { - permission: Boolean! -} - -type PostsFields_createdAt_Update { - permission: Boolean! -} - -type PostsFields_createdAt_Delete { - permission: Boolean! -} - -type PostsCreateAccess { - permission: Boolean! - where: JSONObject -} - -type PostsReadAccess { - permission: Boolean! - where: JSONObject -} - -type PostsUpdateAccess { - permission: Boolean! - where: JSONObject -} - -type PostsDeleteAccess { - permission: Boolean! - where: JSONObject -} - -type mediaAccess { - fields: MediaFields - create: MediaCreateAccess - read: MediaReadAccess - update: MediaUpdateAccess - delete: MediaDeleteAccess -} - -type MediaFields { - updatedAt: MediaFields_updatedAt - createdAt: MediaFields_createdAt - url: MediaFields_url - filename: MediaFields_filename - mimeType: MediaFields_mimeType - filesize: MediaFields_filesize - width: MediaFields_width - height: MediaFields_height -} - -type MediaFields_updatedAt { - create: MediaFields_updatedAt_Create - read: MediaFields_updatedAt_Read - update: MediaFields_updatedAt_Update - delete: MediaFields_updatedAt_Delete -} - -type MediaFields_updatedAt_Create { - permission: Boolean! -} - -type MediaFields_updatedAt_Read { - permission: Boolean! -} - -type MediaFields_updatedAt_Update { - permission: Boolean! -} - -type MediaFields_updatedAt_Delete { - permission: Boolean! -} - -type MediaFields_createdAt { - create: MediaFields_createdAt_Create - read: MediaFields_createdAt_Read - update: MediaFields_createdAt_Update - delete: MediaFields_createdAt_Delete -} - -type MediaFields_createdAt_Create { - permission: Boolean! -} - -type MediaFields_createdAt_Read { - permission: Boolean! -} - -type MediaFields_createdAt_Update { - permission: Boolean! -} - -type MediaFields_createdAt_Delete { - permission: Boolean! -} - -type MediaFields_url { - create: MediaFields_url_Create - read: MediaFields_url_Read - update: MediaFields_url_Update - delete: MediaFields_url_Delete -} - -type MediaFields_url_Create { - permission: Boolean! -} - -type MediaFields_url_Read { - permission: Boolean! -} - -type MediaFields_url_Update { - permission: Boolean! -} - -type MediaFields_url_Delete { - permission: Boolean! -} - -type MediaFields_filename { - create: MediaFields_filename_Create - read: MediaFields_filename_Read - update: MediaFields_filename_Update - delete: MediaFields_filename_Delete -} - -type MediaFields_filename_Create { - permission: Boolean! -} - -type MediaFields_filename_Read { - permission: Boolean! -} - -type MediaFields_filename_Update { - permission: Boolean! -} - -type MediaFields_filename_Delete { - permission: Boolean! -} - -type MediaFields_mimeType { - create: MediaFields_mimeType_Create - read: MediaFields_mimeType_Read - update: MediaFields_mimeType_Update - delete: MediaFields_mimeType_Delete -} - -type MediaFields_mimeType_Create { - permission: Boolean! -} - -type MediaFields_mimeType_Read { - permission: Boolean! -} - -type MediaFields_mimeType_Update { - permission: Boolean! -} - -type MediaFields_mimeType_Delete { - permission: Boolean! -} - -type MediaFields_filesize { - create: MediaFields_filesize_Create - read: MediaFields_filesize_Read - update: MediaFields_filesize_Update - delete: MediaFields_filesize_Delete -} - -type MediaFields_filesize_Create { - permission: Boolean! -} - -type MediaFields_filesize_Read { - permission: Boolean! -} - -type MediaFields_filesize_Update { - permission: Boolean! -} - -type MediaFields_filesize_Delete { - permission: Boolean! -} - -type MediaFields_width { - create: MediaFields_width_Create - read: MediaFields_width_Read - update: MediaFields_width_Update - delete: MediaFields_width_Delete -} - -type MediaFields_width_Create { - permission: Boolean! -} - -type MediaFields_width_Read { - permission: Boolean! -} - -type MediaFields_width_Update { - permission: Boolean! -} - -type MediaFields_width_Delete { - permission: Boolean! -} - -type MediaFields_height { - create: MediaFields_height_Create - read: MediaFields_height_Read - update: MediaFields_height_Update - delete: MediaFields_height_Delete -} - -type MediaFields_height_Create { - permission: Boolean! -} - -type MediaFields_height_Read { - permission: Boolean! -} - -type MediaFields_height_Update { - permission: Boolean! -} - -type MediaFields_height_Delete { - permission: Boolean! -} - -type MediaCreateAccess { - permission: Boolean! - where: JSONObject -} - -type MediaReadAccess { - permission: Boolean! - where: JSONObject -} - -type MediaUpdateAccess { - permission: Boolean! - where: JSONObject -} - -type MediaDeleteAccess { - permission: Boolean! - where: JSONObject -} - -type usersAccess { - fields: UsersFields - create: UsersCreateAccess - read: UsersReadAccess - update: UsersUpdateAccess - delete: UsersDeleteAccess - unlock: UsersUnlockAccess -} - -type UsersFields { - updatedAt: UsersFields_updatedAt - createdAt: UsersFields_createdAt - email: UsersFields_email - password: UsersFields_password -} - -type UsersFields_updatedAt { - create: UsersFields_updatedAt_Create - read: UsersFields_updatedAt_Read - update: UsersFields_updatedAt_Update - delete: UsersFields_updatedAt_Delete -} - -type UsersFields_updatedAt_Create { - permission: Boolean! -} - -type UsersFields_updatedAt_Read { - permission: Boolean! -} - -type UsersFields_updatedAt_Update { - permission: Boolean! -} - -type UsersFields_updatedAt_Delete { - permission: Boolean! -} - -type UsersFields_createdAt { - create: UsersFields_createdAt_Create - read: UsersFields_createdAt_Read - update: UsersFields_createdAt_Update - delete: UsersFields_createdAt_Delete -} - -type UsersFields_createdAt_Create { - permission: Boolean! -} - -type UsersFields_createdAt_Read { - permission: Boolean! -} - -type UsersFields_createdAt_Update { - permission: Boolean! -} - -type UsersFields_createdAt_Delete { - permission: Boolean! -} - -type UsersFields_email { - create: UsersFields_email_Create - read: UsersFields_email_Read - update: UsersFields_email_Update - delete: UsersFields_email_Delete -} - -type UsersFields_email_Create { - permission: Boolean! -} - -type UsersFields_email_Read { - permission: Boolean! -} - -type UsersFields_email_Update { - permission: Boolean! -} - -type UsersFields_email_Delete { - permission: Boolean! -} - -type UsersFields_password { - create: UsersFields_password_Create - read: UsersFields_password_Read - update: UsersFields_password_Update - delete: UsersFields_password_Delete -} - -type UsersFields_password_Create { - permission: Boolean! -} - -type UsersFields_password_Read { - permission: Boolean! -} - -type UsersFields_password_Update { - permission: Boolean! -} - -type UsersFields_password_Delete { - permission: Boolean! -} - -type UsersCreateAccess { - permission: Boolean! - where: JSONObject -} - -type UsersReadAccess { - permission: Boolean! - where: JSONObject -} - -type UsersUpdateAccess { - permission: Boolean! - where: JSONObject -} - -type UsersDeleteAccess { - permission: Boolean! - where: JSONObject -} - -type UsersUnlockAccess { - permission: Boolean! - where: JSONObject -} - -type menuAccess { - fields: MenuFields - read: MenuReadAccess - update: MenuUpdateAccess -} - -type MenuFields { - globalText: MenuFields_globalText -} - -type MenuFields_globalText { - create: MenuFields_globalText_Create - read: MenuFields_globalText_Read - update: MenuFields_globalText_Update - delete: MenuFields_globalText_Delete -} - -type MenuFields_globalText_Create { - permission: Boolean! -} - -type MenuFields_globalText_Read { - permission: Boolean! -} - -type MenuFields_globalText_Update { - permission: Boolean! -} - -type MenuFields_globalText_Delete { - permission: Boolean! -} - -type MenuReadAccess { - permission: Boolean! - where: JSONObject -} - -type MenuUpdateAccess { - permission: Boolean! - where: JSONObject -} - -type Mutation { - createPost(data: mutationPostInput!, draft: Boolean): Post - updatePost(id: String!, data: mutationPostUpdateInput!, draft: Boolean, autosave: Boolean): Post - deletePost(id: String!): Post - createMedia(data: mutationMediaInput!, draft: Boolean): Media - updateMedia( - id: String! - data: mutationMediaUpdateInput! - draft: Boolean - autosave: Boolean - ): Media - deleteMedia(id: String!): Media - createUser(data: mutationUserInput!, draft: Boolean): User - updateUser(id: String!, data: mutationUserUpdateInput!, draft: Boolean, autosave: Boolean): User - deleteUser(id: String!): User - refreshTokenUser(token: String): usersRefreshedUser - logoutUser: String - unlockUser(email: String!): Boolean! - loginUser(email: String, password: String): usersLoginResult - forgotPasswordUser(email: String!, disableEmail: Boolean, expiration: Int): Boolean! - resetPasswordUser(token: String, password: String): usersResetPassword - verifyEmailUser(token: String): Boolean - updateMenu(data: mutationMenuInput!, draft: Boolean): Menu - updatePreference(key: String!, value: JSON): Preference - deletePreference(key: String!): Preference -} - -input mutationPostInput { - text: String - associatedMedia: String - updatedAt: String - createdAt: String -} - -input mutationPostUpdateInput { - text: String - associatedMedia: String - updatedAt: String - createdAt: String -} - -input mutationMediaInput { - updatedAt: String - createdAt: String - url: String - filename: String - mimeType: String - filesize: Float - width: Float - height: Float -} - -input mutationMediaUpdateInput { - updatedAt: String - createdAt: String - url: String - filename: String - mimeType: String - filesize: Float - width: Float - height: Float -} - -input mutationUserInput { - updatedAt: String - createdAt: String - email: String - resetPasswordToken: String - resetPasswordExpiration: String - loginAttempts: Float - lockUntil: String - password: String! -} - -input mutationUserUpdateInput { - updatedAt: String - createdAt: String - email: String - resetPasswordToken: String - resetPasswordExpiration: String - loginAttempts: Float - lockUntil: String - password: String -} - -type usersRefreshedUser { - user: usersJWT - refreshedToken: String - exp: Int -} - -type usersJWT { - email: EmailAddress! - collection: String! -} - -type usersLoginResult { - token: String - user: User - exp: Int -} - -type usersResetPassword { - token: String - user: User -} - -input mutationMenuInput { - globalText: String -} diff --git a/packages/payload/scss.scss b/packages/payload/scss.scss deleted file mode 100644 index c306807834..0000000000 --- a/packages/payload/scss.scss +++ /dev/null @@ -1,6 +0,0 @@ -@import './dist/admin/scss/vars'; -@import './dist/admin/scss/z-index'; -@import './dist/admin/scss/type'; -@import './dist/admin/scss/queries'; -@import './dist/admin/scss/resets'; -@import './dist/admin/scss/svg'; diff --git a/packages/payload/templates.ts b/packages/payload/templates.ts deleted file mode 100644 index ebec62ba4e..0000000000 --- a/packages/payload/templates.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { Minimal } from '../templates/Minimal' -export { Default } from '../templates/Default' diff --git a/packages/payload/uploads.d.ts b/packages/payload/uploads.d.ts deleted file mode 100644 index 4cb00bd0f9..0000000000 --- a/packages/payload/uploads.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { getFileByPath } from './dist/uploads/getFileByPath.js'; -//# sourceMappingURL=uploads.d.ts.map \ No newline at end of file diff --git a/packages/payload/uploads.js b/packages/payload/uploads.js deleted file mode 100644 index cc581e56e9..0000000000 --- a/packages/payload/uploads.js +++ /dev/null @@ -1,3 +0,0 @@ -export { getFileByPath } from './dist/uploads/getFileByPath.js'; - -//# sourceMappingURL=uploads.js.map \ No newline at end of file From 9d42751a428a149732b1142822c6d34813dadd43 Mon Sep 17 00:00:00 2001 From: Elliot DeNolf Date: Fri, 12 Apr 2024 11:39:08 -0400 Subject: [PATCH 125/177] feat!: remove more pointer files --- packages/payload/.gitignore | 27 ------------------------ packages/plugin-cloud-storage/.gitignore | 11 ---------- packages/richtext-lexical/.gitignore | 4 ---- 3 files changed, 42 deletions(-) delete mode 100644 packages/payload/.gitignore delete mode 100644 packages/richtext-lexical/.gitignore diff --git a/packages/payload/.gitignore b/packages/payload/.gitignore deleted file mode 100644 index 0a54c684f1..0000000000 --- a/packages/payload/.gitignore +++ /dev/null @@ -1,27 +0,0 @@ -/fields/ -/components/ -/auth.d.ts -/auth.js -/components.d.ts -/components.js -/config.d.ts -/config.js -/database.d.ts -/database.js -/errors.d.ts -/errors.js -/graphql.d.ts -/graphql.js -/types.d.ts -/types.js -/utilities.d.ts -/utilities.js -/versions.d.ts -/versions.js -/operations.js -/operations.d.ts -/node.js -/node.d.ts -/uploads.js -/uploads.d.ts -/i18n diff --git a/packages/plugin-cloud-storage/.gitignore b/packages/plugin-cloud-storage/.gitignore index 28200c7237..11274bcd07 100644 --- a/packages/plugin-cloud-storage/.gitignore +++ b/packages/plugin-cloud-storage/.gitignore @@ -1,14 +1,3 @@ -azure.d.ts -azure.js -gcs.d.ts -gcs.js -s3.d.ts -s3.js -vercelBlob.d.ts -vercelBlob.js -utilities.d.ts -utilities.js - dev/tmp dev/yarn.lock diff --git a/packages/richtext-lexical/.gitignore b/packages/richtext-lexical/.gitignore deleted file mode 100644 index 6b2c68f46d..0000000000 --- a/packages/richtext-lexical/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -/utilities.d.ts -/utilities.js -/components.d.ts -/components.js From cb4214fe6e9df4dd05d71dd2478edcd15e450f50 Mon Sep 17 00:00:00 2001 From: Alessio Gravili Date: Fri, 12 Apr 2024 11:58:05 -0400 Subject: [PATCH 126/177] fix(richtext-lexical)!: fix output of internal list HTML converter BREAKING: Changes the classnames of the converted HTML --- docs/rich-text/lexical.mdx | 13 ++++++++++ .../features/converters/html/field/index.ts | 19 ++++++++++---- .../src/field/features/lists/htmlConverter.ts | 26 ++++++++++++++----- 3 files changed, 47 insertions(+), 11 deletions(-) diff --git a/docs/rich-text/lexical.mdx b/docs/rich-text/lexical.mdx index 4a4367ab80..02c56417ca 100644 --- a/docs/rich-text/lexical.mdx +++ b/docs/rich-text/lexical.mdx @@ -234,6 +234,19 @@ This method employs `convertLexicalToHTML` from `@payloadcms/richtext-lexical`, Because every `Feature` is able to provide html converters, and because the `htmlFeature` can modify those or provide their own, we need to consolidate them with the default html Converters using the `consolidateHTMLConverters` function. +#### CSS + +Payload's lexical HTML converter does not generate CSS for you, but it does add classes to the generated HTML. You can use these classes to style the HTML in your frontend. + +Here is some "base" CSS you can use to ensure that nested lists render correctly: + +```css +/* Base CSS for Lexical HTML */ +.nestedListItem, .list-check { + list-style-type: none; +} +``` + #### Creating your own HTML Converter HTML Converters are typed as `HTMLConverter`, which contains the node type it should handle, and a function that accepts the serialized node from the lexical editor, and outputs the HTML string. Here's the HTML Converter of the Upload node as an example: diff --git a/packages/richtext-lexical/src/field/features/converters/html/field/index.ts b/packages/richtext-lexical/src/field/features/converters/html/field/index.ts index ad3d97cc22..4b23699090 100644 --- a/packages/richtext-lexical/src/field/features/converters/html/field/index.ts +++ b/packages/richtext-lexical/src/field/features/converters/html/field/index.ts @@ -1,5 +1,5 @@ import type { SerializedEditorState } from 'lexical' -import type { Field, RichTextField, TextField } from 'payload/types' +import type { Field, RichTextField } from 'payload/types' import type { AdapterProps, LexicalRichTextAdapter } from '../../../../../types.js' import type { SanitizedServerEditorConfig } from '../../../../lexical/config/types.js' @@ -10,6 +10,12 @@ import { defaultHTMLConverters } from '../converter/defaultConverters.js' import { convertLexicalToHTML } from '../converter/index.js' type Props = { + /** + * Whether the lexicalHTML field should be hidden in the admin panel + * + * @default true + */ + hidden?: boolean name: string } @@ -53,13 +59,16 @@ export const lexicalHTML: ( **/ lexicalFieldName: string, props: Props, -) => TextField = (lexicalFieldName, props) => { - const { name = 'lexicalHTML' } = props +) => Field = (lexicalFieldName, props) => { + const { name = 'lexicalHTML', hidden = true } = props return { name, - type: 'text', + type: 'code', admin: { - hidden: true, + editorOptions: { + language: 'html', + }, + hidden, }, hooks: { afterRead: [ diff --git a/packages/richtext-lexical/src/field/features/lists/htmlConverter.ts b/packages/richtext-lexical/src/field/features/lists/htmlConverter.ts index 490b57b5a9..8e197c09c0 100644 --- a/packages/richtext-lexical/src/field/features/lists/htmlConverter.ts +++ b/packages/richtext-lexical/src/field/features/lists/htmlConverter.ts @@ -1,6 +1,7 @@ import type { SerializedListItemNode, SerializedListNode } from '@lexical/list' import lexicalListImport from '@lexical/list' +import { v4 as uuidv4 } from 'uuid' const { ListItemNode, ListNode } = lexicalListImport import type { HTMLConverter } from '../converters/html/converter/types.js' @@ -19,13 +20,15 @@ export const ListHTMLConverter: HTMLConverter = { payload, }) - return `<${node?.tag} class="${node?.listType}">${childrenText}` + return `<${node?.tag} class="list-${node?.listType}">${childrenText}` }, nodeTypes: [ListNode.getType()], } export const ListItemHTMLConverter: HTMLConverter = { converter: async ({ converters, node, parent, payload }) => { + const hasSubLists = node.children.some((child) => child.type === 'list') + const childrenText = await convertLexicalNodesToHTML({ converters, lexicalNodes: node.children, @@ -37,19 +40,30 @@ export const ListItemHTMLConverter: HTMLConverter = { }) if ('listType' in parent && parent?.listType === 'check') { + const uuid = uuidv4() + return `

` } else { - return `
  • ${childrenText}
  • ` + return `
  • ${childrenText}
  • ` } }, nodeTypes: [ListItemNode.getType()], From b1259be8f2a44ec489d863647fbd0f7230f782e1 Mon Sep 17 00:00:00 2001 From: Elliot DeNolf Date: Fri, 12 Apr 2024 12:06:41 -0400 Subject: [PATCH 127/177] chore(release): v3.0.0-beta.9 [skip ci] --- package.json | 2 +- packages/create-payload-app/package.json | 2 +- packages/db-mongodb/package.json | 2 +- packages/db-postgres/package.json | 2 +- packages/graphql/package.json | 2 +- packages/next/package.json | 2 +- packages/payload/package.json | 2 +- packages/plugin-cloud-storage/package.json | 2 +- packages/plugin-cloud/package.json | 2 +- packages/plugin-form-builder/package.json | 2 +- packages/plugin-nested-docs/package.json | 2 +- packages/plugin-redirects/package.json | 2 +- packages/plugin-search/package.json | 2 +- packages/plugin-seo/package.json | 2 +- packages/richtext-lexical/package.json | 2 +- packages/richtext-slate/package.json | 2 +- packages/translations/package.json | 2 +- packages/ui/package.json | 2 +- 18 files changed, 18 insertions(+), 18 deletions(-) diff --git a/package.json b/package.json index 5df248f467..4de2b5da02 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "payload-monorepo", - "version": "3.0.0-beta.6", + "version": "3.0.0-beta.9", "private": true, "type": "module", "workspaces:": [ diff --git a/packages/create-payload-app/package.json b/packages/create-payload-app/package.json index c89556a46b..d9b2f1052c 100644 --- a/packages/create-payload-app/package.json +++ b/packages/create-payload-app/package.json @@ -1,6 +1,6 @@ { "name": "create-payload-app", - "version": "3.0.0-beta.6", + "version": "3.0.0-beta.9", "license": "MIT", "type": "module", "homepage": "https://payloadcms.com", diff --git a/packages/db-mongodb/package.json b/packages/db-mongodb/package.json index 4c8adeabf6..67c8a995c2 100644 --- a/packages/db-mongodb/package.json +++ b/packages/db-mongodb/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/db-mongodb", - "version": "3.0.0-beta.6", + "version": "3.0.0-beta.9", "description": "The officially supported MongoDB database adapter for Payload", "repository": { "type": "git", diff --git a/packages/db-postgres/package.json b/packages/db-postgres/package.json index ef0bc77fc7..418273d8c5 100644 --- a/packages/db-postgres/package.json +++ b/packages/db-postgres/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/db-postgres", - "version": "3.0.0-beta.6", + "version": "3.0.0-beta.9", "description": "The officially supported Postgres database adapter for Payload", "repository": { "type": "git", diff --git a/packages/graphql/package.json b/packages/graphql/package.json index ea62a60a0a..ed4bc61c12 100644 --- a/packages/graphql/package.json +++ b/packages/graphql/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/graphql", - "version": "3.0.0-beta.6", + "version": "3.0.0-beta.9", "main": "./src/index.ts", "types": "./src/index.d.ts", "type": "module", diff --git a/packages/next/package.json b/packages/next/package.json index b11117709b..ddeddd1945 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/next", - "version": "3.0.0-beta.6", + "version": "3.0.0-beta.9", "main": "./src/index.js", "types": "./src/index.js", "type": "module", diff --git a/packages/payload/package.json b/packages/payload/package.json index ad4ce91944..6449030f52 100644 --- a/packages/payload/package.json +++ b/packages/payload/package.json @@ -1,6 +1,6 @@ { "name": "payload", - "version": "3.0.0-beta.6", + "version": "3.0.0-beta.9", "description": "Node, React and MongoDB Headless CMS and Application Framework", "license": "MIT", "main": "./src/index.ts", diff --git a/packages/plugin-cloud-storage/package.json b/packages/plugin-cloud-storage/package.json index 361a902641..1e3ea35a07 100644 --- a/packages/plugin-cloud-storage/package.json +++ b/packages/plugin-cloud-storage/package.json @@ -1,7 +1,7 @@ { "name": "@payloadcms/plugin-cloud-storage", "description": "The official cloud storage plugin for Payload CMS", - "version": "3.0.0-beta.6", + "version": "3.0.0-beta.9", "main": "./src/index.ts", "types": "./src/index.ts", "type": "module", diff --git a/packages/plugin-cloud/package.json b/packages/plugin-cloud/package.json index 27a5282f91..f01a80bae3 100644 --- a/packages/plugin-cloud/package.json +++ b/packages/plugin-cloud/package.json @@ -1,7 +1,7 @@ { "name": "@payloadcms/plugin-cloud", "description": "The official Payload Cloud plugin", - "version": "3.0.0-beta.6", + "version": "3.0.0-beta.9", "main": "./src/index.ts", "types": "./src/index.ts", "license": "MIT", diff --git a/packages/plugin-form-builder/package.json b/packages/plugin-form-builder/package.json index 9f591ba807..4d2b4c8802 100644 --- a/packages/plugin-form-builder/package.json +++ b/packages/plugin-form-builder/package.json @@ -1,7 +1,7 @@ { "name": "@payloadcms/plugin-form-builder", "description": "Form builder plugin for Payload CMS", - "version": "3.0.0-beta.6", + "version": "3.0.0-beta.9", "homepage:": "https://payloadcms.com", "repository": { "type": "git", diff --git a/packages/plugin-nested-docs/package.json b/packages/plugin-nested-docs/package.json index 0ffbd899fa..16621858f0 100644 --- a/packages/plugin-nested-docs/package.json +++ b/packages/plugin-nested-docs/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-nested-docs", - "version": "3.0.0-beta.6", + "version": "3.0.0-beta.9", "description": "The official Nested Docs plugin for Payload", "repository": { "type": "git", diff --git a/packages/plugin-redirects/package.json b/packages/plugin-redirects/package.json index abab6f4e80..504c24be9d 100644 --- a/packages/plugin-redirects/package.json +++ b/packages/plugin-redirects/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-redirects", - "version": "3.0.0-beta.6", + "version": "3.0.0-beta.9", "homepage:": "https://payloadcms.com", "repository": { "type": "git", diff --git a/packages/plugin-search/package.json b/packages/plugin-search/package.json index 8266350dd0..76c4477cbf 100644 --- a/packages/plugin-search/package.json +++ b/packages/plugin-search/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-search", - "version": "3.0.0-beta.6", + "version": "3.0.0-beta.9", "homepage:": "https://payloadcms.com", "repository": { "type": "git", diff --git a/packages/plugin-seo/package.json b/packages/plugin-seo/package.json index 7229a68094..22ca330c96 100644 --- a/packages/plugin-seo/package.json +++ b/packages/plugin-seo/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-seo", - "version": "3.0.0-beta.6", + "version": "3.0.0-beta.9", "homepage:": "https://payloadcms.com", "repository": { "type": "git", diff --git a/packages/richtext-lexical/package.json b/packages/richtext-lexical/package.json index cde7481d26..15aa7f376f 100644 --- a/packages/richtext-lexical/package.json +++ b/packages/richtext-lexical/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/richtext-lexical", - "version": "3.0.0-beta.6", + "version": "3.0.0-beta.9", "description": "The officially supported Lexical richtext adapter for Payload", "repository": { "type": "git", diff --git a/packages/richtext-slate/package.json b/packages/richtext-slate/package.json index e8ba047023..65f3deb368 100644 --- a/packages/richtext-slate/package.json +++ b/packages/richtext-slate/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/richtext-slate", - "version": "3.0.0-beta.6", + "version": "3.0.0-beta.9", "description": "The officially supported Slate richtext adapter for Payload", "repository": { "type": "git", diff --git a/packages/translations/package.json b/packages/translations/package.json index d3d27d553c..3f7c81c85e 100644 --- a/packages/translations/package.json +++ b/packages/translations/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/translations", - "version": "3.0.0-beta.6", + "version": "3.0.0-beta.9", "main": "./src/exports/index.ts", "types": "./src/types.ts", "type": "module", diff --git a/packages/ui/package.json b/packages/ui/package.json index cbeed10dba..e966c5f91c 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/ui", - "version": "3.0.0-beta.6", + "version": "3.0.0-beta.9", "type": "module", "homepage": "https://payloadcms.com", "repository": { From 5fd6e3c1a880fca517ce1a783dc592716761b19d Mon Sep 17 00:00:00 2001 From: Alessio Gravili Date: Fri, 12 Apr 2024 14:01:33 -0400 Subject: [PATCH 128/177] fix!: upgrade minimum required node version from 18.17.0 to v18.20.2. Some old node versions have issues with our loader (#5829) --- .node-version | 2 +- .nvmrc | 2 +- package.json | 2 +- packages/next/package.json | 2 +- packages/payload/package.json | 2 +- packages/richtext-lexical/package.json | 2 +- packages/richtext-slate/package.json | 2 +- packages/ui/package.json | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.node-version b/.node-version index 60495ee0aa..fb3e6603b5 100644 --- a/.node-version +++ b/.node-version @@ -1 +1 @@ -v18.19.1 +v18.20.2 diff --git a/.nvmrc b/.nvmrc index 60495ee0aa..fb3e6603b5 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -v18.19.1 +v18.20.2 diff --git a/package.json b/package.json index 4de2b5da02..e4bf3d8f01 100644 --- a/package.json +++ b/package.json @@ -163,7 +163,7 @@ "react": "18.2.0" }, "engines": { - "node": ">=18.17.0", + "node": ">=18.20.2", "pnpm": ">=8" }, "lint-staged": { diff --git a/packages/next/package.json b/packages/next/package.json index ddeddd1945..5b1e33d800 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -102,7 +102,7 @@ "registry": "https://registry.npmjs.org/" }, "engines": { - "node": ">=18.17.0" + "node": ">=18.20.2" }, "files": [ "dist" diff --git a/packages/payload/package.json b/packages/payload/package.json index 6449030f52..f4c6d010d2 100644 --- a/packages/payload/package.json +++ b/packages/payload/package.json @@ -113,7 +113,7 @@ "ts-essentials": "7.0.3" }, "engines": { - "node": ">=18.17.0" + "node": ">=18.20.2" }, "files": [ "bin.js", diff --git a/packages/richtext-lexical/package.json b/packages/richtext-lexical/package.json index 15aa7f376f..63fa6194c5 100644 --- a/packages/richtext-lexical/package.json +++ b/packages/richtext-lexical/package.json @@ -91,7 +91,7 @@ "types": "./dist/index.d.ts" }, "engines": { - "node": ">=18.17.0" + "node": ">=18.20.2" }, "files": [ "dist", diff --git a/packages/richtext-slate/package.json b/packages/richtext-slate/package.json index 65f3deb368..dcff1948cd 100644 --- a/packages/richtext-slate/package.json +++ b/packages/richtext-slate/package.json @@ -56,7 +56,7 @@ "types": "./dist/index.d.ts" }, "engines": { - "node": ">=18.17.0" + "node": ">=18.20.2" }, "files": [ "dist" diff --git a/packages/ui/package.json b/packages/ui/package.json index e966c5f91c..c6c89da840 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -221,7 +221,7 @@ "react": "^18.0.0" }, "engines": { - "node": ">=18.17.0" + "node": ">=18.20.2" }, "files": [ "dist" From 80496aa94cb2980a84b04dc784a132a1e97a4209 Mon Sep 17 00:00:00 2001 From: Elliot DeNolf Date: Fri, 12 Apr 2024 14:35:36 -0400 Subject: [PATCH 129/177] fix: remove all exports null (#5830) --- packages/live-preview-react/package.json | 8 +++++++- packages/live-preview/package.json | 8 +++++++- packages/plugin-search/package.json | 8 +++++++- packages/plugin-seo/package.json | 8 +++++++- packages/richtext-slate/package.json | 8 +++++++- 5 files changed, 35 insertions(+), 5 deletions(-) diff --git a/packages/live-preview-react/package.json b/packages/live-preview-react/package.json index cfc1e73042..59eaded6b4 100644 --- a/packages/live-preview-react/package.json +++ b/packages/live-preview-react/package.json @@ -39,7 +39,13 @@ } }, "publishConfig": { - "exports": null, + "exports": { + ".": { + "import": "./dist/index.js", + "require": "./dist/index.js", + "types": "./dist/index.d.ts" + } + }, "main": "./dist/index.js", "registry": "https://registry.npmjs.org/", "types": "./dist/index.d.ts" diff --git a/packages/live-preview/package.json b/packages/live-preview/package.json index 2e8f72af15..fc6e7bd94e 100644 --- a/packages/live-preview/package.json +++ b/packages/live-preview/package.json @@ -32,7 +32,13 @@ } }, "publishConfig": { - "exports": null, + "exports": { + ".": { + "import": "./dist/index.js", + "require": "./dist/index.js", + "types": "./dist/index.d.ts" + } + }, "main": "./dist/index.js", "registry": "https://registry.npmjs.org/", "types": "./dist/index.d.ts" diff --git a/packages/plugin-search/package.json b/packages/plugin-search/package.json index 76c4477cbf..58a6738093 100644 --- a/packages/plugin-search/package.json +++ b/packages/plugin-search/package.json @@ -52,7 +52,13 @@ } }, "publishConfig": { - "exports": null, + "exports": { + ".": { + "import": "./dist/index.js", + "require": "./dist/index.js", + "types": "./dist/index.d.ts" + } + }, "main": "./dist/index.js", "registry": "https://registry.npmjs.org/", "types": "./dist/index.d.ts" diff --git a/packages/plugin-seo/package.json b/packages/plugin-seo/package.json index 22ca330c96..ffd2265445 100644 --- a/packages/plugin-seo/package.json +++ b/packages/plugin-seo/package.json @@ -54,7 +54,13 @@ } }, "publishConfig": { - "exports": null, + "exports": { + ".": { + "import": "./dist/index.js", + "require": "./dist/index.js", + "types": "./dist/index.d.ts" + } + }, "main": "./dist/index.js", "registry": "https://registry.npmjs.org/", "types": "./dist/index.d.ts" diff --git a/packages/richtext-slate/package.json b/packages/richtext-slate/package.json index dcff1948cd..089c7768a7 100644 --- a/packages/richtext-slate/package.json +++ b/packages/richtext-slate/package.json @@ -50,7 +50,13 @@ } }, "publishConfig": { - "exports": null, + "exports": { + ".": { + "import": "./dist/index.js", + "require": "./dist/index.js", + "types": "./dist/index.d.ts" + } + }, "main": "./dist/index.js", "registry": "https://registry.npmjs.org/", "types": "./dist/index.d.ts" From b9185a6fcd489cfcda6b7734eb5d0d257e514819 Mon Sep 17 00:00:00 2001 From: Elliot DeNolf Date: Fri, 12 Apr 2024 14:48:34 -0400 Subject: [PATCH 130/177] chore: fix more publish config exports --- packages/richtext-lexical/package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/richtext-lexical/package.json b/packages/richtext-lexical/package.json index 63fa6194c5..f670c024b9 100644 --- a/packages/richtext-lexical/package.json +++ b/packages/richtext-lexical/package.json @@ -81,9 +81,9 @@ "types": "./dist/index.d.ts" }, "./*": { - "import": "./src/exports/*.ts", - "require": "./src/exports/*.ts", - "types": "./src/exports/*.ts" + "import": "./dist/exports/*.js", + "require": "./dist/exports/*.js", + "types": "./dist/exports/*.d.ts" } }, "main": "./dist/index.js", From 471e1f4827be666efda3aba6fa60c22b6c42f520 Mon Sep 17 00:00:00 2001 From: Elliot DeNolf Date: Fri, 12 Apr 2024 14:56:04 -0400 Subject: [PATCH 131/177] chore: specify next canary peer dep --- package.json | 2 +- packages/next/package.json | 2 +- packages/ui/package.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index e4bf3d8f01..96408df0f9 100644 --- a/package.json +++ b/package.json @@ -127,7 +127,7 @@ "lint-staged": "^14.0.1", "minimist": "1.2.8", "mongodb-memory-server": "^9.0", - "next": "^14.2", + "next": "^14.2.0-canary.23", "node-mocks-http": "^1.14.1", "nodemon": "3.0.3", "open": "^10.1.0", diff --git a/packages/next/package.json b/packages/next/package.json index 5b1e33d800..bfff2e4c74 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -77,7 +77,7 @@ }, "peerDependencies": { "http-status": "1.6.2", - "next": "^14.2", + "next": "^14.2.0-canary.23", "payload": "workspace:*" }, "publishConfig": { diff --git a/packages/ui/package.json b/packages/ui/package.json index c6c89da840..2b909e9c68 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -216,7 +216,7 @@ "uuid": "9.0.1" }, "peerDependencies": { - "next": "^14.2", + "next": "^14.2.0-canary.23", "payload": "workspace:*", "react": "^18.0.0" }, From 568b5073c8d58b6a7ce6818eac957e4daa56221d Mon Sep 17 00:00:00 2001 From: Elliot DeNolf Date: Fri, 12 Apr 2024 14:56:42 -0400 Subject: [PATCH 132/177] chore(deps): sync pnpm-lock.yaml --- pnpm-lock.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 47b2c0c255..cead960ab3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -200,7 +200,7 @@ importers: specifier: ^9.0 version: 9.1.8 next: - specifier: ^14.2 + specifier: ^14.2.0-canary.23 version: 14.2.0(@babel/core@7.24.4)(@playwright/test@1.43.0)(react-dom@18.2.0)(react@18.2.0)(sass@1.74.1) node-mocks-http: specifier: ^1.14.1 @@ -628,7 +628,7 @@ importers: specifier: 1.6.2 version: 1.6.2 next: - specifier: ^14.2 + specifier: ^14.2.0-canary.23 version: 14.2.0(@babel/core@7.24.4)(@playwright/test@1.43.0)(react-dom@18.2.0)(react@18.2.0)(sass@1.74.1) path-to-regexp: specifier: ^6.2.1 @@ -1397,7 +1397,7 @@ importers: specifier: 2.3.0 version: 2.3.0 next: - specifier: ^14.2 + specifier: ^14.2.0-canary.23 version: 14.2.0(@babel/core@7.24.4)(@playwright/test@1.43.0)(react-dom@18.2.0)(react@18.2.0)(sass@1.74.1) object-to-formdata: specifier: 4.5.1 From ea4203bb328c77de49b7a018f315f587a3086de4 Mon Sep 17 00:00:00 2001 From: Elliot DeNolf Date: Fri, 12 Apr 2024 14:58:12 -0400 Subject: [PATCH 133/177] chore(release): v3.0.0-beta.10 [skip ci] --- package.json | 2 +- packages/create-payload-app/package.json | 2 +- packages/db-mongodb/package.json | 2 +- packages/db-postgres/package.json | 2 +- packages/graphql/package.json | 2 +- packages/next/package.json | 2 +- packages/payload/package.json | 2 +- packages/plugin-cloud-storage/package.json | 2 +- packages/plugin-cloud/package.json | 2 +- packages/plugin-form-builder/package.json | 2 +- packages/plugin-nested-docs/package.json | 2 +- packages/plugin-redirects/package.json | 2 +- packages/plugin-search/package.json | 2 +- packages/plugin-seo/package.json | 2 +- packages/richtext-lexical/package.json | 2 +- packages/richtext-slate/package.json | 2 +- packages/translations/package.json | 2 +- packages/ui/package.json | 2 +- 18 files changed, 18 insertions(+), 18 deletions(-) diff --git a/package.json b/package.json index 96408df0f9..8d8f2a12d8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "payload-monorepo", - "version": "3.0.0-beta.9", + "version": "3.0.0-beta.10", "private": true, "type": "module", "workspaces:": [ diff --git a/packages/create-payload-app/package.json b/packages/create-payload-app/package.json index d9b2f1052c..3de6bd5022 100644 --- a/packages/create-payload-app/package.json +++ b/packages/create-payload-app/package.json @@ -1,6 +1,6 @@ { "name": "create-payload-app", - "version": "3.0.0-beta.9", + "version": "3.0.0-beta.10", "license": "MIT", "type": "module", "homepage": "https://payloadcms.com", diff --git a/packages/db-mongodb/package.json b/packages/db-mongodb/package.json index 67c8a995c2..a6890d6971 100644 --- a/packages/db-mongodb/package.json +++ b/packages/db-mongodb/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/db-mongodb", - "version": "3.0.0-beta.9", + "version": "3.0.0-beta.10", "description": "The officially supported MongoDB database adapter for Payload", "repository": { "type": "git", diff --git a/packages/db-postgres/package.json b/packages/db-postgres/package.json index 418273d8c5..b24d746b96 100644 --- a/packages/db-postgres/package.json +++ b/packages/db-postgres/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/db-postgres", - "version": "3.0.0-beta.9", + "version": "3.0.0-beta.10", "description": "The officially supported Postgres database adapter for Payload", "repository": { "type": "git", diff --git a/packages/graphql/package.json b/packages/graphql/package.json index ed4bc61c12..dec617a49f 100644 --- a/packages/graphql/package.json +++ b/packages/graphql/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/graphql", - "version": "3.0.0-beta.9", + "version": "3.0.0-beta.10", "main": "./src/index.ts", "types": "./src/index.d.ts", "type": "module", diff --git a/packages/next/package.json b/packages/next/package.json index bfff2e4c74..8b2c282f82 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/next", - "version": "3.0.0-beta.9", + "version": "3.0.0-beta.10", "main": "./src/index.js", "types": "./src/index.js", "type": "module", diff --git a/packages/payload/package.json b/packages/payload/package.json index f4c6d010d2..888032c63c 100644 --- a/packages/payload/package.json +++ b/packages/payload/package.json @@ -1,6 +1,6 @@ { "name": "payload", - "version": "3.0.0-beta.9", + "version": "3.0.0-beta.10", "description": "Node, React and MongoDB Headless CMS and Application Framework", "license": "MIT", "main": "./src/index.ts", diff --git a/packages/plugin-cloud-storage/package.json b/packages/plugin-cloud-storage/package.json index 1e3ea35a07..50d8453c38 100644 --- a/packages/plugin-cloud-storage/package.json +++ b/packages/plugin-cloud-storage/package.json @@ -1,7 +1,7 @@ { "name": "@payloadcms/plugin-cloud-storage", "description": "The official cloud storage plugin for Payload CMS", - "version": "3.0.0-beta.9", + "version": "3.0.0-beta.10", "main": "./src/index.ts", "types": "./src/index.ts", "type": "module", diff --git a/packages/plugin-cloud/package.json b/packages/plugin-cloud/package.json index f01a80bae3..e890952e7f 100644 --- a/packages/plugin-cloud/package.json +++ b/packages/plugin-cloud/package.json @@ -1,7 +1,7 @@ { "name": "@payloadcms/plugin-cloud", "description": "The official Payload Cloud plugin", - "version": "3.0.0-beta.9", + "version": "3.0.0-beta.10", "main": "./src/index.ts", "types": "./src/index.ts", "license": "MIT", diff --git a/packages/plugin-form-builder/package.json b/packages/plugin-form-builder/package.json index 4d2b4c8802..49868d3b71 100644 --- a/packages/plugin-form-builder/package.json +++ b/packages/plugin-form-builder/package.json @@ -1,7 +1,7 @@ { "name": "@payloadcms/plugin-form-builder", "description": "Form builder plugin for Payload CMS", - "version": "3.0.0-beta.9", + "version": "3.0.0-beta.10", "homepage:": "https://payloadcms.com", "repository": { "type": "git", diff --git a/packages/plugin-nested-docs/package.json b/packages/plugin-nested-docs/package.json index 16621858f0..efad229849 100644 --- a/packages/plugin-nested-docs/package.json +++ b/packages/plugin-nested-docs/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-nested-docs", - "version": "3.0.0-beta.9", + "version": "3.0.0-beta.10", "description": "The official Nested Docs plugin for Payload", "repository": { "type": "git", diff --git a/packages/plugin-redirects/package.json b/packages/plugin-redirects/package.json index 504c24be9d..339a2c755b 100644 --- a/packages/plugin-redirects/package.json +++ b/packages/plugin-redirects/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-redirects", - "version": "3.0.0-beta.9", + "version": "3.0.0-beta.10", "homepage:": "https://payloadcms.com", "repository": { "type": "git", diff --git a/packages/plugin-search/package.json b/packages/plugin-search/package.json index 58a6738093..64ee8e32ef 100644 --- a/packages/plugin-search/package.json +++ b/packages/plugin-search/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-search", - "version": "3.0.0-beta.9", + "version": "3.0.0-beta.10", "homepage:": "https://payloadcms.com", "repository": { "type": "git", diff --git a/packages/plugin-seo/package.json b/packages/plugin-seo/package.json index ffd2265445..d8a11a4631 100644 --- a/packages/plugin-seo/package.json +++ b/packages/plugin-seo/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-seo", - "version": "3.0.0-beta.9", + "version": "3.0.0-beta.10", "homepage:": "https://payloadcms.com", "repository": { "type": "git", diff --git a/packages/richtext-lexical/package.json b/packages/richtext-lexical/package.json index f670c024b9..db0ed359ed 100644 --- a/packages/richtext-lexical/package.json +++ b/packages/richtext-lexical/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/richtext-lexical", - "version": "3.0.0-beta.9", + "version": "3.0.0-beta.10", "description": "The officially supported Lexical richtext adapter for Payload", "repository": { "type": "git", diff --git a/packages/richtext-slate/package.json b/packages/richtext-slate/package.json index 089c7768a7..1c10fe38a6 100644 --- a/packages/richtext-slate/package.json +++ b/packages/richtext-slate/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/richtext-slate", - "version": "3.0.0-beta.9", + "version": "3.0.0-beta.10", "description": "The officially supported Slate richtext adapter for Payload", "repository": { "type": "git", diff --git a/packages/translations/package.json b/packages/translations/package.json index 3f7c81c85e..8975b16026 100644 --- a/packages/translations/package.json +++ b/packages/translations/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/translations", - "version": "3.0.0-beta.9", + "version": "3.0.0-beta.10", "main": "./src/exports/index.ts", "types": "./src/types.ts", "type": "module", diff --git a/packages/ui/package.json b/packages/ui/package.json index 2b909e9c68..e532288a2e 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/ui", - "version": "3.0.0-beta.9", + "version": "3.0.0-beta.10", "type": "module", "homepage": "https://payloadcms.com", "repository": { From 43e8a533b7d493bd46308539c27ae6be11fc9cc2 Mon Sep 17 00:00:00 2001 From: Elliot DeNolf Date: Fri, 12 Apr 2024 15:16:47 -0400 Subject: [PATCH 134/177] fix: ensure file persists through form state changes (#5823) --- packages/next/src/routes/rest/buildFormState.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/packages/next/src/routes/rest/buildFormState.ts b/packages/next/src/routes/rest/buildFormState.ts index 6c828b9bc3..10ef286db2 100644 --- a/packages/next/src/routes/rest/buildFormState.ts +++ b/packages/next/src/routes/rest/buildFormState.ts @@ -187,6 +187,16 @@ export const buildFormState = async ({ req }: { req: PayloadRequest }) => { req, }) + // Maintain form state of file + if ( + collectionSlug && + req.payload.collections[collectionSlug]?.config?.upload && + formState && + formState.file + ) { + result.file = formState.file + } + return Response.json(result, { status: httpStatus.OK, }) From 73c76cab771f812f47aa702ab74ba776478834da Mon Sep 17 00:00:00 2001 From: Gabriel Novotny Date: Sat, 13 Apr 2024 00:53:19 +0200 Subject: [PATCH 135/177] fix: postgres turbopack static analysis error (#5832) --- packages/db-postgres/src/schema/build.ts | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/packages/db-postgres/src/schema/build.ts b/packages/db-postgres/src/schema/build.ts index c193b1081d..bfa8421fd1 100644 --- a/packages/db-postgres/src/schema/build.ts +++ b/packages/db-postgres/src/schema/build.ts @@ -66,13 +66,6 @@ export const buildTable = ({ const columns: Record = baseColumns const indexes: Record IndexBuilder> = {} - let hasLocalizedField = false - let hasLocalizedRelationshipField = false - let hasManyTextField: 'index' | boolean = false - let hasManyNumberField: 'index' | boolean = false - let hasLocalizedManyTextField = false - let hasLocalizedManyNumberField = false - const localesColumns: Record = {} const localesIndexes: Record IndexBuilder> = {} let localesTable: GenericTable | PgTableWithColumns @@ -89,7 +82,7 @@ export const buildTable = ({ const idColType: IDType = setColumnID({ adapter, columns, fields }) - ;({ + const { hasLocalizedField, hasLocalizedManyNumberField, hasLocalizedManyTextField, @@ -116,7 +109,7 @@ export const buildTable = ({ rootTableIDColType: rootTableIDColType || idColType, rootTableName, versions, - })) + }) if (timestamps) { columns.createdAt = timestamp('created_at', { From f71e61d7d938f58816d588c3bb39d06c3498c0b6 Mon Sep 17 00:00:00 2001 From: Elliot DeNolf Date: Sat, 13 Apr 2024 10:27:39 -0400 Subject: [PATCH 136/177] chore(templates): remove no longer used editor-import comment --- templates/blank-3.0/src/payload.config.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/templates/blank-3.0/src/payload.config.ts b/templates/blank-3.0/src/payload.config.ts index d1ba25647f..7a1b155371 100644 --- a/templates/blank-3.0/src/payload.config.ts +++ b/templates/blank-3.0/src/payload.config.ts @@ -1,6 +1,6 @@ import { mongooseAdapter } from '@payloadcms/db-mongodb' // database-adapter-import // import { payloadCloud } from '@payloadcms/plugin-cloud' -import { lexicalEditor } from '@payloadcms/richtext-lexical' // editor-import +import { lexicalEditor } from '@payloadcms/richtext-lexical' import path from 'path' import { buildConfig } from 'payload/config' // import sharp from 'sharp' @@ -27,6 +27,7 @@ export default buildConfig({ url: process.env.DATABASE_URI || '', }), // database-adapter-config-end + // Sharp is now an optional dependency - // if you want to resize images, crop, set focal point, etc. // make sure to install it and pass it to the config. From 2722d2f5ce48544c2a468fead49e0d17314d45f2 Mon Sep 17 00:00:00 2001 From: Ritsu Date: Sat, 13 Apr 2024 23:24:46 +0300 Subject: [PATCH 137/177] fix: passes number type limit arg to find on the list view (#5837) Co-authored-by: Paul --- packages/next/src/views/List/index.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/next/src/views/List/index.tsx b/packages/next/src/views/List/index.tsx index 5a3e881f20..52110577e1 100644 --- a/packages/next/src/views/List/index.tsx +++ b/packages/next/src/views/List/index.tsx @@ -78,7 +78,7 @@ export const ListView: React.FC = async ({ initPageResult, searc CustomListView = CustomList.Component } - const page = isNumber(query?.page) ? query.page : 0 + const page = isNumber(query?.page) ? Number(query.page) : 0 const whereQuery = mergeListSearchAndWhere({ collectionConfig, query: { @@ -87,7 +87,7 @@ export const ListView: React.FC = async ({ initPageResult, searc }, }) const limit = isNumber(query?.limit) - ? query.limit + ? Number(query.limit) : listPreferences?.limit || collectionConfig.admin.pagination.defaultLimit const sort = query?.sort && typeof query.sort === 'string' From 3f2df643e7fc49246edfae554b8b99d39390cae5 Mon Sep 17 00:00:00 2001 From: Alessio Gravili Date: Sun, 14 Apr 2024 02:18:16 -0400 Subject: [PATCH 138/177] chore(richtext-lexical): add failing e2e test which ensures sub-richtext blocks work as intended --- test/fields/collections/Lexical/blocks.ts | 30 ++- test/fields/collections/Lexical/e2e.spec.ts | 200 +++++++++++++++++- .../Lexical/generateLexicalRichText.ts | 4 +- test/helpers.ts | 2 +- 4 files changed, 227 insertions(+), 9 deletions(-) diff --git a/test/fields/collections/Lexical/blocks.ts b/test/fields/collections/Lexical/blocks.ts index 15ae911f01..593e12c54b 100644 --- a/test/fields/collections/Lexical/blocks.ts +++ b/test/fields/collections/Lexical/blocks.ts @@ -1,6 +1,7 @@ import type { LexicalBlock } from '@payloadcms/richtext-lexical' import type { ArrayField } from 'payload/types' +import { BlocksFeature } from '@payloadcms/richtext-lexical' import { lexicalEditor } from '@payloadcms/richtext-lexical' import { textFieldsSlug } from '../Text/shared.js' @@ -113,12 +114,35 @@ export const RadioButtonsBlock: LexicalBlock = { export const RichTextBlock: LexicalBlock = { fields: [ { - name: 'richText', + name: 'richTextField', type: 'richText', - editor: lexicalEditor(), + editor: lexicalEditor({ + features: ({ defaultFeatures }) => [ + ...defaultFeatures, + BlocksFeature({ + blocks: [ + { + fields: [ + { + name: 'subRichTextField', + type: 'richText', + editor: lexicalEditor({}), + }, + { + name: 'subUploadField', + type: 'upload', + relationTo: 'uploads', + }, + ], + slug: 'lexicalAndUploadBlock', + }, + ], + }), + ], + }), }, ], - slug: 'richText', + slug: 'richTextBlock', } export const UploadAndRichTextBlock: LexicalBlock = { diff --git a/test/fields/collections/Lexical/e2e.spec.ts b/test/fields/collections/Lexical/e2e.spec.ts index ff08b17e6b..197413321b 100644 --- a/test/fields/collections/Lexical/e2e.spec.ts +++ b/test/fields/collections/Lexical/e2e.spec.ts @@ -7,9 +7,10 @@ import { expect, test } from '@playwright/test' import { initPayloadE2ENoConfig } from 'helpers/initPayloadE2ENoConfig.js' import { reInitializeDB } from 'helpers/reInit.js' import path from 'path' +import { wait } from 'payload/utilities' import { fileURLToPath } from 'url' -import type { Config, LexicalField } from '../../payload-types.js' +import type { Config, LexicalField, Upload } from '../../payload-types.js' import { initPageConsoleErrorCatch, saveDocAndAssert } from '../../../helpers.js' import { AdminUrlUtil } from '../../../helpers/adminUrlUtil.js' @@ -147,6 +148,7 @@ describe('lexical', () => { await payload.find({ collection: lexicalFieldsSlug, depth: 0, + overrideAccess: true, where: { title: { equals: lexicalDocData.title, @@ -216,6 +218,7 @@ describe('lexical', () => { await payload.find({ collection: lexicalFieldsSlug, depth: 0, + overrideAccess: true, where: { title: { equals: lexicalDocData.title, @@ -366,6 +369,7 @@ describe('lexical', () => { await payload.find({ collection: lexicalFieldsSlug, depth: 0, + overrideAccess: true, where: { title: { equals: lexicalDocData.title, @@ -375,8 +379,11 @@ describe('lexical', () => { ).docs[0] as never const lexicalField: SerializedEditorState = lexicalDoc.lexicalWithBlocks + const blockNode: SerializedBlockNode = lexicalField.root.children[4] as SerializedBlockNode - const textNodeInBlockNodeRichText = blockNode.fields.richText.root.children[1].children[0] + + const textNodeInBlockNodeRichText = + blockNode.fields.richTextField.root.children[1].children[0] expect(textNodeInBlockNodeRichText.text).toBe( 'Some text below relationship node 1 inserted text', @@ -443,6 +450,7 @@ describe('lexical', () => { await payload.find({ collection: lexicalFieldsSlug, depth: 0, + overrideAccess: true, where: { title: { equals: lexicalDocData.title, @@ -453,7 +461,7 @@ describe('lexical', () => { const lexicalField: SerializedEditorState = lexicalDoc.lexicalWithBlocks const blockNode: SerializedBlockNode = lexicalField.root.children[4] as SerializedBlockNode - const paragraphNodeInBlockNodeRichText = blockNode.fields.richText.root.children[1] + const paragraphNodeInBlockNodeRichText = blockNode.fields.richTextField.root.children[1] expect(paragraphNodeInBlockNodeRichText.children).toHaveLength(2) @@ -534,6 +542,7 @@ describe('lexical', () => { await payload.find({ collection: lexicalFieldsSlug, depth: 0, + overrideAccess: true, where: { title: { equals: lexicalDocData.title, @@ -680,6 +689,7 @@ describe('lexical', () => { await payload.find({ collection: lexicalFieldsSlug, depth: 0, + overrideAccess: true, where: { title: { equals: lexicalDocData.title, @@ -702,6 +712,189 @@ describe('lexical', () => { }) }) + // Big test which tests a bunch of things: Creation of blocks via slash commands, creation of deeply nested sub-lexical-block fields via slash commands, properly populated deeply nested fields within those + test('ensure creation of a lexical, lexical-field-block, which contains another lexical, lexical-and-upload-field-block, works and that the sub-upload field is properly populated', async () => { + await navigateToLexicalFields() + const richTextField = page.locator('.rich-text-lexical').nth(1) // second + await richTextField.scrollIntoViewIfNeeded() + await expect(richTextField).toBeVisible() + + const lastParagraph = richTextField.locator('p').last() + await lastParagraph.scrollIntoViewIfNeeded() + await expect(lastParagraph).toBeVisible() + + /** + * Create new sub-block + */ + // type / to open the slash menu + await lastParagraph.click() + await page.keyboard.press('/') + await page.keyboard.type('Rich') + + // Create Rich Text Block + const slashMenuPopover = page.locator('#slash-menu .slash-menu-popup') + await expect(slashMenuPopover).toBeVisible() + + // Click 1. Button and ensure it's the Rich Text block creation button (it should be! Otherwise, sorting wouldn't work) + const richTextBlockSelectButton = slashMenuPopover.locator('button').first() + await expect(richTextBlockSelectButton).toBeVisible() + await expect(richTextBlockSelectButton).toContainText('Rich Text') + await richTextBlockSelectButton.click() + await expect(slashMenuPopover).toBeHidden() + + const newRichTextBlock = richTextField + .locator('.lexical-block:not(.lexical-block .lexical-block)') + .last() // The :not(.lexical-block .lexical-block) makes sure this does not select sub-blocks + await newRichTextBlock.scrollIntoViewIfNeeded() + await expect(newRichTextBlock).toBeVisible() + + // Ensure that sub-editor is empty + const newRichTextEditorParagraph = newRichTextBlock.locator('p').first() + await expect(newRichTextEditorParagraph).toBeVisible() + await expect(newRichTextEditorParagraph).toHaveText('') + + await newRichTextEditorParagraph.click() + await page.keyboard.press('/') + await page.keyboard.type('Lexical') + await expect(slashMenuPopover).toBeVisible() + // Click 1. Button and ensure it's the Lexical And Upload block creation button (it should be! Otherwise, sorting wouldn't work) + const lexicalAndUploadBlockSelectButton = slashMenuPopover.locator('button').first() + await expect(lexicalAndUploadBlockSelectButton).toBeVisible() + await expect(lexicalAndUploadBlockSelectButton).toContainText('Lexical And Upload') + await lexicalAndUploadBlockSelectButton.click() + await expect(slashMenuPopover).toBeHidden() + + // Ensure that sub-editor is created + const newSubLexicalAndUploadBlock = newRichTextBlock.locator('.lexical-block').first() + await newSubLexicalAndUploadBlock.scrollIntoViewIfNeeded() + await expect(newSubLexicalAndUploadBlock).toBeVisible() + + // Type in newSubLexicalAndUploadBlock + const paragraphInSubEditor = newSubLexicalAndUploadBlock.locator('p').first() + await expect(paragraphInSubEditor).toBeVisible() + await paragraphInSubEditor.click() + await page.keyboard.type('Some subText') + // Upload something + const chooseExistingUploadButton = newSubLexicalAndUploadBlock + .locator('.upload__toggler.list-drawer__toggler') + .first() + await expect(chooseExistingUploadButton).toBeVisible() + await chooseExistingUploadButton.click() + await wait(500) // wait for drawer form state to initialize (it's a flake) + const uploadListDrawer = page.locator('dialog[id^=list-drawer_1_]').first() // IDs starting with list-drawer_1_ (there's some other symbol after the underscore) + await expect(uploadListDrawer).toBeVisible() + // find button which has a span with text "payload.jpg" and click it in playwright + const uploadButton = uploadListDrawer.locator('button').getByText('payload.jpg').first() + await expect(uploadButton).toBeVisible() + await uploadButton.click() + await expect(uploadListDrawer).toBeHidden() + // Check if the upload is there + await expect( + newSubLexicalAndUploadBlock.locator('.field-type.upload .file-meta__url a'), + ).toHaveText('payload.jpg') + // save document and assert + await saveDocAndAssert(page) + await expect( + newSubLexicalAndUploadBlock.locator('.field-type.upload .file-meta__url a'), + ).toHaveText('payload.jpg') + await expect(paragraphInSubEditor).toHaveText('Some subText') + + // reload page and assert again + await page.reload() + await expect( + newSubLexicalAndUploadBlock.locator('.field-type.upload .file-meta__url a'), + ).toHaveText('payload.jpg') + await expect(paragraphInSubEditor).toHaveText('Some subText') + + // Check if the API result is populated correctly - Depth 0 + await expect(async () => { + const lexicalDoc: LexicalField = ( + await payload.find({ + collection: lexicalFieldsSlug, + depth: 0, + overrideAccess: true, + where: { + title: { + equals: lexicalDocData.title, + }, + }, + }) + ).docs[0] as never + + const uploadDoc: Upload = ( + await payload.find({ + collection: 'uploads', + depth: 0, + overrideAccess: true, + where: { + filename: { + equals: 'payload.jpg', + }, + }, + }) + ).docs[0] as never + + const lexicalField: SerializedEditorState = lexicalDoc.lexicalWithBlocks + const richTextBlock: SerializedBlockNode = lexicalField.root + .children[12] as SerializedBlockNode + const subRichTextBlock: SerializedBlockNode = richTextBlock.fields.richTextField.root + .children[1] as SerializedBlockNode // index 0 and 2 are paragraphs created by default around the block node when a new block is added via slash command + + const subSubRichTextField = subRichTextBlock.fields.subRichTextField + const subSubUploadField = subRichTextBlock.fields.subUploadField + + expect(subSubRichTextField.root.children[0].children[0].text).toBe('Some subText') + expect(subSubUploadField).toBe(uploadDoc.id) + }).toPass({ + timeout: POLL_TOPASS_TIMEOUT, + }) + + // Check if the API result is populated correctly - Depth 1 + await expect(async () => { + // Now with depth 1 + const lexicalDocDepth1: LexicalField = ( + await payload.find({ + collection: lexicalFieldsSlug, + depth: 1, + overrideAccess: true, + where: { + title: { + equals: lexicalDocData.title, + }, + }, + }) + ).docs[0] as never + + const uploadDoc: Upload = ( + await payload.find({ + collection: 'uploads', + depth: 0, + overrideAccess: true, + where: { + filename: { + equals: 'payload.jpg', + }, + }, + }) + ).docs[0] as never + + const lexicalField2: SerializedEditorState = lexicalDocDepth1.lexicalWithBlocks + const richTextBlock2: SerializedBlockNode = lexicalField2.root + .children[12] as SerializedBlockNode + const subRichTextBlock2: SerializedBlockNode = richTextBlock2.fields.richTextField.root + .children[1] as SerializedBlockNode // index 0 and 2 are paragraphs created by default around the block node when a new block is added via slash command + + const subSubRichTextField2 = subRichTextBlock2.fields.subRichTextField + const subSubUploadField2 = subRichTextBlock2.fields.subUploadField + + expect(subSubRichTextField2.root.children[0].children[0].text).toBe('Some subText') + expect(subSubUploadField2.id).toBe(uploadDoc.id) + expect(subSubUploadField2.filename).toBe(uploadDoc.filename) + }).toPass({ + timeout: POLL_TOPASS_TIMEOUT, + }) + }) + test('should allow changing values of two different radio button blocks independently', async () => { // This test ensures that https://github.com/payloadcms/payload/issues/3911 does not happen again @@ -750,6 +943,7 @@ describe('lexical', () => { await payload.find({ collection: lexicalFieldsSlug, depth: 0, + overrideAccess: true, where: { title: { equals: lexicalDocData.title, diff --git a/test/fields/collections/Lexical/generateLexicalRichText.ts b/test/fields/collections/Lexical/generateLexicalRichText.ts index b38d2fd61b..08bedd6bb4 100644 --- a/test/fields/collections/Lexical/generateLexicalRichText.ts +++ b/test/fields/collections/Lexical/generateLexicalRichText.ts @@ -110,7 +110,7 @@ export function generateLexicalRichText() { version: 2, fields: { id: '65298b1ddb4ef8c744a7faab', - richText: { + richTextField: { root: { type: 'root', format: '', @@ -149,7 +149,7 @@ export function generateLexicalRichText() { }, }, blockName: 'Block Node, with RichText Field, with Relationship Node', - blockType: 'richText', + blockType: 'richTextBlock', }, }, { diff --git a/test/helpers.ts b/test/helpers.ts index 8211346fd9..7497a65d35 100644 --- a/test/helpers.ts +++ b/test/helpers.ts @@ -133,7 +133,7 @@ export async function openNav(page: Page): Promise { export async function openDocDrawer(page: Page, selector: string): Promise { await wait(300) // wait for parent form state to initialize await page.locator(selector).click({ delay: 100 }) - await wait(500) // wait for drawer form state to initializ + await wait(500) // wait for drawer form state to initialize } export async function closeNav(page: Page): Promise { From 993b035285ce263a0740309a4fbf60023032cb80 Mon Sep 17 00:00:00 2001 From: Alessio Gravili Date: Sun, 14 Apr 2024 02:19:58 -0400 Subject: [PATCH 139/177] fix(richtext-lexical): ensure schema maps for complex fields / sub-fields are handled correctly for blocks, link and upload features --- packages/next/src/exports/utilities.ts | 1 + .../field/features/blocks/component/index.tsx | 4 +- .../field/features/blocks/feature.server.ts | 48 +++++++------------ .../src/field/features/link/drawer/index.tsx | 4 +- .../src/field/features/link/feature.server.ts | 38 +++++++++++---- .../src/field/features/types.ts | 8 +--- .../component/ExtraFieldsDrawer/index.tsx | 4 +- .../field/features/upload/feature.server.ts | 25 +++++++--- .../src/generateComponentMap.tsx | 38 +++++++-------- .../richtext-lexical/src/generateSchemaMap.ts | 20 ++++---- 10 files changed, 101 insertions(+), 89 deletions(-) diff --git a/packages/next/src/exports/utilities.ts b/packages/next/src/exports/utilities.ts index 4937507d59..506e94daf6 100644 --- a/packages/next/src/exports/utilities.ts +++ b/packages/next/src/exports/utilities.ts @@ -1,2 +1,3 @@ +export { traverseFields } from '../utilities/buildFieldSchemaMap/traverseFields.js' export { getNextRequestI18n } from '../utilities/getNextRequestI18n.js' export { getPayloadHMR } from '../utilities/getPayloadHMR.js' diff --git a/packages/richtext-lexical/src/field/features/blocks/component/index.tsx b/packages/richtext-lexical/src/field/features/blocks/component/index.tsx index 2a753d1889..3bdb403d7b 100644 --- a/packages/richtext-lexical/src/field/features/blocks/component/index.tsx +++ b/packages/richtext-lexical/src/field/features/blocks/component/index.tsx @@ -154,7 +154,9 @@ export const BlockComponent: React.FC = (props) => { reducedBlock, blockFieldWrapperName, onChange, - ]) + schemaFieldsPath, + path, + ]) // Adding formData to the dependencies here might break it return
    {formContent}
    } diff --git a/packages/richtext-lexical/src/field/features/blocks/feature.server.ts b/packages/richtext-lexical/src/field/features/blocks/feature.server.ts index a31b75bfa6..9a278bd4eb 100644 --- a/packages/richtext-lexical/src/field/features/blocks/feature.server.ts +++ b/packages/richtext-lexical/src/field/features/blocks/feature.server.ts @@ -1,5 +1,6 @@ import type { Block, BlockField, Field, FieldWithRichTextRequiredEditor } from 'payload/types' +import { traverseFields } from '@payloadcms/next/utilities' import { baseBlockFields, sanitizeFields } from 'payload/config' import { fieldsToJSONSchema, formatLabels } from 'payload/utilities' @@ -60,43 +61,26 @@ export const BlocksFeature: FeatureProviderProviderServer< return { ClientComponent: BlocksFeatureClientComponent, clientFeatureProps: clientProps, - generateSchemaMap: ({ config, props, schemaMap: schemaMapFromProps, schemaPath }) => { - const schemaMap: { - [key: string]: Field[] - } = {} + generateSchemaMap: ({ config, i18n, props }) => { + const validRelationships = config.collections.map((c) => c.slug) || [] /** - * Add sub-fields to the schemaMap. E.g. if you have an array field as part of the block and it runs addRow, it will request these - * sub-fields from the component map. Thus we need to put them in the component map here. + * Add sub-fields to the schemaMap. E.g. if you have an array field as part of the block, and it runs addRow, it will request these + * sub-fields from the component map. Thus, we need to put them in the component map here. */ - const handleFields = (parentPath: string, fields: Field[]) => { - for (const field of fields) { - if ('name' in field && 'fields' in field) { - schemaMap[parentPath + '.' + field.name] = field.fields - handleFields(parentPath + '.' + field.name, field.fields) - } - if ('blocks' in field) { - for (const block of field.blocks) { - schemaMap[parentPath + '.' + field.name + '.' + block.slug] = block.fields || [] - handleFields(parentPath + '.' + field.name + '.' + block.slug, block.fields) - } - } - if ('tabs' in field) { - for (const tab of field.tabs) { - if ('name' in tab) { - schemaMap[parentPath + '.' + tab.name] = tab.fields || [] - handleFields(parentPath + '.' + tab.name, tab.fields) - } else { - handleFields(parentPath, tab.fields) - } - } - } - } - } + const schemaMap = new Map() for (const block of props.blocks) { - schemaMap[block.slug] = block.fields || [] - handleFields(block.slug, block.fields) + schemaMap.set(block.slug, block.fields || []) + + traverseFields({ + config, + fields: block.fields, + i18n, + schemaMap, + schemaPath: block.slug, + validRelationships, + }) } return schemaMap diff --git a/packages/richtext-lexical/src/field/features/link/drawer/index.tsx b/packages/richtext-lexical/src/field/features/link/drawer/index.tsx index 20a651cfcf..11efc18552 100644 --- a/packages/richtext-lexical/src/field/features/link/drawer/index.tsx +++ b/packages/richtext-lexical/src/field/features/link/drawer/index.tsx @@ -87,9 +87,9 @@ export const LinkDrawer: React.FC = ({ drawerSlug, handleModalSubmit, sta {t('general:submit')} diff --git a/packages/richtext-lexical/src/field/features/link/feature.server.ts b/packages/richtext-lexical/src/field/features/link/feature.server.ts index b9a2d043bf..42acc66c6c 100644 --- a/packages/richtext-lexical/src/field/features/link/feature.server.ts +++ b/packages/richtext-lexical/src/field/features/link/feature.server.ts @@ -1,6 +1,8 @@ import type { I18n } from '@payloadcms/translations' import type { SanitizedConfig } from 'payload/config' -import type { FieldWithRichTextRequiredEditor } from 'payload/types' +import type { Field, FieldWithRichTextRequiredEditor } from 'payload/types' + +import { traverseFields } from '@payloadcms/next/utilities' import type { HTMLConverter } from '../converters/html/converter/types.js' import type { FeatureProviderProviderServer } from '../types.js' @@ -65,15 +67,33 @@ export const LinkFeature: FeatureProviderProviderServer { - return { - fields: transformExtraFields( - props.fields, - config, - i18n, - props.enabledCollections, - props.disabledCollections, - ), + if (!props?.fields || !Array.isArray(props.fields) || props.fields.length === 0) { + return null } + const schemaMap = new Map() + + const validRelationships = config.collections.map((c) => c.slug) || [] + + const transformedFields = transformExtraFields( + props.fields, + config, + i18n, + props.enabledCollections, + props.disabledCollections, + ) + + schemaMap.set('fields', transformedFields) + + traverseFields({ + config, + fields: transformedFields, + i18n, + schemaMap, + schemaPath: 'fields', + validRelationships, + }) + + return schemaMap }, nodes: [ { diff --git a/packages/richtext-lexical/src/field/features/types.ts b/packages/richtext-lexical/src/field/features/types.ts index 9864537968..5a25b64c03 100644 --- a/packages/richtext-lexical/src/field/features/types.ts +++ b/packages/richtext-lexical/src/field/features/types.ts @@ -191,13 +191,7 @@ export type ServerFeature = { props: ServerProps schemaMap: Map schemaPath: string - }) => - | { - [key: string]: Field[] - } - | Promise<{ - [key: string]: Field[] - }> + }) => Map | null generatedTypes?: { modifyOutputSchema: ({ collectionIDFieldTypes, diff --git a/packages/richtext-lexical/src/field/features/upload/component/ExtraFieldsDrawer/index.tsx b/packages/richtext-lexical/src/field/features/upload/component/ExtraFieldsDrawer/index.tsx index cc9752e5eb..194d619f8b 100644 --- a/packages/richtext-lexical/src/field/features/upload/component/ExtraFieldsDrawer/index.tsx +++ b/packages/richtext-lexical/src/field/features/upload/component/ExtraFieldsDrawer/index.tsx @@ -140,9 +140,9 @@ export const ExtraFieldsUploadDrawer: React.FC< {t('fields:saveChanges')} diff --git a/packages/richtext-lexical/src/field/features/upload/feature.server.ts b/packages/richtext-lexical/src/field/features/upload/feature.server.ts index 83d62ab5b7..cc9f484d46 100644 --- a/packages/richtext-lexical/src/field/features/upload/feature.server.ts +++ b/packages/richtext-lexical/src/field/features/upload/feature.server.ts @@ -1,5 +1,7 @@ import type { Field, FieldWithRichTextRequiredEditor, Payload } from 'payload/types' +import { traverseFields } from '@payloadcms/next/utilities' + import type { HTMLConverter } from '../converters/html/converter/types.js' import type { FeatureProviderProviderServer } from '../types.js' import type { UploadFeaturePropsClient } from './feature.client.js' @@ -46,18 +48,27 @@ export const UploadFeature: FeatureProviderProviderServer< return { ClientComponent: UploadFeatureClientComponent, clientFeatureProps: clientProps, - generateSchemaMap: ({ props }) => { - if (!props?.collections) return {} + generateSchemaMap: ({ config, i18n, props }) => { + if (!props?.collections) return null - const map: { - [key: string]: Field[] - } = {} + const schemaMap = new Map() + const validRelationships = config.collections.map((c) => c.slug) || [] for (const collection in props.collections) { - map[collection] = props.collections[collection].fields + if (props.collections[collection].fields?.length) { + schemaMap.set(collection, props.collections[collection].fields) + traverseFields({ + config, + fields: props.collections[collection].fields, + i18n, + schemaMap, + schemaPath: collection, + validRelationships, + }) + } } - return map + return schemaMap }, nodes: [ { diff --git a/packages/richtext-lexical/src/generateComponentMap.tsx b/packages/richtext-lexical/src/generateComponentMap.tsx index 480c018530..8a0bb518a4 100644 --- a/packages/richtext-lexical/src/generateComponentMap.tsx +++ b/packages/richtext-lexical/src/generateComponentMap.tsx @@ -76,27 +76,27 @@ export const getGenerateComponentMap = schemaPath, }) - for (const schemaKey in schemas) { - const fields = schemas[schemaKey] + if (schemas) { + for (const [schemaKey, fields] of schemas.entries()) { + const sanitizedFields = sanitizeFields({ + config, + fields: cloneDeep(fields), + requireFieldLevelRichTextEditor: true, + validRelationships, + }) - const sanitizedFields = sanitizeFields({ - config, - fields: cloneDeep(fields), - requireFieldLevelRichTextEditor: true, - validRelationships, - }) + const mappedFields = mapFields({ + WithServerSideProps, + config, + disableAddingID: true, + fieldSchema: sanitizedFields, + i18n, + parentPath: `${schemaPath}.feature.${featureKey}.fields.${schemaKey}`, + readOnly: false, + }) - const mappedFields = mapFields({ - WithServerSideProps, - config, - disableAddingID: true, - fieldSchema: sanitizedFields, - i18n, - parentPath: `${schemaPath}.feature.${featureKey}.fields.${schemaKey}`, - readOnly: false, - }) - - componentMap.set(`feature.${featureKey}.fields.${schemaKey}`, mappedFields) + componentMap.set(`feature.${featureKey}.fields.${schemaKey}`, mappedFields) + } } } diff --git a/packages/richtext-lexical/src/generateSchemaMap.ts b/packages/richtext-lexical/src/generateSchemaMap.ts index 590073e76a..ab09c389e9 100644 --- a/packages/richtext-lexical/src/generateSchemaMap.ts +++ b/packages/richtext-lexical/src/generateSchemaMap.ts @@ -26,17 +26,17 @@ export const getGenerateSchemaMap = schemaPath, }) - for (const schemaKey in schemas) { - const fields = schemas[schemaKey] + if (schemas) { + for (const [schemaKey, fields] of schemas.entries()) { + const sanitizedFields = sanitizeFields({ + config, + fields: cloneDeep(fields), + requireFieldLevelRichTextEditor: true, + validRelationships, + }) - const sanitizedFields = sanitizeFields({ - config, - fields: cloneDeep(fields), - requireFieldLevelRichTextEditor: true, - validRelationships, - }) - - schemaMap.set(`${schemaPath}.feature.${featureKey}.${schemaKey}`, sanitizedFields) + schemaMap.set(`${schemaPath}.feature.${featureKey}.${schemaKey}`, sanitizedFields) + } } } From da79f09544d14a6441c2fbf3f58c638b39629cf8 Mon Sep 17 00:00:00 2001 From: Alessio Gravili Date: Sun, 14 Apr 2024 16:43:42 -0400 Subject: [PATCH 140/177] fix(payload): ensure that the minimum @swc/core peerdep version used is 1.4.13 (#5841) --- packages/payload/package.json | 8 ++++++++ pnpm-lock.yaml | 3 +++ 2 files changed, 11 insertions(+) diff --git a/packages/payload/package.json b/packages/payload/package.json index 888032c63c..f66077bea5 100644 --- a/packages/payload/package.json +++ b/packages/payload/package.json @@ -67,6 +67,14 @@ "scheduler": "0.23.0", "scmp": "2.1.0" }, + "peerDependencies": { + "@swc/core": "^1.4.13" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + } + }, "devDependencies": { "@monaco-editor/react": "4.5.1", "@payloadcms/eslint-config": "workspace:*", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cead960ab3..c68536d186 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -712,6 +712,9 @@ importers: '@swc-node/sourcemap-support': specifier: ^0.5.0 version: 0.5.0 + '@swc/core': + specifier: ^1.4.13 + version: 1.4.13 '@types/probe-image-size': specifier: ^7.2.4 version: 7.2.4 From 07b676ac81cb78753b928057e5c60827dbb28ba3 Mon Sep 17 00:00:00 2001 From: Alessio Gravili Date: Sun, 14 Apr 2024 16:45:54 -0400 Subject: [PATCH 141/177] chore(richtext-lexical): adjust field name inside int tests --- test/fields/lexical.int.spec.ts | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/test/fields/lexical.int.spec.ts b/test/fields/lexical.int.spec.ts index 86042cd374..d82755f6da 100644 --- a/test/fields/lexical.int.spec.ts +++ b/test/fields/lexical.int.spec.ts @@ -33,7 +33,6 @@ import { let payload: Payload let restClient: NextRESTClient -let token: string let createdArrayDocID: number | string = null let createdJPGDocID: number | string = null @@ -409,7 +408,7 @@ describe('Lexical', () => { const subEditorBlockNode: SerializedBlockNode = lexicalField.root .children[4] as SerializedBlockNode - const subEditor: SerializedEditorState = subEditorBlockNode.fields.richText + const subEditor: SerializedEditorState = subEditorBlockNode.fields.richTextField const subEditorRelationshipNode: SerializedRelationshipNode = subEditor.root .children[0] as SerializedRelationshipNode @@ -440,7 +439,7 @@ describe('Lexical', () => { const subEditorBlockNode: SerializedBlockNode = lexicalField.root .children[4] as SerializedBlockNode - const subEditor: SerializedEditorState = subEditorBlockNode.fields.richText + const subEditor: SerializedEditorState = subEditorBlockNode.fields.richTextField const subEditorRelationshipNode: SerializedRelationshipNode = subEditor.root .children[0] as SerializedRelationshipNode @@ -487,7 +486,7 @@ describe('Lexical', () => { const subEditorBlockNode: SerializedBlockNode = lexicalField.root .children[4] as SerializedBlockNode - const subEditor: SerializedEditorState = subEditorBlockNode.fields.richText + const subEditor: SerializedEditorState = subEditorBlockNode.fields.richTextField const subEditorRelationshipNode: SerializedRelationshipNode = subEditor.root .children[0] as SerializedRelationshipNode From 1ffc0f552e1eb4b1e8dd1b9999120200cf6f6522 Mon Sep 17 00:00:00 2001 From: Ritsu Date: Sun, 14 Apr 2024 23:49:06 +0300 Subject: [PATCH 142/177] fix(payload): remove incorrect payload module import within payload (#5847) --- packages/payload/src/utilities/isEntityHidden.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/payload/src/utilities/isEntityHidden.ts b/packages/payload/src/utilities/isEntityHidden.ts index 0406674794..72ec9078ed 100644 --- a/packages/payload/src/utilities/isEntityHidden.ts +++ b/packages/payload/src/utilities/isEntityHidden.ts @@ -1,7 +1,6 @@ -import type { PayloadRequest } from 'payload/types' - import type { SanitizedCollectionConfig } from '../collections/config/types.js' import type { SanitizedGlobalConfig } from '../globals/config/types.js' +import type { PayloadRequest } from '../types/index.js' export const isEntityHidden = ({ hidden, From 18ec830882c3cfcea62f06504ddc66c107167f30 Mon Sep 17 00:00:00 2001 From: Oladayo Olufemi Fagbemi <89917778+oladayo21@users.noreply.github.com> Date: Sun, 14 Apr 2024 23:28:53 +0200 Subject: [PATCH 143/177] fix(plugin-seo): incorrect styling of field labels (#5845) Co-authored-by: Oladayo Fagbemi Co-authored-by: Alessio Gravili --- packages/plugin-seo/src/fields/MetaDescription.tsx | 13 +------------ packages/plugin-seo/src/fields/MetaImage.tsx | 12 +----------- packages/plugin-seo/src/fields/MetaTitle.tsx | 12 +----------- packages/plugin-seo/src/fields/index.scss | 2 +- 4 files changed, 4 insertions(+), 35 deletions(-) diff --git a/packages/plugin-seo/src/fields/MetaDescription.tsx b/packages/plugin-seo/src/fields/MetaDescription.tsx index 6bf01c5b7d..54ba05e33d 100644 --- a/packages/plugin-seo/src/fields/MetaDescription.tsx +++ b/packages/plugin-seo/src/fields/MetaDescription.tsx @@ -76,18 +76,7 @@ export const MetaDescription: React.FC = (props) => { }} >
    - {CustomLabel !== undefined ? CustomLabel : } - {required && ( - - * - - )} - + {hasGenerateDescriptionFn && (   —   diff --git a/packages/plugin-seo/src/fields/MetaImage.tsx b/packages/plugin-seo/src/fields/MetaImage.tsx index cd6e54d8fa..9be4a6c4d6 100644 --- a/packages/plugin-seo/src/fields/MetaImage.tsx +++ b/packages/plugin-seo/src/fields/MetaImage.tsx @@ -77,17 +77,7 @@ export const MetaImage: React.FC = (props) => { }} >
    - {CustomLabel !== undefined ? CustomLabel : } - {required && ( - - * - - )} + {hasGenerateImageFn && (   —   diff --git a/packages/plugin-seo/src/fields/MetaTitle.tsx b/packages/plugin-seo/src/fields/MetaTitle.tsx index 6b2ad68d38..4d8e1b36bd 100644 --- a/packages/plugin-seo/src/fields/MetaTitle.tsx +++ b/packages/plugin-seo/src/fields/MetaTitle.tsx @@ -77,17 +77,7 @@ export const MetaTitle: React.FC = (props) => { }} >
    - {CustomLabel !== undefined ? CustomLabel : } - {required && ( - - * - - )} + {hasGenerateTitleFn && (   —   diff --git a/packages/plugin-seo/src/fields/index.scss b/packages/plugin-seo/src/fields/index.scss index 2780c812b7..27f37aea7d 100644 --- a/packages/plugin-seo/src/fields/index.scss +++ b/packages/plugin-seo/src/fields/index.scss @@ -1,5 +1,5 @@ .plugin-seo__field { .field-label { - display: inline; + display: inline!important; } } From c0b454a5de6654a6a38654c31f8d9b720c615abb Mon Sep 17 00:00:00 2001 From: Oladayo Olufemi Fagbemi <89917778+oladayo21@users.noreply.github.com> Date: Sun, 14 Apr 2024 23:44:15 +0200 Subject: [PATCH 144/177] fix(plugin-seo): add default empty endpoints array (#5844) --- packages/plugin-seo/src/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/plugin-seo/src/index.tsx b/packages/plugin-seo/src/index.tsx index c953ab21ff..f0417bc2b9 100644 --- a/packages/plugin-seo/src/index.tsx +++ b/packages/plugin-seo/src/index.tsx @@ -194,7 +194,7 @@ const seo = return collection }) || [], endpoints: [ - ...config.endpoints, + ...(config.endpoints ?? []), { handler: async (req) => { const args: Parameters[0] = From ae2c85f9473bb6bcef570bbec48533c9626d51e9 Mon Sep 17 00:00:00 2001 From: James Date: Mon, 15 Apr 2024 10:19:55 -0400 Subject: [PATCH 145/177] chore: exports getFieldsToSign --- packages/payload/src/auth/getFieldsToSign.ts | 1 - packages/payload/src/exports/auth.ts | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/payload/src/auth/getFieldsToSign.ts b/packages/payload/src/auth/getFieldsToSign.ts index 784f3af3cb..a9fa9646f0 100644 --- a/packages/payload/src/auth/getFieldsToSign.ts +++ b/packages/payload/src/auth/getFieldsToSign.ts @@ -2,7 +2,6 @@ import type { CollectionConfig } from '../collections/config/types.js' import type { Field, TabAsField } from '../fields/config/types.js' import type { PayloadRequest } from '../types/index.js' -import type { User } from './index.js' import { fieldAffectsData, tabHasName } from '../fields/config/types.js' diff --git a/packages/payload/src/exports/auth.ts b/packages/payload/src/exports/auth.ts index 9838eac56a..936016a2d2 100644 --- a/packages/payload/src/exports/auth.ts +++ b/packages/payload/src/exports/auth.ts @@ -2,6 +2,7 @@ export * from '../auth/index.js' export { default as executeAccess } from '../auth/executeAccess.js' export { executeAuthStrategies } from '../auth/executeAuthStrategies.js' export { getAccessResults } from '../auth/getAccessResults.js' +export { getFieldsToSign } from '../auth/getFieldsToSign.js' export type { AuthStrategyFunction, From f3409fab29c49c8353dc6e6a0a42126df57df756 Mon Sep 17 00:00:00 2001 From: Patrik Date: Mon, 15 Apr 2024 10:24:07 -0400 Subject: [PATCH 146/177] fix(db-mongodb): failing contains query with special chars (#5776) --- packages/db-mongodb/src/queries/sanitizeQueryValue.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/db-mongodb/src/queries/sanitizeQueryValue.ts b/packages/db-mongodb/src/queries/sanitizeQueryValue.ts index fc7c1ff027..5912254ffe 100644 --- a/packages/db-mongodb/src/queries/sanitizeQueryValue.ts +++ b/packages/db-mongodb/src/queries/sanitizeQueryValue.ts @@ -142,7 +142,10 @@ export const sanitizeQueryValue = ({ if (path !== '_id' || (path === '_id' && hasCustomID && field.type === 'text')) { if (operator === 'contains') { - formattedValue = { $options: 'i', $regex: formattedValue } + formattedValue = { + $options: 'i', + $regex: formattedValue.replace(/[\\^$*+?.()|[\]{}]/g, '\\$&'), + } } } From 6a162776f2440a09425ed72078a307fa52ef6de6 Mon Sep 17 00:00:00 2001 From: Paul Date: Mon, 15 Apr 2024 12:53:12 -0300 Subject: [PATCH 147/177] chore: export react toastify from UI (#5828) --- packages/ui/src/exports/elements.ts | 6 ++++-- packages/ui/src/exports/fields.ts | 1 + packages/ui/src/exports/providers.ts | 1 + 3 files changed, 6 insertions(+), 2 deletions(-) create mode 100644 packages/ui/src/exports/fields.ts create mode 100644 packages/ui/src/exports/providers.ts diff --git a/packages/ui/src/exports/elements.ts b/packages/ui/src/exports/elements.ts index d3b2b4ef5b..f53972274d 100644 --- a/packages/ui/src/exports/elements.ts +++ b/packages/ui/src/exports/elements.ts @@ -46,9 +46,11 @@ export { Tooltip } from '../elements/Tooltip/index.js' export { Translation } from '../elements/Translation/index.js' export { UnpublishMany } from '../elements/UnpublishMany/index.js' export { Upload } from '../elements/Upload/index.js' -export { BlocksDrawer } from '../fields/Blocks/BlocksDrawer/index.js' import * as facelessUIImport from '@faceless-ui/modal' const { Modal } = facelessUIImport && 'Modal' in facelessUIImport ? facelessUIImport : { Modal: undefined } export { Modal } -export { SetViewActions } from '../providers/Actions/SetViewActions/index.js' +import * as reactToastifyImport from 'react-toastify' +const { toast } = + reactToastifyImport && 'toast' in reactToastifyImport ? reactToastifyImport : { toast: undefined } +export { toast } diff --git a/packages/ui/src/exports/fields.ts b/packages/ui/src/exports/fields.ts new file mode 100644 index 0000000000..79921ad079 --- /dev/null +++ b/packages/ui/src/exports/fields.ts @@ -0,0 +1 @@ +export { BlocksDrawer } from '../fields/Blocks/BlocksDrawer/index.js' diff --git a/packages/ui/src/exports/providers.ts b/packages/ui/src/exports/providers.ts new file mode 100644 index 0000000000..513c383c5f --- /dev/null +++ b/packages/ui/src/exports/providers.ts @@ -0,0 +1 @@ +export { SetViewActions } from '../providers/Actions/SetViewActions/index.js' From a394d8211e4cc442301d98e10731dc33d8b6d5f7 Mon Sep 17 00:00:00 2001 From: Patrik Date: Mon, 15 Apr 2024 12:02:17 -0400 Subject: [PATCH 148/177] fix: passes parent id instead of incoming id to saveVersion (#5854) --- packages/payload/src/versions/saveVersion.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/payload/src/versions/saveVersion.ts b/packages/payload/src/versions/saveVersion.ts index b9b01875e3..cae3e58657 100644 --- a/packages/payload/src/versions/saveVersion.ts +++ b/packages/payload/src/versions/saveVersion.ts @@ -154,7 +154,7 @@ export const saveVersion = async ({ createdVersion.updatedAt = result.updatedAt createdVersion = sanitizeInternalFields(createdVersion) - createdVersion.id = id + createdVersion.id = result.parent return createdVersion } From 4150c87be080844199c09ef65df9f6843df8c71a Mon Sep 17 00:00:00 2001 From: Paul Date: Mon, 15 Apr 2024 13:22:01 -0300 Subject: [PATCH 149/177] chore(plugin-nested-docs): update nested docs plugin exports and moved away from default exports (#5856) --- .../src/fields/breadcrumbs.ts | 2 -- .../plugin-nested-docs/src/fields/parent.ts | 2 -- .../src/fields/parentFilterOptions.ts | 2 -- .../src/hooks/resaveChildren.ts | 5 ++--- .../src/hooks/resaveSelfAfterCreate.ts | 4 +--- packages/plugin-nested-docs/src/index.ts | 18 +++++++++--------- .../src/utilities/formatBreadcrumb.ts | 4 +--- .../src/utilities/getParents.ts | 4 +--- .../src/utilities/populateBreadcrumbs.ts | 8 +++----- .../collections/Categories.ts | 4 ++-- test/plugin-nested-docs/collections/Pages.ts | 3 +-- .../collections/populateFullTitle.ts | 4 +--- test/plugin-nested-docs/config.ts | 2 +- 13 files changed, 22 insertions(+), 40 deletions(-) diff --git a/packages/plugin-nested-docs/src/fields/breadcrumbs.ts b/packages/plugin-nested-docs/src/fields/breadcrumbs.ts index 7eaadf38c5..262a21a76e 100644 --- a/packages/plugin-nested-docs/src/fields/breadcrumbs.ts +++ b/packages/plugin-nested-docs/src/fields/breadcrumbs.ts @@ -45,5 +45,3 @@ export const createBreadcrumbsField = ( ...(overrides?.fields || []), ], }) - -export default createBreadcrumbsField diff --git a/packages/plugin-nested-docs/src/fields/parent.ts b/packages/plugin-nested-docs/src/fields/parent.ts index 87086819e7..67b6d09b95 100644 --- a/packages/plugin-nested-docs/src/fields/parent.ts +++ b/packages/plugin-nested-docs/src/fields/parent.ts @@ -20,5 +20,3 @@ export const createParentField = ( relationTo, ...(overrides || {}), }) - -export default createParentField diff --git a/packages/plugin-nested-docs/src/fields/parentFilterOptions.ts b/packages/plugin-nested-docs/src/fields/parentFilterOptions.ts index e1c532e0d4..13ddc51efc 100644 --- a/packages/plugin-nested-docs/src/fields/parentFilterOptions.ts +++ b/packages/plugin-nested-docs/src/fields/parentFilterOptions.ts @@ -12,5 +12,3 @@ export const parentFilterOptions: (breadcrumbsFieldSlug?: string) => FilterOptio return null } - -export default parentFilterOptions diff --git a/packages/plugin-nested-docs/src/hooks/resaveChildren.ts b/packages/plugin-nested-docs/src/hooks/resaveChildren.ts index cc282951a7..4361f8e818 100644 --- a/packages/plugin-nested-docs/src/hooks/resaveChildren.ts +++ b/packages/plugin-nested-docs/src/hooks/resaveChildren.ts @@ -2,7 +2,7 @@ import type { CollectionAfterChangeHook, CollectionConfig, PayloadRequest } from import type { PluginConfig } from '../types.js' -import populateBreadcrumbs from '../utilities/populateBreadcrumbs.js' +import { populateBreadcrumbs } from '../utilities/populateBreadcrumbs.js' type ResaveArgs = { collection: CollectionConfig @@ -65,7 +65,7 @@ const resave = async ({ collection, doc, draft, pluginConfig, req }: ResaveArgs) } } -const resaveChildren = +export const resaveChildren = (pluginConfig: PluginConfig, collection: CollectionConfig): CollectionAfterChangeHook => async ({ doc, req }) => { await resave({ @@ -88,4 +88,3 @@ const resaveChildren = return undefined } -export default resaveChildren diff --git a/packages/plugin-nested-docs/src/hooks/resaveSelfAfterCreate.ts b/packages/plugin-nested-docs/src/hooks/resaveSelfAfterCreate.ts index 0e968a1ace..b07308a5e8 100644 --- a/packages/plugin-nested-docs/src/hooks/resaveSelfAfterCreate.ts +++ b/packages/plugin-nested-docs/src/hooks/resaveSelfAfterCreate.ts @@ -5,7 +5,7 @@ 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. -const resaveSelfAfterCreate = +export const resaveSelfAfterCreate = (pluginConfig: PluginConfig, collection: CollectionConfig): CollectionAfterChangeHook => async ({ doc, operation, req }) => { const { locale, payload } = req @@ -52,5 +52,3 @@ const resaveSelfAfterCreate = return undefined } - -export default resaveSelfAfterCreate diff --git a/packages/plugin-nested-docs/src/index.ts b/packages/plugin-nested-docs/src/index.ts index e7521a29dd..4a8954d55d 100644 --- a/packages/plugin-nested-docs/src/index.ts +++ b/packages/plugin-nested-docs/src/index.ts @@ -3,14 +3,16 @@ import type { SingleRelationshipField } from 'payload/types' import type { PluginConfig } from './types.js' -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' +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 = +export { createBreadcrumbsField, createParentField } + +export const nestedDocs = (pluginConfig: PluginConfig): Plugin => (config) => ({ ...config, @@ -67,5 +69,3 @@ const nestedDocs = return collection }), }) - -export default nestedDocs diff --git a/packages/plugin-nested-docs/src/utilities/formatBreadcrumb.ts b/packages/plugin-nested-docs/src/utilities/formatBreadcrumb.ts index ab4ad23462..51d157c55b 100644 --- a/packages/plugin-nested-docs/src/utilities/formatBreadcrumb.ts +++ b/packages/plugin-nested-docs/src/utilities/formatBreadcrumb.ts @@ -2,7 +2,7 @@ import type { CollectionConfig } from 'payload/types' import type { Breadcrumb, PluginConfig } from '../types.js' -const formatBreadcrumb = ( +export const formatBreadcrumb = ( pluginConfig: PluginConfig, collection: CollectionConfig, docs: Array>, @@ -29,5 +29,3 @@ const formatBreadcrumb = ( url, } } - -export default formatBreadcrumb diff --git a/packages/plugin-nested-docs/src/utilities/getParents.ts b/packages/plugin-nested-docs/src/utilities/getParents.ts index 963ca548bb..3d2ce58b15 100644 --- a/packages/plugin-nested-docs/src/utilities/getParents.ts +++ b/packages/plugin-nested-docs/src/utilities/getParents.ts @@ -2,7 +2,7 @@ import type { CollectionConfig } from 'payload/types' import type { PluginConfig } from '../types.js' -const getParents = async ( +export const getParents = async ( req: any, pluginConfig: PluginConfig, collection: CollectionConfig, @@ -44,5 +44,3 @@ const getParents = async ( return docs } - -export default getParents diff --git a/packages/plugin-nested-docs/src/utilities/populateBreadcrumbs.ts b/packages/plugin-nested-docs/src/utilities/populateBreadcrumbs.ts index c7742b32ac..453eb5c6f8 100644 --- a/packages/plugin-nested-docs/src/utilities/populateBreadcrumbs.ts +++ b/packages/plugin-nested-docs/src/utilities/populateBreadcrumbs.ts @@ -2,10 +2,10 @@ import type { CollectionConfig } from 'payload/types' import type { PluginConfig } from '../types.js' -import formatBreadcrumb from './formatBreadcrumb.js' -import getParents from './getParents.js' +import { formatBreadcrumb } from './formatBreadcrumb.js' +import { getParents } from './getParents.js' -const populateBreadcrumbs = async ( +export const populateBreadcrumbs = async ( req: any, pluginConfig: PluginConfig, collection: CollectionConfig, @@ -40,5 +40,3 @@ const populateBreadcrumbs = async ( [pluginConfig?.breadcrumbsFieldSlug || 'breadcrumbs']: breadcrumbs, } } - -export default populateBreadcrumbs diff --git a/test/plugin-nested-docs/collections/Categories.ts b/test/plugin-nested-docs/collections/Categories.ts index a0c3fafe1c..e9b806801b 100644 --- a/test/plugin-nested-docs/collections/Categories.ts +++ b/test/plugin-nested-docs/collections/Categories.ts @@ -1,7 +1,7 @@ import type { CollectionConfig } from 'payload/types' -import { createBreadcrumbsField } from '../../../packages/plugin-nested-docs/src/fields/breadcrumbs.js' -import createParentField from '../../../packages/plugin-nested-docs/src/fields/parent.js' +import { createBreadcrumbsField } from '@payloadcms/plugin-nested-docs' +import { createParentField } from '@payloadcms/plugin-nested-docs' export const Categories: CollectionConfig = { access: { diff --git a/test/plugin-nested-docs/collections/Pages.ts b/test/plugin-nested-docs/collections/Pages.ts index ec458b7394..e3e713c00b 100644 --- a/test/plugin-nested-docs/collections/Pages.ts +++ b/test/plugin-nested-docs/collections/Pages.ts @@ -1,7 +1,6 @@ -// const payload = require('payload'); import type { CollectionConfig } from 'payload/types' -import populateFullTitle from './populateFullTitle.js' +import { populateFullTitle } from './populateFullTitle.js' export const Pages: CollectionConfig = { slug: 'pages', diff --git a/test/plugin-nested-docs/collections/populateFullTitle.ts b/test/plugin-nested-docs/collections/populateFullTitle.ts index f462222d0f..fcdb052b2e 100644 --- a/test/plugin-nested-docs/collections/populateFullTitle.ts +++ b/test/plugin-nested-docs/collections/populateFullTitle.ts @@ -11,7 +11,5 @@ export const generateFullTitle = (breadcrumbs: Array<{ label: string }>): string return undefined } -const populateFullTitle: FieldHook = ({ data, originalDoc }) => +export const populateFullTitle: FieldHook = ({ data, originalDoc }) => generateFullTitle(data?.breadcrumbs || originalDoc?.breadcrumbs) - -export default populateFullTitle diff --git a/test/plugin-nested-docs/config.ts b/test/plugin-nested-docs/config.ts index d024756ed3..dbef801fdf 100644 --- a/test/plugin-nested-docs/config.ts +++ b/test/plugin-nested-docs/config.ts @@ -1,4 +1,4 @@ -import nestedDocs from '@payloadcms/plugin-nested-docs' +import { nestedDocs } from '@payloadcms/plugin-nested-docs' import { buildConfigWithDefaults } from '../buildConfigWithDefaults.js' import { devUser } from '../credentials.js' From beeb59f2633e7fa5f80af274dd6f0694ac8df8c1 Mon Sep 17 00:00:00 2001 From: Alessio Gravili Date: Mon, 15 Apr 2024 12:23:48 -0400 Subject: [PATCH 150/177] ci: add weird tune linux network step which seems to reduce flakes (#5855) --- .github/workflows/main.yml | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 851534eb5b..86aa77d556 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -19,6 +19,10 @@ jobs: needs_build: ${{ steps.filter.outputs.needs_build }} templates: ${{ steps.filter.outputs.templates }} steps: + # https://github.com/actions/virtual-environments/issues/1187 + - name: tune linux network + run: sudo ethtool -K eth0 tx off rx off + - uses: actions/checkout@v4 with: fetch-depth: 25 @@ -49,6 +53,10 @@ jobs: with: fetch-depth: 25 + # https://github.com/actions/virtual-environments/issues/1187 + - name: tune linux network + run: sudo ethtool -K eth0 tx off rx off + - name: Use Node.js 18 uses: actions/setup-node@v4 with: @@ -90,6 +98,10 @@ jobs: needs: build steps: + # https://github.com/actions/virtual-environments/issues/1187 + - name: tune linux network + run: sudo ethtool -K eth0 tx off rx off + - name: Use Node.js 18 uses: actions/setup-node@v4 with: @@ -135,6 +147,10 @@ jobs: AWS_REGION: us-east-1 steps: + # https://github.com/actions/virtual-environments/issues/1187 + - name: tune linux network + run: sudo ethtool -K eth0 tx off rx off + - name: Use Node.js 18 uses: actions/setup-node@v4 with: @@ -234,6 +250,10 @@ jobs: - uploads steps: + # https://github.com/actions/virtual-environments/issues/1187 + - name: tune linux network + run: sudo ethtool -K eth0 tx off rx off + - name: Use Node.js 18 uses: actions/setup-node@v4 with: @@ -271,6 +291,10 @@ jobs: needs: build steps: + # https://github.com/actions/virtual-environments/issues/1187 + - name: tune linux network + run: sudo ethtool -K eth0 tx off rx off + - name: Use Node.js 18 uses: actions/setup-node@v4 with: @@ -308,6 +332,9 @@ jobs: - uses: actions/checkout@v4 with: fetch-depth: 25 + # https://github.com/actions/virtual-environments/issues/1187 + - name: tune linux network + run: sudo ethtool -K eth0 tx off rx off - name: Use Node.js 18 uses: actions/setup-node@v4 From bceb49ee6cb00a563e70a651de443468d8e17e6d Mon Sep 17 00:00:00 2001 From: Ritsu Date: Mon, 15 Apr 2024 19:33:49 +0300 Subject: [PATCH 151/177] fix(ui): ensures titleField is not empty (#5850) --- packages/ui/src/elements/ListControls/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/ui/src/elements/ListControls/index.tsx b/packages/ui/src/elements/ListControls/index.tsx index 1a08c9d807..f1ec993537 100644 --- a/packages/ui/src/elements/ListControls/index.tsx +++ b/packages/ui/src/elements/ListControls/index.tsx @@ -79,7 +79,7 @@ export const ListControls: React.FC = (props) => { )) ?? undefined } - fieldName={titleField.name} + fieldName={titleField?.name} handleChange={handleSearchChange} listSearchableFields={getTextFieldsToBeSearched( collectionConfig.admin.listSearchableFields, From 5f577821994ca14087b3c300ebc892c292695f17 Mon Sep 17 00:00:00 2001 From: Elliot DeNolf Date: Mon, 15 Apr 2024 13:38:46 -0400 Subject: [PATCH 152/177] fix(db-postgres): properly pass id type for type gen (#5859) --- packages/db-postgres/src/index.ts | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/packages/db-postgres/src/index.ts b/packages/db-postgres/src/index.ts index 42785c2ce8..a4740e1e49 100644 --- a/packages/db-postgres/src/index.ts +++ b/packages/db-postgres/src/index.ts @@ -43,9 +43,11 @@ export type { MigrateDownArgs, MigrateUpArgs } from './types.js' export { sql } from 'drizzle-orm' export function postgresAdapter(args: Args): DatabaseAdapterObj { + const postgresIDType = args.idType || 'serial' + const payloadIDType = postgresIDType ? 'number' : 'text' + function adapter({ payload }: { payload: Payload }) { const migrationDir = findMigrationDir(args.migrationDir) - const idType = args.idType || 'serial' return createDatabaseAdapter({ name: 'postgres', @@ -55,7 +57,7 @@ export function postgresAdapter(args: Args): DatabaseAdapterObj drizzle: undefined, enums: {}, fieldConstraints: {}, - idType, + idType: postgresIDType, localesSuffix: args.localesSuffix || '_locales', logger: args.logger, pgSchema: undefined, @@ -79,10 +81,7 @@ export function postgresAdapter(args: Args): DatabaseAdapterObj createGlobalVersion, createMigration, createVersion, - /** - * This represents how a default ID is treated in Payload as were a field type - */ - defaultIDType: idType === 'serial' ? 'number' : 'text', + defaultIDType: payloadIDType, deleteMany, deleteOne, deleteVersions, @@ -111,7 +110,7 @@ export function postgresAdapter(args: Args): DatabaseAdapterObj } return { - defaultIDType: 'number', + defaultIDType: payloadIDType, init: adapter, } } From 2628249a5114a3aa6fafcfbf012528fb881eade2 Mon Sep 17 00:00:00 2001 From: Jacob Fletcher Date: Mon, 15 Apr 2024 14:58:57 -0400 Subject: [PATCH 153/177] fix(next): removes links to hidden entities (#5861) --- packages/next/src/views/API/index.client.tsx | 4 ++-- .../{SetStepNav => SetDocumentStepNav}/index.tsx | 12 ++++++++---- packages/next/src/views/Edit/Default/index.tsx | 4 ++-- packages/next/src/views/LivePreview/index.client.tsx | 4 ++-- packages/next/src/views/Versions/index.tsx | 4 ++-- 5 files changed, 16 insertions(+), 12 deletions(-) rename packages/next/src/views/Edit/Default/{SetStepNav => SetDocumentStepNav}/index.tsx (80%) diff --git a/packages/next/src/views/API/index.client.tsx b/packages/next/src/views/API/index.client.tsx index 6cf91c1c15..4578bddceb 100644 --- a/packages/next/src/views/API/index.client.tsx +++ b/packages/next/src/views/API/index.client.tsx @@ -18,7 +18,7 @@ import qs from 'qs' import * as React from 'react' import { toast } from 'react-toastify' -import { SetStepNav } from '../Edit/Default/SetStepNav/index.js' +import { SetDocumentStepNav } from '../Edit/Default/SetDocumentStepNav/index.js' import { RenderJSON } from './RenderJSON/index.js' import './index.scss' @@ -113,7 +113,7 @@ export const APIViewClient: React.FC = () => { className={[baseClass, fullscreen && `${baseClass}--fullscreen`].filter(Boolean).join(' ')} right={false} > - { /> {BeforeDocument} {preventLeaveWithoutSaving && } - = ({ (globalConfig && !(globalConfig.versions?.drafts && globalConfig.versions?.drafts?.autosave))) && !disableLeaveWithoutSaving && } - { return ( - Date: Mon, 15 Apr 2024 15:02:07 -0400 Subject: [PATCH 154/177] feat: allow configuration for setting headers on external file fetch (#5862) --- packages/payload/src/collections/config/client.ts | 1 + packages/payload/src/collections/config/schema.ts | 1 + packages/payload/src/uploads/generateFileData.ts | 6 +++++- packages/payload/src/uploads/getExternalFile.ts | 15 ++++++++++----- packages/payload/src/uploads/types.ts | 6 ++++++ 5 files changed, 23 insertions(+), 6 deletions(-) diff --git a/packages/payload/src/collections/config/client.ts b/packages/payload/src/collections/config/client.ts index d11e3c6cf4..c7831a59cd 100644 --- a/packages/payload/src/collections/config/client.ts +++ b/packages/payload/src/collections/config/client.ts @@ -59,6 +59,7 @@ export const createClientCollectionConfig = ({ sanitized.upload = { ...sanitized.upload } delete sanitized.upload.handlers delete sanitized.upload.adminThumbnail + delete sanitized.upload.externalFileHeaderFilter } if ('auth' in sanitized && typeof sanitized.auth === 'object') { diff --git a/packages/payload/src/collections/config/schema.ts b/packages/payload/src/collections/config/schema.ts index 04c93e2f95..45e2590017 100644 --- a/packages/payload/src/collections/config/schema.ts +++ b/packages/payload/src/collections/config/schema.ts @@ -154,6 +154,7 @@ const collectionSchema = joi.object().keys({ adminThumbnail: joi.alternatives().try(joi.string(), componentSchema), crop: joi.bool(), disableLocalStorage: joi.bool(), + externalFileHeaderFilter: joi.func(), filesRequiredOnCreate: joi.bool(), focalPoint: joi.bool(), formatOptions: joi.object().keys({ diff --git a/packages/payload/src/uploads/generateFileData.ts b/packages/payload/src/uploads/generateFileData.ts index 4879061e0c..e629440495 100644 --- a/packages/payload/src/uploads/generateFileData.ts +++ b/packages/payload/src/uploads/generateFileData.ts @@ -70,7 +70,11 @@ export const generateFileData = async ({ file = response overwriteExistingFiles = true } else if (filename && url) { - file = await getExternalFile({ data: data as FileData, req }) + file = await getExternalFile({ + data: data as FileData, + req, + uploadConfig: collectionConfig.upload, + }) overwriteExistingFiles = true } } catch (err) { diff --git a/packages/payload/src/uploads/getExternalFile.ts b/packages/payload/src/uploads/getExternalFile.ts index 4ddbedf557..892ad83935 100644 --- a/packages/payload/src/uploads/getExternalFile.ts +++ b/packages/payload/src/uploads/getExternalFile.ts @@ -1,24 +1,29 @@ import type { PayloadRequest } from '../types/index.ts' -import type { File, FileData } from './types.js' +import type { File, FileData, UploadConfig } from './types.js' import { APIError } from '../errors/index.js' type Args = { data: FileData req: PayloadRequest + uploadConfig: UploadConfig } -export const getExternalFile = async ({ data, req }: Args): Promise => { +export const getExternalFile = async ({ data, req, uploadConfig }: Args): Promise => { const baseUrl = req.origin || `${req.protocol}://${req.host}` const { filename, url } = data if (typeof url === 'string') { const fileURL = `${baseUrl}${url}` + const headers = uploadConfig.externalFileHeaderFilter + ? uploadConfig.externalFileHeaderFilter(Object.fromEntries(new Headers(req.headers))) + : { + cookie: req.headers['cookie'], + } + const res = await fetch(fileURL, { credentials: 'include', - headers: { - ...req.headers, - }, + headers, method: 'GET', }) diff --git a/packages/payload/src/uploads/types.ts b/packages/payload/src/uploads/types.ts index 97dfa0c008..12062db406 100644 --- a/packages/payload/src/uploads/types.ts +++ b/packages/payload/src/uploads/types.ts @@ -78,6 +78,12 @@ export type UploadConfig = { adminThumbnail?: GetAdminThumbnail | string crop?: boolean disableLocalStorage?: boolean + /** + * Accepts existing headers and can filter/modify them. + * + * Useful for adding custom headers to fetch from external providers. + */ + externalFileHeaderFilter?: (headers: Record) => Record filesRequiredOnCreate?: boolean focalPoint?: boolean /** Options for original upload file only. For sizes, set each formatOptions individually. */ From 974a74500b2c57e34c2bc8ae0be94e2d2758b678 Mon Sep 17 00:00:00 2001 From: Ritsu Date: Mon, 15 Apr 2024 22:03:16 +0300 Subject: [PATCH 155/177] fix(ui): passes cellComponentProps through buildColumnState (#5848) --- packages/ui/src/elements/TableColumns/buildColumnState.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/ui/src/elements/TableColumns/buildColumnState.tsx b/packages/ui/src/elements/TableColumns/buildColumnState.tsx index fc8a901706..9bfca32833 100644 --- a/packages/ui/src/elements/TableColumns/buildColumnState.tsx +++ b/packages/ui/src/elements/TableColumns/buildColumnState.tsx @@ -134,6 +134,7 @@ export const buildColumnState = (args: Args): Column[] => { accessor: name, active, cellProps: { + ...field.cellComponentProps, ...cellProps?.[index], link: isFirstActiveColumn, relationTo: From abeb94a53db66f5d4ed0e74054d52378f171a799 Mon Sep 17 00:00:00 2001 From: Elliot DeNolf Date: Mon, 15 Apr 2024 15:11:35 -0400 Subject: [PATCH 156/177] docs: add externalFileHeaderFilter --- docs/upload/overview.mdx | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/docs/upload/overview.mdx b/docs/upload/overview.mdx index 5f01049269..aaaadcaa87 100644 --- a/docs/upload/overview.mdx +++ b/docs/upload/overview.mdx @@ -40,21 +40,22 @@ Every Payload Collection can opt-in to supporting Uploads by specifying the `upl ### Collection Upload Options -| Option | Description | -| --------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **`staticURL`** \* | The URL path to use to access your uploads. Relative path like `/media` will be served by payload. Full path like `https://example.com/media` needs to be served by another web server. | -| **`staticDir`** \* | The folder directory to use to store media in. Can be either an absolute path or relative to the directory that contains your config. | -| **`adminThumbnail`** | Set the way that the Admin panel will display thumbnails for this Collection. [More](#admin-thumbnails) | -| **`crop`** | Set to `false` to disable the cropping tool in the Admin panel. Crop is enabled by default. [More](#crop-and-focal-point-selector) | -| **`disableLocalStorage`** | Completely disable uploading files to disk locally. [More](#disabling-local-upload-storage) | -| **`focalPoint`** | Set to `false` to disable the focal point selection tool in the Admin panel. The focal point selector is only available when `imageSizes` or `resizeOptions` are defined. [More](#crop-and-focal-point-selector) | -| **`formatOptions`** | An object with `format` and `options` that are used with the Sharp image library to format the upload file. [More](https://sharp.pixelplumbing.com/api-output#toformat) | -| **`handlers`** | Array of Express request handlers to execute before the built-in Payload static middleware executes. | -| **`imageSizes`** | If specified, image uploads will be automatically resized in accordance to these image sizes. [More](#image-sizes) | -| **`mimeTypes`** | Restrict mimeTypes in the file picker. Array of valid mimetypes or mimetype wildcards [More](#mimetypes) | -| **`staticOptions`** | Set options for `express.static` to use while serving your static files. [More](http://expressjs.com/en/resources/middleware/serve-static.html) | -| **`resizeOptions`** | An object passed to the the Sharp image library to resize the uploaded file. [More](https://sharp.pixelplumbing.com/api-resize) | -| **`filesRequiredOnCreate`** | Mandate file data on creation, default is true. | +| Option | Description | +| ------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **`staticURL`** \* | The URL path to use to access your uploads. Relative path like `/media` will be served by payload. Full path like `https://example.com/media` needs to be served by another web server. | +| **`staticDir`** \* | The folder directory to use to store media in. Can be either an absolute path or relative to the directory that contains your config. | +| **`adminThumbnail`** | Set the way that the Admin panel will display thumbnails for this Collection. [More](#admin-thumbnails) | +| **`crop`** | Set to `false` to disable the cropping tool in the Admin panel. Crop is enabled by default. [More](#crop-and-focal-point-selector) | +| **`disableLocalStorage`** | Completely disable uploading files to disk locally. [More](#disabling-local-upload-storage) | +| **`externalFileHeaderFilter`** | Accepts existing headers and can filter/modify them. | +| **`focalPoint`** | Set to `false` to disable the focal point selection tool in the Admin panel. The focal point selector is only available when `imageSizes` or `resizeOptions` are defined. [More](#crop-and-focal-point-selector) | +| **`formatOptions`** | An object with `format` and `options` that are used with the Sharp image library to format the upload file. [More](https://sharp.pixelplumbing.com/api-output#toformat) | +| **`handlers`** | Array of Express request handlers to execute before the built-in Payload static middleware executes. | +| **`imageSizes`** | If specified, image uploads will be automatically resized in accordance to these image sizes. [More](#image-sizes) | +| **`mimeTypes`** | Restrict mimeTypes in the file picker. Array of valid mimetypes or mimetype wildcards [More](#mimetypes) | +| **`staticOptions`** | Set options for `express.static` to use while serving your static files. [More](http://expressjs.com/en/resources/middleware/serve-static.html) | +| **`resizeOptions`** | An object passed to the the Sharp image library to resize the uploaded file. [More](https://sharp.pixelplumbing.com/api-resize) | +| **`filesRequiredOnCreate`** | Mandate file data on creation, default is true. | _An asterisk denotes that a property above is required._ From b6578d6447efdf90a7b8bd420890c06dab15dee8 Mon Sep 17 00:00:00 2001 From: Elliot DeNolf Date: Mon, 15 Apr 2024 16:10:51 -0400 Subject: [PATCH 157/177] test(pcs): add prefix test (#5867) --- .../plugin-cloud-storage/collections/Media.ts | 2 +- .../collections/MediaWithPrefix.ts | 9 +++ test/plugin-cloud-storage/config.ts | 17 +++-- test/plugin-cloud-storage/int.spec.ts | 64 +++++++++++++++---- test/plugin-cloud-storage/shared.ts | 3 + 5 files changed, 77 insertions(+), 18 deletions(-) create mode 100644 test/plugin-cloud-storage/collections/MediaWithPrefix.ts create mode 100644 test/plugin-cloud-storage/shared.ts diff --git a/test/plugin-cloud-storage/collections/Media.ts b/test/plugin-cloud-storage/collections/Media.ts index 4762fe3a7c..4d9acc2a62 100644 --- a/test/plugin-cloud-storage/collections/Media.ts +++ b/test/plugin-cloud-storage/collections/Media.ts @@ -3,7 +3,7 @@ import type { CollectionConfig } from 'payload/types' export const Media: CollectionConfig = { slug: 'media', upload: { - disableLocalStorage: true, // don't save me + disableLocalStorage: true, resizeOptions: { position: 'center', width: 200, diff --git a/test/plugin-cloud-storage/collections/MediaWithPrefix.ts b/test/plugin-cloud-storage/collections/MediaWithPrefix.ts new file mode 100644 index 0000000000..48a1659196 --- /dev/null +++ b/test/plugin-cloud-storage/collections/MediaWithPrefix.ts @@ -0,0 +1,9 @@ +import type { CollectionConfig } from 'payload/types' + +export const MediaWithPrefix: CollectionConfig = { + slug: 'media-with-prefix', + upload: { + disableLocalStorage: true, + }, + fields: [], +} diff --git a/test/plugin-cloud-storage/config.ts b/test/plugin-cloud-storage/config.ts index e43106efb1..d93f32dd18 100644 --- a/test/plugin-cloud-storage/config.ts +++ b/test/plugin-cloud-storage/config.ts @@ -1,20 +1,23 @@ import type { Adapter } from '@payloadcms/plugin-cloud-storage/types' import { cloudStorage } from '@payloadcms/plugin-cloud-storage' +import { azureBlobStorageAdapter } from '@payloadcms/plugin-cloud-storage/azure' +import { gcsAdapter } from '@payloadcms/plugin-cloud-storage/gcs' +import { s3Adapter } from '@payloadcms/plugin-cloud-storage/s3' import dotenv from 'dotenv' import path from 'path' -import { azureBlobStorageAdapter } from '../../packages/plugin-cloud-storage/src/adapters/azure/index.js' -import { gcsAdapter } from '../../packages/plugin-cloud-storage/src/adapters/gcs/index.js' -import { s3Adapter } from '../../packages/plugin-cloud-storage/src/adapters/s3/index.js' import { buildConfigWithDefaults } from '../buildConfigWithDefaults.js' import { devUser } from '../credentials.js' import { Media } from './collections/Media.js' +import { MediaWithPrefix } from './collections/MediaWithPrefix.js' import { Users } from './collections/Users.js' +import { mediaSlug, mediaWithPrefixSlug, prefix } from './shared.js' let adapter: Adapter let uploadOptions +// Load config to work with emulated services dotenv.config({ path: path.resolve(process.cwd(), './test/plugin-cloud-storage/.env.emulated'), }) @@ -84,7 +87,7 @@ if (process.env.PAYLOAD_PUBLIC_CLOUD_STORAGE_ADAPTER === 'r2') { } export default buildConfigWithDefaults({ - collections: [Media, Users], + collections: [Media, MediaWithPrefix, Users], onInit: async (payload) => { /*const client = new AWS.S3({ endpoint: process.env.S3_ENDPOINT, @@ -115,9 +118,13 @@ export default buildConfigWithDefaults({ plugins: [ cloudStorage({ collections: { - media: { + [mediaSlug]: { adapter, }, + [mediaWithPrefixSlug]: { + adapter, + prefix, + }, }, }), ], diff --git a/test/plugin-cloud-storage/int.spec.ts b/test/plugin-cloud-storage/int.spec.ts index 5149c094d4..b420c71a28 100644 --- a/test/plugin-cloud-storage/int.spec.ts +++ b/test/plugin-cloud-storage/int.spec.ts @@ -7,6 +7,7 @@ import { fileURLToPath } from 'url' import { describeIfInCIOrHasLocalstack } from '../helpers.js' import { initPayloadInt } from '../helpers/initPayloadInt.js' import configPromise from './config.js' +import { mediaSlug, mediaWithPrefixSlug, prefix } from './shared.js' const filename = fileURLToPath(import.meta.url) const dirname = path.dirname(filename) @@ -41,6 +42,7 @@ describe('@payloadcms/plugin-cloud-storage', () => { }) await createTestBucket() + await clearTestBucket() }) afterEach(async () => { @@ -49,14 +51,36 @@ describe('@payloadcms/plugin-cloud-storage', () => { it('can upload', async () => { const upload = await payload.create({ - collection: 'media', + collection: mediaSlug, data: {}, filePath: path.resolve(dirname, '../uploads/image.png'), }) expect(upload.id).toBeTruthy() - await verifyUploads(upload.id) + await verifyUploads({ + collectionSlug: mediaSlug, + uploadId: upload.id, + }) + + expect(upload.url).toEqual(`/api/${mediaSlug}/file/${upload.filename as string}`) + }) + + it('can upload with prefix', async () => { + const upload = await payload.create({ + collection: mediaWithPrefixSlug, + data: {}, + filePath: path.resolve(dirname, '../uploads/image.png'), + }) + + expect(upload.id).toBeTruthy() + + await verifyUploads({ + collectionSlug: mediaWithPrefixSlug, + uploadId: upload.id, + prefix, + }) + expect(upload.url).toEqual(`/api/${mediaWithPrefixSlug}/file/${String(upload.filename)}`) }) }) }) @@ -105,26 +129,42 @@ describe('@payloadcms/plugin-cloud-storage', () => { } } - async function verifyUploads(uploadId: number | string) { + async function verifyUploads({ + collectionSlug, + uploadId, + prefix = '', + }: { + collectionSlug: string + prefix?: string + uploadId: number | string + }) { + const uploadData = (await payload.findByID({ + collection: collectionSlug, + id: uploadId, + })) as unknown as { filename: string; sizes: Record } + + const fileKeys = Object.keys(uploadData.sizes || {}).map((key) => { + const rawFilename = uploadData.sizes[key].filename + return prefix ? `${prefix}/${rawFilename}` : rawFilename + }) + + fileKeys.push(`${prefix ? `${prefix}/` : ''}${uploadData.filename}`) try { - const uploadData = (await payload.findByID({ - collection: 'media', - id: uploadId, - })) as unknown as { filename: string; sizes: Record } - - const fileKeys = Object.keys(uploadData.sizes).map((key) => uploadData.sizes[key].filename) - fileKeys.push(uploadData.filename) - for (const key of fileKeys) { const { $metadata } = await client.send( new AWS.HeadObjectCommand({ Bucket: TEST_BUCKET, Key: key }), ) + if ($metadata.httpStatusCode !== 200) { + console.error('Error verifying uploads', key, $metadata) + throw new Error(`Error verifying uploads: ${key}, ${$metadata.httpStatusCode}`) + } + // Verify each size was properly uploaded expect($metadata.httpStatusCode).toBe(200) } } catch (error: unknown) { - console.error('Error verifying uploads:', error) + console.error('Error verifying uploads:', fileKeys, error) throw error } } diff --git a/test/plugin-cloud-storage/shared.ts b/test/plugin-cloud-storage/shared.ts new file mode 100644 index 0000000000..7d74b323ae --- /dev/null +++ b/test/plugin-cloud-storage/shared.ts @@ -0,0 +1,3 @@ +export const mediaSlug = 'media' +export const mediaWithPrefixSlug = 'media-with-prefix' +export const prefix = 'test-prefix' From 4e4ccca02a81dcd03bb94a95956b1e3f332aca0c Mon Sep 17 00:00:00 2001 From: Dan Ribbens Date: Mon, 15 Apr 2024 16:26:26 -0400 Subject: [PATCH 158/177] fix(db-mongodb): version fields indexSortableFields (#5864) --- packages/db-mongodb/src/init.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/db-mongodb/src/init.ts b/packages/db-mongodb/src/init.ts index 7ae4260489..facae23cb4 100644 --- a/packages/db-mongodb/src/init.ts +++ b/packages/db-mongodb/src/init.ts @@ -28,6 +28,7 @@ export const init: Init = function init(this: MongooseAdapter) { const versionSchema = buildSchema(this.payload.config, versionCollectionFields, { disableUnique: true, draftsEnabled: true, + indexSortableFields: this.payload.config.indexSortableFields, options: { minimize: false, timestamps: false, From f21b394d213d261245cb12d32b9dbdbdfb46e477 Mon Sep 17 00:00:00 2001 From: Dan Ribbens Date: Mon, 15 Apr 2024 16:40:31 -0400 Subject: [PATCH 159/177] chore(create-payload-app): db user and password connection URI (#5853) --- packages/create-payload-app/src/lib/select-db.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/create-payload-app/src/lib/select-db.ts b/packages/create-payload-app/src/lib/select-db.ts index 9b1d3a1a7b..17b3df917d 100644 --- a/packages/create-payload-app/src/lib/select-db.ts +++ b/packages/create-payload-app/src/lib/select-db.ts @@ -16,7 +16,7 @@ const dbChoiceRecord: Record = { value: 'mongodb', }, postgres: { - dbConnectionPrefix: 'postgres://127.0.0.1:5432/', + dbConnectionPrefix: 'postgres://postgres:@127.0.0.1:5432/', title: 'PostgreSQL (beta)', value: 'postgres', }, From f1b2f767bbbe19a798ea449d71d44bc15e986578 Mon Sep 17 00:00:00 2001 From: Ritsu Date: Mon, 15 Apr 2024 23:50:28 +0300 Subject: [PATCH 160/177] fix(db-postgres): validateExistingBlockIsIdentical localized (#5840) --- .../db-postgres/src/schema/traverseFields.ts | 1 + .../validateExistingBlockIsIdentical.ts | 24 +++++++++++--- test/localization/config.ts | 32 +++++++++++++++++++ test/localization/shared.ts | 1 + 4 files changed, 53 insertions(+), 5 deletions(-) diff --git a/packages/db-postgres/src/schema/traverseFields.ts b/packages/db-postgres/src/schema/traverseFields.ts index a25872e626..a7b1cadbda 100644 --- a/packages/db-postgres/src/schema/traverseFields.ts +++ b/packages/db-postgres/src/schema/traverseFields.ts @@ -493,6 +493,7 @@ export const traverseFields = ({ localized: field.localized, rootTableName, table: adapter.tables[blockTableName], + tableLocales: adapter.tables[`${blockTableName}${adapter.localesSuffix}`], }) } adapter.blockTableNames[`${rootTableName}.${toSnakeCase(block.slug)}`] = blockTableName diff --git a/packages/db-postgres/src/schema/validateExistingBlockIsIdentical.ts b/packages/db-postgres/src/schema/validateExistingBlockIsIdentical.ts index 1320957ecd..96219adad8 100644 --- a/packages/db-postgres/src/schema/validateExistingBlockIsIdentical.ts +++ b/packages/db-postgres/src/schema/validateExistingBlockIsIdentical.ts @@ -10,9 +10,13 @@ type Args = { localized: boolean rootTableName: string table: GenericTable + tableLocales?: GenericTable } -const getFlattenedFieldNames = (fields: Field[], prefix: string = ''): string[] => { +const getFlattenedFieldNames = ( + fields: Field[], + prefix: string = '', +): { localized?: boolean; name: string }[] => { return fields.reduce((fieldsToUse, field) => { let fieldPrefix = prefix @@ -44,7 +48,13 @@ const getFlattenedFieldNames = (fields: Field[], prefix: string = ''): string[] } if (fieldAffectsData(field)) { - return [...fieldsToUse, `${fieldPrefix?.replace('.', '_') || ''}${field.name}`] + return [ + ...fieldsToUse, + { + name: `${fieldPrefix?.replace('.', '_') || ''}${field.name}`, + localized: field.localized, + }, + ] } return fieldsToUse @@ -56,22 +66,26 @@ export const validateExistingBlockIsIdentical = ({ localized, rootTableName, table, + tableLocales, }: Args): void => { const fieldNames = getFlattenedFieldNames(block.fields) const missingField = // ensure every field from the config is in the matching table - fieldNames.find((name) => Object.keys(table).indexOf(name) === -1) || + fieldNames.find(({ name, localized }) => { + const fieldTable = localized && tableLocales ? tableLocales : table + return Object.keys(fieldTable).indexOf(name) === -1 + }) || // ensure every table column is matched for every field from the config Object.keys(table).find((fieldName) => { if (!['_locale', '_order', '_parentID', '_path', '_uuid'].includes(fieldName)) { - return fieldNames.indexOf(fieldName) === -1 + return fieldNames.findIndex((field) => field.name) === -1 } }) if (missingField) { throw new InvalidConfiguration( - `The table ${rootTableName} has multiple blocks with slug ${block.slug}, but the schemas do not match. One block includes the field ${missingField}, while the other block does not.`, + `The table ${rootTableName} has multiple blocks with slug ${block.slug}, but the schemas do not match. One block includes the field ${typeof missingField === 'string' ? missingField : missingField.name}, while the other block does not.`, ) } diff --git a/test/localization/config.ts b/test/localization/config.ts index 8172382cb2..4749f8b549 100644 --- a/test/localization/config.ts +++ b/test/localization/config.ts @@ -5,6 +5,7 @@ import { devUser } from '../credentials.js' import { ArrayCollection } from './collections/Array/index.js' import { NestedToArrayAndBlock } from './collections/NestedToArrayAndBlock/index.js' import { + blocksWithLocalizedSameName, defaultLocale, englishTitle, localizedPostsSlug, @@ -231,6 +232,37 @@ export default buildConfigWithDefaults({ }, ], }, + { + slug: blocksWithLocalizedSameName, + fields: [ + { + type: 'blocks', + name: 'blocks', + blocks: [ + { + slug: 'block_first', + fields: [ + { + name: 'title', + type: 'text', + localized: true, + }, + ], + }, + { + slug: 'block_second', + fields: [ + { + name: 'title', + type: 'text', + localized: true, + }, + ], + }, + ], + }, + ], + }, ], globals: [ { diff --git a/test/localization/shared.ts b/test/localization/shared.ts index 3ad58dc1dc..dc7501efcc 100644 --- a/test/localization/shared.ts +++ b/test/localization/shared.ts @@ -16,3 +16,4 @@ export const relationshipLocalizedSlug = 'relationship-localized' export const withRequiredLocalizedFields = 'localized-required' export const localizedSortSlug = 'localized-sort' export const usersSlug = 'users' +export const blocksWithLocalizedSameName = 'blocks-same-name' From 8178d57ab94e02fc434327a1add5b9434c1cad19 Mon Sep 17 00:00:00 2001 From: Elliot DeNolf Date: Mon, 15 Apr 2024 16:47:17 -0400 Subject: [PATCH 161/177] chore(release): v3.0.0-beta.11 [skip ci] --- package.json | 2 +- packages/create-payload-app/package.json | 2 +- packages/db-mongodb/package.json | 2 +- packages/db-postgres/package.json | 2 +- packages/graphql/package.json | 2 +- packages/next/package.json | 2 +- packages/payload/package.json | 2 +- packages/plugin-cloud-storage/package.json | 2 +- packages/plugin-cloud/package.json | 2 +- packages/plugin-form-builder/package.json | 2 +- packages/plugin-nested-docs/package.json | 2 +- packages/plugin-redirects/package.json | 2 +- packages/plugin-search/package.json | 2 +- packages/plugin-seo/package.json | 2 +- packages/richtext-lexical/package.json | 2 +- packages/richtext-slate/package.json | 2 +- packages/translations/package.json | 2 +- packages/ui/package.json | 2 +- 18 files changed, 18 insertions(+), 18 deletions(-) diff --git a/package.json b/package.json index 8d8f2a12d8..510c4e580c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "payload-monorepo", - "version": "3.0.0-beta.10", + "version": "3.0.0-beta.11", "private": true, "type": "module", "workspaces:": [ diff --git a/packages/create-payload-app/package.json b/packages/create-payload-app/package.json index 3de6bd5022..de73baf743 100644 --- a/packages/create-payload-app/package.json +++ b/packages/create-payload-app/package.json @@ -1,6 +1,6 @@ { "name": "create-payload-app", - "version": "3.0.0-beta.10", + "version": "3.0.0-beta.11", "license": "MIT", "type": "module", "homepage": "https://payloadcms.com", diff --git a/packages/db-mongodb/package.json b/packages/db-mongodb/package.json index a6890d6971..140d5d95d2 100644 --- a/packages/db-mongodb/package.json +++ b/packages/db-mongodb/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/db-mongodb", - "version": "3.0.0-beta.10", + "version": "3.0.0-beta.11", "description": "The officially supported MongoDB database adapter for Payload", "repository": { "type": "git", diff --git a/packages/db-postgres/package.json b/packages/db-postgres/package.json index b24d746b96..67c677edd4 100644 --- a/packages/db-postgres/package.json +++ b/packages/db-postgres/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/db-postgres", - "version": "3.0.0-beta.10", + "version": "3.0.0-beta.11", "description": "The officially supported Postgres database adapter for Payload", "repository": { "type": "git", diff --git a/packages/graphql/package.json b/packages/graphql/package.json index dec617a49f..43e2011ff0 100644 --- a/packages/graphql/package.json +++ b/packages/graphql/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/graphql", - "version": "3.0.0-beta.10", + "version": "3.0.0-beta.11", "main": "./src/index.ts", "types": "./src/index.d.ts", "type": "module", diff --git a/packages/next/package.json b/packages/next/package.json index 8b2c282f82..5d496efd8d 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/next", - "version": "3.0.0-beta.10", + "version": "3.0.0-beta.11", "main": "./src/index.js", "types": "./src/index.js", "type": "module", diff --git a/packages/payload/package.json b/packages/payload/package.json index c206568716..1a738dd54c 100644 --- a/packages/payload/package.json +++ b/packages/payload/package.json @@ -1,6 +1,6 @@ { "name": "payload", - "version": "3.0.0-beta.10", + "version": "3.0.0-beta.11", "description": "Node, React and MongoDB Headless CMS and Application Framework", "license": "MIT", "main": "./src/index.ts", diff --git a/packages/plugin-cloud-storage/package.json b/packages/plugin-cloud-storage/package.json index 50d8453c38..97a08812be 100644 --- a/packages/plugin-cloud-storage/package.json +++ b/packages/plugin-cloud-storage/package.json @@ -1,7 +1,7 @@ { "name": "@payloadcms/plugin-cloud-storage", "description": "The official cloud storage plugin for Payload CMS", - "version": "3.0.0-beta.10", + "version": "3.0.0-beta.11", "main": "./src/index.ts", "types": "./src/index.ts", "type": "module", diff --git a/packages/plugin-cloud/package.json b/packages/plugin-cloud/package.json index e890952e7f..0e6a722a94 100644 --- a/packages/plugin-cloud/package.json +++ b/packages/plugin-cloud/package.json @@ -1,7 +1,7 @@ { "name": "@payloadcms/plugin-cloud", "description": "The official Payload Cloud plugin", - "version": "3.0.0-beta.10", + "version": "3.0.0-beta.11", "main": "./src/index.ts", "types": "./src/index.ts", "license": "MIT", diff --git a/packages/plugin-form-builder/package.json b/packages/plugin-form-builder/package.json index 49868d3b71..efb81fe925 100644 --- a/packages/plugin-form-builder/package.json +++ b/packages/plugin-form-builder/package.json @@ -1,7 +1,7 @@ { "name": "@payloadcms/plugin-form-builder", "description": "Form builder plugin for Payload CMS", - "version": "3.0.0-beta.10", + "version": "3.0.0-beta.11", "homepage:": "https://payloadcms.com", "repository": { "type": "git", diff --git a/packages/plugin-nested-docs/package.json b/packages/plugin-nested-docs/package.json index efad229849..d427337313 100644 --- a/packages/plugin-nested-docs/package.json +++ b/packages/plugin-nested-docs/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-nested-docs", - "version": "3.0.0-beta.10", + "version": "3.0.0-beta.11", "description": "The official Nested Docs plugin for Payload", "repository": { "type": "git", diff --git a/packages/plugin-redirects/package.json b/packages/plugin-redirects/package.json index 339a2c755b..6cfd9556de 100644 --- a/packages/plugin-redirects/package.json +++ b/packages/plugin-redirects/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-redirects", - "version": "3.0.0-beta.10", + "version": "3.0.0-beta.11", "homepage:": "https://payloadcms.com", "repository": { "type": "git", diff --git a/packages/plugin-search/package.json b/packages/plugin-search/package.json index 64ee8e32ef..ac9dd96cbf 100644 --- a/packages/plugin-search/package.json +++ b/packages/plugin-search/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-search", - "version": "3.0.0-beta.10", + "version": "3.0.0-beta.11", "homepage:": "https://payloadcms.com", "repository": { "type": "git", diff --git a/packages/plugin-seo/package.json b/packages/plugin-seo/package.json index d8a11a4631..650fe58160 100644 --- a/packages/plugin-seo/package.json +++ b/packages/plugin-seo/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-seo", - "version": "3.0.0-beta.10", + "version": "3.0.0-beta.11", "homepage:": "https://payloadcms.com", "repository": { "type": "git", diff --git a/packages/richtext-lexical/package.json b/packages/richtext-lexical/package.json index db0ed359ed..26e44b1931 100644 --- a/packages/richtext-lexical/package.json +++ b/packages/richtext-lexical/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/richtext-lexical", - "version": "3.0.0-beta.10", + "version": "3.0.0-beta.11", "description": "The officially supported Lexical richtext adapter for Payload", "repository": { "type": "git", diff --git a/packages/richtext-slate/package.json b/packages/richtext-slate/package.json index 1c10fe38a6..fd63bb59a8 100644 --- a/packages/richtext-slate/package.json +++ b/packages/richtext-slate/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/richtext-slate", - "version": "3.0.0-beta.10", + "version": "3.0.0-beta.11", "description": "The officially supported Slate richtext adapter for Payload", "repository": { "type": "git", diff --git a/packages/translations/package.json b/packages/translations/package.json index 8975b16026..d6c1f89cb9 100644 --- a/packages/translations/package.json +++ b/packages/translations/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/translations", - "version": "3.0.0-beta.10", + "version": "3.0.0-beta.11", "main": "./src/exports/index.ts", "types": "./src/types.ts", "type": "module", diff --git a/packages/ui/package.json b/packages/ui/package.json index e532288a2e..ff820f5e83 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/ui", - "version": "3.0.0-beta.10", + "version": "3.0.0-beta.11", "type": "module", "homepage": "https://payloadcms.com", "repository": { From 3db0557b07daf12c63e07b4f36521582432d3ef8 Mon Sep 17 00:00:00 2001 From: Jarrod Flesch <30633324+JarrodMFlesch@users.noreply.github.com> Date: Mon, 15 Apr 2024 22:11:17 -0400 Subject: [PATCH 162/177] chore: improve cookie helper functions (#5866) --- .vscode/launch.json | 23 +++--- packages/payload/src/auth/cookies.ts | 100 ++++++++++++++++++++++----- 2 files changed, 91 insertions(+), 32 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 34e2968ddc..6532427795 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -41,6 +41,13 @@ "request": "launch", "type": "node-terminal" }, + { + "command": "node --no-deprecation test/dev.js auth", + "cwd": "${workspaceFolder}", + "name": "Run Dev Auth", + "request": "launch", + "type": "node-terminal" + }, { "command": "pnpm run dev plugin-cloud-storage", "cwd": "${workspaceFolder}", @@ -69,36 +76,26 @@ } }, { - "command": "pnpm run dev versions", + "command": "node --no-deprecation test/dev.js versions", "cwd": "${workspaceFolder}", "name": "Run Dev Versions", "request": "launch", "type": "node-terminal" }, { - "command": "pnpm run dev localization", + "command": "node --no-deprecation test/dev.js localization", "cwd": "${workspaceFolder}", "name": "Run Dev Localization", "request": "launch", "type": "node-terminal" }, { - "command": "pnpm run dev uploads", + "command": "node --no-deprecation test/dev.js uploads", "cwd": "${workspaceFolder}", "name": "Run Dev Uploads", "request": "launch", "type": "node-terminal" }, - { - "command": "PAYLOAD_BUNDLER=vite pnpm run dev fields", - "cwd": "${workspaceFolder}", - "name": "Run Dev Fields (Vite)", - "request": "launch", - "type": "node-terminal", - "env": { - "NODE_ENV": "production" - } - }, { "command": "pnpm run test:int live-preview", "cwd": "${workspaceFolder}", diff --git a/packages/payload/src/auth/cookies.ts b/packages/payload/src/auth/cookies.ts index 5d2adc3029..31d6f24c09 100644 --- a/packages/payload/src/auth/cookies.ts +++ b/packages/payload/src/auth/cookies.ts @@ -1,5 +1,6 @@ import type { Payload } from '../index.js' import type { SanitizedCollectionConfig } from './../collections/config/types.js' + type CookieOptions = { domain?: string expires?: Date @@ -7,53 +8,108 @@ type CookieOptions = { maxAge?: number name: string path?: string + returnCookieAsObject: boolean sameSite?: 'Lax' | 'None' | 'Strict' secure?: boolean value?: string } -export const generateCookies = (cookies: CookieOptions[]): string => { - return cookies.map((options) => generateCookie(options)).join('; ') +type CookieObject = { + domain?: string + expires?: string + httpOnly?: boolean + maxAge?: number + name: string + path?: string + sameSite?: 'Lax' | 'None' | 'Strict' + secure?: boolean + value: string } -export const generateCookie = (args: CookieOptions): string => { - const { name, domain, expires, httpOnly, maxAge, path, sameSite, secure: secureArg, value } = args +export const generateCookie = ( + args: CookieOptions, +): ReturnCookieAsObject extends true ? CookieObject : string => { + const { + name, + domain, + expires, + httpOnly, + maxAge, + path, + returnCookieAsObject, + sameSite, + secure: secureArg, + value, + } = args let cookieString = `${name}=${value || ''}` + const cookieObject: CookieObject = { + name, + value, + } const secure = secureArg || sameSite === 'None' if (expires) { - cookieString += `; Expires=${expires.toUTCString()}` + if (returnCookieAsObject) { + cookieObject.expires = expires.toUTCString() + } else { + cookieString += `; Expires=${expires.toUTCString()}` + } } if (maxAge) { - cookieString += `; Max-Age=${maxAge}` + if (returnCookieAsObject) { + cookieObject.maxAge = maxAge + } else { + cookieString += `; Max-Age=${maxAge.toString()}` + } } if (domain) { - cookieString += `; Domain=${domain}` + if (returnCookieAsObject) { + cookieObject.domain = domain + } else { + cookieString += `; Domain=${domain}` + } } if (path) { - cookieString += `; Path=${path}` + if (returnCookieAsObject) { + cookieObject.path = path + } else { + cookieString += `; Path=${path}` + } } if (secure) { - cookieString += '; Secure' + if (returnCookieAsObject) { + cookieObject.secure = secure + } else { + cookieString += `; Secure=${secure}` + } } if (httpOnly) { - cookieString += '; HttpOnly' + if (returnCookieAsObject) { + cookieObject.httpOnly = httpOnly + } else { + cookieString += `; HttpOnly=${httpOnly}` + } } if (sameSite) { - cookieString += `; SameSite=${sameSite}` + if (returnCookieAsObject) { + cookieObject.sameSite = sameSite + } else { + cookieString += `; SameSite=${sameSite}` + } } - return cookieString + return (returnCookieAsObject ? cookieObject : cookieString) as ReturnCookieAsObject extends true + ? CookieObject + : string } - type GetCookieExpirationArgs = { /* The number of seconds until the cookie expires @@ -72,14 +128,17 @@ type GeneratePayloadCookieArgs = { collectionConfig: SanitizedCollectionConfig /* An instance of payload */ payload: Payload + /* The returnAs value */ + returnCookieAsObject?: boolean /* The token to be stored in the cookie */ token: string } -export const generatePayloadCookie = ({ +export const generatePayloadCookie = ({ collectionConfig, payload, + returnCookieAsObject = false, token, -}: GeneratePayloadCookieArgs): string => { +}: T): T['returnCookieAsObject'] extends true ? CookieObject : string => { const sameSite = typeof collectionConfig.auth.cookies.sameSite === 'string' ? collectionConfig.auth.cookies.sameSite @@ -87,22 +146,24 @@ export const generatePayloadCookie = ({ ? 'Strict' : undefined - return generateCookie({ + return generateCookie({ name: `${payload.config.cookiePrefix}-token`, domain: collectionConfig.auth.cookies.domain ?? undefined, expires: getCookieExpiration({ seconds: collectionConfig.auth.tokenExpiration }), httpOnly: true, path: '/', + returnCookieAsObject, sameSite, secure: collectionConfig.auth.cookies.secure, value: token, }) } -export const generateExpiredPayloadCookie = ({ +export const generateExpiredPayloadCookie = >({ collectionConfig, payload, -}: Omit): string => { + returnCookieAsObject = false, +}: T): T['returnCookieAsObject'] extends true ? CookieObject : string => { const sameSite = typeof collectionConfig.auth.cookies.sameSite === 'string' ? collectionConfig.auth.cookies.sameSite @@ -112,12 +173,13 @@ export const generateExpiredPayloadCookie = ({ const expires = new Date(Date.now() - 1000) - return generateCookie({ + return generateCookie({ name: `${payload.config.cookiePrefix}-token`, domain: collectionConfig.auth.cookies.domain ?? undefined, expires, httpOnly: true, path: '/', + returnCookieAsObject, sameSite, secure: collectionConfig.auth.cookies.secure, }) From 697a0f1ecf49df5f934238f94dc0320b4fdc9afd Mon Sep 17 00:00:00 2001 From: Jarrod Flesch <30633324+JarrodMFlesch@users.noreply.github.com> Date: Tue, 16 Apr 2024 09:22:41 -0400 Subject: [PATCH 163/177] fix: ensure body limit is respected (#5807) Co-authored-by: James --- packages/next/src/next-fileupload/handlers.ts | 2 +- .../src/next-fileupload/isEligibleRequest.ts | 2 +- .../src/next-fileupload/processMultipart.ts | 44 +- .../next/src/next-fileupload/utilities.ts | 9 +- .../src/routes/rest/collections/preview.ts | 3 +- .../next/src/routes/rest/files/getFile.ts | 1 + .../next/src/routes/rest/globals/preview.ts | 3 +- packages/next/src/routes/rest/index.ts | 4 + packages/next/src/routes/rest/routeError.ts | 31 +- packages/next/src/utilities/getDataAndFile.ts | 93 +- test/helpers/NextRESTClient.ts | 32 +- test/uploads/2mb.jpg | Bin 0 -> 2215474 bytes test/uploads/config.ts | 7 + test/uploads/createStreamableFile.ts | 37 + test/uploads/e2e.spec.ts | 11 + test/uploads/getMimeType.ts | 32 + test/uploads/int.spec.ts | 828 +++++++++--------- 17 files changed, 631 insertions(+), 508 deletions(-) create mode 100644 test/uploads/2mb.jpg create mode 100644 test/uploads/createStreamableFile.ts create mode 100644 test/uploads/getMimeType.ts diff --git a/packages/next/src/next-fileupload/handlers.ts b/packages/next/src/next-fileupload/handlers.ts index 0904d784fa..7a4860d9b1 100644 --- a/packages/next/src/next-fileupload/handlers.ts +++ b/packages/next/src/next-fileupload/handlers.ts @@ -77,7 +77,7 @@ export const tempFileHandler: Handler = (options, fieldname, filename) => { } export const memHandler: Handler = (options, fieldname, filename) => { - const buffers = [] + const buffers: Buffer[] = [] const hash = crypto.createHash('md5') let fileSize = 0 let completed = false diff --git a/packages/next/src/next-fileupload/isEligibleRequest.ts b/packages/next/src/next-fileupload/isEligibleRequest.ts index b7722366c5..316b347e50 100644 --- a/packages/next/src/next-fileupload/isEligibleRequest.ts +++ b/packages/next/src/next-fileupload/isEligibleRequest.ts @@ -1,4 +1,4 @@ -const ACCEPTABLE_CONTENT_TYPE = /^multipart\/['"()+-_]+(?:; ?['"()+-_]*)+$/i +const ACCEPTABLE_CONTENT_TYPE = /multipart\/['"()+-_]+(?:; ?['"()+-_]*)+$/i const UNACCEPTABLE_METHODS = new Set(['GET', 'HEAD', 'DELETE', 'OPTIONS', 'CONNECT', 'TRACE']) const hasBody = (req: Request): boolean => { diff --git a/packages/next/src/next-fileupload/processMultipart.ts b/packages/next/src/next-fileupload/processMultipart.ts index 1722b4e13c..c7fe71fee5 100644 --- a/packages/next/src/next-fileupload/processMultipart.ts +++ b/packages/next/src/next-fileupload/processMultipart.ts @@ -1,4 +1,5 @@ import Busboy from 'busboy' +import httpStatus from 'http-status' import { APIError } from 'payload/errors' import type { NextFileUploadOptions, NextFileUploadResponse } from './index.js' @@ -17,6 +18,17 @@ type ProcessMultipart = (args: { }) => Promise export const processMultipart: ProcessMultipart = async ({ options, request }) => { let parsingRequest = true + + let fileCount = 0 + let filesCompleted = 0 + let allFilesHaveResolved: (value?: unknown) => void + let failedResolvingFiles: (err: Error) => void + + const allFilesComplete = new Promise((res, rej) => { + allFilesHaveResolved = res + failedResolvingFiles = rej + }) + const result: NextFileUploadResponse = { fields: undefined, files: undefined, @@ -36,6 +48,7 @@ export const processMultipart: ProcessMultipart = async ({ options, request }) = // Build req.files fields busboy.on('file', (field, file, info) => { + fileCount += 1 // Parse file name(cutting huge names, decoding, etc..). const { encoding, filename: name, mimeType: mime } = info const filename = parseFileName(options, name) @@ -73,7 +86,9 @@ export const processMultipart: ProcessMultipart = async ({ options, request }) = debugLog(options, `Aborting upload because of size limit ${field}->${filename}.`) cleanup() parsingRequest = false - throw new APIError(options.responseOnLimit, 413, { size: getFileSize() }) + throw new APIError(options.responseOnLimit, httpStatus.REQUEST_ENTITY_TOO_LARGE, { + size: getFileSize(), + }) } }) @@ -95,6 +110,8 @@ export const processMultipart: ProcessMultipart = async ({ options, request }) = return debugLog(options, `Don't add file instance if original name and size are empty`) } + filesCompleted += 1 + result.files = buildFields( result.files, field, @@ -117,19 +134,25 @@ export const processMultipart: ProcessMultipart = async ({ options, request }) = request[waitFlushProperty] = [] } request[waitFlushProperty].push(writePromise) + + if (filesCompleted === fileCount) { + allFilesHaveResolved() + } }) file.on('error', (err) => { uploadTimer.clear() debugLog(options, `File Error: ${err.message}`) cleanup() + failedResolvingFiles(err) }) + // Start upload process. debugLog(options, `New upload started ${field}->${filename}, bytes:${getFileSize()}`) uploadTimer.set() }) - busboy.on('finish', () => { + busboy.on('finish', async () => { debugLog(options, `Busboy finished parsing request.`) if (options.parseNested) { result.fields = processNested(result.fields) @@ -137,20 +160,27 @@ export const processMultipart: ProcessMultipart = async ({ options, request }) = } if (request[waitFlushProperty]) { - Promise.all(request[waitFlushProperty]).then(() => { - delete request[waitFlushProperty] - }) + try { + await Promise.all(request[waitFlushProperty]).then(() => { + delete request[waitFlushProperty] + }) + } catch (err) { + debugLog(options, `Error waiting for file write promises: ${err}`) + } } + + return result }) busboy.on('error', (err) => { debugLog(options, `Busboy error`) parsingRequest = false - throw new APIError('Busboy error parsing multipart request', 500) + throw new APIError('Busboy error parsing multipart request', httpStatus.BAD_REQUEST) }) const reader = request.body.getReader() + // Start parsing request while (parsingRequest) { const { done, value } = await reader.read() @@ -163,5 +193,7 @@ export const processMultipart: ProcessMultipart = async ({ options, request }) = } } + if (fileCount !== 0) await allFilesComplete + return result } diff --git a/packages/next/src/next-fileupload/utilities.ts b/packages/next/src/next-fileupload/utilities.ts index 52627dd6a8..7d2e652860 100644 --- a/packages/next/src/next-fileupload/utilities.ts +++ b/packages/next/src/next-fileupload/utilities.ts @@ -19,7 +19,7 @@ let tempCounter = 0 export const debugLog = (options: NextFileUploadOptions, msg: string) => { const opts = options || {} if (!opts.debug) return false - console.log(`Express-file-upload: ${msg}`) // eslint-disable-line + console.log(`Next-file-upload: ${msg}`) // eslint-disable-line return true } @@ -287,8 +287,9 @@ export const parseFileName: ParseFileName = (opts, fileName) => { ? opts.safeFileNames : SAFE_FILE_NAME_REGEX // Parse file name extension. - let { name, extension } = parseFileNameExtension(opts.preserveExtension, parsedName) - if (extension.length) extension = '.' + extension.replace(nameRegex, '') + const parsedFileName = parseFileNameExtension(opts.preserveExtension, parsedName) + if (parsedFileName.extension.length) + parsedFileName.extension = '.' + parsedFileName.extension.replace(nameRegex, '') - return name.replace(nameRegex, '').concat(extension) + return parsedFileName.name.replace(nameRegex, '').concat(parsedFileName.extension) } diff --git a/packages/next/src/routes/rest/collections/preview.ts b/packages/next/src/routes/rest/collections/preview.ts index d2d3a9190d..5c99258d68 100644 --- a/packages/next/src/routes/rest/collections/preview.ts +++ b/packages/next/src/routes/rest/collections/preview.ts @@ -35,8 +35,9 @@ export const preview: CollectionRouteHandlerWithID = async ({ id, collection, re token, }) } catch (err) { - routeError({ + return routeError({ collection, + config: req.payload.config, err, req, }) diff --git a/packages/next/src/routes/rest/files/getFile.ts b/packages/next/src/routes/rest/files/getFile.ts index 6d564a02b9..d99ac5477c 100644 --- a/packages/next/src/routes/rest/files/getFile.ts +++ b/packages/next/src/routes/rest/files/getFile.ts @@ -66,6 +66,7 @@ export const getFile = async ({ collection, filename, req }: Args): Promise { token, }) } catch (err) { - routeError({ + return routeError({ + config: req.payload.config, err, req, }) diff --git a/packages/next/src/routes/rest/index.ts b/packages/next/src/routes/rest/index.ts index 323812ee2b..e9962c5def 100644 --- a/packages/next/src/routes/rest/index.ts +++ b/packages/next/src/routes/rest/index.ts @@ -303,6 +303,7 @@ export const GET = } catch (error) { return routeError({ collection, + config, err: error, req, }) @@ -445,6 +446,7 @@ export const POST = } catch (error) { return routeError({ collection, + config, err: error, req, }) @@ -514,6 +516,7 @@ export const DELETE = } catch (error) { return routeError({ collection, + config, err: error, req, }) @@ -583,6 +586,7 @@ export const PATCH = } catch (error) { return routeError({ collection, + config, err: error, req, }) diff --git a/packages/next/src/routes/rest/routeError.ts b/packages/next/src/routes/rest/routeError.ts index acaf94f6da..d362fc4e84 100644 --- a/packages/next/src/routes/rest/routeError.ts +++ b/packages/next/src/routes/rest/routeError.ts @@ -1,8 +1,10 @@ -import type { Collection, PayloadRequest } from 'payload/types' +import type { Collection, PayloadRequest, SanitizedConfig } from 'payload/types' import httpStatus from 'http-status' import { APIError } from 'payload/errors' +import { getPayloadHMR } from '../../utilities/getPayloadHMR.js' + export type ErrorResponse = { data?: any; errors: unknown[]; stack?: string } const formatErrors = (incoming: { [key: string]: unknown } | APIError): ErrorResponse => { @@ -66,26 +68,33 @@ const formatErrors = (incoming: { [key: string]: unknown } | APIError): ErrorRes } } -export const routeError = ({ +export const routeError = async ({ collection, + config: configArg, err, req, }: { collection?: Collection + config: Promise | SanitizedConfig err: APIError req: PayloadRequest }) => { - if (!req?.payload) { - return Response.json( - { - message: err.message, - stack: err.stack, - }, - { status: httpStatus.INTERNAL_SERVER_ERROR }, - ) + let payload = req?.payload + + if (!payload) { + try { + payload = await getPayloadHMR({ config: configArg }) + } catch (e) { + return Response.json( + { + message: 'There was an error initializing Payload', + }, + { status: httpStatus.INTERNAL_SERVER_ERROR }, + ) + } } - const { config, logger } = req.payload + const { config, logger } = payload let response = formatErrors(err) diff --git a/packages/next/src/utilities/getDataAndFile.ts b/packages/next/src/utilities/getDataAndFile.ts index de4699c4eb..e81a1daadb 100644 --- a/packages/next/src/utilities/getDataAndFile.ts +++ b/packages/next/src/utilities/getDataAndFile.ts @@ -1,5 +1,7 @@ import type { Collection, CustomPayloadRequest, SanitizedConfig } from 'payload/types' +import type { NextFileUploadOptions } from '../next-fileupload/index.js' + import { nextFileUpload } from '../next-fileupload/index.js' type GetDataAndFile = (args: { @@ -10,68 +12,53 @@ type GetDataAndFile = (args: { data: Record file: CustomPayloadRequest['file'] }> -export const getDataAndFile: GetDataAndFile = async ({ collection, config, request }) => { +export const getDataAndFile: GetDataAndFile = async ({ + collection, + config, + request: incomingRequest, +}) => { let data: Record = undefined let file: CustomPayloadRequest['file'] = undefined - if (['PATCH', 'POST', 'PUT'].includes(request.method.toUpperCase()) && request.body) { + if ( + ['PATCH', 'POST', 'PUT'].includes(incomingRequest.method.toUpperCase()) && + incomingRequest.body + ) { + const request = new Request(incomingRequest) const [contentType] = (request.headers.get('Content-Type') || '').split(';') if (contentType === 'application/json') { - try { - data = await request.json() - } catch (error) { - data = {} - } - } else if (contentType === 'multipart/form-data') { - // possible upload request - if (collection?.config?.upload) { - // load file in memory - if (!config.upload?.useTempFiles) { - const formData = await request.formData() - const formFile = formData.get('file') - - if (formFile instanceof Blob) { - const bytes = await formFile.arrayBuffer() - const buffer = Buffer.from(bytes) - - file = { - name: formFile.name, - data: buffer, - mimetype: formFile.type, - size: formFile.size, - } - } - - const payloadData = formData.get('_payload') - - if (typeof payloadData === 'string') { - data = JSON.parse(payloadData) - } - } else { - // store temp file on disk - const { error, fields, files } = await nextFileUpload({ - options: config.upload as any, - request, - }) - - if (error) { - throw new Error(error.message) - } - - if (files?.file) file = files.file - - if (fields?._payload && typeof fields._payload === 'string') { - data = JSON.parse(fields._payload) - } + const bodyByteSize = parseInt(request.headers.get('Content-Length') || '0', 10) + const upperByteLimit = + typeof config.upload?.limits?.fieldSize === 'number' + ? config.upload.limits.fields + : undefined + if (bodyByteSize <= upperByteLimit || upperByteLimit === undefined) { + try { + data = await request.json() + } catch (error) { + data = {} } } else { - // non upload request - const formData = await request.formData() - const payloadData = formData.get('_payload') + throw new Error('Request body size exceeds the limit') + } + } else { + if (request.headers.has('Content-Length') && request.headers.get('Content-Length') !== '0') { + const { error, fields, files } = await nextFileUpload({ + options: config.upload as NextFileUploadOptions, + request, + }) - if (typeof payloadData === 'string') { - data = JSON.parse(payloadData) + if (error) { + throw new Error(error.message) + } + + if (collection?.config?.upload && files?.file) { + file = files.file + } + + if (fields?._payload && typeof fields._payload === 'string') { + data = JSON.parse(fields._payload) } } } diff --git a/test/helpers/NextRESTClient.ts b/test/helpers/NextRESTClient.ts index 6b0886c482..fa262ec957 100644 --- a/test/helpers/NextRESTClient.ts +++ b/test/helpers/NextRESTClient.ts @@ -2,21 +2,20 @@ import type { SanitizedConfig } from 'payload/config' import type { Where } from 'payload/types' import type { ParsedQs } from 'qs' +import { + REST_DELETE as createDELETE, + REST_GET as createGET, + REST_PATCH as createPATCH, + REST_POST as createPOST, +} from '@payloadcms/next/routes' +import { GRAPHQL_POST as createGraphqlPOST } from '@payloadcms/next/routes' import QueryString from 'qs' -import { GRAPHQL_POST as createGraphqlPOST } from '../../packages/next/src/routes/graphql/index.js' -import { - DELETE as createDELETE, - GET as createGET, - PATCH as createPATCH, - POST as createPOST, -} from '../../packages/next/src/routes/rest/index.js' import { devUser } from '../credentials.js' type ValidPath = `/${string}` type RequestOptions = { auth?: boolean - file?: boolean query?: { depth?: number fallbackLocale?: string @@ -28,6 +27,10 @@ type RequestOptions = { } } +type FileArg = { + file?: Omit +} + function generateQueryString(query: RequestOptions['query'], params: ParsedQs): string { return QueryString.stringify( { @@ -67,12 +70,16 @@ export class NextRESTClient { this._GRAPHQL_POST = createGraphqlPOST(config) } - private buildHeaders(options: RequestInit & RequestOptions): Headers { + private buildHeaders(options: RequestInit & RequestOptions & FileArg): Headers { const defaultHeaders = { 'Content-Type': 'application/json', } const headers = new Headers({ - ...(options?.file ? {} : defaultHeaders), + ...(options?.file + ? { + 'Content-Length': options.file.size.toString(), + } + : defaultHeaders), ...(options?.headers || {}), }) @@ -141,7 +148,7 @@ export class NextRESTClient { return this._GRAPHQL_POST(request) } - async PATCH(path: ValidPath, options: RequestInit & RequestOptions): Promise { + async PATCH(path: ValidPath, options: RequestInit & RequestOptions & FileArg): Promise { const { url, slug, params } = this.generateRequestParts(path) const { query, ...rest } = options const queryParams = generateQueryString(query, params) @@ -156,11 +163,10 @@ export class NextRESTClient { async POST( path: ValidPath, - options: RequestInit & RequestOptions & { file?: boolean } = {}, + options: RequestInit & RequestOptions & FileArg = {}, ): Promise { const { url, slug, params } = this.generateRequestParts(path) const queryParams = generateQueryString({}, params) - const request = new Request(`${url}${queryParams}`, { ...options, method: 'POST', diff --git a/test/uploads/2mb.jpg b/test/uploads/2mb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3803d240dd6f0f2a0d424fe0fc4764ba4a54bfc5 GIT binary patch literal 2215474 zcmeIzH;h$B6b9g#ckkN-61*iCXb4MK+z||h29cJ~5er| zV5rEcBd3OJaJ2*n5YpoBmHOYoiBege>XH7Ts5dF#7vB>Vyh7H zcS7F~zj4(y`NkG8=8uP5NkwHvWfF5ClZ#0%=1+%~A;j$a-r>WFnIz2?6_=Ej)hiU# zGz^)TB$+hHX4AA#J+H7I(pel_|9zFZ^>t8is;Gn_7hL0He%c#*~#!r~|>!it3rvCQ( zjG41$&zZYu@sg#>maq6@)#^2C*R9{Mansgq+js2TwR_Lr0|yV)96s{r(PJl1oj!B+ z-1!R^FJHNO?fQ+Iw{G9N|KQ=H$A3L}`uDTvFJAuh?|=WldR><*hUDYO-Us_ES78V- zlcq^pT$d|mW)+?!mu6dcDk|?iq_}!oqc)uvlr-+Ma?Ab`r4?O<);1Y8{Zd)ewq5VF zdsY|iU9v9=w(zTxeGK*~*X>Y0iG{;Ua-mmvGj`vZ1}|$X!{*HVvfyO|z5+jjyTElw z1RBzihBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh z4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4 zG^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF z(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+Gy zNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp* zAq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYM zhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV2 z8q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7 zX-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHU zq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZ zkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{Cr zLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh z4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4 zG^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF z(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+Gy zNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp* zAq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYM zhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV2 z8q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7 zX-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHU zq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZ zkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{Cr zLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh z4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4 zG^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF z(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+Gy zNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp* zAq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYM zhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV2 z8q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7 zX-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHU zq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZ zkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{Cr zLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh z4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4 zG^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF z(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+Gy zNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp* zAq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYM zhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV2 z8q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7 zX-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHU zq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZ zkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{Cr zLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh z4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4 zG^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF z(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+Gy zNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp* zAq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYM zhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV2 z8q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7 zX-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHU zq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZ zkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{Cr zLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh z4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4 zG^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF z(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+Gy zNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp* zAq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYM zhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV2 z8q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7 zX-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHU zq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZ zkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{Cr zLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh z4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4 zG^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF z(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+Gy zNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp* zAq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYM zhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV2 z8q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7 zX-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHU zq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZ zkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{Cr zLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh z4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4 zG^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF z(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+Gy zNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp* zAq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYM zhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV2 z8q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7 zX-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHU zq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZ zkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{Cr zLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh z4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4 zG^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF z(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+Gy zNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp* zAq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYM zhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV2 z8q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7 zX-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHU zq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZ zkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{Cr zLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh z4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4 zG^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF z(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+Gy zNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp* zAq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYM zhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV2 z8q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7 zX-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHU zq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZ zkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{Cr zLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh z4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4 zG^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF z(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+Gy zNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp* zAq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYM zhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV2 z8q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7 zX-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHU zq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZ zkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{Cr zLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh z4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4 zG^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF z(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+Gy zNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp* zAq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYM zhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV2 z8q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7 zX-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHU zq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZ zkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{Cr zLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh z4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4 zG^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF z(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+Gy zNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp* zAq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYM zhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV2 z8q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7 zX-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHU zq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZ zkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{Cr zLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh z4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4 zG^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF z(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+Gy zNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp* zAq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYM zhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV2 z8q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7 zX-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHU zq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZ zkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{Cr zLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh z4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4 zG^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF z(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+Gy zNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp* zAq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYM zhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV2 z8q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7 zX-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHU zq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZ zkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{Cr zLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh z4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4 zG^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF z(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+Gy zNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp* zAq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYM zhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV2 z8q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7 zX-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHU zq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZ zkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{Cr zLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh z4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4 zG^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF z(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+Gy zNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp* zAq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYM zhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV2 z8q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7 zX-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHU zq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZ zkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{Cr zLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh z4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4 zG^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF z(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+Gy zNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp* zAq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYM zhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV2 z8q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7 zX-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHU zq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZ zkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{Cr zLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh z4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4 zG^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF z(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+Gy zNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp* zAq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYM zhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV2 z8q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7 zX-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHU zq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZ zkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{Cr zLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh z4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4 zG^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF z(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+Gy zNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp* zAq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYM zhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV2 z8q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7 zX-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHU zq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZ zkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{Cr zLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh z4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4 zG^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF z(vXHUq#+GyNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+Gy zNJARZkcKp*Aq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp* zAq{CrLmJYMhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmJYM zhBTxh4QWV28q$!4G^8O7X-GpF(vXHUq#+GyNJARZkcKp*Aq{CrLmGYu8s=}k1x?4H A-2eap literal 0 HcmV?d00001 diff --git a/test/uploads/config.ts b/test/uploads/config.ts index 20321c1d22..17e2aeb578 100644 --- a/test/uploads/config.ts +++ b/test/uploads/config.ts @@ -452,6 +452,13 @@ export default buildConfigWithDefaults({ }, }, ], + upload: { + // debug: true, + abortOnLimit: true, + limits: { + fileSize: 2_000_000, // 2MB + }, + }, onInit: async (payload) => { const uploadsDir = path.resolve(dirname, './media') removeFiles(path.normalize(uploadsDir)) diff --git a/test/uploads/createStreamableFile.ts b/test/uploads/createStreamableFile.ts new file mode 100644 index 0000000000..496eb25fd9 --- /dev/null +++ b/test/uploads/createStreamableFile.ts @@ -0,0 +1,37 @@ +import { File } from 'buffer' +import NodeFormData from 'form-data' +import fs from 'fs' +import { open } from 'node:fs/promises' +import { basename } from 'node:path' + +import { getMimeType } from './getMimeType.js' + +export async function createStreamableFile( + path: string, +): Promise<{ file: File; handle: fs.promises.FileHandle }> { + const name = basename(path) + const handle = await open(path) + + const { type } = getMimeType(path) + + const file = new File([], name, { type }) + file.stream = () => handle.readableWebStream() + + const formDataNode = new NodeFormData() + formDataNode.append('file', fs.createReadStream(path)) + + const contentLength = await new Promise((resolve, reject) => { + formDataNode.getLength((err, length) => { + if (err) { + reject(err) + } else { + resolve(length) + } + }) + }) + + // Set correct size otherwise, fetch will encounter UND_ERR_REQ_CONTENT_LENGTH_MISMATCH + Object.defineProperty(file, 'size', { get: () => contentLength }) + + return { file, handle } +} diff --git a/test/uploads/e2e.spec.ts b/test/uploads/e2e.spec.ts index c392d8f97e..3a451d6daf 100644 --- a/test/uploads/e2e.spec.ts +++ b/test/uploads/e2e.spec.ts @@ -241,6 +241,17 @@ describe('uploads', () => { ) }) + test('should throw error when file is larger than the limit and abortOnLimit is true', async () => { + await page.goto(mediaURL.create) + await page.setInputFiles('input[type="file"]', path.resolve(dirname, './2mb.jpg')) + + await wait(500) // TODO: Fix this + await page.click('#action-save', { delay: 100 }) + await expect(page.locator('.Toastify .Toastify__toast--error')).toContainText( + 'File size limit has been reached', + ) + }) + test('Should render adminThumbnail when using a function', async () => { await page.goto(adminThumbnailFunctionURL.list) await page.waitForURL(adminThumbnailFunctionURL.list) diff --git a/test/uploads/getMimeType.ts b/test/uploads/getMimeType.ts new file mode 100644 index 0000000000..908418d13e --- /dev/null +++ b/test/uploads/getMimeType.ts @@ -0,0 +1,32 @@ +import path from 'path' + +export const getMimeType = ( + filePath: string, +): { + filename: string + type: string +} => { + const ext = path.extname(filePath).slice(1) + let type: string + switch (ext) { + case 'png': + type = 'image/png' + break + case 'jpg': + type = 'image/jpeg' + break + case 'jpeg': + type = 'image/jpeg' + break + case 'svg': + type = 'image/svg+xml' + break + default: + type = 'image/png' + } + + return { + filename: path.basename(filePath), + type, + } +} diff --git a/test/uploads/int.spec.ts b/test/uploads/int.spec.ts index 4d61f6a288..189de748b3 100644 --- a/test/uploads/int.spec.ts +++ b/test/uploads/int.spec.ts @@ -1,7 +1,5 @@ import type { Payload } from 'payload' -import { File as FileBuffer } from 'buffer' -import NodeFormData from 'form-data' import fs from 'fs' import path from 'path' import { getFileByPath } from 'payload/uploads' @@ -13,6 +11,7 @@ import type { Enlarge, Media } from './payload-types.js' import { initPayloadInt } from '../helpers/initPayloadInt.js' import configPromise from './config.js' +import { createStreamableFile } from './createStreamableFile.js' import { enlargeSlug, mediaSlug, @@ -24,54 +23,6 @@ import { const filename = fileURLToPath(import.meta.url) const dirname = path.dirname(filename) - -const getMimeType = ( - filePath: string, -): { - filename: string - type: string -} => { - const ext = path.extname(filePath).slice(1) - let type: string - switch (ext) { - case 'png': - type = 'image/png' - break - case 'jpg': - type = 'image/jpeg' - break - case 'jpeg': - type = 'image/jpeg' - break - case 'svg': - type = 'image/svg+xml' - break - default: - type = 'image/png' - } - - return { - filename: path.basename(filePath), - type, - } -} -const bufferToFileBlob = async (filePath: string): Promise => - new Promise((resolve, reject) => { - fs.readFile(filePath, (err, data) => { - if (err) { - console.error(`Error reading file at ${filePath}:`, err) - reject(err) - return - } - - const { filename, type } = getMimeType(filePath) - - // Convert type FileBuffer > unknown > File - // The File type expects webkitRelativePath, we don't have that - resolve(new FileBuffer([data], filename, { type }) as unknown as File) - }) - }) - const stat = promisify(fs.stat) let restClient: NextRESTClient @@ -90,20 +41,22 @@ describe('Collections - Uploads', () => { } }) - describe('REST', () => { + describe('REST API', () => { describe('create', () => { it('creates from form data given a png', async () => { const formData = new FormData() const filePath = path.join(dirname, './image.png') - - formData.append('file', await bufferToFileBlob(filePath)) + const { file, handle } = await createStreamableFile(filePath) + formData.append('file', file) const response = await restClient.POST(`/${mediaSlug}`, { body: formData, - file: true, + file, }) const { doc } = await response.json() + await handle.close() + expect(response.status).toBe(201) const { sizes } = doc @@ -130,16 +83,20 @@ describe('Collections - Uploads', () => { }) it('creates from form data given an svg', async () => { - const formData = new FormData() const filePath = path.join(dirname, './image.svg') - formData.append('file', await bufferToFileBlob(filePath)) + const formData = new FormData() + const { file, handle } = await createStreamableFile(filePath) + formData.append('file', file) const response = await restClient.POST(`/${mediaSlug}`, { body: formData, - file: true, + file, }) + const { doc } = await response.json() + await handle.close() + expect(response.status).toBe(201) // Check for files @@ -151,100 +108,426 @@ describe('Collections - Uploads', () => { expect(doc.width).toBeDefined() expect(doc.height).toBeDefined() }) - }) - it('should have valid image url', async () => { - const formData = new FormData() - const fileBlob = await bufferToFileBlob(path.join(dirname, './image.svg')) - formData.append('file', fileBlob) + it('should have valid image url', async () => { + const formData = new FormData() + const filePath = path.join(dirname, './image.svg') + const { file, handle } = await createStreamableFile(filePath) + formData.append('file', file) - const response = await restClient.POST(`/${mediaSlug}`, { - body: formData, - file: true, + const response = await restClient.POST(`/${mediaSlug}`, { + body: formData, + file, + }) + const { doc } = await response.json() + + await handle.close() + + expect(response.status).toBe(201) + const expectedPath = path.join(dirname, './media') + expect(await fileExists(path.join(expectedPath, doc.filename))).toBe(true) + + expect(doc.url).not.toContain('undefined') }) - const { doc } = await response.json() - expect(response.status).toBe(201) - const expectedPath = path.join(dirname, './media') - expect(await fileExists(path.join(expectedPath, doc.filename))).toBe(true) + it('creates images that do not require all sizes', async () => { + const formData = new FormData() + const filePath = path.join(dirname, './small.png') + const { file, handle } = await createStreamableFile(filePath) + formData.append('file', file) - expect(doc.url).not.toContain('undefined') - }) + const response = await restClient.POST(`/${mediaSlug}`, { + body: formData, + file, + }) + const { doc } = await response.json() - it('creates images that do not require all sizes', async () => { - const formData = new FormData() - const fileBlob = await bufferToFileBlob(path.join(dirname, './small.png')) - formData.append('file', fileBlob) + await handle.close() - const response = await restClient.POST(`/${mediaSlug}`, { - body: formData, - file: true, + expect(response.status).toBe(201) + + const expectedPath = path.join(dirname, './media') + + // Check for files + expect(await fileExists(path.join(expectedPath, doc.filename))).toBe(true) + expect(await fileExists(path.join(expectedPath, 'small-640x480.png'))).toBe(false) + expect(await fileExists(path.join(expectedPath, doc.sizes.icon.filename))).toBe(true) + + // Check api response + expect(doc.sizes.tablet.filename).toBeNull() + expect(doc.sizes.icon.filename).toBeDefined() }) - const { doc } = await response.json() - expect(response.status).toBe(201) + it('creates images from a different format', async () => { + const formData = new FormData() + const filePath = path.join(dirname, './image.jpg') + const { file, handle } = await createStreamableFile(filePath) + formData.append('file', file) - const expectedPath = path.join(dirname, './media') + const response = await restClient.POST(`/${mediaSlug}`, { + body: formData, + file, + }) + const { doc } = await response.json() - // Check for files - expect(await fileExists(path.join(expectedPath, doc.filename))).toBe(true) - expect(await fileExists(path.join(expectedPath, 'small-640x480.png'))).toBe(false) - expect(await fileExists(path.join(expectedPath, doc.sizes.icon.filename))).toBe(true) + await handle.close() - // Check api response - expect(doc.sizes.tablet.filename).toBeNull() - expect(doc.sizes.icon.filename).toBeDefined() - }) + expect(response.status).toBe(201) - it('creates images from a different format', async () => { - const formData = new FormData() - const fileBlob = await bufferToFileBlob(path.join(dirname, './image.jpg')) - formData.append('file', fileBlob) + const expectedPath = path.join(dirname, './media') - const response = await restClient.POST(`/${mediaSlug}`, { - body: formData, - file: true, + // Check for files + expect(await fileExists(path.join(expectedPath, doc.filename))).toBe(true) + expect(await fileExists(path.join(expectedPath, doc.sizes.tablet.filename))).toBe(true) + + // Check api response + expect(doc.filename).toContain('.png') + expect(doc.mimeType).toEqual('image/png') + expect(doc.sizes.maintainedAspectRatio.filename).toContain('.png') + expect(doc.sizes.maintainedAspectRatio.mimeType).toContain('image/png') + expect(doc.sizes.differentFormatFromMainImage.filename).toContain('.jpg') + expect(doc.sizes.differentFormatFromMainImage.mimeType).toContain('image/jpeg') }) - const { doc } = await response.json() - expect(response.status).toBe(201) + it('creates media without storing a file', async () => { + const formData = new FormData() + const filePath = path.join(dirname, './unstored.png') + const { file, handle } = await createStreamableFile(filePath) + formData.append('file', file) - const expectedPath = path.join(dirname, './media') + // unstored media + const response = await restClient.POST(`/${unstoredMediaSlug}`, { + body: formData, + file, + }) + const { doc } = await response.json() - // Check for files - expect(await fileExists(path.join(expectedPath, doc.filename))).toBe(true) - expect(await fileExists(path.join(expectedPath, doc.sizes.tablet.filename))).toBe(true) + await handle.close() - // Check api response - expect(doc.filename).toContain('.png') - expect(doc.mimeType).toEqual('image/png') - expect(doc.sizes.maintainedAspectRatio.filename).toContain('.png') - expect(doc.sizes.maintainedAspectRatio.mimeType).toContain('image/png') - expect(doc.sizes.differentFormatFromMainImage.filename).toContain('.jpg') - expect(doc.sizes.differentFormatFromMainImage.mimeType).toContain('image/jpeg') - }) + expect(response.status).toBe(201) - it('creates media without storing a file', async () => { - const formData = new FormData() - const fileBlob = await bufferToFileBlob(path.join(dirname, './unstored.png')) - formData.append('file', fileBlob) + // Check for files + expect(await fileExists(path.join(dirname, './media', doc.filename))).toBe(false) - // unstored media - const response = await restClient.POST(`/${unstoredMediaSlug}`, { - body: formData, - file: true, + // Check api response + expect(doc.filename).toBeDefined() }) - const { doc } = await response.json() - - expect(response.status).toBe(201) - - // Check for files - expect(await fileExists(path.join(dirname, './media', doc.filename))).toBe(false) - - // Check api response - expect(doc.filename).toBeDefined() }) + describe('update', () => { + it('should replace image and delete old files - by ID', async () => { + const filePath = path.resolve(dirname, './image.png') + const file = await getFileByPath(filePath) + file.name = 'renamed.png' + + const mediaDoc = (await payload.create({ + collection: mediaSlug, + data: {}, + file, + })) as unknown as Media + + const formData = new FormData() + const filePath2 = path.resolve(dirname, './small.png') + const { file: file2, handle } = await createStreamableFile(filePath2) + formData.append('file', file2) + + const response = await restClient.PATCH(`/${mediaSlug}/${mediaDoc.id}`, { + body: formData, + file: file2, + }) + + await handle.close() + + expect(response.status).toBe(200) + + const expectedPath = path.join(dirname, './media') + + // Check that previously existing files were removed + expect(await fileExists(path.join(expectedPath, mediaDoc.filename))).toBe(false) + expect(await fileExists(path.join(expectedPath, mediaDoc.sizes.icon.filename))).toBe(false) + }) + + it('should replace image and delete old files - where query', async () => { + const filePath = path.resolve(dirname, './image.png') + const file = await getFileByPath(filePath) + file.name = 'renamed.png' + + const mediaDoc = (await payload.create({ + collection: mediaSlug, + data: {}, + file, + })) as unknown as Media + + const formData = new FormData() + const filePath2 = path.resolve(dirname, './small.png') + const { file: file2, handle } = await createStreamableFile(filePath2) + formData.append('file', file2) + + const response = await restClient.PATCH(`/${mediaSlug}`, { + body: formData, + file: file2, + query: { + where: { + id: { + equals: mediaDoc.id, + }, + }, + }, + }) + + await handle.close() + + expect(response.status).toBe(200) + + const expectedPath = path.join(dirname, './media') + + // Check that previously existing files were removed + expect(await fileExists(path.join(expectedPath, mediaDoc.filename))).toBe(false) + expect(await fileExists(path.join(expectedPath, mediaDoc.sizes.icon.filename))).toBe(false) + }) + }) + + describe('delete', () => { + it('should remove related files when deleting by ID', async () => { + const formData = new FormData() + const filePath = path.join(dirname, './image.png') + const { file, handle } = await createStreamableFile(filePath) + + formData.append('file', file) + + const { doc } = await restClient + .POST(`/${mediaSlug}`, { + body: formData, + file, + }) + .then((res) => res.json()) + + await handle.close() + + const response2 = await restClient.DELETE(`/${mediaSlug}/${doc.id}`) + expect(response2.status).toBe(200) + + expect(await fileExists(path.join(dirname, doc.filename))).toBe(false) + }) + + it('should remove all related files when deleting with where query', async () => { + const formData = new FormData() + const filePath = path.join(dirname, './image.png') + const { file, handle } = await createStreamableFile(filePath) + formData.append('file', file) + + const { doc } = await restClient + .POST(`/${mediaSlug}`, { + body: formData, + file, + }) + .then((res) => res.json()) + + await handle.close() + + const { errors } = await restClient + .DELETE(`/${mediaSlug}`, { + query: { + where: { + id: { + equals: doc.id, + }, + }, + }, + }) + .then((res) => res.json()) + + expect(errors).toHaveLength(0) + + expect(await fileExists(path.join(dirname, doc.filename))).toBe(false) + }) + }) + }) + + describe('Local API', () => { + describe('update', () => { + it('should remove existing media on re-upload - by ID', async () => { + // Create temp file + const filePath = path.resolve(dirname, './temp.png') + const file = await getFileByPath(filePath) + file.name = 'temp.png' + + const mediaDoc = (await payload.create({ + collection: mediaSlug, + data: {}, + file, + })) as unknown as Media + + const expectedPath = path.join(dirname, './media') + + // Check that the temp file was created + expect(await fileExists(path.join(expectedPath, mediaDoc.filename))).toBe(true) + + // Replace the temp file with a new one + const newFilePath = path.resolve(dirname, './temp-renamed.png') + const newFile = await getFileByPath(newFilePath) + newFile.name = 'temp-renamed.png' + + const updatedMediaDoc = (await payload.update({ + collection: mediaSlug, + id: mediaDoc.id, + file: newFile, + data: {}, + })) as unknown as Media + + // Check that the replacement file was created and the old one was removed + expect(await fileExists(path.join(expectedPath, updatedMediaDoc.filename))).toBe(true) + expect(await fileExists(path.join(expectedPath, mediaDoc.filename))).toBe(false) + }) + + it('should remove existing media on re-upload - where query', async () => { + // Create temp file + const filePath = path.resolve(dirname, './temp.png') + const file = await getFileByPath(filePath) + file.name = 'temp.png' + + const mediaDoc = (await payload.create({ + collection: mediaSlug, + data: {}, + file, + })) as unknown as Media + + const expectedPath = path.join(dirname, './media') + + // Check that the temp file was created + expect(await fileExists(path.join(expectedPath, mediaDoc.filename))).toBe(true) + + // Replace the temp file with a new one + const newFilePath = path.resolve(dirname, './temp-renamed.png') + const newFile = await getFileByPath(newFilePath) + newFile.name = 'temp-renamed-second.png' + + const updatedMediaDoc = (await payload.update({ + collection: mediaSlug, + where: { + id: { equals: mediaDoc.id }, + }, + file: newFile, + data: {}, + })) as unknown as { docs: Media[] } + + // Check that the replacement file was created and the old one was removed + expect(updatedMediaDoc.docs[0].filename).toEqual(newFile.name) + expect(await fileExists(path.join(expectedPath, updatedMediaDoc.docs[0].filename))).toBe( + true, + ) + expect(await fileExists(path.join(expectedPath, mediaDoc.filename))).toBe(false) + }) + + it('should remove sizes that do not pertain to the new image - by ID', async () => { + const filePath = path.resolve(dirname, './image.png') + const file = await getFileByPath(filePath) + const small = await getFileByPath(path.resolve(dirname, './small.png')) + + const { id } = await payload.create({ + collection: mediaSlug, + data: {}, + file, + }) + + const doc = (await payload.update({ + collection: mediaSlug, + id, + data: {}, + file: small, + })) as unknown as Media + + expect(doc.sizes.icon).toBeDefined() + expect(doc.sizes.tablet.width).toBeNull() + }) + + it('should remove sizes that do not pertain to the new image - where query', async () => { + const filePath = path.resolve(dirname, './image.png') + const file = await getFileByPath(filePath) + const small = await getFileByPath(path.resolve(dirname, './small.png')) + + const { id } = await payload.create({ + collection: mediaSlug, + data: {}, + file, + }) + + const doc = (await payload.update({ + collection: mediaSlug, + where: { + id: { equals: id }, + }, + data: {}, + file: small, + })) as unknown as { docs: Media[] } + + expect(doc.docs[0].sizes.icon).toBeDefined() + expect(doc.docs[0].sizes.tablet.width).toBeNull() + }) + + it('should allow removing file from upload relationship field - by ID', async () => { + const filePath = path.resolve(dirname, './image.png') + const file = await getFileByPath(filePath) + file.name = 'renamed.png' + + const { id } = await payload.create({ + collection: mediaSlug, + data: {}, + file, + }) + + const related = await payload.create({ + collection: relationSlug, + data: { + image: id, + }, + }) + + const doc = await payload.update({ + collection: relationSlug, + id: related.id, + data: { + image: null, + }, + }) + + expect(doc.image).toBeFalsy() + }) + + it('should allow update removing a relationship - where query', async () => { + const filePath = path.resolve(dirname, './image.png') + const file = await getFileByPath(filePath) + file.name = 'renamed.png' + + const { id } = await payload.create({ + collection: mediaSlug, + data: {}, + file, + }) + + const related = await payload.create({ + collection: relationSlug, + data: { + image: id, + }, + }) + + const doc = await payload.update({ + collection: relationSlug, + where: { + id: { equals: related.id }, + }, + data: { + image: null, + }, + }) + + expect(doc.docs[0].image).toBeFalsy() + }) + }) + }) + + describe('Image Manipulation', () => { it('should enlarge images if resize options `withoutEnlargement` is set to false', async () => { const small = await getFileByPath(path.resolve(dirname, './small.png')) @@ -318,8 +601,6 @@ describe('Collections - Uploads', () => { }) it('should not reduce images if resize options `withoutReduction` is set to true', async () => { - const formData = new NodeFormData() - formData.append('file', fs.createReadStream(path.join(dirname, './small.png'))) const small = await getFileByPath(path.resolve(dirname, './small.png')) const result = await payload.create({ @@ -359,294 +640,7 @@ describe('Collections - Uploads', () => { }) }) - it('update', async () => { - // Create image - const filePath = path.resolve(dirname, './image.png') - const file = await getFileByPath(filePath) - file.name = 'renamed.png' - - const mediaDoc = (await payload.create({ - collection: mediaSlug, - data: {}, - file, - })) as unknown as Media - - const formData = new FormData() - formData.append('file', await bufferToFileBlob(path.join(dirname, './small.png'))) - - const response = await restClient.PATCH(`/${mediaSlug}/${mediaDoc.id}`, { - body: formData, - file: true, - }) - - expect(response.status).toBe(200) - - const expectedPath = path.join(dirname, './media') - - // Check that previously existing files were removed - expect(await fileExists(path.join(expectedPath, mediaDoc.filename))).toBe(false) - expect(await fileExists(path.join(expectedPath, mediaDoc.sizes.icon.filename))).toBe(false) - }) - - it('update - update many', async () => { - // Create image - const filePath = path.resolve(dirname, './image.png') - const file = await getFileByPath(filePath) - file.name = 'renamed.png' - - const mediaDoc = (await payload.create({ - collection: mediaSlug, - data: {}, - file, - })) as unknown as Media - - const formData = new FormData() - formData.append('file', await bufferToFileBlob(path.join(dirname, './small.png'))) - - const response = await restClient.PATCH(`/${mediaSlug}`, { - body: formData, - file: true, - query: { - where: { - id: { - equals: mediaDoc.id, - }, - }, - }, - }) - - expect(response.status).toBe(200) - - const expectedPath = path.join(dirname, './media') - - // Check that previously existing files were removed - expect(await fileExists(path.join(expectedPath, mediaDoc.filename))).toBe(false) - expect(await fileExists(path.join(expectedPath, mediaDoc.sizes.icon.filename))).toBe(false) - }) - - it('should remove existing media on re-upload', async () => { - // Create temp file - const filePath = path.resolve(dirname, './temp.png') - const file = await getFileByPath(filePath) - file.name = 'temp.png' - - const mediaDoc = (await payload.create({ - collection: mediaSlug, - data: {}, - file, - })) as unknown as Media - - const expectedPath = path.join(dirname, './media') - - // Check that the temp file was created - expect(await fileExists(path.join(expectedPath, mediaDoc.filename))).toBe(true) - - // Replace the temp file with a new one - const newFilePath = path.resolve(dirname, './temp-renamed.png') - const newFile = await getFileByPath(newFilePath) - newFile.name = 'temp-renamed.png' - - const updatedMediaDoc = (await payload.update({ - collection: mediaSlug, - id: mediaDoc.id, - file: newFile, - data: {}, - })) as unknown as Media - - // Check that the replacement file was created and the old one was removed - expect(await fileExists(path.join(expectedPath, updatedMediaDoc.filename))).toBe(true) - expect(await fileExists(path.join(expectedPath, mediaDoc.filename))).toBe(false) - }) - - it('should remove existing media on re-upload - update many', async () => { - // Create temp file - const filePath = path.resolve(dirname, './temp.png') - const file = await getFileByPath(filePath) - file.name = 'temp.png' - - const mediaDoc = (await payload.create({ - collection: mediaSlug, - data: {}, - file, - })) as unknown as Media - - const expectedPath = path.join(dirname, './media') - - // Check that the temp file was created - expect(await fileExists(path.join(expectedPath, mediaDoc.filename))).toBe(true) - - // Replace the temp file with a new one - const newFilePath = path.resolve(dirname, './temp-renamed.png') - const newFile = await getFileByPath(newFilePath) - newFile.name = 'temp-renamed-second.png' - - const updatedMediaDoc = (await payload.update({ - collection: mediaSlug, - where: { - id: { equals: mediaDoc.id }, - }, - file: newFile, - data: {}, - })) as unknown as { docs: Media[] } - - // Check that the replacement file was created and the old one was removed - expect(updatedMediaDoc.docs[0].filename).toEqual(newFile.name) - expect(await fileExists(path.join(expectedPath, updatedMediaDoc.docs[0].filename))).toBe(true) - expect(await fileExists(path.join(expectedPath, mediaDoc.filename))).toBe(false) - }) - - it('should remove extra sizes on update', async () => { - const filePath = path.resolve(dirname, './image.png') - const file = await getFileByPath(filePath) - const small = await getFileByPath(path.resolve(dirname, './small.png')) - - const { id } = await payload.create({ - collection: mediaSlug, - data: {}, - file, - }) - - const doc = (await payload.update({ - collection: mediaSlug, - id, - data: {}, - file: small, - })) as unknown as Media - - expect(doc.sizes.icon).toBeDefined() - expect(doc.sizes.tablet.width).toBeNull() - }) - - it('should remove extra sizes on update - update many', async () => { - const filePath = path.resolve(dirname, './image.png') - const file = await getFileByPath(filePath) - const small = await getFileByPath(path.resolve(dirname, './small.png')) - - const { id } = await payload.create({ - collection: mediaSlug, - data: {}, - file, - }) - - const doc = (await payload.update({ - collection: mediaSlug, - where: { - id: { equals: id }, - }, - data: {}, - file: small, - })) as unknown as { docs: Media[] } - - expect(doc.docs[0].sizes.icon).toBeDefined() - expect(doc.docs[0].sizes.tablet.width).toBeNull() - }) - - it('should allow update removing a relationship', async () => { - const filePath = path.resolve(dirname, './image.png') - const file = await getFileByPath(filePath) - file.name = 'renamed.png' - - const { id } = await payload.create({ - collection: mediaSlug, - data: {}, - file, - }) - - const related = await payload.create({ - collection: relationSlug, - data: { - image: id, - }, - }) - - const doc = await payload.update({ - collection: relationSlug, - id: related.id, - data: { - image: null, - }, - }) - - expect(doc.image).toBeFalsy() - }) - - it('should allow update removing a relationship - update many', async () => { - const filePath = path.resolve(dirname, './image.png') - const file = await getFileByPath(filePath) - file.name = 'renamed.png' - - const { id } = await payload.create({ - collection: mediaSlug, - data: {}, - file, - }) - - const related = await payload.create({ - collection: relationSlug, - data: { - image: id, - }, - }) - - const doc = await payload.update({ - collection: relationSlug, - where: { - id: { equals: related.id }, - }, - data: { - image: null, - }, - }) - - expect(doc.docs[0].image).toBeFalsy() - }) - - it('delete', async () => { - const formData = new FormData() - formData.append('file', await bufferToFileBlob(path.join(dirname, './image.png'))) - - const { doc } = await restClient - .POST(`/${mediaSlug}`, { - body: formData, - file: true, - }) - .then((res) => res.json()) - - const response2 = await restClient.DELETE(`/${mediaSlug}/${doc.id}`) - expect(response2.status).toBe(200) - - expect(await fileExists(path.join(dirname, doc.filename))).toBe(false) - }) - - it('delete - update many', async () => { - const formData = new FormData() - formData.append('file', await bufferToFileBlob(path.join(dirname, './image.png'))) - - const { doc } = await restClient - .POST(`/${mediaSlug}`, { - body: formData, - file: true, - }) - .then((res) => res.json()) - - const { errors } = await restClient - .DELETE(`/${mediaSlug}`, { - query: { - where: { - id: { - equals: doc.id, - }, - }, - }, - }) - .then((res) => res.json()) - - expect(errors).toHaveLength(0) - - expect(await fileExists(path.join(dirname, doc.filename))).toBe(false) - }) - - describe('filesRequiredOnCreate', () => { + describe('Required Files', () => { // eslint-disable-next-line @typescript-eslint/require-await it('should allow file to be optional if filesRequiredOnCreate is false', async () => { const successfulCreate = await payload.create({ From 7369da3d8dcd4d1955765196908d911ca35c5486 Mon Sep 17 00:00:00 2001 From: Bohdan Kucheriavyi Date: Tue, 16 Apr 2024 16:32:08 +0300 Subject: [PATCH 164/177] chore(plugin-seo): adds Ukrainian translations (#5836) Signed-off-by: Bohdan Kucheriavyi --- packages/plugin-seo/src/translations/index.ts | 22 +++ packages/plugin-seo/src/translations/uk.json | 22 +++ .../translations/src/importDateFNSLocale.ts | 4 + packages/translations/src/languages/uk.ts | 172 +++++++++--------- packages/translations/src/types.ts | 1 + 5 files changed, 135 insertions(+), 86 deletions(-) create mode 100644 packages/plugin-seo/src/translations/uk.json diff --git a/packages/plugin-seo/src/translations/index.ts b/packages/plugin-seo/src/translations/index.ts index 95d807d373..7104df6945 100644 --- a/packages/plugin-seo/src/translations/index.ts +++ b/packages/plugin-seo/src/translations/index.ts @@ -149,4 +149,26 @@ export const translations = { tooShort: 'Zbyt krótkie', }, }, + uk: { + $schema: './translation-schema.json', + 'plugin-seo': { + almostThere: 'Ще трошки', + autoGenerate: 'Згенерувати', + bestPractices: 'найкращі практики', + characterCount: '{{current}}/{{minLength}}-{{maxLength}} символів, ', + charactersLeftOver: 'залишилось {{characters}} символів', + charactersToGo: ' на {{characters}} символів коротше', + charactersTooMany: 'на {{characters}} символів довше', + checksPassing: '{{current}}/{{max}} перевірок пройдено', + good: 'Чудово', + imageAutoGenerationTip: 'Автоматична генерація використає зображення з головного блоку', + lengthTipDescription: 'Має бути від {{minLength}} до {{maxLength}} символів. Щоб дізнатися, як писати якісні метаописи — перегляньте ', + lengthTipTitle: 'Має бути від {{minLength}} до {{maxLength}} символів. Щоб дізнатися, як писати якісні метазаголовки — перегляньте ', + noImage: 'Немає зображення', + preview: 'Попередній перегляд', + previewDescription: 'Реальне відображення може відрізнятися в залежності від вмісту та релевантності пошуку.', + tooLong: 'Задовгий', + tooShort: 'Закороткий', + }, + }, } diff --git a/packages/plugin-seo/src/translations/uk.json b/packages/plugin-seo/src/translations/uk.json new file mode 100644 index 0000000000..14a818c544 --- /dev/null +++ b/packages/plugin-seo/src/translations/uk.json @@ -0,0 +1,22 @@ +{ + "$schema": "./translation-schema.json", + "plugin-seo": { + "almostThere": "Ще трошки", + "autoGenerate": "Згенерувати", + "bestPractices": "найкращі практики", + "characterCount": "{{current}}/{{minLength}}-{{maxLength}} символів, ", + "charactersLeftOver": "залишилось {{characters}} символів", + "charactersToGo": " на {{characters}} символів коротше", + "charactersTooMany": "на {{characters}} символів довше", + "checksPassing": "{{current}}/{{max}} перевірок пройдено", + "good": "Чудово", + "imageAutoGenerationTip": "Автоматична генерація використає зображення з головного блоку", + "lengthTipDescription": "Має бути від {{minLength}} до {{maxLength}} символів. Щоб дізнатися, як писати якісні метаописи — перегляньте ", + "lengthTipTitle": "Має бути від {{minLength}} до {{maxLength}} символів. Щоб дізнатися, як писати якісні метазаголовки — перегляньте ", + "noImage": "Немає зображення", + "preview": "Попередній перегляд", + "previewDescription": "Реальне відображення може відрізнятися в залежності від вмісту та релевантності пошуку.", + "tooLong": "Задовгий", + "tooShort": "Закороткий" + } +} diff --git a/packages/translations/src/importDateFNSLocale.ts b/packages/translations/src/importDateFNSLocale.ts index f27689d76f..7dad7fcc53 100644 --- a/packages/translations/src/importDateFNSLocale.ts +++ b/packages/translations/src/importDateFNSLocale.ts @@ -95,6 +95,10 @@ export const importDateFNSLocale = async (locale: string): Promise => { case 'tr': result = await import('date-fns/locale/tr') + break + case 'uk': + result = await import('date-fns/locale/uk') + break case 'vi': result = await import('date-fns/locale/vi') diff --git a/packages/translations/src/languages/uk.ts b/packages/translations/src/languages/uk.ts index 25b2d934b5..71005b0a61 100644 --- a/packages/translations/src/languages/uk.ts +++ b/packages/translations/src/languages/uk.ts @@ -1,7 +1,7 @@ import type { Language } from '../types.js' export const uk: Language = { - dateFNSKey: 'en-US', + dateFNSKey: 'uk', translations: { authentication: { account: 'Обліковий запис', @@ -10,10 +10,10 @@ export const uk: Language = { alreadyLoggedIn: 'Вже увійшли в систему', apiKey: 'API ключ', backToLogin: 'Повернутися до входу', - beginCreateFirstUser: 'Щоб розпочати - створість першого користувача', + beginCreateFirstUser: 'Щоб розпочати — створість першого користувача', changePassword: 'Змінити пароль', checkYourEmailForPasswordReset: - 'Перевірте вашу пошту на наявність посилання, яке дозволить вам безпечно скинути пароль', + 'Перевірте вашу електронну пошту на наявність посилання, що дозволить вам безпечно скинути пароль', confirmGeneration: 'Підтвердити генерацію', confirmPassword: 'Підтвердження паролю', createFirstUser: 'Створення першого користувача', @@ -22,79 +22,79 @@ export const uk: Language = { enableAPIKey: 'Активувати API ключ', failedToUnlock: 'Не вдалось розблокувати', forceUnlock: 'Примусове розблокування', - forgotPassword: 'Забули пароль', + forgotPassword: 'Забули пароль?', forgotPasswordEmailInstructions: - 'Будь ласка, введіть вашу адресу електронної пошти нижче. Ви отримаєте повідомлення електронною поштою з інструкціями щодо скидання пароля.', + 'Будь ласка, вкажіть адресу вашої електронної пошти нижче. Ви отримаєте лист на вашу електронну пошту з інструкціями щодо скидання пароля.', forgotPasswordQuestion: 'Забули пароль?', generate: 'Згенерувати', generateNewAPIKey: 'Згенерувати новий API ключ', generatingNewAPIKeyWillInvalidate: - 'Генерація нового API ключа зробить попередній <1>недійсним. Ви впевнені, що хочете продовжити?', + 'Генерація нового API ключа зробить попередній <1>недійсним. Ви впевнені, що бажаєте продовжити?', lockUntil: 'Заблокувати до', logBackIn: 'Увійти знову', logOut: 'Вийти', - loggedIn: 'Щоб увійти в інший обліковий запис, спочатку <0>вийдіть з поточного.', + loggedIn: 'Щоб увйти в систему з іншого облікового запису, спочатку <0>вийдіть з системи.', loggedInChangePassword: - 'Щоб змінити ваш пароль, перейдіть до <0>облікового запису і змініть ваш пароль там.', + 'Щоб змінити ваш пароль, перейдіть до <0>сторінки облікового запису і змініть ваш пароль.', loggedOutInactivity: 'Ви вийшли з системи через бездіяльність.', loggedOutSuccessfully: 'Ви успішно вийшли з системи.', login: 'Увійти', loginAttempts: 'Спроби входу', loginUser: 'Вхід користувача в систему', - loginWithAnotherUser: 'Щоб увйти в систему під іншим користувачем, спочатку <0>вийдіть.', + loginWithAnotherUser: 'Щоб увйти в систему з іншого облікового запису, спочатку <0>вийдіть з системи.', logout: 'Вийти', logoutUser: 'Вийти з системи', newAPIKeyGenerated: 'Новий API ключ згенеровано.', newAccountCreated: - 'Новий обліковий запис було створено, щоб отримати доступ до {{serverURL}}, будь ласка, натисніть на наступне посилання, або вставте посилання в адресну строку вашого браузера, щоб підтвердити вашу пошту: {{verificationURL}}
    Після Підтвердження вашої пошти, ви матимете змогу зайти в систему.', + 'Новий обліковий запис було створено, щоб отримати доступ до {{serverURL}}, будь ласка, натисніть на наступне посилання, або вставте його в адресний рядок браузера, щоб підтвердити вашу електронну пошту: {{verificationURL}}
    Після підтвердження вашої електронно пошти, ви зможете увійти в систему.', newPassword: 'Новий пароль', resetPassword: 'Скинути пароль', resetPasswordExpiration: 'Скинути пароль після закінчення строку дії', resetPasswordToken: 'Токет для скидання пароля', resetYourPassword: 'Скинути ваш пароль', - stayLoggedIn: 'Залишатись в системі', + stayLoggedIn: 'Залишитись в системі', successfullyUnlocked: 'Успішно розблоковано', unableToVerify: 'Неможливо підтвердити', verified: 'Підтверджено', - verifiedSuccessfully: 'Успішно Підтверджено', + verifiedSuccessfully: 'Успішно підтверджено', verify: 'Підтвердити', verifyUser: 'Підтвердити користувача', verifyYourEmail: 'Підтвердити пошту', youAreInactive: 'Ви були неактивні певний час і скоро, в цілях вашої безпеки, вас буде розлогінено. Чи бажаєте ви залишитись в системі?', youAreReceivingResetPassword: - 'Ви отримали це повідомлення, бо ви (або хтось інший) створив запит на скидання пароля до вашого облікового запису. Будь ласка, натисніть на наступне посилання, або вставте посилання в адресний рядок вашого браузера, щоб завершити процес:', + 'Ви отримали це повідомлення, бо ви (або хтось інший) створив запит на скидання пароля до вашого облікового запису. Будь ласка, натисніть на наступне посилання, або вставте посилання в адресний рядок браузера, щоб завершити процес:', youDidNotRequestPassword: - 'Якщо ви не сторювали запит на це, будь ласка, ігноруйте це повідомлення і пароль залишиться без змін', + 'Якщо ви не сторювали цей запит, будь ласка, проігноруйте це повідомлення', }, error: { - accountAlreadyActivated: 'Цей аккаунт вже активований', + accountAlreadyActivated: 'Цей обліковий запис вже активований', autosaving: 'Виникла проблема під час автозбереження цього документа.', correctInvalidFields: 'Будь ласка, виправте невірні поля.', deletingFile: 'Виникла помилка під час видалення файлу', deletingTitle: - "Виникла помилка під час видалення {{title}}, Будь ласка, перевірте ваше з'єднання та спробуйте ще раз.", - emailOrPasswordIncorrect: 'Вказаний email або пароль не є вірними', - followingFieldsInvalid_one: 'Наступне поле не є вірним:', - followingFieldsInvalid_other: 'Наступні поля не є вірними', + "Виникла помилка під час видалення {{title}}. Будь ласка, перевірте ваше з'єднання та спробуйте ще раз.", + emailOrPasswordIncorrect: 'Вказана адреса електронної пошти або пароль є невірними', + followingFieldsInvalid_one: 'Наступне поле невірне:', + followingFieldsInvalid_other: 'Наступні поля невірні', incorrectCollection: 'Неправильна колекція', - invalidFileType: 'Невіртий тип файлу', + invalidFileType: 'Невірний тип файлу', invalidFileTypeValue: 'Невірний тип файлу: {{value}}', loadingDocument: 'Виникла помилка під час завантаження документа з ID {{id}}.', missingEmail: 'Відсутній email.', missingIDOfDocument: 'Відсутній ID документа для оновлення.', missingIDOfVersion: 'Відсутній ID версії.', missingRequiredData: "Відсусті обов'язкові дані.", - noFilesUploaded: 'Не було загружено жодного файлу.', + noFilesUploaded: 'Жодного файлу не було завантажено.', noMatchedField: 'Не знайдено відповідного поля для "{{label}}"', noUser: 'Немає користувача', notAllowedToAccessPage: 'Ви не маєте доступу до цієї сторінки.', - notAllowedToPerformAction: 'Вам не дозволено виконувати цю дію.', + notAllowedToPerformAction: 'Ви не маєте дозволу виконувати цю дію.', notFound: 'Запитуваний ресурс не знайдено.', previewing: 'Виникла помилка під час попереднього перегляду цього документа.', problemUploadingFile: 'Виникла помилка під час завантаження файлу.', - tokenInvalidOrExpired: 'Токен або не дійсний, або його строк дії закінчився.', - unPublishingDocument: 'Підчас відміни публікації даного документа, виникла помилка.', + tokenInvalidOrExpired: 'Токен недійсний, або його строк дії закінчився.', + unPublishingDocument: 'Під час скасування публікації даного документа виникла помилка.', unableToDeleteCount: 'Не вдалося видалити {{count}} із {{total}} {{label}}.', unableToUpdateCount: 'Не вдалося оновити {{count}} із {{total}} {{label}}.', unauthorized: 'Немає доступу, ви повинні увійти, щоб виконати цей запит.', @@ -102,7 +102,7 @@ export const uk: Language = { unspecific: 'Виникла помилка.', userLocked: 'Цей користувач заблокований через велику кількість невдалих спроб входу.', valueMustBeUnique: 'Значення має бути унікальним.', - verificationTokenInvalid: 'Токен верифікації є недійсним.', + verificationTokenInvalid: 'Токен верифікації недійсний.', }, fields: { addLabel: 'Додати {{label}}', @@ -115,19 +115,19 @@ export const uk: Language = { blockType: 'Тип блока', blocks: 'блоки', chooseBetweenCustomTextOrDocument: - 'Виберіть між введенням власної текстової URL-адреси і посиланням на інший документ.', - chooseDocumentToLink: 'Виберіть документ, на який потрібно зробити посилання', - chooseFromExisting: 'Вибрати з існуючих', - chooseLabel: 'Вибрати {{label}}', + 'Виберіть між введенням власної URL-адреси та посиланням на інший документ.', + chooseDocumentToLink: 'Оберіть документ, на який потрібно зробити посилання', + chooseFromExisting: 'Обрати з існуючих', + chooseLabel: 'Обрати {{label}}', collapseAll: 'Згорнути все', customURL: 'Власний URL', - editLabelData: 'Редагувати данні {{label}}', + editLabelData: 'Редагувати дані {{label}}', editLink: 'Редагувати посилання', editRelationship: "Редагувати взаємозв'язок", enterURL: 'Введіть URL', internalLink: 'Внутрішнє посилання', itemsAndMore: '{{items}} і ще {{count}}', - labelRelationship: "{{label}} Зв'язок", + labelRelationship: "{{label}} взаємов'язок", latitude: 'Широта', linkType: 'Тип посилання', linkedTo: "Зв'язано з <0>{{label}}", @@ -136,8 +136,8 @@ export const uk: Language = { openInNewTab: 'Відкривати в новій вкладці', passwordsDoNotMatch: 'Паролі не співпадають.', relatedDocument: "Пов'язаний документ", - relationTo: "Зв'язано з", - removeRelationship: "Видалити зв'язок", + relationTo: "Пов'язано з", + removeRelationship: "Видалити взаємозв'язок", removeUpload: 'Видалити завантаження', saveChanges: 'Зберегти зміни', searchForBlock: 'Знайти блок', @@ -152,12 +152,12 @@ export const uk: Language = { }, general: { aboutToDelete: 'Ви бажаєте видалити {{label}} <1>{{title}}. Ви впевнені?', - aboutToDeleteCount_many: 'Ви збираєтеся видалити {{count}} {{label}}', - aboutToDeleteCount_one: 'Ви збираєтеся видалити {{count}} {{label}}', - aboutToDeleteCount_other: 'Ви збираєтеся видалити {{count}} {{label}}', + aboutToDeleteCount_many: 'Ви бажаєте видалити {{count}} {{label}}', + aboutToDeleteCount_one: 'Ви бажаєте видалити {{count}} {{label}}', + aboutToDeleteCount_other: 'Ви бажаєте видалити {{count}} {{label}}', addBelow: 'Додати нижче', addFilter: 'Додати фільтр', - adminTheme: 'Тема адмінки', + adminTheme: 'Тема адмін панелі', and: 'і', applyChanges: 'Застосувати зміни', ascending: 'В порядку зростання', @@ -199,8 +199,8 @@ export const uk: Language = { editingLabel_many: 'Редагування {{count}} {{label}}', editingLabel_one: 'Редагування {{count}} {{label}}', editingLabel_other: 'Редагування {{count}} {{label}}', - email: 'Email', - emailAddress: 'Email адреса', + email: 'Електронна пошта', + emailAddress: 'Адреса електронної пошти', enterAValue: 'Введіть значення', error: 'Помилка', errors: 'Помилки', @@ -215,9 +215,9 @@ export const uk: Language = { leaveWithoutSaving: 'Вийти без збереження', light: 'Світла', livePreview: 'Попередній перегляд', - loading: 'Загрузка', + loading: 'Завантаження', locale: 'Локаль', - locales: 'Переклади', + locales: 'Локалі', menu: 'Меню', moveDown: 'Перемістити нижче', moveUp: 'Перемістити вище', @@ -226,7 +226,7 @@ export const uk: Language = { noLabel: '<без {{label}}>', noOptions: 'Немає варіантів', noResults: - 'Жодного {{label}} не знайдено. Або {{label}} ще не існує, або жодна з них не відповідає фільтрам, які ви задали више.', + 'Жодного {{label}} не знайдено. Або {{label}} ще не існує, або жодна з них не відповідає фільтрам, що ви задали више.', noValue: 'Немає значення', none: 'Ніхто', notFound: 'Не знайдено', @@ -247,11 +247,11 @@ export const uk: Language = { saving: 'Збереження...', searchBy: 'Шукати по {{label}}', selectAll: 'Вибрати всі {{count}} {{label}}', - selectAllRows: 'Вибрати всі рядки', - selectValue: 'Вибрати значення', - selectedCount: 'Вибрано {{count}} {{label}}', + selectAllRows: 'Обрати всі рядки', + selectValue: 'Обрати значення', + selectedCount: 'Обрано {{count}} {{label}}', showAllLabel: 'Показати всі {{label}}', - sorryNotFound: 'Вибачте - немає нічого, що відповідало б Вашому запиту.', + sorryNotFound: 'Вибачте, немає нічого, що відповідало б Вашому запиту.', sort: 'Сортувати', sortByLabelDirection: 'Сортувати за {{label}} {{direction}}', stayOnThisPage: 'Залишитись на цій сторінці', @@ -262,7 +262,7 @@ export const uk: Language = { thisLanguage: 'Українська', titleDeleted: '{{label}} "{{title}}" успішно видалено.', unauthorized: 'Немає доступу', - unsavedChangesDuplicate: 'Ви маєте не збережені зміни. Чи бажаєте ви продовжити дублювання?', + unsavedChangesDuplicate: 'Ви маєте незбережені зміни. Чи бажаєте ви продовжити дублювання?', untitled: 'Без назви', updatedAt: 'Змінено', updatedCountSuccessfully: 'Успішно оновлено {{count}} {{label}}.', @@ -297,67 +297,66 @@ export const uk: Language = { editImage: 'Редагувати зображення', fileName: 'Назва файлу', fileSize: 'Розмір файлу', - focalPoint: 'Центральна точка', + focalPoint: 'Точка фокусу', focalPointDescription: - 'Перетягніть фокусний пункт безпосередньо на попередній перегляд або налаштуйте значення нижче.', + 'Перетягніть точку фокусу безпосередньо на попередньому перегляді або налаштуйте значення нижче.', height: 'Висота', lessInfo: 'Менше інформації', moreInfo: 'Більше інформації', - previewSizes: 'Розміри попереднього перегляду', - selectCollectionToBrowse: 'Виберіть колекцію для перегляду', - selectFile: 'Виберіть файл', + previewSizes: 'Попередній перегляд розмірів', + selectCollectionToBrowse: 'Оберіть колекцію для перегляду', + selectFile: 'Оберіть файл', setCropArea: 'Встановити область обрізки', - setFocalPoint: 'Встановити фокусний пункт', + setFocalPoint: 'Встановити точку фокусу', sizes: 'Розміри', sizesFor: 'Розміри для {{label}}', width: 'Ширина', }, validation: { - emailAddress: 'Будь ласка, введіть валідну email адресу.', - enterNumber: 'Будь ласка, введіть валідний номер.', - fieldHasNo: 'В цього поля немає {{label}}', - greaterThanMax: '{{value}} більше, ніж дозволено максимуму {{label}} в {{max}}.', + emailAddress: 'Будь ласка, введіть валідну адресу електронної пошти.', + enterNumber: 'Будь ласка, введіть валідне число.', + fieldHasNo: 'В цього полі немає {{label}}', + greaterThanMax: '{{value}} більше, ніж припустиме максимальне значення {{label}} в {{max}}.', invalidInput: 'У цьому полі введено некоректне значення.', invalidSelection: 'Це поле має некоректний вибір.', invalidSelections: 'Це поле має наступні невірні варіанти вибору:', - lessThanMin: '{{value}} менше, ніж дозволено мінімуму {{label}} в {{min}}.', + lessThanMin: '{{value}} менше, ніж мінімальне припустиме значення {{label}} в {{min}}.', limitReached: 'Досягнуто межі, можна додати лише {{max}} елементів.', - longerThanMin: - 'Це значення має бути більше, ніж мінімальна довжина {{minLength}} characters.', + longerThanMin: 'Це значення має дорівнювати або бути довшим, ніж {{minLength}} символів.', notValidDate: '"{{value}}" - некоректна дата.', required: "Це поле є обов'язковим.", requiresAtLeast: 'Це поле потребує не менше {{count}} {{label}}.', requiresNoMoreThan: 'Це поле потребує не більше {{count}} {{label}}.', requiresTwoNumbers: 'У цьому полі потрібно ввести два числа.', - shorterThanMax: 'Це значення має бути меншим за максимальну довжину символів {{maxLength}}.', + shorterThanMax: 'Це значення має дорівнювати або бути коротшим, ніж {{maxLength}} символів.', trueOrFalse: 'Це поле може мати значення тільки true або false.', validUploadID: 'Це поле не є дійсним ID завантаження.', }, version: { type: 'Тип', - aboutToPublishSelection: 'Ви збираєтеся опублікувати всі {{label}} у добірці. Ти впевнений?', + aboutToPublishSelection: 'Ви бажаєте опублікувати всі {{label}} у вибірці. Ви впевнені?', aboutToRestore: - 'Ви збираєтесь відновити цей документ {{label}} до стану, в якому він знаходився {{versionDate}}.', + 'Ви бажаєте відновити цей документ {{label}} до стану, в якому він знаходився {{versionDate}}. Ви впевнені?', aboutToRestoreGlobal: - 'Ви збираєтесь відновити глобальний запис {{label}} до стану, в якому він знаходився {{versionDate}}.', + 'Ви бажаєте відновити глобальний запис {{label}} до стану, в якому він знаходився {{versionDate}}. Ви впевнені?', aboutToRevertToPublished: - 'Ви збираєтесь вернути зміни цього документа до його опублікованого стану. Ви впевнені?', - aboutToUnpublish: 'Ви збираєтесь відмінити публікацю цього документа. Ви впевнені?', + 'Ви бажаєте повернути зміни цього документа до його опублікованого стану. Ви впевнені?', + aboutToUnpublish: 'Ви бажаєте скасувати публікацю цього документа. Ви впевнені?', aboutToUnpublishSelection: - 'Ви збираєтеся скасувати публікацію всіх {{label}} у вибраному. Ти впевнений?', + 'Ви бажаєте скасувати публікацію всіх {{label}} у вибірці. Ви впевнені?', autosave: 'Автозбереження', autosavedSuccessfully: 'Автозбереження успішно виконано.', - autosavedVersion: 'Автозбережена версія', + autosavedVersion: 'Автозбереження', changed: 'Змінено', compareVersion: 'Порівняти версію з:', confirmPublish: 'Підтвердити публікацію', - confirmRevertToSaved: 'Підтвердити повернення до збереженого', - confirmUnpublish: 'Підвтердити відміну публікації', + confirmRevertToSaved: 'Підтвердити повернення до збереженого стану', + confirmUnpublish: 'Підвтердити скасування публікації', confirmVersionRestoration: 'Підтвердити відновлення версії', currentDocumentStatus: 'Поточний статус {{docStatus}} документа', draft: 'Чернетка', - draftSavedSuccessfully: 'Чернетка успішно збережена.', - lastSavedAgo: 'Останній раз збережено {{distance}} тому', + draftSavedSuccessfully: 'Чернетку успішно збережено.', + lastSavedAgo: 'Востаннє збережено {{distance}} тому', noFurtherVersionsFound: 'Інших версій не знайдено', noRowsFound: 'Не знайдено {{label}}', preview: 'Попередній перегляд', @@ -368,29 +367,30 @@ export const uk: Language = { publishing: 'Публікація', restoreThisVersion: 'Відновити цю версію', restoredSuccessfully: 'Відновлено успішно.', - restoring: 'Відеовлення...', - revertToPublished: 'Відновити до опублікованого', - reverting: 'Відновлення...', + restoring: 'Відновлення...', + revertToPublished: 'Повернутися до опублікованого стану', + reverting: 'Повернення до опублікованого стану...', saveDraft: 'Зберегти чернетку', - selectLocales: 'Виберіть переклад для відображення', - selectVersionToCompare: 'Виберіть версію для порівняння', - showLocales: 'Показати переклади:', + selectLocales: 'Оберіть локаль для відображення', + selectVersionToCompare: 'Оберіть версію для порівняння', + showLocales: 'Показати локалі:', showingVersionsFor: 'Показані версії для:', status: 'Статус', - unpublish: 'Відмінити публікацію', - unpublishing: 'Відміна публікації...', + unpublish: 'Скасувати публікацію', + unpublishing: 'Скасування публікації...', version: 'Версія', - versionCount_many: '{{count}} Версій знайдено', + versionCount_many: '{{count}} версій знайдено', versionCount_none: 'Версій не знайдено', versionCount_one: '{{count}} версія знайдена', - versionCount_other: '{{count}} versions found', + versionCount_other: '{{count}} версій знайдено', + versionCount_two: '{{count}} версії знайдено', versionCreatedOn: '{{version}} створена:', versionID: 'ID версії', versions: 'Версії', - viewingVersion: 'Огляд версії для {{entityLabel}} {{documentTitle}}', - viewingVersionGlobal: 'Огляд версій для глобальної колекці {{entityLabel}}', - viewingVersions: 'Огляд версій для {{entityLabel}} {{documentTitle}}', - viewingVersionsGlobal: 'Огляд версій для глобальної колекції {{entityLabel}}', + viewingVersion: 'Перенляд версії для {{entityLabel}} {{documentTitle}}', + viewingVersionGlobal: 'Перегляд версій для глобальної колекції {{entityLabel}}', + viewingVersions: 'Перегляд версій для {{entityLabel}} {{documentTitle}}', + viewingVersionsGlobal: 'Перегляд версій для глобальної колекції {{entityLabel}}', }, }, } diff --git a/packages/translations/src/types.ts b/packages/translations/src/types.ts index 937b252b43..1e06bf82b7 100644 --- a/packages/translations/src/types.ts +++ b/packages/translations/src/types.ts @@ -26,6 +26,7 @@ type DateFNSKeys = | 'sv' | 'th' | 'tr' + | 'uk' | 'vi' | 'zh-CN' | 'zh-TW' From 6669a2cedbb939d46983ce7b751ff7b092c3c8fc Mon Sep 17 00:00:00 2001 From: Patrik Date: Tue, 16 Apr 2024 10:36:37 -0400 Subject: [PATCH 165/177] fix(next): adds client-side field validations to login and forgot-password views (#5871) --- .../ForgotPasswordForm/index.tsx | 81 +++++++++++++++++++ .../next/src/views/ForgotPassword/index.tsx | 47 +---------- .../next/src/views/Login/LoginForm/index.tsx | 42 +++++++++- packages/translations/src/clientKeys.ts | 4 + 4 files changed, 128 insertions(+), 46 deletions(-) create mode 100644 packages/next/src/views/ForgotPassword/ForgotPasswordForm/index.tsx diff --git a/packages/next/src/views/ForgotPassword/ForgotPasswordForm/index.tsx b/packages/next/src/views/ForgotPassword/ForgotPasswordForm/index.tsx new file mode 100644 index 0000000000..680725bd95 --- /dev/null +++ b/packages/next/src/views/ForgotPassword/ForgotPasswordForm/index.tsx @@ -0,0 +1,81 @@ +'use client' + +import type { FormState, PayloadRequest } from 'payload/types' + +import { Email } from '@payloadcms/ui/fields/Email' +import { Form } from '@payloadcms/ui/forms/Form' +import { FormSubmit } from '@payloadcms/ui/forms/Submit' +import { useConfig } from '@payloadcms/ui/providers/Config' +import { useTranslation } from '@payloadcms/ui/providers/Translation' +import { email } from 'payload/fields/validations' +import React, { Fragment, useState } from 'react' +import { toast } from 'react-toastify' + +export const ForgotPasswordForm: React.FC = () => { + const config = useConfig() + + const { + admin: { user: userSlug }, + routes: { api }, + } = config + + const { t } = useTranslation() + const [hasSubmitted, setHasSubmitted] = useState(false) + + const handleResponse = (res) => { + res.json().then( + () => { + setHasSubmitted(true) + }, + () => { + toast.error(t('authentication:emailNotValid')) + }, + ) + } + + const initialState: FormState = { + email: { + initialValue: '', + valid: true, + value: undefined, + }, + } + + if (hasSubmitted) { + return ( + +

    {t('authentication:emailSent')}

    +

    {t('authentication:checkYourEmailForPasswordReset')}

    +
    + ) + } + + return ( +
    +

    {t('authentication:forgotPassword')}

    +

    {t('authentication:forgotPasswordEmailInstructions')}

    + + email(value, { + name: 'email', + type: 'email', + data: {}, + req: { t } as PayloadRequest, + required: true, + siblingData: {}, + }) + } + /> + {t('general:submit')} + + ) +} diff --git a/packages/next/src/views/ForgotPassword/index.tsx b/packages/next/src/views/ForgotPassword/index.tsx index 87e58ba3d8..3234a5c889 100644 --- a/packages/next/src/views/ForgotPassword/index.tsx +++ b/packages/next/src/views/ForgotPassword/index.tsx @@ -2,12 +2,11 @@ import type { AdminViewProps } from 'payload/types' import { Button } from '@payloadcms/ui/elements/Button' import { Translation } from '@payloadcms/ui/elements/Translation' -import { Email } from '@payloadcms/ui/fields/Email' -import { Form } from '@payloadcms/ui/forms/Form' -import { FormSubmit } from '@payloadcms/ui/forms/Submit' import LinkImport from 'next/link.js' import React, { Fragment } from 'react' +import { ForgotPasswordForm } from './ForgotPasswordForm/index.js' + export { generateForgotPasswordMetadata } from './meta.js' const Link = (LinkImport.default || LinkImport) as unknown as typeof LinkImport.default @@ -23,22 +22,9 @@ export const ForgotPasswordView: React.FC = ({ initPageResult }) } = initPageResult const { - admin: { user: userSlug }, - routes: { admin, api }, - serverURL, + routes: { admin }, } = config - // const handleResponse = (res) => { - // res.json().then( - // () => { - // setHasSubmitted(true) - // }, - // () => { - // toast.error(i18n.t('authentication:emailNotValid')) - // }, - // ) - // } - if (user) { return ( @@ -60,34 +46,9 @@ export const ForgotPasswordView: React.FC = ({ initPageResult }) ) } - // if (hasSubmitted) { - // return ( - // - //

    {i18n.t('authentication:emailSent')}

    - //

    {i18n.t('authentication:checkYourEmailForPasswordReset')}

    - //
    - // ) - // } - return ( -
    -

    {i18n.t('authentication:forgotPassword')}

    -

    {i18n.t('authentication:forgotPasswordEmailInstructions')}

    - - {i18n.t('general:submit')} - + {i18n.t('authentication:backToLogin')}
    ) diff --git a/packages/next/src/views/Login/LoginForm/index.tsx b/packages/next/src/views/Login/LoginForm/index.tsx index d526a77fd2..b49c86bfaa 100644 --- a/packages/next/src/views/Login/LoginForm/index.tsx +++ b/packages/next/src/views/Login/LoginForm/index.tsx @@ -6,7 +6,7 @@ import React from 'react' const baseClass = 'login__form' const Link = (LinkImport.default || LinkImport) as unknown as typeof LinkImport.default -import type { FormState } from 'payload/types' +import type { FormState, PayloadRequest } from 'payload/types' import { FormLoadingOverlayToggle } from '@payloadcms/ui/elements/Loading' import { Email } from '@payloadcms/ui/fields/Email' @@ -15,6 +15,7 @@ import { Form } from '@payloadcms/ui/forms/Form' import { FormSubmit } from '@payloadcms/ui/forms/Submit' import { useConfig } from '@payloadcms/ui/providers/Config' import { useTranslation } from '@payloadcms/ui/providers/Translation' +import { email, password } from 'payload/fields/validations' import './index.scss' @@ -57,8 +58,43 @@ export const LoginForm: React.FC<{ >
    - - + + email(value, { + name: 'email', + type: 'email', + data: {}, + req: { t } as PayloadRequest, + required: true, + siblingData: {}, + }) + } + /> + + password(value, { + name: 'password', + type: 'text', + data: {}, + req: { + payload: { + config, + }, + t, + } as PayloadRequest, + required: true, + siblingData: {}, + }) + } + />
    {t('authentication:forgotPasswordQuestion')} {t('authentication:login')} diff --git a/packages/translations/src/clientKeys.ts b/packages/translations/src/clientKeys.ts index 63074666fb..d2e8a57920 100644 --- a/packages/translations/src/clientKeys.ts +++ b/packages/translations/src/clientKeys.ts @@ -6,6 +6,7 @@ export const clientTranslationKeys = [ 'authentication:backToLogin', 'authentication:beginCreateFirstUser', 'authentication:changePassword', + 'authentication:checkYourEmailForPasswordReset', 'authentication:confirmGeneration', 'authentication:confirmPassword', 'authentication:createFirstUser', @@ -222,10 +223,13 @@ export const clientTranslationKeys = [ 'upload:sizesFor', 'upload:width', + 'validation:emailAddress', 'validation:fieldHasNo', 'validation:limitReached', + 'validation:longerThanMin', 'validation:required', 'validation:requiresAtLeast', + 'validation:shorterThanMax', 'version:aboutToPublishSelection', 'version:aboutToRestore', From b80c92ba937a13f5a57d52ea8594fcb4bdec5ffd Mon Sep 17 00:00:00 2001 From: Paul Date: Tue, 16 Apr 2024 11:52:56 -0300 Subject: [PATCH 166/177] fix(next): issue with password and confirm password fields not being type of password (#5870) --- .../views/CreateFirstUser/index.client.tsx | 2 +- .../next/src/views/CreateFirstUser/index.tsx | 20 +++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/packages/next/src/views/CreateFirstUser/index.client.tsx b/packages/next/src/views/CreateFirstUser/index.client.tsx index 353dd39c03..4abe636cd6 100644 --- a/packages/next/src/views/CreateFirstUser/index.client.tsx +++ b/packages/next/src/views/CreateFirstUser/index.client.tsx @@ -15,7 +15,7 @@ export const CreateFirstUserFields: React.FC<{ return ( = async ({ initPageRe fieldSchema: fields, i18n, parentPath: userSlug, + }).map((field) => { + // Transform field types for the password and confirm-password fields + if (field.name === 'password') { + const type: keyof FieldTypes = 'password' + + return { + ...field, + type, + } + } + if (field.name === 'confirm-password') { + const type: keyof FieldTypes = 'confirmPassword' + + return { + ...field, + type, + } + } + return field }) const formState = await buildStateFromSchema({ From b9a9dad60a78a59140fa308cb4a5f5013df61faa Mon Sep 17 00:00:00 2001 From: Jacob Fletcher Date: Tue, 16 Apr 2024 11:14:15 -0400 Subject: [PATCH 167/177] fix(plugin-seo): uses correct key for ukrainian translation --- packages/plugin-seo/src/translations/index.ts | 11 +++++++---- .../plugin-seo/src/translations/{uk.json => ua.json} | 0 packages/translations/src/exports/all.ts | 4 ++-- packages/translations/src/importDateFNSLocale.ts | 2 +- packages/translations/src/languages/{uk.ts => ua.ts} | 10 ++++++---- packages/translations/src/types.ts | 2 +- 6 files changed, 17 insertions(+), 12 deletions(-) rename packages/plugin-seo/src/translations/{uk.json => ua.json} (100%) rename packages/translations/src/languages/{uk.ts => ua.ts} (98%) diff --git a/packages/plugin-seo/src/translations/index.ts b/packages/plugin-seo/src/translations/index.ts index 7104df6945..22cc49c640 100644 --- a/packages/plugin-seo/src/translations/index.ts +++ b/packages/plugin-seo/src/translations/index.ts @@ -149,7 +149,7 @@ export const translations = { tooShort: 'Zbyt krótkie', }, }, - uk: { + ua: { $schema: './translation-schema.json', 'plugin-seo': { almostThere: 'Ще трошки', @@ -162,11 +162,14 @@ export const translations = { checksPassing: '{{current}}/{{max}} перевірок пройдено', good: 'Чудово', imageAutoGenerationTip: 'Автоматична генерація використає зображення з головного блоку', - lengthTipDescription: 'Має бути від {{minLength}} до {{maxLength}} символів. Щоб дізнатися, як писати якісні метаописи — перегляньте ', - lengthTipTitle: 'Має бути від {{minLength}} до {{maxLength}} символів. Щоб дізнатися, як писати якісні метазаголовки — перегляньте ', + lengthTipDescription: + 'Має бути від {{minLength}} до {{maxLength}} символів. Щоб дізнатися, як писати якісні метаописи — перегляньте ', + lengthTipTitle: + 'Має бути від {{minLength}} до {{maxLength}} символів. Щоб дізнатися, як писати якісні метазаголовки — перегляньте ', noImage: 'Немає зображення', preview: 'Попередній перегляд', - previewDescription: 'Реальне відображення може відрізнятися в залежності від вмісту та релевантності пошуку.', + previewDescription: + 'Реальне відображення може відрізнятися в залежності від вмісту та релевантності пошуку.', tooLong: 'Задовгий', tooShort: 'Закороткий', }, diff --git a/packages/plugin-seo/src/translations/uk.json b/packages/plugin-seo/src/translations/ua.json similarity index 100% rename from packages/plugin-seo/src/translations/uk.json rename to packages/plugin-seo/src/translations/ua.json diff --git a/packages/translations/src/exports/all.ts b/packages/translations/src/exports/all.ts index 4e6b32043c..04919e7bd2 100644 --- a/packages/translations/src/exports/all.ts +++ b/packages/translations/src/exports/all.ts @@ -26,7 +26,7 @@ import { ru } from '../languages/ru.js' import { sv } from '../languages/sv.js' import { th } from '../languages/th.js' import { tr } from '../languages/tr.js' -import { uk } from '../languages/uk.js' +import { ua } from '../languages/ua.js' import { vi } from '../languages/vi.js' import { zh } from '../languages/zh.js' import { zhTw } from '../languages/zhTw.js' @@ -58,7 +58,7 @@ export const translations = { sv, th, tr, - uk, + ua, vi, zh, 'zh-TW': zhTw, diff --git a/packages/translations/src/importDateFNSLocale.ts b/packages/translations/src/importDateFNSLocale.ts index 7dad7fcc53..71dee01f39 100644 --- a/packages/translations/src/importDateFNSLocale.ts +++ b/packages/translations/src/importDateFNSLocale.ts @@ -96,7 +96,7 @@ export const importDateFNSLocale = async (locale: string): Promise => { result = await import('date-fns/locale/tr') break - case 'uk': + case 'ua': result = await import('date-fns/locale/uk') break diff --git a/packages/translations/src/languages/uk.ts b/packages/translations/src/languages/ua.ts similarity index 98% rename from packages/translations/src/languages/uk.ts rename to packages/translations/src/languages/ua.ts index 71005b0a61..fee84621cc 100644 --- a/packages/translations/src/languages/uk.ts +++ b/packages/translations/src/languages/ua.ts @@ -1,7 +1,7 @@ import type { Language } from '../types.js' -export const uk: Language = { - dateFNSKey: 'uk', +export const ua: Language = { + dateFNSKey: 'ua', translations: { authentication: { account: 'Обліковий запис', @@ -33,7 +33,8 @@ export const uk: Language = { lockUntil: 'Заблокувати до', logBackIn: 'Увійти знову', logOut: 'Вийти', - loggedIn: 'Щоб увйти в систему з іншого облікового запису, спочатку <0>вийдіть з системи.', + loggedIn: + 'Щоб увйти в систему з іншого облікового запису, спочатку <0>вийдіть з системи.', loggedInChangePassword: 'Щоб змінити ваш пароль, перейдіть до <0>сторінки облікового запису і змініть ваш пароль.', loggedOutInactivity: 'Ви вийшли з системи через бездіяльність.', @@ -41,7 +42,8 @@ export const uk: Language = { login: 'Увійти', loginAttempts: 'Спроби входу', loginUser: 'Вхід користувача в систему', - loginWithAnotherUser: 'Щоб увйти в систему з іншого облікового запису, спочатку <0>вийдіть з системи.', + loginWithAnotherUser: + 'Щоб увйти в систему з іншого облікового запису, спочатку <0>вийдіть з системи.', logout: 'Вийти', logoutUser: 'Вийти з системи', newAPIKeyGenerated: 'Новий API ключ згенеровано.', diff --git a/packages/translations/src/types.ts b/packages/translations/src/types.ts index 1e06bf82b7..a9d399afb8 100644 --- a/packages/translations/src/types.ts +++ b/packages/translations/src/types.ts @@ -26,7 +26,7 @@ type DateFNSKeys = | 'sv' | 'th' | 'tr' - | 'uk' + | 'ua' | 'vi' | 'zh-CN' | 'zh-TW' From eaf5a8612140ee2a86f5b068820fc9680b5d9082 Mon Sep 17 00:00:00 2001 From: Elliot DeNolf Date: Tue, 16 Apr 2024 11:35:00 -0400 Subject: [PATCH 168/177] ci: enforce node version for all jobs --- .github/workflows/main.yml | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 86aa77d556..9069bf150e 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -10,6 +10,9 @@ concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true +env: + NODE_VERSION: 18.20.2 + jobs: changes: runs-on: ubuntu-latest @@ -57,10 +60,10 @@ jobs: - name: tune linux network run: sudo ethtool -K eth0 tx off rx off - - name: Use Node.js 18 + - name: Setup Node@${{ env.NODE_VERSION }} uses: actions/setup-node@v4 with: - node-version: 18 + node-version: ${{ env.NODE_VERSION }} - name: Install pnpm uses: pnpm/action-setup@v3 @@ -102,10 +105,10 @@ jobs: - name: tune linux network run: sudo ethtool -K eth0 tx off rx off - - name: Use Node.js 18 + - name: Setup Node@${{ env.NODE_VERSION }} uses: actions/setup-node@v4 with: - node-version: 18 + node-version: ${{ env.NODE_VERSION }} - name: Install pnpm uses: pnpm/action-setup@v3 @@ -151,10 +154,10 @@ jobs: - name: tune linux network run: sudo ethtool -K eth0 tx off rx off - - name: Use Node.js 18 + - name: Setup Node@${{ env.NODE_VERSION }} uses: actions/setup-node@v4 with: - node-version: 18 + node-version: ${{ env.NODE_VERSION }} - name: Install pnpm uses: pnpm/action-setup@v3 @@ -254,10 +257,10 @@ jobs: - name: tune linux network run: sudo ethtool -K eth0 tx off rx off - - name: Use Node.js 18 + - name: Setup Node@${{ env.NODE_VERSION }} uses: actions/setup-node@v4 with: - node-version: 18 + node-version: ${{ env.NODE_VERSION }} - name: Install pnpm uses: pnpm/action-setup@v3 @@ -295,10 +298,10 @@ jobs: - name: tune linux network run: sudo ethtool -K eth0 tx off rx off - - name: Use Node.js 18 + - name: Setup Node@${{ env.NODE_VERSION }} uses: actions/setup-node@v4 with: - node-version: 18 + node-version: ${{ env.NODE_VERSION }} - name: Install pnpm uses: pnpm/action-setup@v3 @@ -336,10 +339,10 @@ jobs: - name: tune linux network run: sudo ethtool -K eth0 tx off rx off - - name: Use Node.js 18 + - name: Setup Node@${{ env.NODE_VERSION }} uses: actions/setup-node@v4 with: - node-version: 18 + node-version: ${{ env.NODE_VERSION }} - name: Start MongoDB uses: supercharge/mongodb-github-action@1.10.0 From b6c975bfdcd42ffca83a83a25f91a1dd95711e2d Mon Sep 17 00:00:00 2001 From: Jacob Fletcher Date: Tue, 16 Apr 2024 11:36:38 -0400 Subject: [PATCH 169/177] Revert "fix(plugin-seo): uses correct key for ukrainian translation" This reverts commit b9a9dad60a78a59140fa308cb4a5f5013df61faa. --- packages/plugin-seo/src/translations/index.ts | 11 ++++------- .../plugin-seo/src/translations/{ua.json => uk.json} | 0 packages/translations/src/exports/all.ts | 4 ++-- packages/translations/src/importDateFNSLocale.ts | 2 +- packages/translations/src/languages/{ua.ts => uk.ts} | 10 ++++------ packages/translations/src/types.ts | 2 +- 6 files changed, 12 insertions(+), 17 deletions(-) rename packages/plugin-seo/src/translations/{ua.json => uk.json} (100%) rename packages/translations/src/languages/{ua.ts => uk.ts} (98%) diff --git a/packages/plugin-seo/src/translations/index.ts b/packages/plugin-seo/src/translations/index.ts index 22cc49c640..7104df6945 100644 --- a/packages/plugin-seo/src/translations/index.ts +++ b/packages/plugin-seo/src/translations/index.ts @@ -149,7 +149,7 @@ export const translations = { tooShort: 'Zbyt krótkie', }, }, - ua: { + uk: { $schema: './translation-schema.json', 'plugin-seo': { almostThere: 'Ще трошки', @@ -162,14 +162,11 @@ export const translations = { checksPassing: '{{current}}/{{max}} перевірок пройдено', good: 'Чудово', imageAutoGenerationTip: 'Автоматична генерація використає зображення з головного блоку', - lengthTipDescription: - 'Має бути від {{minLength}} до {{maxLength}} символів. Щоб дізнатися, як писати якісні метаописи — перегляньте ', - lengthTipTitle: - 'Має бути від {{minLength}} до {{maxLength}} символів. Щоб дізнатися, як писати якісні метазаголовки — перегляньте ', + lengthTipDescription: 'Має бути від {{minLength}} до {{maxLength}} символів. Щоб дізнатися, як писати якісні метаописи — перегляньте ', + lengthTipTitle: 'Має бути від {{minLength}} до {{maxLength}} символів. Щоб дізнатися, як писати якісні метазаголовки — перегляньте ', noImage: 'Немає зображення', preview: 'Попередній перегляд', - previewDescription: - 'Реальне відображення може відрізнятися в залежності від вмісту та релевантності пошуку.', + previewDescription: 'Реальне відображення може відрізнятися в залежності від вмісту та релевантності пошуку.', tooLong: 'Задовгий', tooShort: 'Закороткий', }, diff --git a/packages/plugin-seo/src/translations/ua.json b/packages/plugin-seo/src/translations/uk.json similarity index 100% rename from packages/plugin-seo/src/translations/ua.json rename to packages/plugin-seo/src/translations/uk.json diff --git a/packages/translations/src/exports/all.ts b/packages/translations/src/exports/all.ts index 04919e7bd2..4e6b32043c 100644 --- a/packages/translations/src/exports/all.ts +++ b/packages/translations/src/exports/all.ts @@ -26,7 +26,7 @@ import { ru } from '../languages/ru.js' import { sv } from '../languages/sv.js' import { th } from '../languages/th.js' import { tr } from '../languages/tr.js' -import { ua } from '../languages/ua.js' +import { uk } from '../languages/uk.js' import { vi } from '../languages/vi.js' import { zh } from '../languages/zh.js' import { zhTw } from '../languages/zhTw.js' @@ -58,7 +58,7 @@ export const translations = { sv, th, tr, - ua, + uk, vi, zh, 'zh-TW': zhTw, diff --git a/packages/translations/src/importDateFNSLocale.ts b/packages/translations/src/importDateFNSLocale.ts index 71dee01f39..7dad7fcc53 100644 --- a/packages/translations/src/importDateFNSLocale.ts +++ b/packages/translations/src/importDateFNSLocale.ts @@ -96,7 +96,7 @@ export const importDateFNSLocale = async (locale: string): Promise => { result = await import('date-fns/locale/tr') break - case 'ua': + case 'uk': result = await import('date-fns/locale/uk') break diff --git a/packages/translations/src/languages/ua.ts b/packages/translations/src/languages/uk.ts similarity index 98% rename from packages/translations/src/languages/ua.ts rename to packages/translations/src/languages/uk.ts index fee84621cc..71005b0a61 100644 --- a/packages/translations/src/languages/ua.ts +++ b/packages/translations/src/languages/uk.ts @@ -1,7 +1,7 @@ import type { Language } from '../types.js' -export const ua: Language = { - dateFNSKey: 'ua', +export const uk: Language = { + dateFNSKey: 'uk', translations: { authentication: { account: 'Обліковий запис', @@ -33,8 +33,7 @@ export const ua: Language = { lockUntil: 'Заблокувати до', logBackIn: 'Увійти знову', logOut: 'Вийти', - loggedIn: - 'Щоб увйти в систему з іншого облікового запису, спочатку <0>вийдіть з системи.', + loggedIn: 'Щоб увйти в систему з іншого облікового запису, спочатку <0>вийдіть з системи.', loggedInChangePassword: 'Щоб змінити ваш пароль, перейдіть до <0>сторінки облікового запису і змініть ваш пароль.', loggedOutInactivity: 'Ви вийшли з системи через бездіяльність.', @@ -42,8 +41,7 @@ export const ua: Language = { login: 'Увійти', loginAttempts: 'Спроби входу', loginUser: 'Вхід користувача в систему', - loginWithAnotherUser: - 'Щоб увйти в систему з іншого облікового запису, спочатку <0>вийдіть з системи.', + loginWithAnotherUser: 'Щоб увйти в систему з іншого облікового запису, спочатку <0>вийдіть з системи.', logout: 'Вийти', logoutUser: 'Вийти з системи', newAPIKeyGenerated: 'Новий API ключ згенеровано.', diff --git a/packages/translations/src/types.ts b/packages/translations/src/types.ts index a9d399afb8..1e06bf82b7 100644 --- a/packages/translations/src/types.ts +++ b/packages/translations/src/types.ts @@ -26,7 +26,7 @@ type DateFNSKeys = | 'sv' | 'th' | 'tr' - | 'ua' + | 'uk' | 'vi' | 'zh-CN' | 'zh-TW' From 7f6c6c47872b52251f4f9d0830106cec3aded4c1 Mon Sep 17 00:00:00 2001 From: Paul Date: Tue, 16 Apr 2024 12:41:20 -0300 Subject: [PATCH 170/177] fix(next): check for matching passwords when creating the first user (#5869) --- .../next/src/routes/rest/auth/registerFirstUser.ts | 10 ++++++++++ test/auth/int.spec.ts | 1 + test/auth/removed-token/int.spec.ts | 2 +- 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/packages/next/src/routes/rest/auth/registerFirstUser.ts b/packages/next/src/routes/rest/auth/registerFirstUser.ts index 88352e7a7e..44c2076044 100644 --- a/packages/next/src/routes/rest/auth/registerFirstUser.ts +++ b/packages/next/src/routes/rest/auth/registerFirstUser.ts @@ -1,5 +1,6 @@ import httpStatus from 'http-status' import { generatePayloadCookie } from 'payload/auth' +import { ValidationError } from 'payload/errors' import { registerFirstUserOperation } from 'payload/operations' import type { CollectionRouteHandler } from '../types.js' @@ -7,6 +8,15 @@ import type { CollectionRouteHandler } from '../types.js' export const registerFirstUser: CollectionRouteHandler = async ({ collection, req }) => { const data = req.data + if (data?.password !== data['confirm-password']) { + throw new ValidationError([ + { + field: 'confirm-password', + message: req.t('Password and confirm password fields do not match.'), + }, + ]) + } + const result = await registerFirstUserOperation({ collection, data: { diff --git a/test/auth/int.spec.ts b/test/auth/int.spec.ts index 383fe12971..0a3b0eb0e9 100644 --- a/test/auth/int.spec.ts +++ b/test/auth/int.spec.ts @@ -74,6 +74,7 @@ describe('Auth', () => { body: JSON.stringify({ email, password, + 'confirm-password': password, }), }) diff --git a/test/auth/removed-token/int.spec.ts b/test/auth/removed-token/int.spec.ts index 00bfa160b1..1add694125 100644 --- a/test/auth/removed-token/int.spec.ts +++ b/test/auth/removed-token/int.spec.ts @@ -14,7 +14,7 @@ describe('Remove token from auth responses', () => { ;({ payload, restClient } = await initPayloadInt(config)) await restClient.POST(`/${collectionSlug}/first-register`, { - body: JSON.stringify(devUser), + body: JSON.stringify({ ...devUser, 'confirm-password': devUser.password }), }) await restClient.login({ slug: collectionSlug, credentials: devUser }) }) From 234837ee1d6b99586308ed993211fc823efa3ae5 Mon Sep 17 00:00:00 2001 From: Dan Ribbens Date: Tue, 16 Apr 2024 17:09:43 -0400 Subject: [PATCH 171/177] fix: postgres query hasMany in (#5884) --- .../src/queries/getTableColumnFromPath.ts | 137 ++++++++++++++---- test/fields/int.spec.ts | 95 ++++++++++++ 2 files changed, 202 insertions(+), 30 deletions(-) diff --git a/packages/db-postgres/src/queries/getTableColumnFromPath.ts b/packages/db-postgres/src/queries/getTableColumnFromPath.ts index 9aa39672d0..1133f167f4 100644 --- a/packages/db-postgres/src/queries/getTableColumnFromPath.ts +++ b/packages/db-postgres/src/queries/getTableColumnFromPath.ts @@ -225,6 +225,85 @@ export const getTableColumnFromPath = ({ }) } + case 'select': { + if (field.hasMany) { + newTableName = getTableName({ + adapter, + config: field, + parentTableName: `${tableName}_${tableNameSuffix}`, + prefix: `${tableName}_${tableNameSuffix}`, + }) + + if (locale && field.localized && adapter.payload.config.localization) { + joins[newTableName] = and( + eq(adapter.tables[tableName].id, adapter.tables[newTableName].parent), + eq(adapter.tables[newTableName]._locale, locale), + ) + if (locale !== 'all') { + constraints.push({ + columnName: '_locale', + table: adapter.tables[newTableName], + value: locale, + }) + } + } else { + joins[newTableName] = eq( + adapter.tables[tableName].id, + adapter.tables[newTableName].parent, + ) + } + + return { + columnName: 'value', + constraints, + field, + table: adapter.tables[newTableName], + } + } + break + } + + case 'text': + case 'number': { + if (field.hasMany) { + let tableType = 'texts' + let columnName = 'text' + if (field.type === 'number') { + tableType = 'numbers' + columnName = 'number' + } + newTableName = `${tableName}_${tableType}` + const joinConstraints = [ + eq(adapter.tables[tableName].id, adapter.tables[newTableName].parent), + eq(adapter.tables[newTableName].path, `${constraintPath}${field.name}`), + ] + + if (locale && field.localized && adapter.payload.config.localization) { + joins[newTableName] = and( + ...joinConstraints, + eq(adapter.tables[newTableName]._locale, locale), + ) + if (locale !== 'all') { + constraints.push({ + columnName: 'locale', + table: adapter.tables[newTableName], + value: locale, + }) + } + } else { + joins[newTableName] = and(...joinConstraints) + } + + return { + columnName, + constraints, + field, + table: adapter.tables[newTableName], + } + } + break + } + case 'array': { newTableName = getTableName({ adapter, @@ -485,43 +564,41 @@ export const getTableColumnFromPath = ({ value, }) } + } - default: { - if (fieldAffectsData(field)) { - if (field.localized && adapter.payload.config.localization) { - // If localized, we go to localized table and set aliasTable to undefined - // so it is not picked up below to be used as targetTable - newTableName = `${tableName}${adapter.localesSuffix}` + if (fieldAffectsData(field)) { + if (field.localized && adapter.payload.config.localization) { + // If localized, we go to localized table and set aliasTable to undefined + // so it is not picked up below to be used as targetTable + newTableName = `${tableName}${adapter.localesSuffix}` - const parentTable = aliasTable || adapter.tables[tableName] + const parentTable = aliasTable || adapter.tables[tableName] - joins[newTableName] = eq(parentTable.id, adapter.tables[newTableName]._parentID) + joins[newTableName] = eq(parentTable.id, adapter.tables[newTableName]._parentID) - aliasTable = undefined + aliasTable = undefined - if (locale !== 'all') { - constraints.push({ - columnName: '_locale', - table: adapter.tables[newTableName], - value: locale, - }) - } - } - - const targetTable = aliasTable || adapter.tables[newTableName] - - selectFields[`${newTableName}.${columnPrefix}${field.name}`] = - targetTable[`${columnPrefix}${field.name}`] - - return { - columnName: `${columnPrefix}${field.name}`, - constraints, - field, - pathSegments, - table: targetTable, - } + if (locale !== 'all') { + constraints.push({ + columnName: '_locale', + table: adapter.tables[newTableName], + value: locale, + }) } } + + const targetTable = aliasTable || adapter.tables[newTableName] + + selectFields[`${newTableName}.${columnPrefix}${field.name}`] = + targetTable[`${columnPrefix}${field.name}`] + + return { + columnName: `${columnPrefix}${field.name}`, + constraints, + field, + pathSegments, + table: targetTable, + } } } diff --git a/test/fields/int.spec.ts b/test/fields/int.spec.ts index ff7825009d..6070bea26d 100644 --- a/test/fields/int.spec.ts +++ b/test/fields/int.spec.ts @@ -112,6 +112,39 @@ describe('Fields', () => { // @ts-expect-error expect(localizedDoc.localizedHasMany.en).toEqual(localizedHasMany) }) + + it('should query hasMany in', async () => { + const hit = await payload.create({ + collection: 'text-fields', + data: { + text: 'required', + hasMany: ['one', 'five'], + }, + }) + + const miss = await payload.create({ + collection: 'text-fields', + data: { + text: 'required', + hasMany: ['two'], + }, + }) + + const { docs } = await payload.find({ + collection: 'text-fields', + where: { + hasMany: { + in: ['one'], + }, + }, + }) + + const hitResult = docs.find(({ id: findID }) => hit.id === findID) + const missResult = docs.find(({ id: findID }) => miss.id === findID) + + expect(hitResult).toBeDefined() + expect(missResult).toBeFalsy() + }) }) describe('relationship', () => { @@ -309,6 +342,37 @@ describe('Fields', () => { expect(Array.isArray(updatedDoc.selectHasMany)).toBe(true) expect(updatedDoc.selectHasMany).toEqual(['one', 'two']) }) + + it('should query hasMany in', async () => { + const hit = await payload.create({ + collection: 'select-fields', + data: { + selectHasMany: ['one', 'four'], + }, + }) + + const miss = await payload.create({ + collection: 'select-fields', + data: { + selectHasMany: ['three'], + }, + }) + + const { docs } = await payload.find({ + collection: 'select-fields', + where: { + selectHasMany: { + in: ['one'], + }, + }, + }) + + const hitResult = docs.find(({ id: findID }) => hit.id === findID) + const missResult = docs.find(({ id: findID }) => miss.id === findID) + + expect(hitResult).toBeDefined() + expect(missResult).toBeFalsy() + }) }) describe('number', () => { @@ -413,6 +477,37 @@ describe('Fields', () => { // @ts-expect-error expect(localizedDoc.localizedHasMany.en).toEqual(localizedHasMany) }) + + it('should query hasMany in', async () => { + const hit = await payload.create({ + collection: 'number-fields', + data: { + hasMany: [5, 10], + }, + }) + + const miss = await payload.create({ + collection: 'number-fields', + data: { + hasMany: [13], + }, + }) + + const { docs } = await payload.find({ + collection: 'number-fields', + where: { + hasMany: { + in: [5], + }, + }, + }) + + const hitResult = docs.find(({ id: findID }) => hit.id === findID) + const missResult = docs.find(({ id: findID }) => miss.id === findID) + + expect(hitResult).toBeDefined() + expect(missResult).toBeFalsy() + }) }) if (isMongoose(payload)) { From 68dee49501f9d8e50ed66ddf300f8dd41b13b82c Mon Sep 17 00:00:00 2001 From: Elliot DeNolf Date: Tue, 16 Apr 2024 19:46:22 -0400 Subject: [PATCH 172/177] feat(cpa): list plugin template after updating for 3.0 --- packages/create-payload-app/src/lib/templates.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/create-payload-app/src/lib/templates.ts b/packages/create-payload-app/src/lib/templates.ts index 76a8897226..b2aa6756d1 100644 --- a/packages/create-payload-app/src/lib/templates.ts +++ b/packages/create-payload-app/src/lib/templates.ts @@ -41,12 +41,12 @@ export function getValidTemplates(): ProjectTemplate[] { // description: 'E-commerce Template', // url: 'https://github.com/payloadcms/payload/templates/ecommerce', // }, - // { - // name: 'plugin', - // type: 'plugin', - // description: 'Template for creating a Payload plugin', - // url: 'https://github.com/payloadcms/payload-plugin-template', - // }, + { + name: 'plugin', + type: 'plugin', + description: 'Template for creating a Payload plugin', + url: 'https://github.com/payloadcms/payload-plugin-template#beta', + }, // { // name: 'payload-demo', // type: 'starter', From 42329fc736006255529e238b01f8fcc8a3f2f5d5 Mon Sep 17 00:00:00 2001 From: Elliot DeNolf Date: Tue, 16 Apr 2024 22:07:52 -0400 Subject: [PATCH 173/177] ci: cut down on codeowners noise [skip ci] --- .github/CODEOWNERS | 35 +++++++++++++---------------------- 1 file changed, 13 insertions(+), 22 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index c90ea45a14..bf45a6e6ce 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,41 +1,32 @@ # Order matters. The last matching pattern takes precedence. ### Core ### -/packages/payload/src/uploads/ @denolfe -/packages/payload/src/admin/ @jmikrut @jacobsfletch @JarrodMFlesch ### Adapters ### -/packages/db-*/ @denolfe @jmikrut @DanRibbens -/packages/richtext-*/ @denolfe @jmikrut @DanRibbens @AlessioGr +/packages/richtext-*/ @AlessioGr ### Plugins ### -/packages/plugin-*/ @denolfe @jmikrut @DanRibbens /packages/plugin-cloud*/ @denolfe -/packages/plugin-form-builder/ @jacobsfletch -/packages/plugin-live-preview*/ @jacobsfletch -/packages/plugin-nested-docs/ @jacobsfletch -/packages/plugin-redirects/ @jacobsfletch -/packages/plugin-search/ @jacobsfletch -/packages/plugin-sentry/ @JessChowdhury -/packages/plugin-seo/ @jacobsfletch -/packages/plugin-stripe/ @jacobsfletch - -### Examples ### -/examples/ @jacobsfletch -/examples/testing/ @JarrodMFlesch -/examples/email/ @JessChowdhury -/examples/whitelabel/ @JessChowdhury ### Templates ### /templates/ @jacobsfletch @denolfe ### Misc ### /packages/create-payload-app/ @denolfe -/packages/eslint-config-payload/ @denolfe -/packages/payload-admin-bar/ @jacobsfletch +/packages/eslint-*/ @denolfe + +### Build Files ### +/**/package.json @denolfe + +/tsconfig.json @denolfe +/**/tsconfig*.json @denolfe + +/jest.config.js @denolfe +/**/jest.config.js @denolfe ### Root ### /package.json @denolfe /scripts/ @denolfe +/.husky/ @denolfe +/.vscode/ @denolfe /.github/ @denolfe -/.github/CODEOWNERS @denolfe From 49cba92fa19601d22eefe09f4a062f7a9e9085f8 Mon Sep 17 00:00:00 2001 From: Jessica Chowdhury <67977755+JessChowdhury@users.noreply.github.com> Date: Wed, 17 Apr 2024 13:53:00 +0100 Subject: [PATCH 174/177] fix(create-payload-app): uses baseUrl for payload config path in tsconfig (#5888) --- packages/create-payload-app/src/lib/init-next.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/create-payload-app/src/lib/init-next.ts b/packages/create-payload-app/src/lib/init-next.ts index afdf23609d..996eaee3ce 100644 --- a/packages/create-payload-app/src/lib/init-next.ts +++ b/packages/create-payload-app/src/lib/init-next.ts @@ -117,13 +117,17 @@ async function addPayloadConfigToTsConfig(projectDir: string, isSrcDir: boolean) warning(`Could not find tsconfig.json to add @payload-config path.`) return } - const userTsConfigContent = await readFile(tsConfigPath, { encoding: 'utf8', }) const userTsConfig = parse(userTsConfigContent) as { compilerOptions?: CompilerOptions } + + const hasBaseUrl = + userTsConfig?.compilerOptions?.baseUrl && userTsConfig?.compilerOptions?.baseUrl !== '.' + const baseUrl = hasBaseUrl ? userTsConfig?.compilerOptions?.baseUrl : './' + if (!userTsConfig.compilerOptions && !('extends' in userTsConfig)) { userTsConfig.compilerOptions = {} } @@ -134,7 +138,7 @@ async function addPayloadConfigToTsConfig(projectDir: string, isSrcDir: boolean) ) { userTsConfig.compilerOptions.paths = { ...(userTsConfig.compilerOptions.paths || {}), - '@payload-config': [`./${isSrcDir ? 'src/' : ''}payload.config.ts`], + '@payload-config': [`${baseUrl}${isSrcDir ? 'src/' : ''}payload.config.ts`], } await writeFile(tsConfigPath, stringify(userTsConfig, null, 2), { encoding: 'utf8' }) } From abca45e152493d51b3c74fea8ff5eef45864920f Mon Sep 17 00:00:00 2001 From: Elliot DeNolf Date: Wed, 17 Apr 2024 10:23:21 -0400 Subject: [PATCH 175/177] chore: add comments to exports about server vs. front-end --- packages/payload/src/exports/node.ts | 4 ++++ packages/payload/src/exports/utilities.ts | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/packages/payload/src/exports/node.ts b/packages/payload/src/exports/node.ts index 5a5157c065..86fc1dd30b 100644 --- a/packages/payload/src/exports/node.ts +++ b/packages/payload/src/exports/node.ts @@ -1,2 +1,6 @@ +/** + * WARNING: This file contains exports that can only be safely used on the server. + */ + export { generateTypes } from '../bin/generateTypes.js' export { importConfig, importWithoutClientFiles } from '../utilities/importWithoutClientFiles.js' diff --git a/packages/payload/src/exports/utilities.ts b/packages/payload/src/exports/utilities.ts index 25162f9491..aab9b6145c 100644 --- a/packages/payload/src/exports/utilities.ts +++ b/packages/payload/src/exports/utilities.ts @@ -1,3 +1,7 @@ +/** + * WARNING: This file contains exports that can only be safely used on the front-end + */ + export { getDataLoader } from '../collections/dataloader.js' export { default as getDefaultValue } from '../fields/getDefaultValue.js' export { promise as afterReadPromise } from '../fields/hooks/afterRead/promise.js' From abf0461d800f2c80e252a99f182cc20619ce969c Mon Sep 17 00:00:00 2001 From: Elliot DeNolf Date: Wed, 17 Apr 2024 10:24:02 -0400 Subject: [PATCH 176/177] ci: add exports pattern to codeowners --- .github/CODEOWNERS | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index bf45a6e6ce..b026e111e5 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,6 +1,7 @@ # Order matters. The last matching pattern takes precedence. -### Core ### +### Package Exports ### +/**/exports/ @denolfe @jmikrut ### Adapters ### /packages/richtext-*/ @AlessioGr From 6cd5b253f18444d51657701bbe8ed6c333aba153 Mon Sep 17 00:00:00 2001 From: Jacob Fletcher Date: Wed, 17 Apr 2024 10:31:39 -0400 Subject: [PATCH 177/177] fix(next): admin access control (#5887) --- packages/next/src/utilities/initPage.ts | 16 +++++++++++-- test/access-control/config.ts | 23 ++++++++++++++---- test/access-control/e2e.spec.ts | 31 +++++++++++++++++++++++-- test/access-control/shared.ts | 2 ++ test/helpers.ts | 22 ++++++++++++++---- test/helpers/sdk/index.ts | 12 ++++++++++ test/helpers/sdk/types.ts | 13 ++++++++++- tsconfig.json | 4 ++-- 8 files changed, 108 insertions(+), 15 deletions(-) diff --git a/packages/next/src/utilities/initPage.ts b/packages/next/src/utilities/initPage.ts index efcededc71..561675a281 100644 --- a/packages/next/src/utilities/initPage.ts +++ b/packages/next/src/utilities/initPage.ts @@ -25,6 +25,8 @@ type Args = { searchParams: { [key: string]: string | string[] | undefined } } +const authRoutes = ['/login', '/logout', '/create-first-user', '/forgot', '/reset', '/verify'] + export const initPage = async ({ config: configPromise, redirectUnauthenticatedUser = false, @@ -79,13 +81,19 @@ export const initPage = async ({ .filter(Boolean), } - const routeSegments = route.replace(payload.config.routes.admin, '').split('/').filter(Boolean) + const { + routes: { admin: adminRoute }, + } = payload.config + + const routeSegments = route.replace(adminRoute, '').split('/').filter(Boolean) const [entityType, entitySlug, createOrID] = routeSegments const collectionSlug = entityType === 'collections' ? entitySlug : undefined const globalSlug = entityType === 'globals' ? entitySlug : undefined const docID = collectionSlug && createOrID !== 'create' ? createOrID : undefined - if (redirectUnauthenticatedUser && !user && route !== '/login') { + const isAuthRoute = authRoutes.some((r) => r === route.replace(adminRoute, '')) + + if (redirectUnauthenticatedUser && !user && !isAuthRoute) { if (searchParams && 'redirect' in searchParams) delete searchParams.redirect const stringifiedSearchParams = Object.keys(searchParams ?? {}).length @@ -95,6 +103,10 @@ export const initPage = async ({ redirect(`${routes.admin}/login?redirect=${route + stringifiedSearchParams}`) } + if (!permissions.canAccessAdmin && !isAuthRoute) { + notFound() + } + let collectionConfig: SanitizedCollectionConfig let globalConfig: SanitizedGlobalConfig diff --git a/test/access-control/config.ts b/test/access-control/config.ts index 450de34e11..4b38c242e1 100644 --- a/test/access-control/config.ts +++ b/test/access-control/config.ts @@ -8,6 +8,7 @@ import { firstArrayText, hiddenAccessSlug, hiddenFieldsSlug, + noAdminAccessEmail, readOnlySlug, relyOnRequestHeadersSlug, restrictedSlug, @@ -41,6 +42,7 @@ const UseRequestHeadersAccess: FieldAccess = ({ req: { headers } }) => { export default buildConfigWithDefaults({ admin: { user: 'users', + autoLogin: false, }, globals: [ { @@ -76,12 +78,17 @@ export default buildConfigWithDefaults({ slug: 'users', auth: true, access: { - // admin: () => true, - admin: async () => - new Promise((resolve) => { + // admin: () => true, + admin: async ({ req }) => { + if (req.user?.email === noAdminAccessEmail) { + return false + } + + return new Promise((resolve) => { // Simulate a request to an external service to determine access, i.e. another instance of Payload setTimeout(resolve, 50, true) // set to 'true' or 'false' here to simulate the response - }), + }) + }, }, fields: [ { @@ -431,6 +438,14 @@ export default buildConfigWithDefaults({ }, }) + await payload.create({ + collection: 'users', + data: { + email: noAdminAccessEmail, + password: 'test', + }, + }) + await payload.create({ collection: slug, data: { diff --git a/test/access-control/e2e.spec.ts b/test/access-control/e2e.spec.ts index e14431dcd1..b588e4a842 100644 --- a/test/access-control/e2e.spec.ts +++ b/test/access-control/e2e.spec.ts @@ -1,8 +1,10 @@ import type { Page } from '@playwright/test' -import type { Payload, TypeWithID } from 'payload/types' +import type { TypeWithID } from 'payload/types' import { expect, test } from '@playwright/test' +import { devUser } from 'credentials.js' import path from 'path' +import { wait } from 'payload/utilities' import { fileURLToPath } from 'url' import type { PayloadTestSDK } from '../helpers/sdk/index.js' @@ -13,6 +15,7 @@ import { ensureAutoLoginAndCompilationIsDone, exactText, initPageConsoleErrorCatch, + login, openDocControls, openNav, saveDocAndAssert, @@ -22,6 +25,7 @@ import { initPayloadE2ENoConfig } from '../helpers/initPayloadE2ENoConfig.js' import { POLL_TOPASS_TIMEOUT } from '../playwright.config.js' import { docLevelAccessSlug, + noAdminAccessEmail, readOnlySlug, restrictedSlug, restrictedVersionsSlug, @@ -61,7 +65,8 @@ describe('access control', () => { const context = await browser.newContext() page = await context.newPage() initPageConsoleErrorCatch(page) - await ensureAutoLoginAndCompilationIsDone({ page, serverURL }) + + await login({ page, serverURL }) }) test('field without read access should not show', async () => { @@ -328,6 +333,28 @@ describe('access control', () => { // ensure user is allowed to edit this document await expect(documentDrawer2.locator('#field-name')).toBeEnabled() }) + + test('should completely block admin access', async () => { + const adminURL = `${serverURL}/admin` + await page.goto(adminURL) + await page.waitForURL(adminURL) + + await expect(page.locator('.dashboard')).toBeVisible() + + await page.goto(`${serverURL}/admin/logout`) + await page.waitForURL(`${serverURL}/admin/logout`) + + await login({ + page, + serverURL, + data: { + email: noAdminAccessEmail, + password: 'test', + }, + }) + + await expect(page.locator('.next-error-h1')).toBeVisible() + }) }) // eslint-disable-next-line @typescript-eslint/require-await diff --git a/test/access-control/shared.ts b/test/access-control/shared.ts index ef1ed5eaad..0b98730f1f 100644 --- a/test/access-control/shared.ts +++ b/test/access-control/shared.ts @@ -14,3 +14,5 @@ export const docLevelAccessSlug = 'doc-level-access' export const hiddenFieldsSlug = 'hidden-fields' export const hiddenAccessSlug = 'hidden-access' + +export const noAdminAccessEmail = 'no-admin-access@payloadcms.com' diff --git a/test/helpers.ts b/test/helpers.ts index 7497a65d35..9da25609c3 100644 --- a/test/helpers.ts +++ b/test/helpers.ts @@ -13,6 +13,10 @@ type FirstRegisterArgs = { } type LoginArgs = { + data?: { + email: string + password: string + } page: Page serverURL: string } @@ -91,14 +95,24 @@ export async function firstRegister(args: FirstRegisterArgs): Promise { } export async function login(args: LoginArgs): Promise { - const { page, serverURL } = args + const { page, serverURL, data = devUser } = args - await page.goto(`${serverURL}/admin`) - await page.fill('#field-email', devUser.email) - await page.fill('#field-password', devUser.password) + await page.goto(`${serverURL}/admin/login`) + await page.waitForURL(`${serverURL}/admin/login`) + await wait(500) + await page.fill('#field-email', data.email) + await page.fill('#field-password', data.password) await wait(500) await page.click('[type=submit]') await page.waitForURL(`${serverURL}/admin`) + + await expect(() => expect(page.url()).not.toContain(`/admin/login`)).toPass({ + timeout: POLL_TOPASS_TIMEOUT, + }) + + await expect(() => expect(page.url()).not.toContain(`/admin/create-first-user`)).toPass({ + timeout: POLL_TOPASS_TIMEOUT, + }) } export async function saveDocHotkeyAndAssert(page: Page): Promise { diff --git a/test/helpers/sdk/index.ts b/test/helpers/sdk/index.ts index c89c13e889..5998f13a23 100644 --- a/test/helpers/sdk/index.ts +++ b/test/helpers/sdk/index.ts @@ -7,6 +7,7 @@ import type { FetchOptions, FindArgs, GeneratedTypes, + LoginArgs, UpdateArgs, UpdateGlobalArgs, } from './types.js' @@ -70,6 +71,17 @@ export class PayloadTestSDK({ + jwt, + ...args + }: LoginArgs) => { + return this.fetch({ + operation: 'login', + args, + jwt, + }) + } + sendEmail = async ({ jwt, ...args }: { jwt?: string } & SendMailOptions): Promise => { return this.fetch({ operation: 'sendEmail', diff --git a/test/helpers/sdk/types.ts b/test/helpers/sdk/types.ts index f107a5a623..4dbaaf7f48 100644 --- a/test/helpers/sdk/types.ts +++ b/test/helpers/sdk/types.ts @@ -25,7 +25,7 @@ export type GeneratedTypes = { export type FetchOptions = { args?: Record jwt?: string - operation: 'create' | 'delete' | 'find' | 'sendEmail' | 'update' | 'updateGlobal' + operation: 'create' | 'delete' | 'find' | 'login' | 'sendEmail' | 'update' | 'updateGlobal' reduceJSON?: (json: any) => R } @@ -122,6 +122,17 @@ export type FindArgs< where?: Where } & BaseArgs +export type LoginArgs< + TGeneratedTypes extends GeneratedTypes, + TSlug extends keyof TGeneratedTypes['collections'], +> = { + collection: TSlug + data: { + email: string + password: string + } +} & BaseArgs + export type DeleteArgs< TGeneratedTypes extends GeneratedTypes, TSlug extends keyof TGeneratedTypes['collections'], diff --git a/tsconfig.json b/tsconfig.json index d55001935b..046160a5de 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -37,7 +37,7 @@ ], "paths": { "@payload-config": [ - "./test/_community/config.ts" + "./test/access-control/config.ts" ], "@payloadcms/live-preview": [ "./packages/live-preview/src" @@ -161,4 +161,4 @@ ".next/types/**/*.ts", "scripts/**/*.ts" ] -} +} \ No newline at end of file