diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 17c907c44..96415ff77 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -304,6 +304,7 @@ jobs: - plugin-nested-docs - plugin-seo - sort + - trash - versions - uploads env: @@ -440,6 +441,7 @@ jobs: - plugin-nested-docs - plugin-seo - sort + - trash - versions - uploads env: diff --git a/.vscode/launch.json b/.vscode/launch.json index 26980151e..74b52f6d2 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -139,6 +139,13 @@ "request": "launch", "type": "node-terminal" }, + { + "command": "pnpm tsx --no-deprecation test/dev.ts trash", + "cwd": "${workspaceFolder}", + "name": "Run Dev Trash", + "request": "launch", + "type": "node-terminal" + }, { "command": "pnpm tsx --no-deprecation test/dev.ts uploads", "cwd": "${workspaceFolder}", diff --git a/docs/configuration/collections.mdx b/docs/configuration/collections.mdx index c6a6e1ebd..b9336c53d 100644 --- a/docs/configuration/collections.mdx +++ b/docs/configuration/collections.mdx @@ -60,32 +60,33 @@ export const Posts: CollectionConfig = { The following options are available: -| Option | Description | -| -------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `admin` | The configuration options for the Admin Panel. [More details](#admin-options). | -| `access` | Provide Access Control functions to define exactly who should be able to do what with Documents in this Collection. [More details](../access-control/collections). | -| `auth` | Specify options if you would like this Collection to feature authentication. [More details](../authentication/overview). | -| `custom` | Extension point for adding custom data (e.g. for plugins) | -| `disableDuplicate` | When true, do not show the "Duplicate" button while editing documents within this Collection and prevent `duplicate` from all APIs. | -| `defaultSort` | Pass a top-level field to sort by default in the Collection List View. Prefix the name of the field with a minus symbol ("-") to sort in descending order. Multiple fields can be specified by using a string array. | -| `dbName` | Custom table or Collection name depending on the Database Adapter. Auto-generated from slug if not defined. | -| `endpoints` | Add custom routes to the REST API. Set to `false` to disable routes. [More details](../rest-api/overview#custom-endpoints). | -| `fields` \* | Array of field types that will determine the structure and functionality of the data stored within this Collection. [More details](../fields/overview). | -| `graphQL` | Manage GraphQL-related properties for this collection. [More](#graphql) | -| `hooks` | Entry point for Hooks. [More details](../hooks/overview#collection-hooks). | -| `orderable` | If true, enables custom ordering for the collection, and documents can be reordered via drag and drop. Uses [fractional indexing](https://observablehq.com/@dgreensp/implementing-fractional-indexing) for efficient reordering. | -| `labels` | Singular and plural labels for use in identifying this Collection throughout Payload. Auto-generated from slug if not defined. | -| `enableQueryPresets` | Enable query presets for this Collection. [More details](../query-presets/overview). | -| `lockDocuments` | Enables or disables document locking. By default, document locking is enabled. Set to an object to configure, or set to `false` to disable locking. [More details](../admin/locked-documents). | -| `slug` \* | Unique, URL-friendly string that will act as an identifier for this Collection. | -| `timestamps` | Set to false to disable documents' automatically generated `createdAt` and `updatedAt` timestamps. | -| `typescript` | An object with property `interface` as the text used in schema generation. Auto-generated from slug if not defined. | -| `upload` | Specify options if you would like this Collection to support file uploads. For more, consult the [Uploads](../upload/overview) documentation. | -| `versions` | Set to true to enable default options, or configure with object properties. [More details](../versions/overview#collection-config). | -| `defaultPopulate` | Specify which fields to select when this Collection is populated from another document. [More Details](../queries/select#defaultpopulate-collection-config-property). | -| `indexes` | Define compound indexes for this collection. This can be used to either speed up querying/sorting by 2 or more fields at the same time or to ensure uniqueness between several fields. [More details](../database/indexes#compound-indexes). | -| `forceSelect` | Specify which fields should be selected always, regardless of the `select` query which can be useful that the field exists for access control / hooks | -| `disableBulkEdit` | Disable the bulk edit operation for the collection in the admin panel and the REST API | +| Option | Description | +| -------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `admin` | The configuration options for the Admin Panel. [More details](#admin-options). | +| `access` | Provide Access Control functions to define exactly who should be able to do what with Documents in this Collection. [More details](../access-control/collections). | +| `auth` | Specify options if you would like this Collection to feature authentication. [More details](../authentication/overview). | +| `custom` | Extension point for adding custom data (e.g. for plugins) | +| `disableDuplicate` | When true, do not show the "Duplicate" button while editing documents within this Collection and prevent `duplicate` from all APIs. | +| `defaultSort` | Pass a top-level field to sort by default in the Collection List View. Prefix the name of the field with a minus symbol ("-") to sort in descending order. Multiple fields can be specified by using a string array. | +| `dbName` | Custom table or Collection name depending on the Database Adapter. Auto-generated from slug if not defined. | +| `endpoints` | Add custom routes to the REST API. Set to `false` to disable routes. [More details](../rest-api/overview#custom-endpoints). | +| `fields` \* | Array of field types that will determine the structure and functionality of the data stored within this Collection. [More details](../fields/overview). | +| `graphQL` | Manage GraphQL-related properties for this collection. [More](#graphql) | +| `hooks` | Entry point for Hooks. [More details](../hooks/overview#collection-hooks). | +| `orderable` | If true, enables custom ordering for the collection, and documents can be reordered via drag and drop. Uses [fractional indexing](https://observablehq.com/@dgreensp/implementing-fractional-indexing) for efficient reordering. | +| `labels` | Singular and plural labels for use in identifying this Collection throughout Payload. Auto-generated from slug if not defined. | +| `enableQueryPresets` | Enable query presets for this Collection. [More details](../query-presets/overview). | +| `lockDocuments` | Enables or disables document locking. By default, document locking is enabled. Set to an object to configure, or set to `false` to disable locking. [More details](../admin/locked-documents). | +| `slug` \* | Unique, URL-friendly string that will act as an identifier for this Collection. | +| `timestamps` | Set to false to disable documents' automatically generated `createdAt` and `updatedAt` timestamps. | +| `trash` | A boolean to enable soft deletes for this collection. Defaults to `false`. [More details](../trash/overview). | +| `typescript` | An object with property `interface` as the text used in schema generation. Auto-generated from slug if not defined. | +| `upload` | Specify options if you would like this Collection to support file uploads. For more, consult the [Uploads](../upload/overview) documentation. | +| `versions` | Set to true to enable default options, or configure with object properties. [More details](../versions/overview#collection-config). | +| `defaultPopulate` | Specify which fields to select when this Collection is populated from another document. [More Details](../queries/select#defaultpopulate-collection-config-property). | +| `indexes` | Define compound indexes for this collection. This can be used to either speed up querying/sorting by 2 or more fields at the same time or to ensure uniqueness between several fields. | +| `forceSelect` | Specify which fields should be selected always, regardless of the `select` query which can be useful that the field exists for access control / hooks | +| `disableBulkEdit` | Disable the bulk edit operation for the collection in the admin panel and the REST API | _\* An asterisk denotes that a property is required._ diff --git a/docs/live-preview/server.mdx b/docs/live-preview/server.mdx index 48745ac3e..4163fed49 100644 --- a/docs/live-preview/server.mdx +++ b/docs/live-preview/server.mdx @@ -51,6 +51,7 @@ export default async function Page() { collection: 'pages', id: '123', draft: true, + trash: true, // add this if trash is enabled in your collection and want to preview trashed documents }) return ( diff --git a/docs/trash/overview.mdx b/docs/trash/overview.mdx new file mode 100644 index 000000000..e20b6e7f7 --- /dev/null +++ b/docs/trash/overview.mdx @@ -0,0 +1,200 @@ +--- +title: Trash +label: Overview +order: 10 +desc: Enable soft deletes for your collections to mark documents as deleted without permanently removing them. +keywords: trash, soft delete, deletedAt, recovery, restore +--- + +Trash (also known as soft delete) allows documents to be marked as deleted without being permanently removed. When enabled on a collection, deleted documents will receive a `deletedAt` timestamp, making it possible to restore them later, view them in a dedicated Trash view, or permanently delete them. + +Soft delete is a safer way to manage content lifecycle, giving editors a chance to review and recover documents that may have been deleted by mistake. + + + **Note:** The Trash feature is currently in beta and may be subject to change + in minor version updates. + + +## Collection Configuration + +To enable soft deleting for a collection, set the `trash` property to `true`: + +```ts +import type { CollectionConfig } from 'payload' + +export const Posts: CollectionConfig = { + slug: 'posts', + trash: true, + fields: [ + { + name: 'title', + type: 'text', + }, + // other fields... + ], +} +``` + +When enabled, Payload automatically injects a deletedAt field into the collection's schema. This timestamp is set when a document is soft-deleted, and cleared when the document is restored. + +## Admin Panel behavior + +Once `trash` is enabled, the Admin Panel provides a dedicated Trash view for each collection: + +- A new route is added at `/collections/:collectionSlug/trash` +- The `Trash` view shows all documents that have a `deletedAt` timestamp + +From the Trash view, you can: + +- Use bulk actions to manage trashed documents: + + - **Restore** to clear the `deletedAt` timestamp and return documents to their original state + - **Delete** to permanently remove selected documents + - **Empty Trash** to select and permanently delete all trashed documents at once + +- Enter each document's **edit view**, just like in the main list view. While in the edit view of a trashed document: + - All fields are in a **read-only** state + - Standard document actions (e.g., Save, Publish, Restore Version) are hidden and disabled. + - The available actions are **Restore** and **Permanently Delete**. + - Access to the **API**, **Versions**, and **Preview** views is preserved. + +When deleting a document from the main collection List View, Payload will soft-delete the document by default. A checkbox in the delete confirmation modal allows users to skip the trash and permanently delete instead. + +## API Support + +Soft deletes are fully supported across all Payload APIs: **Local**, **REST**, and **GraphQL**. + +The following operations respect and support the `trash` functionality: + +- `find` +- `findByID` +- `update` +- `updateByID` +- `delete` +- `deleteByID` +- `findVersions` +- `findVersionByID` + +### Understanding `trash` Behavior + +Passing `trash: true` to these operations will **include soft-deleted documents** in the query results. + +To return _only_ soft-deleted documents, you must combine `trash: true` with a `where` clause that checks if `deletedAt` exists. + +### Examples + +#### Local API + +Return all documents including trashed: + +```ts +const result = await payload.find({ + collection: 'posts', + trash: true, +}) +``` + +Return only trashed documents: + +```ts +const result = await payload.find({ + collection: 'posts', + trash: true, + where: { + deletedAt: { + exists: true, + }, + }, +}) +``` + +Return only non-trashed documents: + +```ts +const result = await payload.find({ + collection: 'posts', + trash: false, +}) +``` + +#### REST + +Return **all** documents including trashed: + +```http +GET /api/posts?trash=true +``` + +Return **only trashed** documents: + +```http +GET /api/posts?trash=true&where[deletedAt][exists]=true +``` + +Return only non-trashed documents: + +```http +GET /api/posts?trash=false +``` + +#### GraphQL + +Return all documents including trashed: + +```ts +query { + Posts(trash: true) { + docs { + id + deletedAt + } + } +} +``` + +Return only trashed documents: + +```ts +query { + Posts( + trash: true + where: { deletedAt: { exists: true } } + ) { + docs { + id + deletedAt + } + } +} +``` + +Return only non-trashed documents: + +```ts +query { + Posts(trash: false) { + docs { + id + deletedAt + } + } +} +``` + +## Access Control + +All trash-related actions (delete, permanent delete) respect the `delete` access control defined in your collection config. + +This means: + +- If a user is denied delete access, they cannot soft delete or permanently delete documents + +## Versions and Trash + +When a document is soft-deleted: + +- It can no longer have a version **restored** until it is first restored from trash +- Attempting to restore a version while the document is in trash will result in an error +- This ensures consistency between the current document state and its version history + +However, versions are still fully **visible and accessible** from the **edit view** of a trashed document. You can view the full version history, but must restore the document itself before restoring any individual version. diff --git a/packages/drizzle/src/queries/sanitizeQueryValue.ts b/packages/drizzle/src/queries/sanitizeQueryValue.ts index 2a7cfc8c9..72b1d5cba 100644 --- a/packages/drizzle/src/queries/sanitizeQueryValue.ts +++ b/packages/drizzle/src/queries/sanitizeQueryValue.ts @@ -112,9 +112,14 @@ export const sanitizeQueryValue = ({ if (field.type === 'date' && operator !== 'exists') { if (typeof val === 'string') { - formattedValue = new Date(val).toISOString() - if (Number.isNaN(Date.parse(formattedValue))) { - return { operator, value: undefined } + if (val === 'null' || val === '') { + formattedValue = null + } else { + const date = new Date(val) + if (Number.isNaN(date.getTime())) { + return { operator, value: undefined } + } + formattedValue = date.toISOString() } } else if (typeof val === 'number') { formattedValue = new Date(val).toISOString() diff --git a/packages/graphql/src/resolvers/collections/delete.ts b/packages/graphql/src/resolvers/collections/delete.ts index 2624d5c63..b033447b8 100644 --- a/packages/graphql/src/resolvers/collections/delete.ts +++ b/packages/graphql/src/resolvers/collections/delete.ts @@ -11,6 +11,7 @@ export type Resolver = ( fallbackLocale?: string id: number | string locale?: string + trash?: boolean }, context: { req: PayloadRequest @@ -49,6 +50,7 @@ export function getDeleteResolver( collection, depth: 0, req: isolateObjectProperty(req, 'transactionID'), + trash: args.trash, } const result = await deleteByIDOperation(options) diff --git a/packages/graphql/src/resolvers/collections/find.ts b/packages/graphql/src/resolvers/collections/find.ts index 3285e16c7..4bd567a96 100644 --- a/packages/graphql/src/resolvers/collections/find.ts +++ b/packages/graphql/src/resolvers/collections/find.ts @@ -15,6 +15,7 @@ export type Resolver = ( page?: number pagination?: boolean sort?: string + trash?: boolean where?: Where }, context: { @@ -57,6 +58,7 @@ export function findResolver(collection: Collection): Resolver { pagination: args.pagination, req, sort: args.sort, + trash: args.trash, where: args.where, } diff --git a/packages/graphql/src/resolvers/collections/findByID.ts b/packages/graphql/src/resolvers/collections/findByID.ts index 22e8403cc..72a1ac424 100644 --- a/packages/graphql/src/resolvers/collections/findByID.ts +++ b/packages/graphql/src/resolvers/collections/findByID.ts @@ -11,6 +11,7 @@ export type Resolver = ( fallbackLocale?: string id: string locale?: string + trash?: boolean }, context: { req: PayloadRequest @@ -50,6 +51,7 @@ export function findByIDResolver( depth: 0, draft: args.draft, req: isolateObjectProperty(req, 'transactionID'), + trash: args.trash, } const result = await findByIDOperation(options) diff --git a/packages/graphql/src/resolvers/collections/findVersionByID.ts b/packages/graphql/src/resolvers/collections/findVersionByID.ts index 25b05f329..933e9f810 100644 --- a/packages/graphql/src/resolvers/collections/findVersionByID.ts +++ b/packages/graphql/src/resolvers/collections/findVersionByID.ts @@ -10,6 +10,7 @@ export type Resolver = ( fallbackLocale?: string id: number | string locale?: string + trash?: boolean }, context: { req: PayloadRequest @@ -33,6 +34,7 @@ export function findVersionByIDResolver(collection: Collection): Resolver { collection, depth: 0, req: isolateObjectProperty(req, 'transactionID'), + trash: args.trash, } const result = await findVersionByIDOperation(options) diff --git a/packages/graphql/src/resolvers/collections/findVersions.ts b/packages/graphql/src/resolvers/collections/findVersions.ts index c747bbdfd..2b1eb906a 100644 --- a/packages/graphql/src/resolvers/collections/findVersions.ts +++ b/packages/graphql/src/resolvers/collections/findVersions.ts @@ -14,6 +14,7 @@ export type Resolver = ( page?: number pagination?: boolean sort?: string + trash?: boolean where: Where }, context: { @@ -54,6 +55,7 @@ export function findVersionsResolver(collection: Collection): Resolver { pagination: args.pagination, req: isolateObjectProperty(req, 'transactionID'), sort: args.sort, + trash: args.trash, where: args.where, } diff --git a/packages/graphql/src/resolvers/collections/update.ts b/packages/graphql/src/resolvers/collections/update.ts index 5e8d894cf..0feff36fb 100644 --- a/packages/graphql/src/resolvers/collections/update.ts +++ b/packages/graphql/src/resolvers/collections/update.ts @@ -13,6 +13,7 @@ export type Resolver = ( fallbackLocale?: string id: number | string locale?: string + trash?: boolean }, context: { req: PayloadRequest @@ -54,6 +55,7 @@ export function updateResolver( depth: 0, draft: args.draft, req: isolateObjectProperty(req, 'transactionID'), + trash: args.trash, } const result = await updateByIDOperation(options) diff --git a/packages/graphql/src/schema/initCollections.ts b/packages/graphql/src/schema/initCollections.ts index 6ae09a692..e3711ea43 100644 --- a/packages/graphql/src/schema/initCollections.ts +++ b/packages/graphql/src/schema/initCollections.ts @@ -205,6 +205,7 @@ export function initCollections({ config, graphqlResult }: InitCollectionsGraphQ locale: { type: graphqlResult.types.localeInputType }, } : {}), + trash: { type: GraphQLBoolean }, }, resolve: findByIDResolver(collection), } @@ -224,6 +225,7 @@ export function initCollections({ config, graphqlResult }: InitCollectionsGraphQ page: { type: GraphQLInt }, pagination: { type: GraphQLBoolean }, sort: { type: GraphQLString }, + trash: { type: GraphQLBoolean }, }, resolve: findResolver(collection), } @@ -292,6 +294,7 @@ export function initCollections({ config, graphqlResult }: InitCollectionsGraphQ locale: { type: graphqlResult.types.localeInputType }, } : {}), + trash: { type: GraphQLBoolean }, }, resolve: updateResolver(collection), } @@ -300,6 +303,7 @@ export function initCollections({ config, graphqlResult }: InitCollectionsGraphQ type: collection.graphQL.type, args: { id: { type: new GraphQLNonNull(idType) }, + trash: { type: GraphQLBoolean }, }, resolve: getDeleteResolver(collection), } @@ -329,12 +333,12 @@ export function initCollections({ config, graphqlResult }: InitCollectionsGraphQ { name: 'createdAt', type: 'date', - label: 'Created At', + label: ({ t }) => t('general:createdAt'), }, { name: 'updatedAt', type: 'date', - label: 'Updated At', + label: ({ t }) => t('general:updatedAt'), }, ] @@ -359,6 +363,7 @@ export function initCollections({ config, graphqlResult }: InitCollectionsGraphQ locale: { type: graphqlResult.types.localeInputType }, } : {}), + trash: { type: GraphQLBoolean }, }, resolve: findVersionByIDResolver(collection), } @@ -385,6 +390,7 @@ export function initCollections({ config, graphqlResult }: InitCollectionsGraphQ page: { type: GraphQLInt }, pagination: { type: GraphQLBoolean }, sort: { type: GraphQLString }, + trash: { type: GraphQLBoolean }, }, resolve: findVersionsResolver(collection), } diff --git a/packages/next/src/elements/DocumentHeader/Tabs/Tab/TabLink.tsx b/packages/next/src/elements/DocumentHeader/Tabs/Tab/TabLink.tsx index 8647ce297..fd8909371 100644 --- a/packages/next/src/elements/DocumentHeader/Tabs/Tab/TabLink.tsx +++ b/packages/next/src/elements/DocumentHeader/Tabs/Tab/TabLink.tsx @@ -38,9 +38,12 @@ export const DocumentTabLink: React.FC<{ path: `/${isCollection ? 'collections' : 'globals'}/${entitySlug}`, }) - if (isCollection && segmentThree) { - // doc ID - docPath += `/${segmentThree}` + if (isCollection) { + if (segmentThree === 'trash' && segmentFour) { + docPath += `/trash/${segmentFour}` + } else if (segmentThree) { + docPath += `/${segmentThree}` + } } const href = `${docPath}${hrefFromProps}` diff --git a/packages/next/src/utilities/initPage/handleAdminPage.ts b/packages/next/src/utilities/initPage/handleAdminPage.ts index d8683ea9f..8fc327055 100644 --- a/packages/next/src/utilities/initPage/handleAdminPage.ts +++ b/packages/next/src/utilities/initPage/handleAdminPage.ts @@ -5,8 +5,6 @@ import type { SanitizedGlobalConfig, } from 'payload' -import { fieldAffectsData } from 'payload/shared' - import { getRouteWithoutAdmin, isAdminRoute } from './shared.js' type Args = { @@ -35,7 +33,7 @@ export function getRouteInfo({ if (isAdminRoute({ adminRoute, config, route })) { const routeWithoutAdmin = getRouteWithoutAdmin({ adminRoute, route }) const routeSegments = routeWithoutAdmin.split('/').filter(Boolean) - const [entityType, entitySlug, createOrID] = routeSegments + const [entityType, entitySlug, segment3, segment4] = routeSegments const collectionSlug = entityType === 'collections' ? entitySlug : undefined const globalSlug = entityType === 'globals' ? entitySlug : undefined @@ -58,12 +56,17 @@ export function getRouteInfo({ } } - const docID = - collectionSlug && createOrID !== 'create' - ? idType === 'number' - ? Number(createOrID) - : createOrID - : undefined + let docID: number | string | undefined + + if (collectionSlug) { + if (segment3 === 'trash' && segment4) { + // /collections/:slug/trash/:id + docID = idType === 'number' ? Number(segment4) : segment4 + } else if (segment3 && segment3 !== 'create') { + // /collections/:slug/:id + docID = idType === 'number' ? Number(segment3) : segment3 + } + } return { collectionConfig, diff --git a/packages/next/src/views/API/index.client.tsx b/packages/next/src/views/API/index.client.tsx index bf1c75e32..95159878e 100644 --- a/packages/next/src/views/API/index.client.tsx +++ b/packages/next/src/views/API/index.client.tsx @@ -15,16 +15,18 @@ import { useTranslation, } from '@payloadcms/ui' import { useSearchParams } from 'next/navigation.js' -import * as React from 'react' import './index.scss' + +import * as React from 'react' + import { LocaleSelector } from './LocaleSelector/index.js' import { RenderJSON } from './RenderJSON/index.js' const baseClass = 'query-inspector' export const APIViewClient: React.FC = () => { - const { id, collectionSlug, globalSlug, initialData } = useDocumentInfo() + const { id, collectionSlug, globalSlug, initialData, isTrashed } = useDocumentInfo() const searchParams = useSearchParams() const { i18n, t } = useTranslation() @@ -69,10 +71,13 @@ export const APIViewClient: React.FC = () => { const [authenticated, setAuthenticated] = React.useState(true) const [fullscreen, setFullscreen] = React.useState(false) + const trashParam = typeof initialData?.deletedAt === 'string' + const params = new URLSearchParams({ depth, draft: String(draft), locale, + trash: trashParam ? 'true' : 'false', }).toString() const fetchURL = `${serverURL}${apiRoute}${docEndpoint}?${params}` @@ -114,6 +119,7 @@ export const APIViewClient: React.FC = () => { globalLabel={globalConfig?.label} globalSlug={globalSlug} id={id} + isTrashed={isTrashed} pluralLabel={collectionConfig ? collectionConfig?.labels?.plural : undefined} useAsTitle={collectionConfig ? collectionConfig?.admin?.useAsTitle : undefined} view="API" diff --git a/packages/next/src/views/CollectionTrash/index.tsx b/packages/next/src/views/CollectionTrash/index.tsx new file mode 100644 index 000000000..7fed4d7b7 --- /dev/null +++ b/packages/next/src/views/CollectionTrash/index.tsx @@ -0,0 +1,43 @@ +import type { AdminViewServerProps, ListQuery } from 'payload' +import type React from 'react' + +import { notFound } from 'next/navigation.js' + +import { renderListView } from '../List/index.js' + +type RenderTrashViewArgs = { + customCellProps?: Record + disableBulkDelete?: boolean + disableBulkEdit?: boolean + disableQueryPresets?: boolean + drawerSlug?: string + enableRowSelections: boolean + overrideEntityVisibility?: boolean + query: ListQuery + redirectAfterDelete?: boolean + redirectAfterDuplicate?: boolean + redirectAfterRestore?: boolean +} & AdminViewServerProps + +export const TrashView: React.FC< + { query?: any } & Omit +> = async (args) => { + try { + const { List: TrashList } = await renderListView({ + ...args, + enableRowSelections: true, + query: { + ...(args.query || {}), + trash: true, // force trash view + }, + viewType: 'trash', + }) + + return TrashList + } catch (error) { + if (error.message === 'not-found') { + notFound() + } + console.error(error) // eslint-disable-line no-console + } +} diff --git a/packages/next/src/views/CollectionTrash/metadata.ts b/packages/next/src/views/CollectionTrash/metadata.ts new file mode 100644 index 000000000..83f5a67ea --- /dev/null +++ b/packages/next/src/views/CollectionTrash/metadata.ts @@ -0,0 +1,35 @@ +import type { Metadata } from 'next' +import type { SanitizedCollectionConfig } from 'payload' + +import { getTranslation } from '@payloadcms/translations' + +import type { GenerateViewMetadata } from '../Root/index.js' + +import { generateMetadata } from '../../utilities/meta.js' + +export const generateCollectionTrashMetadata = async ( + args: { + collectionConfig: SanitizedCollectionConfig + } & Parameters[0], +): Promise => { + const { collectionConfig, config, i18n } = args + + let title: string = '' + const description: string = '' + const keywords: string = '' + + if (collectionConfig) { + title = getTranslation(collectionConfig.labels.plural, i18n) + } + + title = `${title ? `${title} ` : title}${i18n.t('general:trash')}` + + return generateMetadata({ + ...(config.admin.meta || {}), + description, + keywords, + serverURL: config.serverURL, + title, + ...(collectionConfig?.admin?.meta || {}), + }) +} diff --git a/packages/next/src/views/Document/getDocumentData.ts b/packages/next/src/views/Document/getDocumentData.ts index 5200813b6..7b2ae7dbe 100644 --- a/packages/next/src/views/Document/getDocumentData.ts +++ b/packages/next/src/views/Document/getDocumentData.ts @@ -15,6 +15,7 @@ type Args = { locale?: Locale payload: Payload req?: PayloadRequest + segments?: string[] user?: TypedUser } @@ -25,12 +26,15 @@ export const getDocumentData = async ({ locale, payload, req, + segments, user, }: Args): Promise | TypeWithID> => { const id = sanitizeID(idArg) let resolvedData: Record | TypeWithID = null const { transactionID, ...rest } = req + const isTrashedDoc = segments?.[2] === 'trash' && typeof segments?.[3] === 'string' // id exists at segment 3 + try { if (collectionSlug && id) { resolvedData = await payload.findByID({ @@ -44,6 +48,7 @@ export const getDocumentData = async ({ req: { ...rest, }, + trash: isTrashedDoc ? true : false, user, }) } diff --git a/packages/next/src/views/Document/getDocumentView.tsx b/packages/next/src/views/Document/getDocumentView.tsx index f97937cd8..7056af04e 100644 --- a/packages/next/src/views/Document/getDocumentView.tsx +++ b/packages/next/src/views/Document/getDocumentView.tsx @@ -113,7 +113,13 @@ export const getDocumentView = ({ // --> /collections/:collectionSlug/:id/api // --> /collections/:collectionSlug/:id/versions // --> /collections/:collectionSlug/:id/ + // --> /collections/:collectionSlug/trash/:id case 4: { + // --> /collections/:collectionSlug/trash/:id + if (segment3 === 'trash' && segment4) { + View = getCustomViewByKey(views, 'default') || DefaultEditView + break + } switch (segment4) { // --> /collections/:collectionSlug/:id/api case 'api': { @@ -167,18 +173,86 @@ export const getDocumentView = ({ break } + // --> /collections/:collectionSlug/trash/:id/api + // --> /collections/:collectionSlug/trash/:id/versions + // --> /collections/:collectionSlug/trash/:id/ // --> /collections/:collectionSlug/:id/versions/:version - // --> /collections/:collectionSlug/:id// - default: { - // --> /collections/:collectionSlug/:id/versions/:version - if (segment4 === 'versions') { + case 5: { + // --> /collections/:slug/trash/:id/api + if (segment3 === 'trash') { + switch (segment5) { + case 'api': { + if (collectionConfig?.admin?.hideAPIURL !== true) { + View = getCustomViewByKey(views, 'api') || DefaultAPIView + } + break + } + // --> /collections/:slug/trash/:id/versions + case 'versions': { + if (docPermissions?.readVersions) { + View = getCustomViewByKey(views, 'versions') || DefaultVersionsView + } else { + View = UnauthorizedViewWithGutter + } + break + } + + default: { + View = getCustomViewByKey(views, 'default') || DefaultEditView + break + } + } + // --> /collections/:collectionSlug/:id/versions/:version + } else if (segment4 === 'versions') { if (docPermissions?.readVersions) { View = getCustomViewByKey(views, 'version') || DefaultVersionView } else { View = UnauthorizedViewWithGutter } } else { - // --> /collections/:collectionSlug/:id// + // --> /collections/:collectionSlug/:id// + const baseRoute = [ + adminRoute !== '/' && adminRoute, + collectionEntity, + collectionSlug, + segment3, + ] + .filter(Boolean) + .join('/') + + const currentRoute = [baseRoute, segment4, segment5, ...remainingSegments] + .filter(Boolean) + .join('/') + + const { Component: CustomViewComponent, viewKey: customViewKey } = getCustomViewByRoute({ + baseRoute, + currentRoute, + views, + }) + + if (customViewKey) { + viewKey = customViewKey + View = CustomViewComponent + } + } + + break + } + + // --> /collections/:collectionSlug/trash/:id/versions/:version + // --> /collections/:collectionSlug/:id/// + default: { + // --> /collections/:collectionSlug/trash/:id/versions/:version + const isTrashedVersionView = segment3 === 'trash' && segment5 === 'versions' + + if (isTrashedVersionView) { + if (docPermissions?.readVersions) { + View = getCustomViewByKey(views, 'version') || DefaultVersionView + } else { + View = UnauthorizedViewWithGutter + } + } else { + // --> /collections/:collectionSlug/:id/// const baseRoute = [ adminRoute !== '/' && adminRoute, collectionEntity, diff --git a/packages/next/src/views/Document/getMetaBySegment.tsx b/packages/next/src/views/Document/getMetaBySegment.tsx index 3462363e2..4725368f9 100644 --- a/packages/next/src/views/Document/getMetaBySegment.tsx +++ b/packages/next/src/views/Document/getMetaBySegment.tsx @@ -15,6 +15,7 @@ export type GenerateEditViewMetadata = ( args: { collectionConfig?: null | SanitizedCollectionConfig globalConfig?: null | SanitizedGlobalConfig + isReadOnly?: boolean view?: keyof EditConfig } & Parameters[0], ) => Promise @@ -42,6 +43,11 @@ export const getMetaBySegment: GenerateEditViewMetadata = async ({ fn = generateEditViewMetadata } + // `/collections/:collection/trash/:id` + if (segments.length === 4 && segments[2] === 'trash') { + fn = (args) => generateEditViewMetadata({ ...args, isReadOnly: true }) + } + // `/:collection/:id/:view` if (params.segments.length === 4) { switch (params.segments[3]) { @@ -69,6 +75,25 @@ export const getMetaBySegment: GenerateEditViewMetadata = async ({ break } } + + // `/collections/:collection/trash/:id/:view` + if (segments.length === 5 && segments[2] === 'trash') { + switch (segments[4]) { + case 'api': + fn = generateAPIViewMetadata + break + case 'versions': + fn = generateVersionsViewMetadata + break + default: + break + } + } + + // `/collections/:collection/trash/:id/versions/:versionID` + if (segments.length === 6 && segments[2] === 'trash' && segments[4] === 'versions') { + fn = generateVersionViewMetadata + } } if (isGlobal) { diff --git a/packages/next/src/views/Document/index.tsx b/packages/next/src/views/Document/index.tsx index 699537406..33029c27b 100644 --- a/packages/next/src/views/Document/index.tsx +++ b/packages/next/src/views/Document/index.tsx @@ -65,6 +65,7 @@ export const renderDocument = async ({ redirectAfterCreate, redirectAfterDelete, redirectAfterDuplicate, + redirectAfterRestore, searchParams, versions, viewType, @@ -74,6 +75,7 @@ export const renderDocument = async ({ readonly redirectAfterCreate?: boolean readonly redirectAfterDelete?: boolean readonly redirectAfterDuplicate?: boolean + readonly redirectAfterRestore?: boolean versions?: RenderDocumentVersionsProperties } & AdminViewServerProps): Promise<{ data: Data @@ -116,6 +118,7 @@ export const renderDocument = async ({ locale, payload, req, + segments, user, })) @@ -134,6 +137,8 @@ export const renderDocument = async ({ } } + const isTrashedDoc = typeof doc?.deletedAt === 'string' + const [ docPreferences, { docPermissions, hasPublishPermission, hasSavePermission }, @@ -202,6 +207,7 @@ export const renderDocument = async ({ globalSlug, locale: locale?.code, operation, + readOnly: isTrashedDoc, renderAllFields: true, req, schemaPath: collectionSlug || globalSlug, @@ -389,12 +395,14 @@ export const renderDocument = async ({ initialState={formState} isEditing={isEditing} isLocked={isLocked} + isTrashed={isTrashedDoc} key={locale?.code} lastUpdateTime={lastUpdateTime} mostRecentVersionIsAutosaved={mostRecentVersionIsAutosaved} redirectAfterCreate={redirectAfterCreate} redirectAfterDelete={redirectAfterDelete} redirectAfterDuplicate={redirectAfterDuplicate} + redirectAfterRestore={redirectAfterRestore} unpublishedVersionCount={unpublishedVersionCount} versionCount={versionCount} > diff --git a/packages/next/src/views/Edit/metadata.ts b/packages/next/src/views/Edit/metadata.ts index db77155f7..250b8ba14 100644 --- a/packages/next/src/views/Edit/metadata.ts +++ b/packages/next/src/views/Edit/metadata.ts @@ -16,6 +16,7 @@ export const generateEditViewMetadata: GenerateEditViewMetadata = async ({ globalConfig, i18n, isEditing, + isReadOnly = false, view = 'default', }): Promise => { const { t } = i18n @@ -26,11 +27,17 @@ export const generateEditViewMetadata: GenerateEditViewMetadata = async ({ ? getTranslation(globalConfig.label, i18n) : '' + const verb = isReadOnly + ? t('general:viewing') + : isEditing + ? t('general:editing') + : t('general:creating') + const metaToUse: MetaConfig = { ...(config.admin.meta || {}), - description: `${isEditing ? t('general:editing') : t('general:creating')} - ${entityLabel}`, + description: `${verb} - ${entityLabel}`, keywords: `${entityLabel}, Payload, CMS`, - title: `${isEditing ? t('general:editing') : t('general:creating')} - ${entityLabel}`, + title: `${verb} - ${entityLabel}`, } const ogToUse: MetaConfig['openGraph'] = { diff --git a/packages/next/src/views/List/index.tsx b/packages/next/src/views/List/index.tsx index 41dbbc208..2d7b2ee2a 100644 --- a/packages/next/src/views/List/index.tsx +++ b/packages/next/src/views/List/index.tsx @@ -67,6 +67,7 @@ export const renderListView = async ( params, query: queryFromArgs, searchParams, + viewType, } = args const { @@ -144,15 +145,47 @@ export const renderListView = async ( }) } - let queryPreset: QueryPreset | undefined - let queryPresetPermissions: SanitizedCollectionPermission | undefined - - const whereWithMergedSearch = mergeListSearchAndWhere({ + let whereCondition = mergeListSearchAndWhere({ collectionConfig, search: typeof query?.search === 'string' ? query.search : undefined, where: combineWhereConstraints([query?.where, baseListFilter]), }) + if (query?.trash === true) { + whereCondition = { + and: [ + whereCondition, + { + deletedAt: { + exists: true, + }, + }, + ], + } + } + + let queryPreset: QueryPreset | undefined + let queryPresetPermissions: SanitizedCollectionPermission | undefined + + let whereWithMergedSearch = mergeListSearchAndWhere({ + collectionConfig, + search: typeof query?.search === 'string' ? query.search : undefined, + where: combineWhereConstraints([query?.where, baseListFilter]), + }) + + if (query?.trash === true) { + whereWithMergedSearch = { + and: [ + whereWithMergedSearch, + { + deletedAt: { + exists: true, + }, + }, + ], + } + } + if (collectionPreferences?.preset) { try { queryPreset = (await payload.findByID({ @@ -207,6 +240,7 @@ export const renderListView = async ( page: query?.page ? Number(query.page) : undefined, req, sort: query?.sort, + trash: query?.trash === true, user, where: whereWithMergedSearch, }) @@ -223,6 +257,7 @@ export const renderListView = async ( payload: req.payload, query, useAsTitle: collectionConfig.admin.useAsTitle, + viewType, })) } @@ -244,6 +279,7 @@ export const renderListView = async ( }) const hasCreatePermission = permissions?.collections?.[collectionSlug]?.create + const hasDeletePermission = permissions?.collections?.[collectionSlug]?.delete // Check if there's a notFound query parameter (document ID that wasn't found) const notFoundDocId = typeof searchParams?.notFound === 'string' ? searchParams.notFound : null @@ -267,6 +303,7 @@ export const renderListView = async ( clientProps: { collectionSlug, hasCreatePermission, + hasDeletePermission, newDocumentURL, }, collectionConfig, @@ -303,6 +340,7 @@ export const renderListView = async ( disableQueryPresets, enableRowSelections, hasCreatePermission, + hasDeletePermission, listPreferences: collectionPreferences, newDocumentURL, queryPreset, @@ -310,6 +348,7 @@ export const renderListView = async ( renderedFilters, resolvedFilterOptions, Table, + viewType, } satisfies ListViewClientProps, Component: collectionConfig?.admin?.components?.views?.list?.Component, Fallback: DefaultListView, diff --git a/packages/next/src/views/Root/getRouteData.ts b/packages/next/src/views/Root/getRouteData.ts index a7e5e787c..fa3e2e5e5 100644 --- a/packages/next/src/views/Root/getRouteData.ts +++ b/packages/next/src/views/Root/getRouteData.ts @@ -17,6 +17,7 @@ import type { initPage } from '../../utilities/initPage/index.js' import { Account } from '../Account/index.js' import { BrowseByFolder } from '../BrowseByFolder/index.js' import { CollectionFolderView } from '../CollectionFolders/index.js' +import { TrashView } from '../CollectionTrash/index.js' import { CreateFirstUserView } from '../CreateFirstUser/index.js' import { Dashboard } from '../Dashboard/index.js' import { Document as DocumentView } from '../Document/index.js' @@ -107,7 +108,7 @@ export const getRouteData = ({ searchParams, } - const [segmentOne, segmentTwo, segmentThree, segmentFour, segmentFive] = segments + const [segmentOne, segmentTwo, segmentThree, segmentFour, segmentFive, segmentSix] = segments const isGlobal = segmentOne === 'globals' const isCollection = segmentOne === 'collections' @@ -272,7 +273,50 @@ export const getRouteData = ({ viewType = 'verify' } else if (isCollection && matchedCollection) { initPageOptions.routeParams.collection = matchedCollection.slug - if (config.folders && segmentThree === config.folders.slug && matchedCollection.folders) { + + if (segmentThree === 'trash' && typeof segmentFour === 'string') { + // --> /collections/:collectionSlug/trash/:id (read-only) + // --> /collections/:collectionSlug/trash/:id/api + // --> /collections/:collectionSlug/trash/:id/preview + // --> /collections/:collectionSlug/trash/:id/versions + // --> /collections/:collectionSlug/trash/:id/versions/:versionID + initPageOptions.routeParams.id = segmentFour + initPageOptions.routeParams.versionID = segmentSix + + ViewToRender = { + Component: DocumentView, + } + + templateClassName = `collection-default-edit` + templateType = 'default' + + const viewInfo = getDocumentViewInfo([segmentFive, segmentSix]) + viewType = viewInfo.viewType + documentSubViewType = viewInfo.documentSubViewType + + attachViewActions({ + collectionOrGlobal: matchedCollection, + serverProps, + viewKeyArg: documentSubViewType, + }) + } else if (segmentThree === 'trash') { + // --> /collections/:collectionSlug/trash + ViewToRender = { + Component: TrashView, + } + + templateClassName = `${segmentTwo}-trash` + templateType = 'default' + viewType = 'trash' + + serverProps.viewActions = serverProps.viewActions.concat( + matchedCollection.admin.components?.views?.list?.actions ?? [], + ) + } else if ( + config.folders && + segmentThree === config.folders.slug && + matchedCollection.folders + ) { // Collection Folder Views // --> /collections/:collectionSlug/:folderCollectionSlug // --> /collections/:collectionSlug/:folderCollectionSlug/:folderID diff --git a/packages/next/src/views/Root/metadata.ts b/packages/next/src/views/Root/metadata.ts index 27ab9c224..6ca7974a7 100644 --- a/packages/next/src/views/Root/metadata.ts +++ b/packages/next/src/views/Root/metadata.ts @@ -5,6 +5,7 @@ import { getNextRequestI18n } from '../../utilities/getNextRequestI18n.js' import { generateAccountViewMetadata } from '../Account/metadata.js' import { generateBrowseByFolderMetadata } from '../BrowseByFolder/metadata.js' import { generateCollectionFolderMetadata } from '../CollectionFolders/metadata.js' +import { generateCollectionTrashMetadata } from '../CollectionTrash/metadata.js' import { generateCreateFirstUserViewMetadata } from '../CreateFirstUser/metadata.js' import { generateDashboardViewMetadata } from '../Dashboard/metadata.js' import { generateDocumentViewMetadata } from '../Document/metadata.js' @@ -129,7 +130,16 @@ export const generatePageMetadata = async ({ // --> /:collectionSlug/verify/:token meta = await generateVerifyViewMetadata({ config, i18n }) } else if (isCollection) { - if (config.folders && segmentThree === config.folders.slug) { + if (segmentThree === 'trash' && segments.length === 3 && collectionConfig) { + // Collection Trash Views + // --> /collections/:collectionSlug/trash + meta = await generateCollectionTrashMetadata({ + collectionConfig, + config, + i18n, + params, + }) + } else if (config.folders && segmentThree === config.folders.slug) { if (folderCollectionSlugs.includes(collectionConfig.slug)) { // Collection Folder Views // --> /collections/:collectionSlug/:folderCollectionSlug @@ -147,6 +157,7 @@ export const generatePageMetadata = async ({ // --> /collections/:collectionSlug/:id/versions // --> /collections/:collectionSlug/:id/versions/:version // --> /collections/:collectionSlug/:id/api + // --> /collections/:collectionSlug/trash/:id meta = await generateDocumentViewMetadata({ collectionConfig, config, i18n, params }) } } else if (isGlobal) { diff --git a/packages/next/src/views/Version/Default/SetStepNav.tsx b/packages/next/src/views/Version/Default/SetStepNav.tsx index cece22878..2d28ca4e0 100644 --- a/packages/next/src/views/Version/Default/SetStepNav.tsx +++ b/packages/next/src/views/Version/Default/SetStepNav.tsx @@ -12,6 +12,7 @@ export const SetStepNav: React.FC<{ readonly collectionConfig?: ClientCollectionConfig readonly globalConfig?: ClientGlobalConfig readonly id?: number | string + readonly isTrashed?: boolean versionToCreatedAtFormatted?: string versionToID?: string versionToUseAsTitle?: string @@ -19,6 +20,7 @@ export const SetStepNav: React.FC<{ id, collectionConfig, globalConfig, + isTrashed, versionToCreatedAtFormatted, versionToID, versionToUseAsTitle, @@ -55,7 +57,11 @@ export const SetStepNav: React.FC<{ docLabel = versionToID } - setStepNav([ + const docBasePath: `/${string}` = isTrashed + ? `/collections/${collectionSlug}/trash/${id}` + : `/collections/${collectionSlug}/${id}` + + const nav = [ { label: getTranslation(pluralLabel, i18n), url: formatAdminURL({ @@ -63,24 +69,40 @@ export const SetStepNav: React.FC<{ path: `/collections/${collectionSlug}`, }), }, + ] + + if (isTrashed) { + nav.push({ + label: t('general:trash'), + url: formatAdminURL({ + adminRoute, + path: `/collections/${collectionSlug}/trash`, + }), + }) + } + + nav.push( { label: docLabel, url: formatAdminURL({ adminRoute, - path: `/collections/${collectionSlug}/${id}`, + path: docBasePath, }), }, { label: 'Versions', url: formatAdminURL({ adminRoute, - path: `/collections/${collectionSlug}/${id}/versions`, + path: `${docBasePath}/versions`, }), }, { label: versionToCreatedAtFormatted, + url: undefined, }, - ]) + ) + + setStepNav(nav) return } @@ -111,6 +133,7 @@ export const SetStepNav: React.FC<{ config, setStepNav, id, + isTrashed, locale, t, i18n, diff --git a/packages/next/src/views/Version/Default/index.tsx b/packages/next/src/views/Version/Default/index.tsx index e31cc717a..96e1e3196 100644 --- a/packages/next/src/views/Version/Default/index.tsx +++ b/packages/next/src/views/Version/Default/index.tsx @@ -67,7 +67,7 @@ export const DefaultVersionView: React.FC = ({ } }, [code, config.localization, selectedLocalesFromProps]) - const { id: originalDocID, collectionSlug, globalSlug } = useDocumentInfo() + const { id: originalDocID, collectionSlug, globalSlug, isTrashed } = useDocumentInfo() const { startRouteTransition } = useRouteTransition() const { collectionConfig, globalConfig } = useMemo(() => { @@ -252,7 +252,7 @@ export const DefaultVersionView: React.FC = ({
{VersionToCreatedAtLabel} - {canUpdate && ( + {canUpdate && !isTrashed && ( = ({ collectionConfig={collectionConfig} globalConfig={globalConfig} id={originalDocID} + isTrashed={isTrashed} versionToCreatedAtFormatted={versionToCreatedAtFormatted} versionToID={versionToID} versionToUseAsTitle={versionToUseAsTitle} diff --git a/packages/next/src/views/Version/SelectComparison/VersionDrawer/index.tsx b/packages/next/src/views/Version/SelectComparison/VersionDrawer/index.tsx index b5b8d34d8..c40b7abed 100644 --- a/packages/next/src/views/Version/SelectComparison/VersionDrawer/index.tsx +++ b/packages/next/src/views/Version/SelectComparison/VersionDrawer/index.tsx @@ -3,6 +3,7 @@ import { Drawer, LoadingOverlay, toast, + useDocumentInfo, useEditDepth, useModal, useServerFunctions, @@ -30,6 +31,7 @@ export const VersionDrawerContent: React.FC<{ globalSlug?: string }> = (props) => { const { collectionSlug, docID, drawerSlug, globalSlug } = props + const { isTrashed } = useDocumentInfo() const { closeModal } = useModal() const searchParams = useSearchParams() const prevSearchParams = useRef(searchParams) @@ -58,6 +60,7 @@ export const VersionDrawerContent: React.FC<{ segments: [ isGlobal ? 'globals' : 'collections', entitySlug, + ...(isTrashed ? ['trash'] : []), isGlobal ? undefined : String(docID), 'versions', ].filter(Boolean), @@ -84,7 +87,16 @@ export const VersionDrawerContent: React.FC<{ void fetchDocumentView() }, - [closeModal, collectionSlug, globalSlug, drawerSlug, renderDocument, searchParams, t], + [ + closeModal, + collectionSlug, + drawerSlug, + globalSlug, + isTrashed, + renderDocument, + searchParams, + t, + ], ) useEffect(() => { diff --git a/packages/next/src/views/Versions/buildColumns.tsx b/packages/next/src/views/Versions/buildColumns.tsx index aebbf7b6e..fd1f4f6c8 100644 --- a/packages/next/src/views/Versions/buildColumns.tsx +++ b/packages/next/src/views/Versions/buildColumns.tsx @@ -23,6 +23,7 @@ export const buildVersionColumns = ({ docs, globalConfig, i18n: { t }, + isTrashed, latestDraftVersion, }: { collectionConfig?: SanitizedCollectionConfig @@ -35,6 +36,7 @@ export const buildVersionColumns = ({ docs: PaginatedDocs>['docs'] globalConfig?: SanitizedGlobalConfig i18n: I18n + isTrashed?: boolean latestDraftVersion?: { id: number | string updatedAt: string @@ -59,6 +61,7 @@ export const buildVersionColumns = ({ collectionSlug={collectionConfig?.slug} docID={docID} globalSlug={globalConfig?.slug} + isTrashed={isTrashed} key={i} rowData={{ id: doc.id, diff --git a/packages/next/src/views/Versions/cells/CreatedAt/index.tsx b/packages/next/src/views/Versions/cells/CreatedAt/index.tsx index c75233a1a..15abcd988 100644 --- a/packages/next/src/views/Versions/cells/CreatedAt/index.tsx +++ b/packages/next/src/views/Versions/cells/CreatedAt/index.tsx @@ -8,6 +8,7 @@ export type CreatedAtCellProps = { collectionSlug?: string docID?: number | string globalSlug?: string + isTrashed?: boolean rowData?: { id: number | string updatedAt: Date | number | string @@ -18,6 +19,7 @@ export const CreatedAtCell: React.FC = ({ collectionSlug, docID, globalSlug, + isTrashed, rowData: { id, updatedAt } = {}, }) => { const { @@ -29,12 +31,14 @@ export const CreatedAtCell: React.FC = ({ const { i18n } = useTranslation() + const trashedDocPrefix = isTrashed ? 'trash/' : '' + let to: string if (collectionSlug) { to = formatAdminURL({ adminRoute, - path: `/collections/${collectionSlug}/${docID}/versions/${id}`, + path: `/collections/${collectionSlug}/${trashedDocPrefix}${docID}/versions/${id}`, }) } diff --git a/packages/next/src/views/Versions/index.tsx b/packages/next/src/views/Versions/index.tsx index 65eb60913..afbad6828 100644 --- a/packages/next/src/views/Versions/index.tsx +++ b/packages/next/src/views/Versions/index.tsx @@ -27,6 +27,7 @@ export async function VersionsView(props: DocumentViewServerProps) { user, }, }, + routeSegments: segments, searchParams: { limit, page, sort }, versions: { disableGutter = false, useVersionDrawerCreatedAtCell = false } = {}, } = props @@ -36,6 +37,8 @@ export async function VersionsView(props: DocumentViewServerProps) { const collectionSlug = collectionConfig?.slug const globalSlug = globalConfig?.slug + const isTrashed = segments[2] === 'trash' + const { localization, routes: { api: apiRoute }, @@ -124,6 +127,7 @@ export async function VersionsView(props: DocumentViewServerProps) { docs: versionsData?.docs, globalConfig, i18n, + isTrashed, latestDraftVersion, }) @@ -140,6 +144,7 @@ export async function VersionsView(props: DocumentViewServerProps) { collectionSlug={collectionSlug} globalSlug={globalSlug} id={id} + isTrashed={isTrashed} pluralLabel={pluralLabel} useAsTitle={collectionConfig?.admin?.useAsTitle || globalSlug} view={i18n.t('version:versions')} diff --git a/packages/payload/src/admin/elements/Cell.ts b/packages/payload/src/admin/elements/Cell.ts index 7b124c38c..31da1a31f 100644 --- a/packages/payload/src/admin/elements/Cell.ts +++ b/packages/payload/src/admin/elements/Cell.ts @@ -22,6 +22,7 @@ import type { UploadFieldClient, } from '../../fields/config/types.js' import type { Payload } from '../../types/index.js' +import type { ViewTypes } from '../types.js' export type RowData = Record @@ -82,6 +83,7 @@ export type DefaultCellComponentProps< rowData: RowData }) => void rowData: RowData + viewType?: ViewTypes } export type DefaultServerCellComponentProps< diff --git a/packages/payload/src/admin/forms/Form.ts b/packages/payload/src/admin/forms/Form.ts index 374d28e06..42e5cfebc 100644 --- a/packages/payload/src/admin/forms/Form.ts +++ b/packages/payload/src/admin/forms/Form.ts @@ -113,6 +113,7 @@ export type BuildFormStateArgs = { */ mockRSCs?: boolean operation?: 'create' | 'update' + readOnly?: boolean /* If true, will render field components within their state object */ diff --git a/packages/payload/src/admin/views/index.ts b/packages/payload/src/admin/views/index.ts index 42976336a..2cf1bcade 100644 --- a/packages/payload/src/admin/views/index.ts +++ b/packages/payload/src/admin/views/index.ts @@ -53,6 +53,7 @@ export type AdminViewServerPropsOnly = { readonly redirectAfterCreate?: boolean readonly redirectAfterDelete?: boolean readonly redirectAfterDuplicate?: boolean + readonly redirectAfterRestore?: boolean } & ServerProps export type AdminViewServerProps = AdminViewClientProps & AdminViewServerPropsOnly @@ -92,6 +93,7 @@ export type ViewTypes = | 'folders' | 'list' | 'reset' + | 'trash' | 'verify' | 'version' diff --git a/packages/payload/src/admin/views/list.ts b/packages/payload/src/admin/views/list.ts index 6a3b320ac..b02601abb 100644 --- a/packages/payload/src/admin/views/list.ts +++ b/packages/payload/src/admin/views/list.ts @@ -8,7 +8,7 @@ import type { CollectionPreferences } from '../../preferences/types.js' import type { QueryPreset } from '../../query-presets/types.js' import type { ResolvedFilterOptions } from '../../types/index.js' import type { Column } from '../elements/Table.js' -import type { Data } from '../types.js' +import type { Data, ViewTypes } from '../types.js' export type ListViewSlots = { AfterList?: React.ReactNode @@ -45,6 +45,7 @@ export type ListViewClientProps = { disableQueryPresets?: boolean enableRowSelections?: boolean hasCreatePermission: boolean + hasDeletePermission?: boolean /** * @deprecated */ @@ -58,11 +59,13 @@ export type ListViewClientProps = { queryPresetPermissions?: SanitizedCollectionPermission renderedFilters?: Map resolvedFilterOptions?: Map + viewType: ViewTypes } & ListViewSlots export type ListViewSlotSharedClientProps = { collectionSlug: SanitizedCollectionConfig['slug'] hasCreatePermission: boolean + hasDeletePermission?: boolean newDocumentURL: string } diff --git a/packages/payload/src/auth/operations/forgotPassword.ts b/packages/payload/src/auth/operations/forgotPassword.ts index 5a709b18c..4c81c1777 100644 --- a/packages/payload/src/auth/operations/forgotPassword.ts +++ b/packages/payload/src/auth/operations/forgotPassword.ts @@ -12,6 +12,7 @@ import type { PayloadRequest, Where } from '../../types/index.js' import { buildAfterOperation } from '../../collections/operations/utils.js' import { APIError } from '../../errors/index.js' import { Forbidden } from '../../index.js' +import { appendNonTrashedFilter } from '../../utilities/appendNonTrashedFilter.js' import { commitTransaction } from '../../utilities/commitTransaction.js' import { formatAdminURL } from '../../utilities/formatAdminURL.js' import { initTransaction } from '../../utilities/initTransaction.js' @@ -123,6 +124,13 @@ export const forgotPasswordOperation = async ( } } + // Exclude trashed users unless `trash: true` + whereConstraint = appendNonTrashedFilter({ + enableTrash: collectionConfig.trash, + trash: false, + where: whereConstraint, + }) + let user = await payload.db.findOne({ collection: collectionConfig.slug, req, diff --git a/packages/payload/src/auth/operations/init.ts b/packages/payload/src/auth/operations/init.ts index 296e0d462..d97876479 100644 --- a/packages/payload/src/auth/operations/init.ts +++ b/packages/payload/src/auth/operations/init.ts @@ -1,4 +1,6 @@ -import type { PayloadRequest } from '../../types/index.js' +import type { PayloadRequest, Where } from '../../types/index.js' + +import { appendNonTrashedFilter } from '../../utilities/appendNonTrashedFilter.js' export const initOperation = async (args: { collection: string @@ -6,9 +8,19 @@ export const initOperation = async (args: { }): Promise => { const { collection: slug, req } = args + const collectionConfig = req.payload.config.collections?.find((c) => c.slug === slug) + + // Exclude trashed documents unless `trash: true` + const where: Where = appendNonTrashedFilter({ + enableTrash: Boolean(collectionConfig?.trash), + trash: false, + where: {}, + }) + const doc = await req.payload.db.findOne({ collection: slug, req, + where, }) return !!doc diff --git a/packages/payload/src/auth/operations/local/login.ts b/packages/payload/src/auth/operations/local/login.ts index 2480084e4..89f6ee572 100644 --- a/packages/payload/src/auth/operations/local/login.ts +++ b/packages/payload/src/auth/operations/local/login.ts @@ -22,6 +22,7 @@ export type Options = { overrideAccess?: boolean req?: Partial showHiddenFields?: boolean + trash?: boolean } export async function loginLocal( diff --git a/packages/payload/src/auth/operations/login.ts b/packages/payload/src/auth/operations/login.ts index 65e185efb..4229ec81c 100644 --- a/packages/payload/src/auth/operations/login.ts +++ b/packages/payload/src/auth/operations/login.ts @@ -17,6 +17,7 @@ import { } from '../../errors/index.js' import { afterRead } from '../../fields/hooks/afterRead/index.js' import { Forbidden } from '../../index.js' +import { appendNonTrashedFilter } from '../../utilities/appendNonTrashedFilter.js' import { killTransaction } from '../../utilities/killTransaction.js' import { sanitizeInternalFields } from '../../utilities/sanitizeInternalFields.js' import { getFieldsToSign } from '../getFieldsToSign.js' @@ -198,6 +199,13 @@ export const loginOperation = async ( whereConstraint = usernameConstraint } + // Exclude trashed users + whereConstraint = appendNonTrashedFilter({ + enableTrash: collectionConfig.trash, + trash: false, + where: whereConstraint, + }) + let user = await payload.db.findOne({ collection: collectionConfig.slug, req, diff --git a/packages/payload/src/auth/operations/logout.ts b/packages/payload/src/auth/operations/logout.ts index 1977a7ffa..fddde87ac 100644 --- a/packages/payload/src/auth/operations/logout.ts +++ b/packages/payload/src/auth/operations/logout.ts @@ -4,6 +4,7 @@ import type { Collection } from '../../collections/config/types.js' import type { PayloadRequest } from '../../types/index.js' import { APIError } from '../../errors/index.js' +import { appendNonTrashedFilter } from '../../utilities/appendNonTrashedFilter.js' export type Arguments = { allSessions?: boolean @@ -39,17 +40,23 @@ export const logoutOperation = async (incomingArgs: Arguments): Promise } if (collectionConfig.auth.disableLocalStrategy !== true && collectionConfig.auth.useSessions) { + const where = appendNonTrashedFilter({ + enableTrash: Boolean(collectionConfig.trash), + trash: false, + where: { + id: { + equals: user.id, + }, + }, + }) + const userWithSessions = await req.payload.db.findOne<{ id: number | string sessions: { id: string }[] }>({ collection: collectionConfig.slug, req, - where: { - id: { - equals: user.id, - }, - }, + where, }) if (!userWithSessions) { diff --git a/packages/payload/src/auth/operations/registerFirstUser.ts b/packages/payload/src/auth/operations/registerFirstUser.ts index 2f05e17de..18ea393f1 100644 --- a/packages/payload/src/auth/operations/registerFirstUser.ts +++ b/packages/payload/src/auth/operations/registerFirstUser.ts @@ -8,6 +8,7 @@ import type { CollectionSlug } from '../../index.js' import type { PayloadRequest, SelectType } from '../../types/index.js' import { Forbidden } from '../../errors/index.js' +import { appendNonTrashedFilter } from '../../utilities/appendNonTrashedFilter.js' import { commitTransaction } from '../../utilities/commitTransaction.js' import { initTransaction } from '../../utilities/initTransaction.js' import { killTransaction } from '../../utilities/killTransaction.js' @@ -57,9 +58,16 @@ export const registerFirstUserOperation = async ( req, }) + const where = appendNonTrashedFilter({ + enableTrash: Boolean(config.trash), + trash: false, + where: {}, // no initial filter; just exclude trashed docs + }) + const doc = await payload.db.findOne({ collection: config.slug, req, + where, }) if (doc) { diff --git a/packages/payload/src/auth/operations/resetPassword.ts b/packages/payload/src/auth/operations/resetPassword.ts index d48e77de1..4cff6599f 100644 --- a/packages/payload/src/auth/operations/resetPassword.ts +++ b/packages/payload/src/auth/operations/resetPassword.ts @@ -6,6 +6,7 @@ import type { PayloadRequest } from '../../types/index.js' import { buildAfterOperation } from '../../collections/operations/utils.js' import { APIError, Forbidden } from '../../errors/index.js' +import { appendNonTrashedFilter } from '../../utilities/appendNonTrashedFilter.js' import { commitTransaction } from '../../utilities/commitTransaction.js' import { initTransaction } from '../../utilities/initTransaction.js' import { killTransaction } from '../../utilities/killTransaction.js' @@ -76,15 +77,21 @@ export const resetPasswordOperation = async ( // Reset Password // ///////////////////////////////////// - const user = await payload.db.findOne({ - collection: collectionConfig.slug, - req, + const where = appendNonTrashedFilter({ + enableTrash: Boolean(collectionConfig.trash), + trash: false, where: { resetPasswordExpiration: { greater_than: new Date().toISOString() }, resetPasswordToken: { equals: data.token }, }, }) + const user = await payload.db.findOne({ + collection: collectionConfig.slug, + req, + where, + }) + if (!user) { throw new APIError('Token is either invalid or has expired.', httpStatus.FORBIDDEN) } @@ -151,6 +158,7 @@ export const resetPasswordOperation = async ( depth, overrideAccess, req, + trash: false, }) if (shouldCommit) { diff --git a/packages/payload/src/auth/operations/unlock.ts b/packages/payload/src/auth/operations/unlock.ts index 439b95270..3ac5af320 100644 --- a/packages/payload/src/auth/operations/unlock.ts +++ b/packages/payload/src/auth/operations/unlock.ts @@ -9,6 +9,7 @@ import type { PayloadRequest, Where } from '../../types/index.js' import { APIError } from '../../errors/index.js' import { Forbidden } from '../../index.js' +import { appendNonTrashedFilter } from '../../utilities/appendNonTrashedFilter.js' import { commitTransaction } from '../../utilities/commitTransaction.js' import { initTransaction } from '../../utilities/initTransaction.js' import { killTransaction } from '../../utilities/killTransaction.js' @@ -86,6 +87,13 @@ export const unlockOperation = async ( } } + // Exclude trashed users unless `trash: true` + whereConstraint = appendNonTrashedFilter({ + enableTrash: Boolean(collectionConfig.trash), + trash: false, + where: whereConstraint, + }) + const user = await req.payload.db.findOne({ collection: collectionConfig.slug, locale: locale!, diff --git a/packages/payload/src/auth/operations/verifyEmail.ts b/packages/payload/src/auth/operations/verifyEmail.ts index 959140206..69dd60644 100644 --- a/packages/payload/src/auth/operations/verifyEmail.ts +++ b/packages/payload/src/auth/operations/verifyEmail.ts @@ -4,6 +4,7 @@ import type { Collection } from '../../collections/config/types.js' import type { PayloadRequest } from '../../types/index.js' import { APIError, Forbidden } from '../../errors/index.js' +import { appendNonTrashedFilter } from '../../utilities/appendNonTrashedFilter.js' import { commitTransaction } from '../../utilities/commitTransaction.js' import { initTransaction } from '../../utilities/initTransaction.js' import { killTransaction } from '../../utilities/killTransaction.js' @@ -27,14 +28,20 @@ export const verifyEmailOperation = async (args: Args): Promise => { try { const shouldCommit = await initTransaction(req) - const user = await req.payload.db.findOne({ - collection: collection.config.slug, - req, + const where = appendNonTrashedFilter({ + enableTrash: Boolean(collection.config.trash), + trash: false, where: { _verificationToken: { equals: token }, }, }) + const user = await req.payload.db.findOne({ + collection: collection.config.slug, + req, + where, + }) + if (!user) { throw new APIError('Verification token is invalid.', httpStatus.FORBIDDEN) } diff --git a/packages/payload/src/collections/config/sanitize.ts b/packages/payload/src/collections/config/sanitize.ts index b73e150cd..617d8cdb0 100644 --- a/packages/payload/src/collections/config/sanitize.ts +++ b/packages/payload/src/collections/config/sanitize.ts @@ -97,6 +97,7 @@ export const sanitizeCollection = async ( // add default timestamps fields only as needed let hasUpdatedAt: boolean | null = null let hasCreatedAt: boolean | null = null + let hasDeletedAt: boolean | null = null sanitized.fields.some((field) => { if (fieldAffectsData(field)) { @@ -107,9 +108,13 @@ export const sanitizeCollection = async ( if (field.name === 'createdAt') { hasCreatedAt = true } + + if (field.name === 'deletedAt') { + hasDeletedAt = true + } } - return hasCreatedAt && hasUpdatedAt + return hasCreatedAt && hasUpdatedAt && (!sanitized.trash || hasDeletedAt) }) if (!hasUpdatedAt) { @@ -138,6 +143,19 @@ export const sanitizeCollection = async ( label: ({ t }) => t('general:createdAt'), }) } + + if (sanitized.trash && !hasDeletedAt) { + sanitized.fields.push({ + name: 'deletedAt', + type: 'date', + admin: { + disableBulkEdit: true, + hidden: true, + }, + index: true, + label: ({ t }) => t('general:deletedAt'), + }) + } } sanitized.labels = sanitized.labels || formatLabels(sanitized.slug) diff --git a/packages/payload/src/collections/config/types.ts b/packages/payload/src/collections/config/types.ts index 97c4004c8..8c109da5f 100644 --- a/packages/payload/src/collections/config/types.ts +++ b/packages/payload/src/collections/config/types.ts @@ -67,7 +67,7 @@ export type AuthOperationsFromCollectionSlug = export type RequiredDataFromCollection = MarkOptional< TData, - 'createdAt' | 'id' | 'sizes' | 'updatedAt' + 'createdAt' | 'deletedAt' | 'id' | 'sizes' | 'updatedAt' > export type RequiredDataFromCollectionSlug = @@ -560,11 +560,22 @@ export type CollectionConfig = { orderable?: boolean slug: string /** - * Add `createdAt` and `updatedAt` fields + * Add `createdAt`, `deletedAt` and `updatedAt` fields * * @default true */ timestamps?: boolean + /** + * Enables trash support for this collection. + * + * When enabled, documents will include a `deletedAt` timestamp field. + * This allows documents to be marked as deleted without being permanently removed. + * The `deletedAt` field will be set to the current date and time when a document is trashed. + * + * @experimental This is a beta feature and its behavior may be refined in future releases. + * @default false + */ + trash?: boolean /** * Options used in typescript generation */ @@ -676,6 +687,7 @@ export type AuthCollection = { } export type TypeWithID = { + deletedAt?: string docId?: any id: number | string } @@ -683,6 +695,7 @@ export type TypeWithID = { export type TypeWithTimestamps = { [key: string]: unknown createdAt: string + deletedAt?: string id: number | string updatedAt: string } diff --git a/packages/payload/src/collections/endpoints/delete.ts b/packages/payload/src/collections/endpoints/delete.ts index 4367420e3..be47ce071 100644 --- a/packages/payload/src/collections/endpoints/delete.ts +++ b/packages/payload/src/collections/endpoints/delete.ts @@ -13,11 +13,12 @@ import { deleteOperation } from '../operations/delete.js' export const deleteHandler: PayloadHandler = async (req) => { const collection = getRequestCollection(req) - const { depth, overrideLock, populate, select, where } = req.query as { + const { depth, overrideLock, populate, select, trash, where } = req.query as { depth?: string overrideLock?: string populate?: Record select?: Record + trash?: string where?: Where } @@ -28,6 +29,7 @@ export const deleteHandler: PayloadHandler = async (req) => { populate: sanitizePopulateParam(populate), req, select: sanitizeSelectParam(select), + trash: trash === 'true', where: where!, }) diff --git a/packages/payload/src/collections/endpoints/deleteByID.ts b/packages/payload/src/collections/endpoints/deleteByID.ts index 1563ade65..7faa13cd0 100644 --- a/packages/payload/src/collections/endpoints/deleteByID.ts +++ b/packages/payload/src/collections/endpoints/deleteByID.ts @@ -14,6 +14,7 @@ export const deleteByIDHandler: PayloadHandler = async (req) => { const { searchParams } = req const depth = searchParams.get('depth') const overrideLock = searchParams.get('overrideLock') + const trash = searchParams.get('trash') === 'true' const doc = await deleteByIDOperation({ id, @@ -23,6 +24,7 @@ export const deleteByIDHandler: PayloadHandler = async (req) => { populate: sanitizePopulateParam(req.query.populate), req, select: sanitizeSelectParam(req.query.select), + trash, }) const headers = headersWithCors({ diff --git a/packages/payload/src/collections/endpoints/find.ts b/packages/payload/src/collections/endpoints/find.ts index 30a360891..0d532c4bd 100644 --- a/packages/payload/src/collections/endpoints/find.ts +++ b/packages/payload/src/collections/endpoints/find.ts @@ -14,7 +14,7 @@ import { findOperation } from '../operations/find.js' export const findHandler: PayloadHandler = async (req) => { const collection = getRequestCollection(req) - const { depth, draft, joins, limit, page, pagination, populate, select, sort, where } = + const { depth, draft, joins, limit, page, pagination, populate, select, sort, trash, where } = req.query as { depth?: string draft?: string @@ -25,6 +25,7 @@ export const findHandler: PayloadHandler = async (req) => { populate?: Record select?: Record sort?: string + trash?: string where?: Where } @@ -40,6 +41,7 @@ export const findHandler: PayloadHandler = async (req) => { req, select: sanitizeSelectParam(select), sort: typeof sort === 'string' ? sort.split(',') : undefined, + trash: trash === 'true', where, }) diff --git a/packages/payload/src/collections/endpoints/findByID.ts b/packages/payload/src/collections/endpoints/findByID.ts index fbdb9b6f2..70413c770 100644 --- a/packages/payload/src/collections/endpoints/findByID.ts +++ b/packages/payload/src/collections/endpoints/findByID.ts @@ -14,6 +14,7 @@ export const findByIDHandler: PayloadHandler = async (req) => { const { searchParams } = req const { id, collection } = getRequestCollectionWithID(req) const depth = searchParams.get('depth') + const trash = searchParams.get('trash') === 'true' const result = await findByIDOperation({ id, @@ -24,6 +25,7 @@ export const findByIDHandler: PayloadHandler = async (req) => { populate: sanitizePopulateParam(req.query.populate), req, select: sanitizeSelectParam(req.query.select), + trash, }) return Response.json(result, { diff --git a/packages/payload/src/collections/endpoints/findVersionByID.ts b/packages/payload/src/collections/endpoints/findVersionByID.ts index 737705d93..701c855f8 100644 --- a/packages/payload/src/collections/endpoints/findVersionByID.ts +++ b/packages/payload/src/collections/endpoints/findVersionByID.ts @@ -12,6 +12,7 @@ import { findVersionByIDOperation } from '../operations/findVersionByID.js' export const findVersionByIDHandler: PayloadHandler = async (req) => { const { searchParams } = req const depth = searchParams.get('depth') + const trash = searchParams.get('trash') === 'true' const { id, collection } = getRequestCollectionWithID(req) @@ -22,6 +23,7 @@ export const findVersionByIDHandler: PayloadHandler = async (req) => { populate: sanitizePopulateParam(req.query.populate), req, select: sanitizeSelectParam(req.query.select), + trash, }) return Response.json(result, { diff --git a/packages/payload/src/collections/endpoints/findVersions.ts b/packages/payload/src/collections/endpoints/findVersions.ts index 57507c27b..b4c2d896b 100644 --- a/packages/payload/src/collections/endpoints/findVersions.ts +++ b/packages/payload/src/collections/endpoints/findVersions.ts @@ -12,7 +12,7 @@ import { findVersionsOperation } from '../operations/findVersions.js' export const findVersionsHandler: PayloadHandler = async (req) => { const collection = getRequestCollection(req) - const { depth, limit, page, pagination, populate, select, sort, where } = req.query as { + const { depth, limit, page, pagination, populate, select, sort, trash, where } = req.query as { depth?: string limit?: string page?: string @@ -20,6 +20,7 @@ export const findVersionsHandler: PayloadHandler = async (req) => { populate?: Record select?: Record sort?: string + trash?: string where?: Where } @@ -33,6 +34,7 @@ export const findVersionsHandler: PayloadHandler = async (req) => { req, select: sanitizeSelectParam(select), sort: typeof sort === 'string' ? sort.split(',') : undefined, + trash: trash === 'true', where, }) diff --git a/packages/payload/src/collections/endpoints/preview.ts b/packages/payload/src/collections/endpoints/preview.ts index 20789ed93..758c34b03 100644 --- a/packages/payload/src/collections/endpoints/preview.ts +++ b/packages/payload/src/collections/endpoints/preview.ts @@ -19,6 +19,7 @@ export const previewHandler: PayloadHandler = async (req) => { depth: isNumber(depth) ? Number(depth) : undefined, draft: searchParams.get('draft') === 'true', req, + trash: true, }) let previewURL!: string diff --git a/packages/payload/src/collections/endpoints/update.ts b/packages/payload/src/collections/endpoints/update.ts index 543c38365..9db2d5488 100644 --- a/packages/payload/src/collections/endpoints/update.ts +++ b/packages/payload/src/collections/endpoints/update.ts @@ -13,7 +13,7 @@ import { updateOperation } from '../operations/update.js' export const updateHandler: PayloadHandler = async (req) => { const collection = getRequestCollection(req) - const { depth, draft, limit, overrideLock, populate, select, sort, where } = req.query as { + const { depth, draft, limit, overrideLock, populate, select, sort, trash, where } = req.query as { depth?: string draft?: string limit?: string @@ -21,6 +21,7 @@ export const updateHandler: PayloadHandler = async (req) => { populate?: Record select?: Record sort?: string + trash?: string where?: Where } @@ -35,6 +36,7 @@ export const updateHandler: PayloadHandler = async (req) => { req, select: sanitizeSelectParam(select), sort: typeof sort === 'string' ? sort.split(',') : undefined, + trash: trash === 'true', where: where!, }) diff --git a/packages/payload/src/collections/endpoints/updateByID.ts b/packages/payload/src/collections/endpoints/updateByID.ts index df2f7a4f6..78d2f74ad 100644 --- a/packages/payload/src/collections/endpoints/updateByID.ts +++ b/packages/payload/src/collections/endpoints/updateByID.ts @@ -16,6 +16,7 @@ export const updateByIDHandler: PayloadHandler = async (req) => { const autosave = searchParams.get('autosave') === 'true' const draft = searchParams.get('draft') === 'true' const overrideLock = searchParams.get('overrideLock') + const trash = searchParams.get('trash') === 'true' const publishSpecificLocale = req.query.publishSpecificLocale as string | undefined const doc = await updateByIDOperation({ @@ -30,6 +31,7 @@ export const updateByIDHandler: PayloadHandler = async (req) => { publishSpecificLocale, req, select: sanitizeSelectParam(req.query.select), + trash, }) let message = req.t('general:updatedSuccessfully') diff --git a/packages/payload/src/collections/operations/delete.ts b/packages/payload/src/collections/operations/delete.ts index 660a70d3c..3ad006b19 100644 --- a/packages/payload/src/collections/operations/delete.ts +++ b/packages/payload/src/collections/operations/delete.ts @@ -18,6 +18,7 @@ import { APIError } from '../../errors/index.js' import { afterRead } from '../../fields/hooks/afterRead/index.js' import { deleteUserPreferences } from '../../preferences/deleteUserPreferences.js' import { deleteAssociatedFiles } from '../../uploads/deleteAssociatedFiles.js' +import { appendNonTrashedFilter } from '../../utilities/appendNonTrashedFilter.js' import { checkDocumentLockStatus } from '../../utilities/checkDocumentLockStatus.js' import { commitTransaction } from '../../utilities/commitTransaction.js' import { initTransaction } from '../../utilities/initTransaction.js' @@ -37,6 +38,7 @@ export type Arguments = { req: PayloadRequest select?: SelectType showHiddenFields?: boolean + trash?: boolean where: Where } @@ -82,6 +84,7 @@ export const deleteOperation = async < req, select: incomingSelect, showHiddenFields, + trash = false, where, } = args @@ -106,7 +109,14 @@ export const deleteOperation = async < where, }) - const fullWhere = combineQueries(where, accessResult!) + let fullWhere = combineQueries(where, accessResult!) + + // Exclude trashed documents when trash: false + fullWhere = appendNonTrashedFilter({ + enableTrash: collectionConfig.trash, + trash, + where: fullWhere, + }) sanitizeWhereQuery({ fields: collectionConfig.flattenedFields, payload, where: fullWhere }) diff --git a/packages/payload/src/collections/operations/deleteByID.ts b/packages/payload/src/collections/operations/deleteByID.ts index 5ba547024..11210c182 100644 --- a/packages/payload/src/collections/operations/deleteByID.ts +++ b/packages/payload/src/collections/operations/deleteByID.ts @@ -14,6 +14,7 @@ import { Forbidden, NotFound } from '../../errors/index.js' import { afterRead } from '../../fields/hooks/afterRead/index.js' import { deleteUserPreferences } from '../../preferences/deleteUserPreferences.js' import { deleteAssociatedFiles } from '../../uploads/deleteAssociatedFiles.js' +import { appendNonTrashedFilter } from '../../utilities/appendNonTrashedFilter.js' import { checkDocumentLockStatus } from '../../utilities/checkDocumentLockStatus.js' import { commitTransaction } from '../../utilities/commitTransaction.js' import { initTransaction } from '../../utilities/initTransaction.js' @@ -34,6 +35,7 @@ export type Arguments = { req: PayloadRequest select?: SelectType showHiddenFields?: boolean + trash?: boolean } export const deleteByIDOperation = async ( @@ -77,6 +79,7 @@ export const deleteByIDOperation = async ( @@ -41,6 +43,7 @@ export const findVersionByIDOperation = async ( req, select: incomingSelect, showHiddenFields, + trash = false, } = args if (!id) { @@ -63,7 +66,16 @@ export const findVersionByIDOperation = async ( const hasWhereAccess = typeof accessResults === 'object' - const fullWhere = combineQueries({ id: { equals: id } }, accessResults) + const where = { id: { equals: id } } + + let fullWhere = combineQueries(where, accessResults) + + fullWhere = appendNonTrashedFilter({ + deletedAtPath: 'version.deletedAt', + enableTrash: collectionConfig.trash, + trash, + where: fullWhere, + }) // ///////////////////////////////////// // Find by ID diff --git a/packages/payload/src/collections/operations/findVersions.ts b/packages/payload/src/collections/operations/findVersions.ts index 7bd20a285..b44960509 100644 --- a/packages/payload/src/collections/operations/findVersions.ts +++ b/packages/payload/src/collections/operations/findVersions.ts @@ -9,6 +9,7 @@ import { combineQueries } from '../../database/combineQueries.js' import { validateQueryPaths } from '../../database/queryValidation/validateQueryPaths.js' import { sanitizeWhereQuery } from '../../database/sanitizeWhereQuery.js' import { afterRead } from '../../fields/hooks/afterRead/index.js' +import { appendNonTrashedFilter } from '../../utilities/appendNonTrashedFilter.js' import { killTransaction } from '../../utilities/killTransaction.js' import { sanitizeInternalFields } from '../../utilities/sanitizeInternalFields.js' import { sanitizeSelect } from '../../utilities/sanitizeSelect.js' @@ -27,6 +28,7 @@ export type Arguments = { select?: SelectType showHiddenFields?: boolean sort?: Sort + trash?: boolean where?: Where } @@ -44,6 +46,7 @@ export const findVersionsOperation = async select: incomingSelect, showHiddenFields, sort, + trash = false, where, } = args @@ -71,7 +74,16 @@ export const findVersionsOperation = async where: where!, }) - const fullWhere = combineQueries(where!, accessResults) + let fullWhere = combineQueries(where!, accessResults) + + // Exclude trashed documents when trash: false + fullWhere = appendNonTrashedFilter({ + deletedAtPath: 'version.deletedAt', + enableTrash: collectionConfig.trash, + trash, + where: fullWhere, + }) + sanitizeWhereQuery({ fields: versionFields, payload, where: fullWhere }) const select = sanitizeSelect({ diff --git a/packages/payload/src/collections/operations/local/delete.ts b/packages/payload/src/collections/operations/local/delete.ts index abcb1c4e7..8731377e9 100644 --- a/packages/payload/src/collections/operations/local/delete.ts +++ b/packages/payload/src/collections/operations/local/delete.ts @@ -73,6 +73,14 @@ export type BaseOptions = * @example ['group', '-createdAt'] // sort by 2 fields, ASC group and DESC createdAt */ sort?: Sort + /** + * When set to `true`, the query will include both normal and trashed documents. + * To query only trashed documents, pass `trash: true` and combine with a `where` clause filtering by `deletedAt`. + * By default (`false`), the query will only include normal documents and exclude those with a `deletedAt` field. + * + * This argument has no effect unless `trash` is enabled on the collection. + * @default false + */ + trash?: boolean /** * If you set `overrideAccess` to `false`, you can pass a user to use against the access control checks. */ @@ -147,6 +156,7 @@ export async function findLocal< select, showHiddenFields, sort, + trash = false, where, } = options @@ -175,6 +185,7 @@ export async function findLocal< select, showHiddenFields, sort, + trash, where, }) } diff --git a/packages/payload/src/collections/operations/local/findByID.ts b/packages/payload/src/collections/operations/local/findByID.ts index 11bc5ba8c..879243371 100644 --- a/packages/payload/src/collections/operations/local/findByID.ts +++ b/packages/payload/src/collections/operations/local/findByID.ts @@ -99,6 +99,15 @@ export type Options< * @default false */ showHiddenFields?: boolean + /** + * When set to `true`, the operation will return a document by ID, even if it is trashed (soft-deleted). + * By default (`false`), the operation will exclude trashed documents. + * To fetch a trashed document, set `trash: true`. + * + * This argument has no effect unless `trash` is enabled on the collection. + * @default false + */ + trash?: boolean /** * If you set `overrideAccess` to `false`, you can pass a user to use against the access control checks. */ @@ -126,6 +135,7 @@ export async function findByIDLocal< populate, select, showHiddenFields, + trash = false, } = options const collection = payload.collections[collectionSlug] @@ -150,5 +160,6 @@ export async function findByIDLocal< req: await createLocalReq(options as CreateLocalReqOptions, payload), select, showHiddenFields, + trash, }) } diff --git a/packages/payload/src/collections/operations/local/findVersionByID.ts b/packages/payload/src/collections/operations/local/findVersionByID.ts index 11a10e335..358cc8db5 100644 --- a/packages/payload/src/collections/operations/local/findVersionByID.ts +++ b/packages/payload/src/collections/operations/local/findVersionByID.ts @@ -1,3 +1,4 @@ +/* eslint-disable no-restricted-exports */ import type { CollectionSlug, Payload, RequestContext, TypedLocale } from '../../../index.js' import type { Document, PayloadRequest, PopulateType, SelectType } from '../../../types/index.js' import type { CreateLocalReqOptions } from '../../../utilities/createLocalReq.js' @@ -69,6 +70,15 @@ export type Options = { * @default false */ showHiddenFields?: boolean + /** + * When set to `true`, the operation will return a document by ID, even if it is trashed (soft-deleted). + * By default (`false`), the operation will exclude trashed documents. + * To fetch a trashed document, set `trash: true`. + * + * This argument has no effect unless `trash` is enabled on the collection. + * @default false + */ + trash?: boolean /** * If you set `overrideAccess` to `false`, you can pass a user to use against the access control checks. */ @@ -88,6 +98,7 @@ export async function findVersionByIDLocal( populate, select, showHiddenFields, + trash = false, } = options const collection = payload.collections[collectionSlug] @@ -110,5 +121,6 @@ export async function findVersionByIDLocal( req: await createLocalReq(options as CreateLocalReqOptions, payload), select, showHiddenFields, + trash, }) } diff --git a/packages/payload/src/collections/operations/local/findVersions.ts b/packages/payload/src/collections/operations/local/findVersions.ts index fb0fbd51e..beea8c025 100644 --- a/packages/payload/src/collections/operations/local/findVersions.ts +++ b/packages/payload/src/collections/operations/local/findVersions.ts @@ -1,3 +1,4 @@ +/* eslint-disable no-restricted-exports */ import type { PaginatedDocs } from '../../../database/types.js' import type { CollectionSlug, Payload, RequestContext, TypedLocale } from '../../../index.js' import type { @@ -85,6 +86,15 @@ export type Options = { * @example ['version.group', '-version.createdAt'] // sort by 2 fields, ASC group and DESC createdAt */ sort?: Sort + /** + * When set to `true`, the query will include both normal and trashed (soft-deleted) documents. + * To query only trashed documents, pass `trash: true` and combine with a `where` clause filtering by `deletedAt`. + * By default (`false`), the query will only include normal documents and exclude those with a `deletedAt` field. + * + * This argument has no effect unless `trash` is enabled on the collection. + * @default false + */ + trash?: boolean /** * If you set `overrideAccess` to `false`, you can pass a user to use against the access control checks. */ @@ -109,6 +119,7 @@ export async function findVersionsLocal( select, showHiddenFields, sort, + trash = false, where, } = options @@ -131,6 +142,7 @@ export async function findVersionsLocal( select, showHiddenFields, sort, + trash, where, }) } diff --git a/packages/payload/src/collections/operations/local/update.ts b/packages/payload/src/collections/operations/local/update.ts index 1e739e4b2..a29e268de 100644 --- a/packages/payload/src/collections/operations/local/update.ts +++ b/packages/payload/src/collections/operations/local/update.ts @@ -113,6 +113,13 @@ export type BaseOptions( throw new Forbidden(req.t) } + if (collectionConfig.trash && doc?.deletedAt) { + throw new APIError( + `Cannot restore a version of a trashed document (ID: ${parentDocID}). Restore the document first.`, + httpStatus.FORBIDDEN, + ) + } + // ///////////////////////////////////// // fetch previousDoc // ///////////////////////////////////// diff --git a/packages/payload/src/collections/operations/update.ts b/packages/payload/src/collections/operations/update.ts index 57551af15..be735b4f1 100644 --- a/packages/payload/src/collections/operations/update.ts +++ b/packages/payload/src/collections/operations/update.ts @@ -20,6 +20,7 @@ import { APIError } from '../../errors/index.js' import { type CollectionSlug, deepCopyObjectSimple } from '../../index.js' import { generateFileData } from '../../uploads/generateFileData.js' import { unlinkTempFiles } from '../../uploads/unlinkTempFiles.js' +import { appendNonTrashedFilter } from '../../utilities/appendNonTrashedFilter.js' import { commitTransaction } from '../../utilities/commitTransaction.js' import { initTransaction } from '../../utilities/initTransaction.js' import { killTransaction } from '../../utilities/killTransaction.js' @@ -53,6 +54,7 @@ export type Arguments = { * @example ['group', '-createdAt'] // sort by 2 fields, ASC group and DESC createdAt */ sort?: Sort + trash?: boolean where: Where } @@ -109,6 +111,7 @@ export const updateOperation = async < select: incomingSelect, showHiddenFields, sort: incomingSort, + trash = false, where, } = args @@ -139,7 +142,27 @@ export const updateOperation = async < // Retrieve documents // ///////////////////////////////////// - const fullWhere = combineQueries(where, accessResult!) + let fullWhere = combineQueries(where, accessResult!) + + const isTrashAttempt = + collectionConfig.trash && + typeof bulkUpdateData === 'object' && + bulkUpdateData !== null && + 'deletedAt' in bulkUpdateData && + bulkUpdateData.deletedAt != null + + // Enforce delete access if performing a soft-delete (trash) + if (isTrashAttempt && !overrideAccess) { + const deleteAccessResult = await executeAccess({ req }, collectionConfig.access.delete) + fullWhere = combineQueries(fullWhere, deleteAccessResult) + } + + // Exclude trashed documents when trash: false + fullWhere = appendNonTrashedFilter({ + enableTrash: collectionConfig.trash, + trash, + where: fullWhere, + }) sanitizeWhereQuery({ fields: collectionConfig.flattenedFields, payload, where: fullWhere }) diff --git a/packages/payload/src/collections/operations/updateByID.ts b/packages/payload/src/collections/operations/updateByID.ts index 8dac3bb42..5b5dfb047 100644 --- a/packages/payload/src/collections/operations/updateByID.ts +++ b/packages/payload/src/collections/operations/updateByID.ts @@ -22,6 +22,7 @@ import { APIError, Forbidden, NotFound } from '../../errors/index.js' import { type CollectionSlug, deepCopyObjectSimple } from '../../index.js' import { generateFileData } from '../../uploads/generateFileData.js' import { unlinkTempFiles } from '../../uploads/unlinkTempFiles.js' +import { appendNonTrashedFilter } from '../../utilities/appendNonTrashedFilter.js' import { commitTransaction } from '../../utilities/commitTransaction.js' import { initTransaction } from '../../utilities/initTransaction.js' import { killTransaction } from '../../utilities/killTransaction.js' @@ -47,6 +48,7 @@ export type Arguments = { req: PayloadRequest select?: SelectType showHiddenFields?: boolean + trash?: boolean } export const updateByIDOperation = async < @@ -102,6 +104,7 @@ export const updateByIDOperation = async < req, select: incomingSelect, showHiddenFields, + trash = false, } = args if (!id) { @@ -123,11 +126,34 @@ export const updateByIDOperation = async < // Retrieve document // ///////////////////////////////////// + const where = { id: { equals: id } } + + let fullWhere = combineQueries(where, accessResults) + + const isTrashAttempt = + collectionConfig.trash && + typeof data === 'object' && + data !== null && + 'deletedAt' in data && + data.deletedAt != null + + if (isTrashAttempt && !overrideAccess) { + const deleteAccessResult = await executeAccess({ req }, collectionConfig.access.delete) + fullWhere = combineQueries(fullWhere, deleteAccessResult) + } + + // Exclude trashed documents when trash: false + fullWhere = appendNonTrashedFilter({ + enableTrash: collectionConfig.trash, + trash, + where: fullWhere, + }) + const findOneArgs: FindOneArgs = { collection: collectionConfig.slug, locale: locale!, req, - where: combineQueries({ id: { equals: id } }, accessResults), + where: fullWhere, } const docWithLocales = await getLatestCollectionVersion({ diff --git a/packages/payload/src/utilities/appendNonTrashedFilter.ts b/packages/payload/src/utilities/appendNonTrashedFilter.ts new file mode 100644 index 000000000..dc88ecc50 --- /dev/null +++ b/packages/payload/src/utilities/appendNonTrashedFilter.ts @@ -0,0 +1,32 @@ +import type { Where } from '../types/index.js' + +export const appendNonTrashedFilter = ({ + deletedAtPath = 'deletedAt', + enableTrash, + trash, + where, +}: { + deletedAtPath?: string + enableTrash: boolean + trash?: boolean + where: Where +}): Where => { + if (!enableTrash || trash) { + return where + } + + const notTrashedFilter = { + [deletedAtPath]: { exists: false }, + } + + if (where?.and) { + return { + ...where, + and: [...where.and, notTrashedFilter], + } + } + + return { + and: [notTrashedFilter, ...(where ? [where] : [])], + } +} diff --git a/packages/payload/src/utilities/getEntityPolicies.ts b/packages/payload/src/utilities/getEntityPolicies.ts index 1db7a16f8..9009d31e2 100644 --- a/packages/payload/src/utilities/getEntityPolicies.ts +++ b/packages/payload/src/utilities/getEntityPolicies.ts @@ -103,6 +103,7 @@ export async function getEntityPolicies(args: T): Promise{{title}} نهائيا. هل أنت متأكد؟', + aboutToPermanentlyDeleteTrash: + 'أنت على وشك حذف <0>{{count}} <1>{{label}} نهائياً من سلة المهملات. هل أنت متأكد؟', + aboutToRestore: 'أنت على وشك استعادة {{label}} <1>{{title}}. هل أنت متأكد؟', + aboutToRestoreAsDraft: 'أنت على وشك استعادة {{label}} <1>{{title}} كمسودة. هل أنت متأكد؟', + aboutToRestoreAsDraftCount: 'أنت على وشك استعادة {{count}} {{label}} كمسودة', + aboutToRestoreCount: 'أنت على وشك استعادة {{count}} {{label}}', + aboutToTrash: 'أنت على وشك نقل {{label}} <1>{{title}} إلى القمامة. هل أنت متأكد؟', + aboutToTrashCount: 'أنت على وشك نقل {{count}} {{label}} إلى المهملات', addBelow: 'أضف في الاسفل', addFilter: 'أضف فلتر', adminTheme: 'شكل واجهة المستخدم', @@ -242,6 +252,7 @@ export const arTranslations: DefaultTranslationsObject = { 'سيؤدي هذا إلى إزالة الفهارس الحالية وإعادة فهرسة المستندات في مجموعات {{collections}}.', confirmReindexDescriptionAll: 'سيؤدي هذا إلى إزالة الفهارس الحالية وإعادة فهرسة المستندات في جميع المجموعات.', + confirmRestoration: 'تأكيد الاستعادة', copied: 'تمّ النّسخ', copy: 'نسخ', copyField: 'نسخ الحقل', @@ -261,13 +272,17 @@ export const arTranslations: DefaultTranslationsObject = { dark: 'غامق', dashboard: 'لوحة التّحكّم', delete: 'حذف', + deleted: 'تم الحذف', + deletedAt: 'تم الحذف في', deletedCountSuccessfully: 'تمّ حذف {{count}} {{label}} بنجاح.', deletedSuccessfully: 'تمّ الحذف بنجاح.', + deletePermanently: 'تجاوز السلة واحذف بشكل دائم', deleting: 'يتمّ الحذف...', depth: 'عمق', descending: 'تنازلي', deselectAllRows: 'إلغاء تحديد جميع الصفوف', document: 'وثيقة', + documentIsTrashed: 'تم تحويل {{label}} هذا إلى المهملات وهو للقراءة فقط.', documentLocked: 'تم قفل المستند', documents: 'وثائق', duplicate: 'استنساخ', @@ -283,6 +298,8 @@ export const arTranslations: DefaultTranslationsObject = { editLabel: 'تعديل {{label}}', email: 'البريد الإلكتروني', emailAddress: 'عنوان البريد الإلكتروني', + emptyTrash: 'أفرغ القمامة', + emptyTrashLabel: 'أفرغ سلة المحذوفات {{label}}', enterAValue: 'أدخل قيمة', error: 'خطأ', errors: 'أخطاء', @@ -330,6 +347,7 @@ export const arTranslations: DefaultTranslationsObject = { 'لا يوجد {{label}}. إما أن لا {{label}} موجودة حتى الآن أو لا تتطابق مع عوامل التصفية التي حددتها أعلاه.', notFound: 'غير موجود', nothingFound: 'لم يتم العثور على شيء', + noTrashResults: 'لا {{label}} في المهملات.', noUpcomingEventsScheduled: 'لا يوجد أحداث مقبلة مجدولة.', noValue: 'لا يوجد قيمة', of: 'من', @@ -343,6 +361,8 @@ export const arTranslations: DefaultTranslationsObject = { pasteField: 'لصق الحقل', pasteRow: 'لصق الصف', payloadSettings: 'الإعدادات', + permanentlyDelete: 'حذف بشكل دائم', + permanentlyDeletedCountSuccessfully: 'تم حذف {{count}} {{label}} بشكل دائم بنجاح.', perPage: 'لكلّ صفحة: {{limit}}', previous: 'سابق', reindex: 'إعادة الفهرسة', @@ -354,6 +374,11 @@ export const arTranslations: DefaultTranslationsObject = { resetPreferencesDescription: 'سيؤدي ذلك إلى إعادة تعيين جميع تفضيلاتك إلى الإعدادات الافتراضية.', resettingPreferences: 'إعادة تعيين التفضيلات.', + restore: 'استعادة', + restoreAsPublished: 'استعادة كإصدار منشور', + restoredCountSuccessfully: 'تمت استعادة {{count}} {{label}} بنجاح.', + restoring: + 'احترم معنى النص الأصلي في سياق Payload. هنا قائمة بالمصطلحات الشائعة في Payload التي تحمل معانٍ محددة جدًا:\n - Collection: المجموعة هي مجموعة من الوثائق التي تتشارك في الهيكل والغرض المشترك. تُستخدم المجموعات لتنظيم وإدارة المحتوى في Payload.', row: 'سطر', rows: 'أسطُر', save: 'حفظ', @@ -384,6 +409,10 @@ export const arTranslations: DefaultTranslationsObject = { time: 'الوقت', timezone: 'المنطقة الزمنية', titleDeleted: 'تم حذف {{label}} "{{title}}" بنجاح.', + titleRestored: 'تمت استعادة "{{title}}" "{{label}}" بنجاح.', + titleTrashed: '"{{label}}" "{{title}}" تم نقلها إلى سلة المهملات.', + trash: 'سلة المهملات', + trashedCountSuccessfully: '{{count}} {{label}} تم نقلها إلى سلة المهملات.', true: 'صحيح', unauthorized: 'غير مصرح به', unsavedChanges: 'لديك تغييرات غير محفوظة. قم بالحفظ أو التجاهل قبل المتابعة.', @@ -402,6 +431,7 @@ export const arTranslations: DefaultTranslationsObject = { username: 'اسم المستخدم', users: 'المستخدمين', value: 'القيمة', + viewing: 'عرض', viewReadOnly: 'عرض للقراءة فقط', welcome: 'مرحبًا', yes: 'نعم', @@ -522,6 +552,7 @@ export const arTranslations: DefaultTranslationsObject = { noRowsFound: 'لم يتمّ العثور على {{label}}', noRowsSelected: 'لم يتم اختيار {{label}}', preview: 'معاينة', + previouslyDraft: 'سابقا مسودة', previouslyPublished: 'نشر سابقا', previousVersion: 'النسخة السابقة', problemRestoringVersion: 'حدث خطأ في استعادة هذه النّسخة', diff --git a/packages/translations/src/languages/az.ts b/packages/translations/src/languages/az.ts index 1efebc54d..08b1f0735 100644 --- a/packages/translations/src/languages/az.ts +++ b/packages/translations/src/languages/az.ts @@ -114,6 +114,8 @@ export const azTranslations: DefaultTranslationsObject = { noUser: 'İstifadəçi Yoxdur', previewing: 'Bu sənədin ön baxışı zamanı problem yarandı.', problemUploadingFile: 'Faylın yüklənməsi zamanı problem yarandı.', + restoringTitle: + '{{title}} bərpa olunarkən xəta baş verdi. Zəhmət olmasa, internet bağlantınızı yoxlayın və yenidən cəhd edin.', tokenInvalidOrExpired: 'Token ya yanlışdır və ya müddəti bitib.', tokenNotProvided: 'Token təqdim edilməyib.', unableToCopy: 'Kopyalama mümkün deyil.', @@ -213,6 +215,19 @@ export const azTranslations: DefaultTranslationsObject = { 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.', + aboutToPermanentlyDelete: + 'Siz əbədi olaraq {{label}} <1>{{title}} silmək üzrəsiniz. Eminsiniz?', + aboutToPermanentlyDeleteTrash: + 'Siz müllifdən daimi olaraq <0>{{count}} <1>{{label}} silinəcəkdir. Eminsiniz?', + aboutToRestore: '{{label}} <1>{{title}} bərpa edilmək üzrədir. Eminsiniz?', + aboutToRestoreAsDraft: + 'Siz {{label}} <1>{{title}} draft kimi bərpa etmək əzəldəsiniz. Eminsinizmi?', + aboutToRestoreAsDraftCount: + 'Siz {{count}} {{label}}-ni qaralamak üçün bərpa etməyə hazırlaşırsınız', + aboutToRestoreCount: 'Siz {{count}} {{label}} bərpa etməyə hazırlaşırsınız.', + aboutToTrash: + 'Siz {{label}} <1>{{title}} elementini zibilliyə köçürmək barədəsiniz. Eminsiniz?', + aboutToTrashCount: 'Siz {{count}} {{label}}-i zibilə köçürmək barədəsiz.', addBelow: 'Aşağıya əlavə et', addFilter: 'Filter əlavə et', adminTheme: 'Admin Mövzusu', @@ -248,6 +263,7 @@ export const azTranslations: DefaultTranslationsObject = { 'Bu, mövcud indeksləri siləcək və {{collections}} kolleksiyalarında sənədləri yenidən indeksləyəcək.', confirmReindexDescriptionAll: 'Bu, mövcud indeksləri siləcək və bütün kolleksiyalardakı sənədləri yenidən indeksləyəcək.', + confirmRestoration: 'Bərpa etməni təsdiqləyin', copied: 'Kopyalandı', copy: 'Kopyala', copyField: 'Sahəni kopyala', @@ -268,13 +284,17 @@ export const azTranslations: DefaultTranslationsObject = { dark: 'Tünd', dashboard: 'Panel', delete: 'Sil', + deleted: 'Silinmiş', + deletedAt: 'Silinib Tarixi', deletedCountSuccessfully: '{{count}} {{label}} uğurla silindi.', deletedSuccessfully: 'Uğurla silindi.', + deletePermanently: 'Çöplüyü atlayın və daimi olaraq silin', deleting: 'Silinir...', depth: 'Dərinlik', descending: 'Azalan', deselectAllRows: 'Bütün sıraları seçimi ləğv edin', document: 'Sənəd', + documentIsTrashed: 'Bu {{label}} zibil qutusuna atılıb və yalnız oxuna bilər.', documentLocked: 'Sənəd kilidləndi', documents: 'Sənədlər', duplicate: 'Dublikat', @@ -290,6 +310,8 @@ export const azTranslations: DefaultTranslationsObject = { editLabel: '{{label}} redaktə et', email: 'Elektron poçt', emailAddress: 'Elektron poçt ünvanı', + emptyTrash: 'Zibil qutusunu boşaltın', + emptyTrashLabel: '{{label}} zibilini boşaltın', enterAValue: 'Bir dəyər daxil edin', error: 'Xəta', errors: 'Xətalar', @@ -338,6 +360,7 @@ export const azTranslations: DefaultTranslationsObject = { 'Heç bir {{label}} tapılmadı. Ya hələ {{label}} yoxdur, ya da yuxarıda göstərdiyiniz filtrlərə uyğun gəlmir.', notFound: 'Tapılmadı', nothingFound: 'Heç nə tapılmadı', + noTrashResults: 'Çöplükdə heç bir {{label}} yoxdur.', noUpcomingEventsScheduled: 'Heç bir gələcək tədbir cədvələ alınmayıb.', noValue: 'Dəyər yoxdur', of: 'dən', @@ -351,6 +374,8 @@ export const azTranslations: DefaultTranslationsObject = { pasteField: 'Sahəni yapışdır', pasteRow: 'Sətiri yapışdır', payloadSettings: 'Payload Parametrləri', + permanentlyDelete: 'Daimi Olaraq Sil', + permanentlyDeletedCountSuccessfully: '{{count}} {{label}} uğurla daimi olaraq silindi.', perPage: 'Hər səhifədə: {{limit}}', previous: 'Əvvəlki', reindex: 'Yenidən indekslə', @@ -361,6 +386,11 @@ export const azTranslations: DefaultTranslationsObject = { resetPreferences: 'Təhlükəsizlik parametrlərini sıfırlamaq', resetPreferencesDescription: 'Bu, bütün parametrlərinizi standart vəziyyətlərinə sıfırlayacaq.', resettingPreferences: 'Təhlükəsizlik parametrləri sıfırlanır.', + restore: 'Bərpa et', + restoreAsPublished: 'Nəşr edilmiş versiya kimi bərpa et', + restoredCountSuccessfully: '{{count}} {{label}} uğurla bərpa edildi.', + restoring: + 'Orijinal mətnin mənasını Payload kontekstində qoruyun. Ən əhəmiyyətli Payload ifadələrinin siyahısı aşağıdakı kimi dir:\n\n - Collection: "Collection" bir sıra sənədlərin əməkdaş olduğu, ortaq struktur və məqsədi olan bir qrupdur. "Collections", Payload-də məzmunu təşkil etmək və idarə etmək üçün istifadə edilir.\n - Field: "Field", kolle', row: 'Sətir', rows: 'Sətirlər', save: 'Saxla', @@ -391,6 +421,10 @@ export const azTranslations: DefaultTranslationsObject = { time: 'Vaxt', timezone: 'Saat qurşağı', titleDeleted: '{{label}} "{{title}}" uğurla silindi.', + titleRestored: '"{{title}}" "{{label}}" uğurla bərpa edildi.', + titleTrashed: '{{label}} "{{title}}" zibilə köçürüldü.', + trash: 'Zibil', + trashedCountSuccessfully: '{{count}} {{label}} zibilə köçürüldü.', true: 'Doğru', unauthorized: 'İcazəsiz', unsavedChanges: @@ -411,6 +445,7 @@ export const azTranslations: DefaultTranslationsObject = { username: 'İstifadəçi adı', users: 'İstifadəçilər', value: 'Dəyər', + viewing: 'Baxış', viewReadOnly: 'Yalnız oxu rejimində bax', welcome: 'Xoş gəldiniz', yes: 'Bəli', @@ -535,6 +570,7 @@ export const azTranslations: DefaultTranslationsObject = { noRowsFound: 'Heç bir {{label}} tapılmadı', noRowsSelected: 'Heç bir {{label}} seçilməyib', preview: 'Öncədən baxış', + previouslyDraft: 'Daha öncə bir Qaralama', previouslyPublished: 'Daha əvvəl nəşr olunmuş', previousVersion: 'Əvvəlki Versiya', problemRestoringVersion: 'Bu versiyanın bərpasında problem yaşandı', diff --git a/packages/translations/src/languages/bg.ts b/packages/translations/src/languages/bg.ts index 8f99debc9..a92388bb4 100644 --- a/packages/translations/src/languages/bg.ts +++ b/packages/translations/src/languages/bg.ts @@ -114,6 +114,8 @@ export const bgTranslations: DefaultTranslationsObject = { noUser: 'Липсващ потребител', previewing: 'Имаше проблем при предварителното разглеждане на документа.', problemUploadingFile: 'Имаше проблем при качването на файла.', + restoringTitle: + 'Възникна грешка при възстановяването на {{title}}. Моля, проверете връзката си и опитайте отново.', tokenInvalidOrExpired: 'Ключът е невалиден или изтекъл.', tokenNotProvided: 'Токенът не е предоставен.', unableToCopy: 'Неуспешно копиране.', @@ -214,6 +216,17 @@ export const bgTranslations: DefaultTranslationsObject = { aboutToDeleteCount_many: 'На път си да изтриеш {{count}} {{label}}', aboutToDeleteCount_one: 'На път си да изтриеш {{count}} {{label}}', aboutToDeleteCount_other: 'На път си да изтриеш {{count}} {{label}}', + aboutToPermanentlyDelete: + 'Предстои да изтриете завинаги {{label}} <1>{{title}}. Сигурни ли сте?', + aboutToPermanentlyDeleteTrash: + 'Вие се насочвате към перманентно изтриване на <0>{{count}} <1>{{label}} от кошчето. Сигурни ли сте?', + aboutToRestore: 'Предстои да възстановите {{label}} <1>{{title}}. Сигурни ли сте?', + aboutToRestoreAsDraft: + 'Предстои да възстановите {{label}} <1>{{title}} като чернова. Сигурни ли сте?', + aboutToRestoreAsDraftCount: 'Предстои да възстановите {{count}} {{label}} като чернова', + aboutToRestoreCount: 'Предстои да възстановите {{count}} {{label}}', + aboutToTrash: 'Предстои да преместите {{label}} <1>{{title}} в кошчето. Сигурни ли сте?', + aboutToTrashCount: 'Предстои да преместите {{count}} {{label}} в кошчето', addBelow: 'Добави отдолу', addFilter: 'Добави филтър', adminTheme: 'Цветова тема', @@ -247,6 +260,7 @@ export const bgTranslations: DefaultTranslationsObject = { 'Това ще премахне съществуващите индекси и ще преиндексира документите в колекциите {{collections}}.', confirmReindexDescriptionAll: 'Това ще премахне съществуващите индекси и ще преиндексира документите във всички колекции.', + confirmRestoration: 'Потвърдете възстановяването', copied: 'Копирано', copy: 'Копирай', copyField: 'Копирай поле', @@ -267,13 +281,17 @@ export const bgTranslations: DefaultTranslationsObject = { dark: 'Тъмна', dashboard: 'Табло', delete: 'Изтрий', + deleted: 'Изтрито', + deletedAt: 'Изтрито на', deletedCountSuccessfully: 'Изтрити {{count}} {{label}} успешно.', deletedSuccessfully: 'Изтрито успешно.', + deletePermanently: 'Пропуснете кошчето и изтрийте перманентно', deleting: 'Изтриване...', depth: 'Дълбочина', descending: 'Низходящо', deselectAllRows: 'Демаркирай всички редове', document: 'Документ', + documentIsTrashed: 'Този {{label}} е изтрит и е само за четене.', documentLocked: 'Документът е заключен', documents: 'Документи', duplicate: 'Дупликирай', @@ -289,6 +307,8 @@ export const bgTranslations: DefaultTranslationsObject = { editLabel: 'Редактирай {{label}}', email: 'Имейл', emailAddress: 'Имейл адрес', + emptyTrash: 'Изпразни кошчето', + emptyTrashLabel: 'Изпразнете кошчето за {{label}}', enterAValue: 'Въведи стойност', error: 'Грешка', errors: 'Грешки', @@ -337,6 +357,7 @@ export const bgTranslations: DefaultTranslationsObject = { '{{label}} не е открит. {{label}} не съществува или никой не отговаря на зададените филтри.', notFound: 'Няма открит', nothingFound: 'Нищо не беше открито', + noTrashResults: 'Няма {{label}} в кошчето.', noUpcomingEventsScheduled: 'Няма предстоящи събития.', noValue: 'Няма стойност', of: 'от', @@ -350,6 +371,8 @@ export const bgTranslations: DefaultTranslationsObject = { pasteField: 'Постави поле', pasteRow: 'Постави ред', payloadSettings: 'Настройки на Payload', + permanentlyDelete: 'Трайно изтриване', + permanentlyDeletedCountSuccessfully: 'Успешно изтрити завинаги {{count}} {{label}}.', perPage: 'На страница: {{limit}}', previous: 'Предишен', reindex: 'Преиндексиране', @@ -361,6 +384,10 @@ export const bgTranslations: DefaultTranslationsObject = { resetPreferencesDescription: 'Това ще нулира всички ваши предпочитания до техните настройки по подразбиране.', resettingPreferences: 'Нулиране на предпочитанията.', + restore: 'Възстановяване', + restoreAsPublished: 'Възстановете като публикувана версия', + restoredCountSuccessfully: 'Успешно възстановени {{count}} {{label}}.', + restoring: 'Възстановяване...', row: 'ред', rows: 'Редове', save: 'Запази', @@ -391,6 +418,10 @@ export const bgTranslations: DefaultTranslationsObject = { time: 'Време', timezone: 'Часова зона', titleDeleted: '{{label}} "{{title}}" успешно изтрит.', + titleRestored: '{{label}} "{{title}}" беше успешно възстановено.', + titleTrashed: '{{label}} "{{title}}" е преместено в кошчето.', + trash: 'Боклук', + trashedCountSuccessfully: '{{count}} {{label}} преместени в кошчето.', true: 'Вярно', unauthorized: 'Неоторизиран', unsavedChanges: 'Имате незапазени промени. Запазете или отхвърлете преди да продължите.', @@ -409,6 +440,7 @@ export const bgTranslations: DefaultTranslationsObject = { username: 'Потребителско име', users: 'Потребители', value: 'Стойност', + viewing: 'Преглеждане', viewReadOnly: 'Преглед само за четене', welcome: 'Добре дошъл', yes: 'Да', @@ -534,6 +566,7 @@ export const bgTranslations: DefaultTranslationsObject = { noRowsFound: 'Не е открит {{label}}', noRowsSelected: 'Не е избран {{label}}', preview: 'Предварителен преглед', + previouslyDraft: 'Предишно беше Чернова', previouslyPublished: 'Предишно публикувано', previousVersion: 'Предишна версия', problemRestoringVersion: 'Имаше проблем при възстановяването на тази версия', diff --git a/packages/translations/src/languages/bnBd.ts b/packages/translations/src/languages/bnBd.ts index 4a1b06d22..01276ef13 100644 --- a/packages/translations/src/languages/bnBd.ts +++ b/packages/translations/src/languages/bnBd.ts @@ -114,6 +114,8 @@ export const bnBdTranslations: DefaultTranslationsObject = { noUser: 'কোনো ব্যবহারকারী নেই', previewing: 'এই ডকুমেন্টটি প্রিভিউ করতে একটি সমস্যা হয়েছে।', problemUploadingFile: 'ফাইল আপলোড করতে একটি সমস্যা হয়েছে।', + restoringTitle: + '{{title}} পুনরুদ্ধার করার সময় একটি ত্রুটি ঘটেছে। দয়া করে আপনার সংযোগ পরীক্ষা করুন এবং আবার চেষ্টা করুন।', tokenInvalidOrExpired: 'টোকেন অবৈধ বা মেয়াদ শেষ হয়ে গেছে।', tokenNotProvided: 'টোকেন প্রদান করা হয়নি।', unableToCopy: 'কপি করা সম্ভব নয়।', @@ -215,6 +217,19 @@ export const bnBdTranslations: DefaultTranslationsObject = { aboutToDeleteCount_many: 'আপনি {{count}} {{label}} মুছতে চলেছেন', aboutToDeleteCount_one: 'আপনি {{count}} {{label}} মুছতে চলেছেন', aboutToDeleteCount_other: 'আপনি {{count}} {{label}} মুছতে চলেছেন', + aboutToPermanentlyDelete: + 'আপনি স্থায়ীভাবে {{label}} <1>{{title}} মুছে ফেলতে যাচ্ছেন। আপনি কি নিশ্চিত?', + aboutToPermanentlyDeleteTrash: + 'আপনি চূর্ণনিবিন্ন <0>{{count}} <1>{{label}} টি সর্বদা মুছে ফেলতে যাচ্ছেন। আপনি কি নিশ্চিত?', + aboutToRestore: 'আপনি কি নিশ্চিত যে আপনি {{label}} <1>{{title}} পুনরুদ্ধার করতে চান?', + aboutToRestoreAsDraft: + 'আপনি কি নিশ্চিত যে, আপনি {{label}} <1>{{title}} একটি খসড়া হিসাবে পুনরুদ্ধার করতে চলেছেন?', + aboutToRestoreAsDraftCount: + 'আপনি সম্প্রদায়ে {{count}} {{label}} খসড়া হিসাবে পুনরুদ্ধার করতে যাচ্ছেন', + aboutToRestoreCount: 'আপনি এখন প্রস্তুত {{count}} {{label}} পুনরুদ্ধার করতে', + aboutToTrash: + 'আপনি প্রথমরা {{label}} <1>{{title}} কে আবর্জনায় স্থানান্তর করতে যাচ্ছেন। আপনি কি নিশ্চিত?', + aboutToTrashCount: 'আপনি সম্পর্কে {{count}} {{label}} মুছে ফেলার জন্য সরিয়ে ফেলাতে যাচ্ছেন', addBelow: 'নিচে যোগ করুন', addFilter: 'ফিল্টার যোগ করুন', adminTheme: 'অ্যাডমিন থিম', @@ -250,6 +265,7 @@ export const bnBdTranslations: DefaultTranslationsObject = { 'এটি বিদ্যমান সূচিগুলি সরিয়ে দেবে এবং {{collections}} সংগ্রহগুলির ডকুমেন্টগুলি পুনরায় সূচিবদ্ধ করবে।', confirmReindexDescriptionAll: 'এটি বিদ্যমান সূচিগুলি সরিয়ে দেবে এবং সমস্ত সংগ্রহগুলির ডকুমেন্টগুলি পুনরায় সূচিবদ্ধ করবে।', + confirmRestoration: 'পুনরুদ্ধার নিশ্চিত করুন', copied: 'কপি করা হয়েছে', copy: 'কপি করুন', copyField: 'ফিল্ড কপি করুন', @@ -270,13 +286,17 @@ export const bnBdTranslations: DefaultTranslationsObject = { dark: 'ডার্ক', dashboard: 'ড্যাশবোর্ড', delete: 'মুছুন', + deleted: 'মুছে ফেলা হয়েছে', + deletedAt: 'মুছে ফেলার সময়', deletedCountSuccessfully: '{{count}} {{label}} সফলভাবে মুছে ফেলা হয়েছে।', deletedSuccessfully: 'সফলভাবে মুছে ফেলা হয়েছে।', + deletePermanently: 'ট্র্যাশ এড়িয়ে স্থায়ীভাবে মুছুন', deleting: 'মুছে ফেলা হচ্ছে...', depth: 'গভীরতা', descending: 'অবরোহী', deselectAllRows: 'সমস্ত সারি নির্বাচন বাতিল করুন', document: 'ডকুমেন্ট', + documentIsTrashed: 'এই {{label}} ট্র্যাশ করা হয়েছে এবং এটি শুধুমাত্র পাঠনীয়।', documentLocked: 'ডকুমেন্ট লক করা হয়েছে', documents: 'ডকুমেন্টগুলি', duplicate: 'ডুপ্লিকেট করুন', @@ -292,6 +312,8 @@ export const bnBdTranslations: DefaultTranslationsObject = { editLabel: '{{label}} সম্পাদনা করুন', email: 'ইমেইল', emailAddress: 'ইমেইল ঠিকানা', + emptyTrash: 'ট্র্যাশ খালি করুন', + emptyTrashLabel: '{{label}} ট্র্যাশ খালি করুন', enterAValue: 'একটি মান লিখুন', error: 'ত্রুটি', errors: 'ত্রুটিগুলি', @@ -340,6 +362,7 @@ export const bnBdTranslations: DefaultTranslationsObject = { 'কোনো {{label}} পাওয়া যায়নি। হয় এখনও কোনো {{label}} তৈরি করা হয়নি বা উপরে নির্দিষ্ট করা ফিল্টারগুলির সাথে কোনোটি মেলে না।', notFound: 'পাওয়া যায়নি', nothingFound: 'কিছুই পাওয়া যায়নি', + noTrashResults: 'ট্র্যাশে কোন {{label}} নেই।', noUpcomingEventsScheduled: 'কোনো আসন্ন ইভেন্ট নির্ধারিত নেই।', noValue: 'কোনো মান নেই', of: 'এর', @@ -353,6 +376,9 @@ export const bnBdTranslations: DefaultTranslationsObject = { pasteField: 'ফিল্ড পেস্ট করুন', pasteRow: 'সারি পেস্ট করুন', payloadSettings: 'পেলোড সেটিংস', + permanentlyDelete: 'চিরতরে মুছে ফেলুন', + permanentlyDeletedCountSuccessfully: + 'স্থায়ীভাবে {{count}} {{label}} সফলভাবে মুছে ফেলা হয়েছে।', perPage: 'প্রতি পৃষ্ঠায়: {{limit}}', previous: 'পূর্ববর্তী', reindex: 'পুনরায় সূচিবদ্ধ করুন', @@ -363,6 +389,11 @@ export const bnBdTranslations: DefaultTranslationsObject = { resetPreferences: 'পছন্দগুলি রিসেট করুন', resetPreferencesDescription: 'এটি আপনার সমস্ত পছন্দগুলি তাদের ডিফল্ট সেটিংসে রিসেট করবে।', resettingPreferences: 'পছন্দগুলি রিসেট করা হচ্ছে।', + restore: 'পুনরুদ্ধার করুন', + restoreAsPublished: 'প্রকাশিত সংস্করণ হিসাবে পুনরুদ্ধার করুন', + restoredCountSuccessfully: '{{count}} {{label}} সফলভাবে পুনরুদ্ধার করা হয়েছে।', + restoring: + 'Payload এর প্রসঙ্গে মূল পাঠের অর্থ সম্মান করুন। এখানে Payload পদ গুলির একটি তালিকা রয়েছে যা খুব নির্দিষ্ট অর্থ বহন করে:\n - সংগ্রহ: একটি সং', row: 'সারি', rows: 'সারিগুলি', save: 'সংরক্ষণ করুন', @@ -393,6 +424,10 @@ export const bnBdTranslations: DefaultTranslationsObject = { time: 'সময়', timezone: 'টাইমজোন', titleDeleted: '{{label}} "{{title}}" সফলভাবে মুছে ফেলা হয়েছে।', + titleRestored: '"{{label}}" "{{title}}" সফলভাবে পুনরুদ্ধার করা হয়েছে।', + titleTrashed: '{{label}} "{{title}}" আবর্জনাস্থলে সরিয়ে নেওয়া হয়েছে।', + trash: 'আবর্জনা', + trashedCountSuccessfully: '{{count}} {{label}} ট্র্যাশে মুভ করা হয়েছে।', true: 'সত্য', unauthorized: 'অননুমোদিত', unsavedChanges: @@ -413,6 +448,7 @@ export const bnBdTranslations: DefaultTranslationsObject = { username: 'ব্যবহারকারীর নাম', users: 'ব্যবহারকারীরা', value: 'মান', + viewing: 'দেখা', viewReadOnly: 'শুধুমাত্র পড়ার জন্য দেখুন', welcome: 'স্বাগতম', yes: 'হ্যাঁ', @@ -536,6 +572,7 @@ export const bnBdTranslations: DefaultTranslationsObject = { noRowsFound: 'কোনো {{label}} পাওয়া যায়নি', noRowsSelected: 'কোনো {{label}} নির্বাচিত হয়নি', preview: 'প্রাকদর্শন', + previouslyDraft: 'পূর্বে একটি খসড়া', previouslyPublished: 'পূর্বে প্রকাশিত', previousVersion: 'পূর্ববর্তী সংস্করণ', problemRestoringVersion: 'এই সংস্করণ পুনরুদ্ধারে সমস্যা হয়েছে', diff --git a/packages/translations/src/languages/bnIn.ts b/packages/translations/src/languages/bnIn.ts index 0c527627b..3d0efea0a 100644 --- a/packages/translations/src/languages/bnIn.ts +++ b/packages/translations/src/languages/bnIn.ts @@ -114,6 +114,8 @@ export const bnInTranslations: DefaultTranslationsObject = { noUser: 'কোনো ব্যবহারকারী নেই', previewing: 'এই ডকুমেন্টটি প্রিভিউ করতে একটি সমস্যা হয়েছে।', problemUploadingFile: 'ফাইল আপলোড করতে একটি সমস্যা হয়েছে।', + restoringTitle: + '{{title}} পুনরুদ্ধার করতে গিয়ে একটি ত্রুটি ঘটেছে। দয়া করে আপনার সংযোগ পরীক্ষা করুন এবং আবার চেষ্টা করুন।', tokenInvalidOrExpired: 'টোকেন অবৈধ বা মেয়াদ শেষ হয়ে গেছে।', tokenNotProvided: 'টোকেন প্রদান করা হয়নি।', unableToCopy: 'কপি করতে অক্ষম।', @@ -215,6 +217,19 @@ export const bnInTranslations: DefaultTranslationsObject = { aboutToDeleteCount_many: 'আপনি {{count}} {{label}} মুছতে চলেছেন', aboutToDeleteCount_one: 'আপনি {{count}} {{label}} মুছতে চলেছেন', aboutToDeleteCount_other: 'আপনি {{count}} {{label}} মুছতে চলেছেন', + aboutToPermanentlyDelete: + 'আপনি চিরস্থায়ীভাবে {{label}} <1>{{title}} মুছে ফেলার ব্যাপারে চিন্তাভাবনা করছেন। আপনি কি নিশ্চিত?', + aboutToPermanentlyDeleteTrash: + 'আপনি স্থায়ীভাবে ট্র্যাশ থেকে <0>{{count}} <1>{{label}} মুছে ফেলতে যাচ্ছেন। আপনি কি নিশ্চিত?', + aboutToRestore: 'আপনি চলেছেন {{label}} <1>{{title}} পুনরুদ্ধার করতে। আপনি কি নিশ্চিত?', + aboutToRestoreAsDraft: + 'আপনি যে {{label}} <1>{{title}} একটি খসড়া হিসাবে পুনঃস্থাপন করতে যাচ্ছেন । আপনি কি নিশ্চিত?', + aboutToRestoreAsDraftCount: + 'আপনি প্রস্তাবিত {{count}} {{label}} ড্রাফ্ট হিসেবে পুনরুদ্ধার করতে যাচ্ছেন', + aboutToRestoreCount: 'আপনি একটি পুনরুদ্ধার করতে যাচ্ছেন {{count}} {{label}}', + aboutToTrash: + 'আপনি সত্যিই স্থানান্তর করতে চাইছেন {{label}} <1>{{title}} কে আবর্জনায়? আপনি কি নিশ্চিত?', + aboutToTrashCount: 'আপনি চলে যাচ্ছেন {{count}} {{label}} ট্র্যাশে সরাতে', addBelow: 'নিচে যোগ করুন', addFilter: 'ফিল্টার যোগ করুন', adminTheme: 'অ্যাডমিন থিম', @@ -249,6 +264,7 @@ export const bnInTranslations: DefaultTranslationsObject = { 'এটি বিদ্যমান সূচিগুলি সরিয়ে দেবে এবং {{collections}} সংগ্রহগুলির ডকুমেন্টগুলি পুনরায় সূচিবদ্ধ করবে।', confirmReindexDescriptionAll: 'এটি বিদ্যমান সূচিগুলি সরিয়ে দেবে এবং সমস্ত সংগ্রহগুলির ডকুমেন্টগুলি পুনরায় সূচিবদ্ধ করবে।', + confirmRestoration: 'পুনর্বাসন নিশ্চিত করুন', copied: 'কপি করা হয়েছে', copy: 'কপি করুন', copyField: 'ফিল্ড কপি করুন', @@ -269,13 +285,17 @@ export const bnInTranslations: DefaultTranslationsObject = { dark: 'ডার্ক', dashboard: 'ড্যাশবোর্ড', delete: 'মুছুন', + deleted: 'মুছে ফেলা হয়েছে', + deletedAt: 'মুছে ফেলার সময়', deletedCountSuccessfully: '{{count}} {{label}} সফলভাবে মুছে ফেলা হয়েছে।', deletedSuccessfully: 'সফলভাবে মুছে ফেলা হয়েছে।', + deletePermanently: 'ট্র্যাশ এড়িয়ে চিরতরে মুছে ফেলুন', deleting: 'মুছে ফেলা হচ্ছে...', depth: 'গভীরতা', descending: 'অবরোহী', deselectAllRows: 'সমস্ত সারি নির্বাচন বাতিল করুন', document: 'ডকুমেন্ট', + documentIsTrashed: 'এই {{label}} টি মুছে ফেলা হয়েছে এবং এটি কেবল পড়ার জন্য।', documentLocked: 'ডকুমেন্ট লক করা হয়েছে', documents: 'ডকুমেন্টগুলি', duplicate: 'ডুপ্লিকেট করুন', @@ -291,6 +311,8 @@ export const bnInTranslations: DefaultTranslationsObject = { editLabel: '{{label}} সম্পাদনা করুন', email: 'ইমেইল', emailAddress: 'ইমেইল ঠিকানা', + emptyTrash: 'ট্র্যাশ খালি করুন', + emptyTrashLabel: '{{label}} ফাঁকা করুন', enterAValue: 'একটি মান লিখুন', error: 'ত্রুটি', errors: 'ত্রুটিগুলি', @@ -339,6 +361,7 @@ export const bnInTranslations: DefaultTranslationsObject = { 'কোনো {{label}} পাওয়া যায়নি। হয় এখনও কোনো {{label}} তৈরি করা হয়নি বা উপরে নির্দিষ্ট করা ফিল্টারগুলির সাথে কোনোটি মেলে না।', notFound: 'পাওয়া যায়নি', nothingFound: 'কিছুই পাওয়া যায়নি', + noTrashResults: 'ট্র্যাশে কোনো {{label}} নেই।', noUpcomingEventsScheduled: 'কোনো আসন্ন ইভেন্ট নির্ধারিত নেই।', noValue: 'কোনো মান নেই', of: 'এর', @@ -352,6 +375,9 @@ export const bnInTranslations: DefaultTranslationsObject = { pasteField: 'ফিল্ড পেস্ট করুন', pasteRow: 'সারি পেস্ট করুন', payloadSettings: 'পেলোড সেটিংস', + permanentlyDelete: 'স্থায়ীভাবে মুছে ফেলুন', + permanentlyDeletedCountSuccessfully: + 'স্থায়ীভাবে {{count}} টি {{label}} সফলভাবে মুছে ফেলা হয়েছে।', perPage: 'প্রতি পৃষ্ঠায়: {{limit}}', previous: 'পূর্ববর্তী', reindex: 'পুনরায় সূচিবদ্ধ করুন', @@ -362,6 +388,11 @@ export const bnInTranslations: DefaultTranslationsObject = { resetPreferences: 'পছন্দগুলি রিসেট করুন', resetPreferencesDescription: 'এটি আপনার সমস্ত পছন্দগুলি তাদের ডিফল্ট সেটিংসে রিসেট করবে।', resettingPreferences: 'পছন্দগুলি রিসেট করা হচ্ছে।', + restore: 'পুনরুদ্ধার করুন', + restoreAsPublished: 'প্রকাশিত সংস্করণ হিসাবে পুনরুদ্ধার করুন', + restoredCountSuccessfully: '{{count}} {{label}} সফলভাবে পুনরুদ্ধার করা হয়েছে।', + restoring: + 'প্রস্থাপনার অর্থকে সম্মান করুন। এখানে Payload এর সাথে সম্পর্কিত কিছু সাধারণ পদগুলির তালিকা রয়েছে যা খুব নির্দিষ্ট অর্থ বহন করে:\n - কালেক', row: 'সারি', rows: 'সারিগুলি', save: 'সংরক্ষণ করুন', @@ -392,6 +423,10 @@ export const bnInTranslations: DefaultTranslationsObject = { time: 'সময়', timezone: 'টাইমজোন', titleDeleted: '{{label}} "{{title}}" সফলভাবে মুছে ফেলা হয়েছে।', + titleRestored: '"{{label}}" "{{title}}" সফলভাবে পুনরুদ্ধার করা হয়েছে।', + titleTrashed: '"{{label}}" "{{title}}" ট্র্যাশে সরিয়ে দেওয়া হয়েছে।', + trash: 'আবর্জনা', + trashedCountSuccessfully: '{{count}} {{label}} ট্র্যাশে সরানো হয়েছে।', true: 'সত্য', unauthorized: 'অননুমোদিত', unsavedChanges: @@ -412,6 +447,7 @@ export const bnInTranslations: DefaultTranslationsObject = { username: 'ব্যবহারকারীর নাম', users: 'ব্যবহারকারীরা', value: 'মান', + viewing: 'দর্শন', viewReadOnly: 'শুধুমাত্র পড়ার জন্য দেখুন', welcome: 'স্বাগতম', yes: 'হ্যাঁ', @@ -535,6 +571,7 @@ export const bnInTranslations: DefaultTranslationsObject = { noRowsFound: 'কোনো {{label}} পাওয়া যায়নি', noRowsSelected: 'কোনো {{label}} নির্বাচিত হয়নি', preview: 'প্রাকদর্শন', + previouslyDraft: 'পূর্বে একটি খসড়া', previouslyPublished: 'পূর্বে প্রকাশিত', previousVersion: 'পূর্ববর্তী সংস্করণ', problemRestoringVersion: 'এই সংস্করণ পুনরুদ্ধারে সমস্যা হয়েছে', diff --git a/packages/translations/src/languages/ca.ts b/packages/translations/src/languages/ca.ts index 5d15a184d..e340d98ee 100644 --- a/packages/translations/src/languages/ca.ts +++ b/packages/translations/src/languages/ca.ts @@ -115,6 +115,8 @@ export const caTranslations: DefaultTranslationsObject = { noUser: 'Cap usuari', previewing: 'Hi ha hagut un problema en previsualitzar aquest document.', problemUploadingFile: "Hi ha hagut un problema mentre es carregava l'arxiu.", + restoringTitle: + 'Hi ha hagut un error en restaurar {{title}}. Si us plau, comproveu la vostra connexió i torneu-ho a provar.', tokenInvalidOrExpired: 'El token és invàlid o ha caducat.', tokenNotProvided: "No s'ha proporcionat cap token.", unableToCopy: 'No es pot copiar.', @@ -215,6 +217,18 @@ export const caTranslations: DefaultTranslationsObject = { aboutToDeleteCount_many: 'Estas apunt de eliminar {{count}} {{label}}', aboutToDeleteCount_one: 'Estas apunt de eliminar {{count}} {{label}}', aboutToDeleteCount_other: 'Estas apunt de eliminar {{count}} {{label}}', + aboutToPermanentlyDelete: + "Estàs a punt d'esborrar permanentment l'{{etiqueta}} <1>{{títol}}. N'estàs segur?", + aboutToPermanentlyDeleteTrash: + "Estàs a punt de suprimir permanentment <0>{{count}} <1>{{label}} de la paperera. N'estàs segur?", + aboutToRestore: "Estàs a punt de restaurar l'{{label}} <1>{{title}}. N'estàs segur?", + aboutToRestoreAsDraft: + "Estàs a punt de restaurar l'etiqueta {{label}} <1>{{title}} com a esborrany. N'estàs segur?", + aboutToRestoreAsDraftCount: 'Està a punt de restaurar {{count}} {{label}} com a esborrany', + aboutToRestoreCount: 'Està a punt de restaurar {{count}} {{label}}', + aboutToTrash: + "Estàs a punt de moure l'{{label}} <1>{{title}} a la paperera. N'estàs segur?", + aboutToTrashCount: 'Estàs a punt de moure {{count}} {{label}} a la paperera', addBelow: 'Afegeix a sota', addFilter: 'Afegeix filtre', adminTheme: "Tema d'administració", @@ -248,6 +262,7 @@ export const caTranslations: DefaultTranslationsObject = { 'Aixo eliminarà els índexs existents i reindexarà els documents de les col·leccions {{collections}}.', confirmReindexDescriptionAll: 'Aixo eliminarà els índexs existents i reindexarà els documents de totes les col·leccions.', + confirmRestoration: 'Confirmeu la restauració', copied: 'Copiat', copy: 'Copiar', copyField: 'Copiar camp', @@ -268,13 +283,17 @@ export const caTranslations: DefaultTranslationsObject = { dark: 'Fosc', dashboard: 'Tauler', delete: 'Eliminar', + deleted: 'Eliminat', + deletedAt: 'Eliminat en', deletedCountSuccessfully: 'Eliminat {{count}} {{label}} correctament.', deletedSuccessfully: 'Eliminat correntament.', + deletePermanently: 'Omet la paperera i elimina permanentment', deleting: 'Eliminant...', depth: 'Profunditat', descending: 'Descendent', deselectAllRows: 'Deselecciona totes les files', document: 'Document', + documentIsTrashed: "Aquesta {{label}} s'ha eliminat i és de només lectura.", documentLocked: 'Document bloquejat', documents: 'Documents', duplicate: 'Duplicar', @@ -290,6 +309,8 @@ export const caTranslations: DefaultTranslationsObject = { editLabel: 'Edita {{label}}', email: 'correu electrònic', emailAddress: 'Addressa de correu electrònic', + emptyTrash: 'Buida la paperera', + emptyTrashLabel: 'Buideu la paperera {{label}}', enterAValue: 'Introdueix un valor', error: 'Error', errors: 'Errors', @@ -338,6 +359,7 @@ export const caTranslations: DefaultTranslationsObject = { "No s'ha trobat cap {{label}}. O no n'hi ha cap encara o cap coincideix amb els filtres que has especificat anteriorment.", notFound: 'No trobat', nothingFound: 'Res trobat', + noTrashResults: 'No hi ha cap {{label}} a la paperera.', noUpcomingEventsScheduled: 'No hi ha esdeveniments programats.', noValue: 'No hi ha cap valor', of: 'de', @@ -351,6 +373,9 @@ export const caTranslations: DefaultTranslationsObject = { pasteField: 'Enganxar camp', pasteRow: 'Enganxar fila', payloadSettings: 'configuracio Payload', + permanentlyDelete: 'Esborrar permanentment', + permanentlyDeletedCountSuccessfully: + "S'ha eliminat permanentment {{count}} {{label}} amb èxit.", perPage: 'Per pagian: {{limit}}', previous: 'Previ', reindex: 'Reindexa', @@ -362,6 +387,10 @@ export const caTranslations: DefaultTranslationsObject = { resetPreferencesDescription: 'Això restablirà totes les teves preferències a les configuracions per defecte.', resettingPreferences: 'Restablint les preferències.', + restore: 'Restaura', + restoreAsPublished: 'Restaura com a versió publicada', + restoredCountSuccessfully: "S'ha restaurat {{count}} {{label}} correctament.", + restoring: 'Restauració...', row: 'Fila', rows: 'Files', save: 'Desa', @@ -392,6 +421,10 @@ export const caTranslations: DefaultTranslationsObject = { time: 'Temps', timezone: 'Fus horari', titleDeleted: '{{label}} "{{title}}" eliminat correctament.', + titleRestored: '{{label}} "{{title}}" s\'ha restaurat correctament.', + titleTrashed: '{{label}} "{{title}}" s\'ha traslladat a la paperera.', + trash: 'Brossa', + trashedCountSuccessfully: "{{count}} {{label}} s'ha mogut a la paperera.", true: 'Veritat', unauthorized: 'No autoritzat', unsavedChanges: 'Tens canvis no desats. Vols continuar sense desar?', @@ -410,6 +443,7 @@ export const caTranslations: DefaultTranslationsObject = { username: "Nom d'usuari", users: 'Usuaris', value: 'Valor', + viewing: 'Visualització', viewReadOnly: 'Veure només de lectura', welcome: 'Benvingut', yes: 'Sí', @@ -537,6 +571,7 @@ export const caTranslations: DefaultTranslationsObject = { noRowsFound: "No s'han trobat {{label}}", noRowsSelected: "No s'han seleccionat {{label}}", preview: 'Vista prèvia', + previouslyDraft: 'Anteriorment un Esborrany', previouslyPublished: 'Publicat anteriorment', previousVersion: 'Versió anterior', problemRestoringVersion: 'Hi ha hagut un problema en restaurar aquesta versió', diff --git a/packages/translations/src/languages/cs.ts b/packages/translations/src/languages/cs.ts index 6259af351..d475579f3 100644 --- a/packages/translations/src/languages/cs.ts +++ b/packages/translations/src/languages/cs.ts @@ -114,6 +114,8 @@ export const csTranslations: DefaultTranslationsObject = { noUser: 'Žádný uživatel', previewing: 'Při náhledu tohoto dokumentu došlo k chybě.', problemUploadingFile: 'Při nahrávání souboru došlo k chybě.', + restoringTitle: + 'Došlo k chybě při obnovování {{title}}. Zkontrolujte prosím své připojení a zkuste to znovu.', tokenInvalidOrExpired: 'Token je neplatný nebo vypršel.', tokenNotProvided: 'Token není poskytnut.', unableToCopy: 'Nelze zkopírovat.', @@ -214,6 +216,17 @@ export const csTranslations: DefaultTranslationsObject = { aboutToDeleteCount_many: 'Chystáte se smazat {{count}} {{label}}', aboutToDeleteCount_one: 'Chystáte se smazat {{count}} {{label}}', aboutToDeleteCount_other: 'Chystáte se smazat {{count}} {{label}}', + aboutToPermanentlyDelete: + 'Chystáte se trvale odstranit {{label}} <1>{{title}}. Jste si jistý?', + aboutToPermanentlyDeleteTrash: + 'Chystáte se trvale smazat <0>{{count}} <1>{{label}} z koše. Jste si jistý?', + aboutToRestore: 'Chystáte se obnovit {{label}} <1>{{title}}. Jste si jistý?', + aboutToRestoreAsDraft: + 'Chystáte se obnovit {{label}} <1>{{title}} jako koncept. Jste si jistý?', + aboutToRestoreAsDraftCount: 'Chystáte se obnovit {{count}} {{label}} jako koncept', + aboutToRestoreCount: 'Chystáte se obnovit {{count}} {{label}}', + aboutToTrash: 'Chystáte se přesunout {{label}} <1>{{title}} do koše. Jste si jisti?', + aboutToTrashCount: 'Chystáte se přesunout {{count}} {{label}} do koše', addBelow: 'Přidat pod', addFilter: 'Přidat filtr', adminTheme: 'Motiv administračního rozhraní', @@ -247,6 +260,7 @@ export const csTranslations: DefaultTranslationsObject = { 'Tímto budou odstraněny stávající indexy a dokumenty v kolekcích {{collections}} budou znovu zaindexovány.', confirmReindexDescriptionAll: 'Tímto budou odstraněny stávající indexy a dokumenty ve všech kolekcích budou znovu zaindexovány.', + confirmRestoration: 'Potvrdit obnovení', copied: 'Zkopírováno', copy: 'Kopírovat', copyField: 'Kopírovat pole', @@ -266,13 +280,17 @@ export const csTranslations: DefaultTranslationsObject = { dark: 'Tmavý', dashboard: 'Nástěnka', delete: 'Odstranit', + deleted: 'Smazáno', + deletedAt: 'Smazáno dne', deletedCountSuccessfully: 'Úspěšně smazáno {{count}} {{label}}.', deletedSuccessfully: 'Úspěšně odstraněno.', + deletePermanently: 'Preskočit koš a smazat trvale', deleting: 'Odstraňování...', depth: 'Hloubka', descending: 'Sestupně', deselectAllRows: 'Zrušte výběr všech řádků', document: 'Dokument', + documentIsTrashed: 'Tento {{label}} je v koši a je pouze pro čtení.', documentLocked: 'Dokument je uzamčen', documents: 'Dokumenty', duplicate: 'Duplikovat', @@ -288,6 +306,8 @@ export const csTranslations: DefaultTranslationsObject = { editLabel: 'Upravit {{label}}', email: 'E-mail', emailAddress: 'E-mailová adresa', + emptyTrash: 'Vyprázdnit koš', + emptyTrashLabel: 'Vyprázdnit {{label}} koš', enterAValue: 'Zadejte hodnotu', error: 'Chyba', errors: 'Chyby', @@ -336,6 +356,7 @@ export const csTranslations: DefaultTranslationsObject = { 'Nebyly nalezeny žádné {{label}}. Buď ještě neexistují žádné {{label}}, nebo žádné nesplňují filtry, které jste zadali výše.', notFound: 'Nenalezeno', nothingFound: 'Nic nenalezeno', + noTrashResults: 'Žádný {{label}} v koši.', noUpcomingEventsScheduled: 'Žádné nadcházející události nejsou naplánovány.', noValue: 'Žádná hodnota', of: 'z', @@ -349,6 +370,8 @@ export const csTranslations: DefaultTranslationsObject = { pasteField: 'Vložit pole', pasteRow: 'Vložit řádek', payloadSettings: 'Payload nastavení', + permanentlyDelete: 'Trvale smazat', + permanentlyDeletedCountSuccessfully: 'Trvale odstraněno {{count}} {{label}} úspěšně.', perPage: 'Na stránku: {{limit}}', previous: 'Předchozí', reindex: 'Přeindexovat', @@ -359,6 +382,11 @@ export const csTranslations: DefaultTranslationsObject = { resetPreferences: 'Obnovit nastavení', resetPreferencesDescription: 'Toto obnoví všechna vaše nastavení na výchozí hodnoty.', resettingPreferences: 'Obnovování nastavení.', + restore: 'Obnovit', + restoreAsPublished: 'Obnovit jako publikovanou verzi', + restoredCountSuccessfully: 'Úspěšně obnoveno {{count}} {{label}}.', + restoring: + 'Respektujte význam původního textu v kontextu Payload. Zde je seznam běžných termínů Payload, které nesou velmi specifické významy:\n - Collection: Sbírka je skupina dokumentů, které sdílejí společnou strukturu a účel. Sbírky se používají k organizaci a správě obsahu v Payload.\n - Field: Field je specifický prvek dat v dokumentu ve sbírce. Field definuje strukturu a typ dat, které mohou', row: 'Řádek', rows: 'Řádky', save: 'Uložit', @@ -389,6 +417,10 @@ export const csTranslations: DefaultTranslationsObject = { time: 'Čas', timezone: 'Časové pásmo', titleDeleted: '{{label}} "{{title}}" úspěšně smazáno.', + titleRestored: '{{label}} "{{title}}" úspěšně obnoveno.', + titleTrashed: '{{label}} "{{title}}" přesunuto do koše.', + trash: 'Koš', + trashedCountSuccessfully: '{{count}} {{label}} přesunuto do koše.', true: 'Pravda', unauthorized: 'Neoprávněný', unsavedChanges: 'Máte neuložené změny. Uložte nebo zahoďte před pokračováním.', @@ -407,6 +439,7 @@ export const csTranslations: DefaultTranslationsObject = { username: 'Uživatelské jméno', users: 'Uživatelé', value: 'Hodnota', + viewing: 'Prohlížení', viewReadOnly: 'Zobrazit pouze pro čtení', welcome: 'Vítejte', yes: 'Ano', @@ -531,6 +564,7 @@ export const csTranslations: DefaultTranslationsObject = { noRowsFound: 'Nenalezen {{label}}', noRowsSelected: 'Nebyl vybrán žádný {{label}}', preview: 'Náhled', + previouslyDraft: 'Dříve Koncept', previouslyPublished: 'Dříve publikováno', previousVersion: 'Předchozí verze', problemRestoringVersion: 'Při obnovování této verze došlo k problému', diff --git a/packages/translations/src/languages/da.ts b/packages/translations/src/languages/da.ts index ba3279727..199e044f5 100644 --- a/packages/translations/src/languages/da.ts +++ b/packages/translations/src/languages/da.ts @@ -113,6 +113,8 @@ export const daTranslations: DefaultTranslationsObject = { noUser: 'Ingen bruger', previewing: 'Der opstod et problem med at vise dokumentet.', problemUploadingFile: 'Der opstod et problem under uploadingen af filen.', + restoringTitle: + 'Der opstod en fejl under genoprettelsen af {{title}}. Kontroller venligst din forbindelse og prøv igen.', tokenInvalidOrExpired: 'Token er enten ugyldig eller udløbet.', tokenNotProvided: 'Token ikke angivet.', unableToCopy: 'Kan ikke kopiere.', @@ -212,6 +214,18 @@ export const daTranslations: DefaultTranslationsObject = { aboutToDeleteCount_many: 'Du er ved at slette {{count}} {{label}}', aboutToDeleteCount_one: 'Du er ved at slette {{count}} {{label}}', aboutToDeleteCount_other: 'Du er ved at slette {{count}} {{label}}', + aboutToPermanentlyDelete: + 'Du er ved at slette {{label}} <1>{{title}} permanent. Er du sikker?', + aboutToPermanentlyDeleteTrash: + 'Du er ved at slette <0>{{count}} <1>{{label}} permanent fra papirkurven. Er du sikker?', + aboutToRestore: 'Du er ved at gendanne {{label}} <1>{{title}}. Er du sikker?', + aboutToRestoreAsDraft: + 'Du er ved at gendanne {{label}} <1>{{title}} som et udkast. Er du sikker?', + aboutToRestoreAsDraftCount: 'Du er ved at gendanne {{count}} {{label}} som udkast', + aboutToRestoreCount: 'Du er ved at gendanne {{count}} {{label}}', + aboutToTrash: + 'Du er ved at flytte {{label}} <1>{{title}} til skraldespanden. Er du sikker?', + aboutToTrashCount: 'Du er ved at flytte {{count}} {{label}} til skraldespanden', addBelow: 'Tilføj under', addFilter: 'Tilføj filter', adminTheme: 'Admin tema', @@ -246,6 +260,7 @@ export const daTranslations: DefaultTranslationsObject = { 'Dette vil fjerne eksisterende indekser og genindeksere dokumenter i {{collections}}-samlingerne.', confirmReindexDescriptionAll: 'Dette vil fjerne eksisterende indekser og genindeksere dokumenter i alle samlinger.', + confirmRestoration: 'Bekræft gendannelse', copied: 'Kopieret', copy: 'Kopier', copyField: 'Kopiér felt', @@ -265,13 +280,17 @@ export const daTranslations: DefaultTranslationsObject = { dark: 'Mørk', dashboard: 'Dashboard', delete: 'Slet', + deleted: 'Slettet', + deletedAt: 'Slettet Ved', deletedCountSuccessfully: 'Slettet {{count}} {{label}}.', deletedSuccessfully: 'Slettet.', + deletePermanently: 'Spring affald over og slet permanent', deleting: 'Sletter...', depth: 'Dybde', descending: 'Faldende', deselectAllRows: 'Fjern markering af alle rækker', document: 'Dokument', + documentIsTrashed: 'Denne {{label}} er smidt væk og er kun til læsning.', documentLocked: 'Dette dokument er låst', documents: 'Dokumenter', duplicate: 'Duplikér', @@ -287,6 +306,8 @@ export const daTranslations: DefaultTranslationsObject = { editLabel: 'Redigere {{label}}', email: 'Email', emailAddress: 'e-mailadresse', + emptyTrash: 'Tøm skraldespanden', + emptyTrashLabel: 'Tøm {{label}} skraldespanden', enterAValue: 'Indtast en værdi', error: 'Fejl', errors: 'Fejl', @@ -335,6 +356,7 @@ export const daTranslations: DefaultTranslationsObject = { 'No {{label}} fundet. Enten findes der endnu ingen {{label}}, eller også matcher ingen af de filtre angivet ovenfor.', notFound: 'Ikke fundet', nothingFound: 'Intet fundet', + noTrashResults: 'Ingen {{label}} i papirkurven.', noUpcomingEventsScheduled: 'Ingen kommende begivenheder planlagt.', noValue: 'Ingen værdi', of: 'Af', @@ -348,6 +370,8 @@ export const daTranslations: DefaultTranslationsObject = { pasteField: 'Indsæt felt', pasteRow: 'Indsæt række', payloadSettings: 'Payload-indstillinger', + permanentlyDelete: 'Permanent Sletning', + permanentlyDeletedCountSuccessfully: 'Permanent slettet {{count}} {{label}} succesfuldt.', perPage: 'Per side: {{limit}}', previous: 'Tidligere', reindex: 'Genindekser', @@ -359,6 +383,11 @@ export const daTranslations: DefaultTranslationsObject = { resetPreferencesDescription: 'Dette vil nulstille alle dine præferencer til standardindstillingerne.', resettingPreferences: 'Nulstiller præferencer.', + restore: 'Gendan', + restoreAsPublished: 'Gendan som udgivet version', + restoredCountSuccessfully: 'Gendannede {{count}} {{label}} succesfuldt.', + restoring: + 'Respekter betydningen af den originale tekst inden for konteksten Payload. Her er en liste over almindelige Payload-udtryk, der bærer meget specifikke betydninger:\n - Samling: En samling er en gruppe af dokumenter, der deler en fælles struktur og formål. Samlinger anvendes til at organisere og administrere indhold i Payload.\n - Felt: Et felt er et specifikt stykke data i et dokument i en samling. Felter definerer struktur og type af data, der kan gemmes i et dokument.\n - Dokument: Et dokument er en individuel post inden for', row: 'Række', rows: 'Rækker', save: 'Gem', @@ -389,6 +418,10 @@ export const daTranslations: DefaultTranslationsObject = { time: 'Tid', timezone: 'Tidszone', titleDeleted: '{{label}} "{{title}}" slettet.', + titleRestored: '{{label}} "{{title}}" succesfuldt genoprettet.', + titleTrashed: '{{label}} "{{title}}" flyttet til papirkurven.', + trash: 'Affald', + trashedCountSuccessfully: '{{count}} {{label}} flyttet til papirkurven.', true: 'Sandt', unauthorized: 'Uautoriseret', unsavedChanges: 'Du har ikke gemte ændringer. Gem eller kassér før fortsættelse.', @@ -407,6 +440,7 @@ export const daTranslations: DefaultTranslationsObject = { username: 'Brugernavn', users: 'Brugere', value: 'Værdi', + viewing: 'Visning', viewReadOnly: 'Vis kun-læsning', welcome: 'Velkommen', yes: 'Ja', @@ -532,6 +566,7 @@ export const daTranslations: DefaultTranslationsObject = { noRowsFound: 'Ingen {{label}} fundet', noRowsSelected: 'Ingen {{label}} valgt', preview: 'Forhåndsvisning', + previouslyDraft: 'Tidligere et udkast', previouslyPublished: 'Tidligere offentliggjort', previousVersion: 'Tidligere version', problemRestoringVersion: 'Der opstod et problem med at gendanne denne version', diff --git a/packages/translations/src/languages/de.ts b/packages/translations/src/languages/de.ts index 5adc81666..910d99f4b 100644 --- a/packages/translations/src/languages/de.ts +++ b/packages/translations/src/languages/de.ts @@ -116,6 +116,8 @@ export const deTranslations: DefaultTranslationsObject = { noUser: 'Kein Benutzer', previewing: 'Bei der Vorschau dieses Dokuments ist ein Fehler aufgetreten.', problemUploadingFile: 'Beim Hochladen der Datei ist ein Fehler aufgetreten.', + restoringTitle: + 'Es gab einen Fehler beim Wiederherstellen von {{title}}. Bitte überprüfen Sie Ihre Verbindung und versuchen Sie es erneut.', tokenInvalidOrExpired: 'Token ist entweder ungültig oder abgelaufen.', tokenNotProvided: 'Token nicht bereitgestellt.', unableToCopy: 'Kopieren nicht möglich.', @@ -219,6 +221,20 @@ export const deTranslations: DefaultTranslationsObject = { aboutToDeleteCount_many: 'Du bist dabei, {{count}} {{label}} zu löschen', aboutToDeleteCount_one: 'Du bist dabei, {{count}} {{label}} zu löschen', aboutToDeleteCount_other: 'Du bist dabei, {{count}} {{label}} zu löschen', + aboutToPermanentlyDelete: + 'Sie sind im Begriff, das {{label}} <1>{{title}} dauerhaft zu löschen. Sind Sie sicher?', + aboutToPermanentlyDeleteTrash: + 'Sie sind dabei, <0>{{count}} <1>{{label}} endgültig aus dem Papierkorb zu löschen. Sind Sie sicher?', + aboutToRestore: + 'Sie sind dabei, das {{label}} <1>{{title}} wiederherzustellen. Sind Sie sicher?', + aboutToRestoreAsDraft: + 'Sie sind dabei, das {{label}} <1>{{title}} als Entwurf wiederherzustellen. Sind Sie sicher?', + aboutToRestoreAsDraftCount: + 'Sie sind dabei, {{count}} {{label}} als Entwurf wiederherzustellen.', + aboutToRestoreCount: 'Sie sind dabei {{count}} {{label}} wiederherzustellen', + aboutToTrash: + 'Sie sind dabei, das {{label}} <1>{{title}} in den Papierkorb zu verschieben. Sind Sie sicher?', + aboutToTrashCount: 'Sie sind dabei, {{count}} {{label}} in den Papierkorb zu verschieben.', addBelow: 'Unterhalb hinzufügen', addFilter: 'Filter hinzufügen', adminTheme: 'Admin-Erscheinungsbild', @@ -254,6 +270,7 @@ export const deTranslations: DefaultTranslationsObject = { 'Dies entfernt bestehende Indizes und indiziert die Dokumente in den {{collections}}-Sammlungen neu.', confirmReindexDescriptionAll: 'Dies entfernt bestehende Indizes und indiziert die Dokumente in allen Sammlungen neu.', + confirmRestoration: 'Bestätigen Sie die Wiederherstellung', copied: 'Kopiert', copy: 'Kopieren', copyField: 'Feld kopieren', @@ -274,13 +291,17 @@ export const deTranslations: DefaultTranslationsObject = { dark: 'Dunkel', dashboard: 'Übersicht', delete: 'Löschen', + deleted: 'Gelöscht', + deletedAt: 'Gelöscht am', deletedCountSuccessfully: '{{count}} {{label}} erfolgreich gelöscht.', deletedSuccessfully: 'Erfolgreich gelöscht.', + deletePermanently: 'Überspringen Sie den Papierkorb und löschen Sie dauerhaft.', deleting: 'Löschen...', depth: 'Tiefe', descending: 'Absteigend', deselectAllRows: 'Alle Zeilen abwählen', document: 'Dokument', + documentIsTrashed: 'Dieses {{label}} wurde gelöscht und ist nur lesbar.', documentLocked: 'Dokument gesperrt', documents: 'Dokumente', duplicate: 'Duplizieren', @@ -296,6 +317,8 @@ export const deTranslations: DefaultTranslationsObject = { editLabel: '{{label}} bearbeiten', email: 'E-Mail', emailAddress: 'E-Mail-Adresse', + emptyTrash: 'Papierkorb leeren', + emptyTrashLabel: 'Leeren Sie den {{label}} Papierkorb', enterAValue: 'Gib einen Wert ein', error: 'Fehler', errors: 'Fehler', @@ -344,6 +367,7 @@ export const deTranslations: DefaultTranslationsObject = { 'Keine {{label}} gefunden. Entweder es existieren keine {{label}} oder es gibt keine Übereinstimmung zu den von dir verwendeten Filtern.', notFound: 'Nicht gefunden', nothingFound: 'Keine Ergebnisse', + noTrashResults: 'Kein {{label}} im Papierkorb.', noUpcomingEventsScheduled: 'Keine bevorstehenden Veranstaltungen geplant.', noValue: 'Kein Wert', of: 'von', @@ -357,6 +381,8 @@ export const deTranslations: DefaultTranslationsObject = { pasteField: 'Feld einfügen', pasteRow: 'Zeile einfügen', payloadSettings: 'Payload-Einstellungen', + permanentlyDelete: 'Dauerhaft löschen', + permanentlyDeletedCountSuccessfully: '{{count}} {{label}} erfolgreich dauerhaft gelöscht.', perPage: 'Pro Seite: {{limit}}', previous: 'Vorherige', reindex: 'Neuindizieren', @@ -367,6 +393,11 @@ export const deTranslations: DefaultTranslationsObject = { resetPreferences: 'Präferenzen zurücksetzen', resetPreferencesDescription: 'Alle Präferenzen werden auf die Standardwerte zurückgesetzt.', resettingPreferences: 'Präferenzen werden zurückgesetzt.', + restore: 'Wiederherstellen', + restoreAsPublished: 'Wiederherstellen als veröffentlichte Version', + restoredCountSuccessfully: '{{count}} {{label}} erfolgreich wiederhergestellt.', + restoring: + 'Respektieren Sie die Bedeutung des Originaltextes im Kontext von Payload. Hier ist eine Liste häufiger Payload-Begriffe, die sehr spezifische Bedeutungen haben:\n - Sammlung: Eine Sammlung ist eine Gruppe von Dokumenten, die eine gemeinsame Struktur und einen gemeinsamen Zweck teilen. Sammlungen werden verwendet, um Inhalte in Payload zu organisieren und zu verwalten.\n - Feld: Ein Feld ist ein spezifisches Datenstück innerhalb eines Dokuments in einer Sammlung. Felder definieren die Struktur und den Datentyp, der in einem Dokument gespeichert werden kann.\n - Dokument:', row: 'Zeile', rows: 'Zeilen', save: 'Speichern', @@ -398,6 +429,10 @@ export const deTranslations: DefaultTranslationsObject = { time: 'Zeit', timezone: 'Zeitzone', titleDeleted: '{{label}} {{title}} wurde erfolgreich gelöscht.', + titleRestored: '{{label}} "{{title}}" erfolgreich wiederhergestellt.', + titleTrashed: '{{label}} "{{title}}" wurde in den Papierkorb verschoben.', + trash: 'Müll', + trashedCountSuccessfully: '{{count}} {{label}} wurde in den Papierkorb verschoben.', true: 'Wahr', unauthorized: 'Nicht autorisiert', unsavedChanges: @@ -418,6 +453,7 @@ export const deTranslations: DefaultTranslationsObject = { username: 'Benutzername', users: 'Benutzer', value: 'Wert', + viewing: 'Ansehen', viewReadOnly: 'Nur-Lese-Ansicht', welcome: 'Willkommen', yes: 'Ja', @@ -542,6 +578,7 @@ export const deTranslations: DefaultTranslationsObject = { noRowsFound: 'Kein {{label}} gefunden', noRowsSelected: 'Kein {{label}} ausgewählt', preview: 'Vorschau', + previouslyDraft: 'Früher ein Entwurf', previouslyPublished: 'Zuvor veröffentlicht', previousVersion: 'Frühere Version', problemRestoringVersion: 'Bei der Wiederherstellung der Version ist ein Fehler aufgetreten', diff --git a/packages/translations/src/languages/en.ts b/packages/translations/src/languages/en.ts index 6e4116e7f..2cacb46e5 100644 --- a/packages/translations/src/languages/en.ts +++ b/packages/translations/src/languages/en.ts @@ -1,3 +1,5 @@ +import { title } from 'process' + import type { Language } from '../types.js' export const enTranslations = { @@ -115,6 +117,8 @@ export const enTranslations = { noUser: 'No User', previewing: 'There was a problem previewing this document.', problemUploadingFile: 'There was a problem while uploading the file.', + restoringTitle: + 'There was an error while restoring {{title}}. Please check your connection and try again.', tokenInvalidOrExpired: 'Token is either invalid or has expired.', tokenNotProvided: 'Token not provided.', unableToCopy: 'Unable to copy.', @@ -214,6 +218,18 @@ export const enTranslations = { 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}}', + aboutToPermanentlyDelete: + 'You are about to permanently delete the {{label}} <1>{{title}}. Are you sure?', + aboutToPermanentlyDeleteTrash: + 'You are about to permanently delete <0>{{count}} <1>{{label}} from the trash. Are you sure?', + aboutToRestore: 'You are about to restore the {{label}} <1>{{title}}. Are you sure?', + aboutToRestoreAsDraft: + 'You are about to restore the {{label}} <1>{{title}} as a draft. Are you sure?', + aboutToRestoreAsDraftCount: 'You are about to restore {{count}} {{label}} as draft', + aboutToRestoreCount: 'You are about to restore {{count}} {{label}}', + aboutToTrash: + 'You are about to move the {{label}} <1>{{title}} to the trash. Are you sure?', + aboutToTrashCount: 'You are about to move {{count}} {{label}} to the trash', addBelow: 'Add Below', addFilter: 'Add Filter', adminTheme: 'Admin Theme', @@ -248,6 +264,7 @@ export const enTranslations = { 'This will remove existing indexes and reindex documents in the {{collections}} collections.', confirmReindexDescriptionAll: 'This will remove existing indexes and reindex documents in all collections.', + confirmRestoration: 'Confirm restoration', copied: 'Copied', copy: 'Copy', copyField: 'Copy Field', @@ -268,13 +285,17 @@ export const enTranslations = { dark: 'Dark', dashboard: 'Dashboard', delete: 'Delete', + deleted: 'Deleted', + deletedAt: 'Deleted At', deletedCountSuccessfully: 'Deleted {{count}} {{label}} successfully.', deletedSuccessfully: 'Deleted successfully.', + deletePermanently: 'Skip trash and delete permanently', deleting: 'Deleting...', depth: 'Depth', descending: 'Descending', deselectAllRows: 'Deselect all rows', document: 'Document', + documentIsTrashed: 'This {{label}} is trashed and is read-only.', documentLocked: 'Document locked', documents: 'Documents', duplicate: 'Duplicate', @@ -290,6 +311,8 @@ export const enTranslations = { editLabel: 'Edit {{label}}', email: 'Email', emailAddress: 'Email Address', + emptyTrash: 'Empty trash', + emptyTrashLabel: 'Empty {{label}} trash', enterAValue: 'Enter a value', error: 'Error', errors: 'Errors', @@ -338,6 +361,7 @@ export const enTranslations = { "No {{label}} found. Either no {{label}} exist yet or none match the filters you've specified above.", notFound: 'Not Found', nothingFound: 'Nothing found', + noTrashResults: 'No {{label}} in trash.', noUpcomingEventsScheduled: 'No upcoming events scheduled.', noValue: 'No value', of: 'of', @@ -351,6 +375,8 @@ export const enTranslations = { pasteField: 'Paste Field', pasteRow: 'Paste Row', payloadSettings: 'Payload Settings', + permanentlyDelete: 'Permanently Delete', + permanentlyDeletedCountSuccessfully: 'Permanently deleted {{count}} {{label}} successfully.', perPage: 'Per Page: {{limit}}', previous: 'Previous', reindex: 'Reindex', @@ -362,6 +388,10 @@ export const enTranslations = { resetPreferencesDescription: 'This will reset all of your preferences to their default settings.', resettingPreferences: 'Resetting Preferences.', + restore: 'Restore', + restoreAsPublished: 'Restore as published version', + restoredCountSuccessfully: 'Restored {{count}} {{label}} successfully.', + restoring: 'Restoring...', row: 'Row', rows: 'Rows', save: 'Save', @@ -392,6 +422,10 @@ export const enTranslations = { time: 'Time', timezone: 'Timezone', titleDeleted: '{{label}} "{{title}}" successfully deleted.', + titleRestored: '{{label}} "{{title}}" successfully restored.', + titleTrashed: '{{label}} "{{title}}" moved to trash.', + trash: 'Trash', + trashedCountSuccessfully: '{{count}} {{label}} moved to trash.', true: 'True', unauthorized: 'Unauthorized', unsavedChanges: 'You have unsaved changes. Save or discard before continuing.', @@ -410,6 +444,7 @@ export const enTranslations = { username: 'Username', users: 'Users', value: 'Value', + viewing: 'Viewing', viewReadOnly: 'View read-only', welcome: 'Welcome', yes: 'Yes', @@ -535,6 +570,7 @@ export const enTranslations = { noRowsFound: 'No {{label}} found', noRowsSelected: 'No {{label}} selected', preview: 'Preview', + previouslyDraft: 'Previously a Draft', previouslyPublished: 'Previously Published', previousVersion: 'Previous Version', problemRestoringVersion: 'There was a problem restoring this version', diff --git a/packages/translations/src/languages/es.ts b/packages/translations/src/languages/es.ts index e61ad47f6..8ca8c5b50 100644 --- a/packages/translations/src/languages/es.ts +++ b/packages/translations/src/languages/es.ts @@ -114,6 +114,8 @@ export const esTranslations: DefaultTranslationsObject = { noUser: 'Sin usuario', previewing: 'Ocurrió un problema al previsualizar este documento.', problemUploadingFile: 'Ocurrió un problema al subir el archivo.', + restoringTitle: + 'Hubo un error al restaurar {{title}}. Por favor, verifique su conexión e intente nuevamente.', tokenInvalidOrExpired: 'El token es inválido o ya expiró.', tokenNotProvided: 'Token no proporcionado.', unableToCopy: 'No se puede copiar.', @@ -218,6 +220,18 @@ export const esTranslations: DefaultTranslationsObject = { aboutToDeleteCount_many: 'Estás a punto de eliminar {{count}} {{label}}', aboutToDeleteCount_one: 'Estás a punto de eliminar {{count}} {{label}}', aboutToDeleteCount_other: 'Estás a punto de eliminar {{count}} {{label}}', + aboutToPermanentlyDelete: + 'Está a punto de eliminar permanentemente la {{label}} <1>{{title}}. ¿Está seguro?', + aboutToPermanentlyDeleteTrash: + 'Está a punto de eliminar permanentemente <0>{{count}} <1>{{label}} de la basura. ¿Está seguro?', + aboutToRestore: 'Está a punto de restaurar la {{label}} <1>{{title}}. ¿Está seguro?', + aboutToRestoreAsDraft: + 'Está a punto de restaurar la {{label}} <1>{{title}} como borrador. ¿Está seguro?', + aboutToRestoreAsDraftCount: 'Estás a punto de restaurar {{count}} {{label}} como borrador', + aboutToRestoreCount: 'Estás a punto de restaurar {{count}} {{label}}', + aboutToTrash: + 'Estás a punto de mover la {{label}} <1>{{title}} a la papelera. ¿Estás seguro?', + aboutToTrashCount: 'Estás a punto de mover {{count}} {{label}} a la papelera', addBelow: 'Añadir abajo', addFilter: 'Añadir filtro', adminTheme: 'Tema del admin', @@ -252,6 +266,7 @@ export const esTranslations: DefaultTranslationsObject = { 'Esto eliminará los índices existentes y volverá a indexar los documentos en las colecciones {{collections}}.', confirmReindexDescriptionAll: 'Esto eliminará los índices existentes y volverá a indexar los documentos en todas las colecciones.', + confirmRestoration: 'Confirme la restauración', copied: 'Copiado', copy: 'Copiar', copyField: 'Copiar campo', @@ -272,13 +287,17 @@ export const esTranslations: DefaultTranslationsObject = { dark: 'Oscuro', dashboard: 'Panel de Control', delete: 'Eliminar', + deleted: 'Eliminado', + deletedAt: 'Eliminado En', deletedCountSuccessfully: 'Se eliminaron {{count}} {{label}} correctamente.', deletedSuccessfully: 'Eliminado correctamente.', + deletePermanently: 'Omitir la papelera y eliminar permanentemente', deleting: 'Eliminando...', depth: 'Profundidad', descending: 'Descendente', deselectAllRows: 'Deseleccionar todas las filas', document: 'Documento', + documentIsTrashed: 'Esta {{label}} está en la papelera y es de solo lectura.', documentLocked: 'Documento bloqueado', documents: 'Documentos', duplicate: 'Duplicar', @@ -294,6 +313,8 @@ export const esTranslations: DefaultTranslationsObject = { editLabel: 'Editar {{label}}', email: 'Correo electrónico', emailAddress: 'Dirección de Correo Electrónico', + emptyTrash: 'Vaciar la papelera', + emptyTrashLabel: 'Vaciar la basura {{label}}', enterAValue: 'Introduce un valor', error: 'Error', errors: 'Errores', @@ -342,6 +363,7 @@ export const esTranslations: DefaultTranslationsObject = { 'No se encontró ningún {{label}}. Puede que aún no existan o que no coincidan con los filtros aplicados.', notFound: 'No encontrado', nothingFound: 'No se encontró nada', + noTrashResults: 'No hay {{label}} en la papelera.', noUpcomingEventsScheduled: 'No hay eventos próximos programados.', noValue: 'Sin valor', of: 'de', @@ -355,6 +377,9 @@ export const esTranslations: DefaultTranslationsObject = { pasteField: 'Pegar campo', pasteRow: 'Pegar fila', payloadSettings: 'Configuración de Payload', + permanentlyDelete: 'Eliminar Permanentemente', + permanentlyDeletedCountSuccessfully: + 'Se ha eliminado permanentemente {{count}} {{label}} con éxito.', perPage: 'Por página: {{limit}}', previous: 'Anterior', reindex: 'Reindexar', @@ -366,6 +391,10 @@ export const esTranslations: DefaultTranslationsObject = { resetPreferencesDescription: 'Esto restablecerá todas tus preferencias a los valores predeterminados.', resettingPreferences: 'Restableciendo preferencias...', + restore: 'Restaurar', + restoreAsPublished: 'Restaurar como versión publicada', + restoredCountSuccessfully: 'Restaurado {{count}} {{label}} con éxito.', + restoring: 'Restaurando...', row: 'Fila', rows: 'Filas', save: 'Guardar', @@ -396,6 +425,10 @@ export const esTranslations: DefaultTranslationsObject = { time: 'Hora', timezone: 'Zona horaria', titleDeleted: '{{label}} "{{title}}" eliminado con éxito.', + titleRestored: '{{label}} "{{title}}" restaurado con éxito.', + titleTrashed: '{{label}} "{{title}}" movido a la papelera.', + trash: 'Basura', + trashedCountSuccessfully: '{{count}} {{label}} movido a la papelera.', true: 'Verdadero', unauthorized: 'No autorizado', unsavedChanges: 'Tienes cambios sin guardar. Guarda o descarta antes de continuar.', @@ -414,6 +447,7 @@ export const esTranslations: DefaultTranslationsObject = { username: 'Nombre de usuario', users: 'Usuarios', value: 'Valor', + viewing: 'Visualización', viewReadOnly: 'Ver solo lectura', welcome: 'Bienvenido', yes: 'Sí', @@ -539,6 +573,7 @@ export const esTranslations: DefaultTranslationsObject = { noRowsFound: 'No se encontraron {{label}}.', noRowsSelected: 'No se ha seleccionado ningún {{label}}.', preview: 'Vista previa', + previouslyDraft: 'Previamente un Borrador', previouslyPublished: 'Publicado anteriormente', previousVersion: 'Versión Anterior', problemRestoringVersion: 'Hubo un problema al restaurar esta versión', diff --git a/packages/translations/src/languages/et.ts b/packages/translations/src/languages/et.ts index f15b3adc5..0a7aaa399 100644 --- a/packages/translations/src/languages/et.ts +++ b/packages/translations/src/languages/et.ts @@ -113,6 +113,8 @@ export const etTranslations: DefaultTranslationsObject = { noUser: 'Kasutajat pole', previewing: 'Selle dokumendi eelvaatamisel tekkis probleem.', problemUploadingFile: 'Faili üleslaadimisel tekkis probleem.', + restoringTitle: + 'Ilmnes viga, kui {{title}} taastati. Kontrollige oma ühendust ja proovige uuesti.', tokenInvalidOrExpired: 'Võti on kas vigane või aegunud.', tokenNotProvided: 'Võtit ei esitatud.', unableToCopy: 'Kopeerimine ebaõnnestus.', @@ -212,6 +214,18 @@ export const etTranslations: DefaultTranslationsObject = { aboutToDeleteCount_many: 'Olete kustutamas {{count}} {{label}}', aboutToDeleteCount_one: 'Olete kustutamas {{count}} {{label}}', aboutToDeleteCount_other: 'Olete kustutamas {{count}} {{label}}', + aboutToPermanentlyDelete: + 'Te olete just hakkamas püsivalt kustutama {{label}} <1>{{title}}. Kas olete kindel?', + aboutToPermanentlyDeleteTrash: + 'Te oled püsivalt kustutamas <0>{{count}} <1>{{label}} prügikastist. Kas oled kindel?', + aboutToRestore: 'Te oled taastamas järgnevat {{label}} <1>{{title}}. Kas oled kindel?', + aboutToRestoreAsDraft: + 'Te oled taastamas {{label}} <1>{{title}} mustandina. Kas oled kindel?', + aboutToRestoreAsDraftCount: 'Te oled kohe taastamas {{count}} {{label}} mustandina', + aboutToRestoreCount: 'Te oled taastamas {{count}} {{label}}', + aboutToTrash: + 'Te olete just prügikasti liigutamas {{label}} <1>{{title}}. Kas olete kindel?', + aboutToTrashCount: 'Te oled valmis liigutama {{count}} {{label}} prügikasti.', addBelow: 'Lisa alla', addFilter: 'Lisa filter', adminTheme: 'Administreerimisliidese teema', @@ -245,6 +259,7 @@ export const etTranslations: DefaultTranslationsObject = { 'See eemaldab olemasolevad indeksid ja indekseerib uuesti dokumendid kollektsioonides {{collections}}.', confirmReindexDescriptionAll: 'See eemaldab olemasolevad indeksid ja indekseerib uuesti dokumendid kõigis kollektsioonides.', + confirmRestoration: 'Kinnita taastamine', copied: 'Kopeeritud', copy: 'Kopeeri', copyField: 'Kopeeri väli', @@ -264,13 +279,17 @@ export const etTranslations: DefaultTranslationsObject = { dark: 'Tume', dashboard: 'Töölaud', delete: 'Kustuta', + deleted: 'Kustutatud', + deletedAt: 'Kustutatud', deletedCountSuccessfully: 'Kustutatud {{count}} {{label}} edukalt.', - deletedSuccessfully: 'Edukalt kustutatud.', + deletedSuccessfully: 'Kustutatud edukalt.', + deletePermanently: 'Jäta prügikasti vahele ja kustuta lõplikult', deleting: 'Kustutamine...', depth: 'Sügavus', descending: 'Kahanev', deselectAllRows: 'Tühista kõigi ridade valik', document: 'Dokument', + documentIsTrashed: 'See {{label}} on prügikastis ja on ainult loetav.', documentLocked: 'Dokument lukustatud', documents: 'Dokumendid', duplicate: 'Dubleeri', @@ -286,6 +305,8 @@ export const etTranslations: DefaultTranslationsObject = { editLabel: 'Muuda {{label}}', email: 'E-post', emailAddress: 'E-posti aadress', + emptyTrash: 'Tühjenda prügikast', + emptyTrashLabel: 'Tühjenda {{label}} prügikast', enterAValue: 'Sisesta väärtus', error: 'Viga', errors: 'Vead', @@ -333,6 +354,7 @@ export const etTranslations: DefaultTranslationsObject = { '{{label}} ei leitud. Kas ühtegi {{label}} pole veel olemas või ükski ei vasta ülal määratud filtritele.', notFound: 'Ei leitud', nothingFound: 'Midagi ei leitud', + noTrashResults: 'Pole {{label}} prügikastis.', noUpcomingEventsScheduled: 'Eelseisvaid sündmusi ei ole plaanitud.', noValue: 'Väärtus puudub', of: '/', @@ -346,6 +368,8 @@ export const etTranslations: DefaultTranslationsObject = { pasteField: 'Kleebi väli', pasteRow: 'Kleebi rida', payloadSettings: 'Payload seaded', + permanentlyDelete: 'Püsivalt Kustuta', + permanentlyDeletedCountSuccessfully: '{{count}} {{label}} edukalt ja lõplikult kustutatud.', perPage: 'Lehel: {{limit}}', previous: 'Eelmine', reindex: 'Indekseeri uuesti', @@ -356,6 +380,10 @@ export const etTranslations: DefaultTranslationsObject = { resetPreferences: 'Lähtesta eelistused', resetPreferencesDescription: 'See lähtestab kõik teie eelistused vaikeväärtustele.', resettingPreferences: 'Lähtestan eelistusi.', + restore: 'Taasta', + restoreAsPublished: 'Taasta avaldatud versioonina', + restoredCountSuccessfully: 'Taastatud {{count}} {{label}} edukalt.', + restoring: 'Austades...', row: 'Rida', rows: 'Read', save: 'Salvesta', @@ -386,6 +414,10 @@ export const etTranslations: DefaultTranslationsObject = { time: 'Aeg', timezone: 'Ajavöönd', titleDeleted: '{{label}} "{{title}}" edukalt kustutatud.', + titleRestored: '{{label}} "{{title}}" edukalt taastatud.', + titleTrashed: '{{label}} "{{title}}" viidi prügikasti.', + trash: 'Prügi', + trashedCountSuccessfully: '{{count}} {{label}} kanti prügikasti.', true: 'Tõene', unauthorized: 'Volitamata', unsavedChanges: 'Teil on salvestamata muudatusi. Salvestage või tühistage enne jätkamist.', @@ -404,6 +436,7 @@ export const etTranslations: DefaultTranslationsObject = { username: 'Kasutajanimi', users: 'Kasutajad', value: 'Väärtus', + viewing: 'Vaade', viewReadOnly: 'Vaata ainult lugemiseks', welcome: 'Tere tulemast', yes: 'Jah', @@ -526,6 +559,7 @@ export const etTranslations: DefaultTranslationsObject = { noRowsFound: '{{label}} ei leitud', noRowsSelected: '{{label}} pole valitud', preview: 'Eelvaade', + previouslyDraft: 'Eelnevalt mustand', previouslyPublished: 'Varem avaldatud', previousVersion: 'Eelmine versioon', problemRestoringVersion: 'Selle versiooni taastamisel tekkis probleem', diff --git a/packages/translations/src/languages/fa.ts b/packages/translations/src/languages/fa.ts index 4b6d8db05..12237ecff 100644 --- a/packages/translations/src/languages/fa.ts +++ b/packages/translations/src/languages/fa.ts @@ -113,6 +113,8 @@ export const faTranslations: DefaultTranslationsObject = { noUser: 'بدون کاربر', previewing: 'مشکلی در پیش‌نمایش این رسانه رخ داد.', problemUploadingFile: 'هنگام بارگذاری سند خطایی رخ داد.', + restoringTitle: + 'هنگام بازیابی {{title}} خطایی رخ داد. لطفا اتصال خود را بررسی کرده و دوباره تلاش کنید.', tokenInvalidOrExpired: 'ژتون شما نامعتبر یا منقضی شده است.', tokenNotProvided: 'توکن ارائه نشده است.', unableToCopy: 'کپی امکان‌پذیر نیست.', @@ -211,6 +213,16 @@ export const faTranslations: DefaultTranslationsObject = { aboutToDeleteCount_many: 'شما در حال پاک کردن {{count}} تعداد {{label}} هستید', aboutToDeleteCount_one: 'شما در حال پاک کردن {{count}} تعداد {{label}} هستید', aboutToDeleteCount_other: 'شما در شرف حذف هستید {{count}} {{label}}', + aboutToPermanentlyDelete: 'شما در حال حذف دائمی {{label}} <1>{{title}} هستید. آیا مطمئنید؟', + aboutToPermanentlyDeleteTrash: + 'شما در حال حذف همیشگی <0>{{count}} <1>{{label}} از سطل زباله هستید. آیا مطمئن هستید؟', + aboutToRestore: 'شما در حال بازیابی {{label}} <1>{{title}} هستید. آیا مطمئن هستید؟', + aboutToRestoreAsDraft: + 'شما در حال بازگرداندن {{label}} <1>{{title}} به عنوان پیش‌نویس هستید. آیا مطمئن هستید؟', + aboutToRestoreAsDraftCount: 'شما در حال بازگرداندن {{count}} {{label}} به صورت پیش‌نویس هستید.', + aboutToRestoreCount: 'شما در حال بازیابی {{count}} {{label}} هستید', + aboutToTrash: 'شما در حال حاضر در صدد حذف {{label}} <1>{{title}} هستید. آيا مطمئن هستید؟', + aboutToTrashCount: 'شما در حال حاضر در مورد انتقال {{count}} {{label}} به سطل زباله هستید', addBelow: 'افزودن به زیر', addFilter: 'افزودن علامت', adminTheme: 'پوسته پیشخوان', @@ -245,6 +257,7 @@ export const faTranslations: DefaultTranslationsObject = { 'این کار ایندکس‌های موجود را حذف کرده و اسناد را در مجموعه‌های {{collections}} بازایندکس می‌کند.', confirmReindexDescriptionAll: 'این کار ایندکس‌های موجود را حذف کرده و اسناد را در همه مجموعه‌ها بازایندکس می‌کند.', + confirmRestoration: 'تأیید بازیابی', copied: 'رونوشت شده', copy: 'رونوشت', copyField: 'کپی فیلد', @@ -265,13 +278,17 @@ export const faTranslations: DefaultTranslationsObject = { dark: 'تاریک', dashboard: 'پیشخوان', delete: 'حذف', + deleted: 'حذف شد', + deletedAt: 'حذف شده در', deletedCountSuccessfully: 'تعداد {{count}} {{label}} با موفقیت پاک گردید.', deletedSuccessfully: 'با موفقیت حذف شد.', + deletePermanently: 'پرش از سطل زباله و حذف دائمی', deleting: 'در حال حذف...', depth: 'عمق', descending: 'رو به پایین', deselectAllRows: 'تمام سطرها را از انتخاب خارج کنید', document: 'سند', + documentIsTrashed: 'این {{label}} حذف شده و فقط قابل خواندن است.', documentLocked: 'سند قفل شده است', documents: 'اسناد', duplicate: 'تکراری', @@ -287,6 +304,8 @@ export const faTranslations: DefaultTranslationsObject = { editLabel: 'نگارش {{label}}', email: 'رایانامه', emailAddress: 'نشانی رایانامه', + emptyTrash: 'خالی کردن سطل زباله', + emptyTrashLabel: 'خالی کردن سطل زباله {{label}}', enterAValue: 'یک مقدار وارد کنید', error: 'خطا', errors: 'خطاها', @@ -335,6 +354,7 @@ export const faTranslations: DefaultTranslationsObject = { 'هیچ {{label}} یافت نشد. {{label}} یا هنوز وجود ندارد یا هیچ کدام با علامت‌گذاری‌هایی که در بالا مشخص کرده اید مطابقت ندارد.', notFound: 'یافت نشد', nothingFound: 'چیزی یافت نشد', + noTrashResults: 'به زباله‌دان {{label}} موجود نیست.', noUpcomingEventsScheduled: 'هیچ رویدادی در دست نیست.', noValue: 'بدون مقدار', of: 'از', @@ -348,6 +368,8 @@ export const faTranslations: DefaultTranslationsObject = { pasteField: 'چسباندن فیلد', pasteRow: 'چسباندن ردیف', payloadSettings: 'تنظیمات پی‌لود', + permanentlyDelete: 'حذف دائم', + permanentlyDeletedCountSuccessfully: '{{count}} {{label}} با موفقیت حذف همیشگی شد.', perPage: 'هر برگه: {{limit}}', previous: 'قبلی', reindex: 'بازنمایه‌سازی', @@ -358,6 +380,11 @@ export const faTranslations: DefaultTranslationsObject = { resetPreferences: 'بازنشانی تنظیمات', resetPreferencesDescription: 'این تمام تنظیمات شما را به تنظیمات پیش‌فرض بازنشانی خواهد کرد.', resettingPreferences: 'در حال بازنشانی تنظیمات.', + restore: 'بازیابی', + restoreAsPublished: 'بازگردانی به عنوان نسخه منتشر شده', + restoredCountSuccessfully: '{{count}} {{label}} با موفقیت بازیابی شد.', + restoring: + 'درک معنی متن اصلی در زمینه Payload. در اینجا لیستی از اصطلاحات متداول Payload که معانی خاص خاص خود را دارند:\n- مجموعه: مجموعه گروهی از اسناد است که ساختار و هدف مشترکی را به اشتراک می‌گذارند. مجموعه‌ها برای سازماندهی و مدیر', row: 'ردیف', rows: 'ردیف‌ها', save: 'ذخیره', @@ -388,6 +415,10 @@ export const faTranslations: DefaultTranslationsObject = { time: 'زمان', timezone: 'منطقه زمانی', titleDeleted: '{{label}} "{{title}}" با موفقیت پاک شد.', + titleRestored: '{{label}} "{{title}}" با موفقیت بازیابی شد.', + titleTrashed: '{{label}} "{{title}}" به سطل زباله منتقل شد.', + trash: 'زباله', + trashedCountSuccessfully: '{{count}} {{label}} به سطل زباله منتقل شد.', true: 'درست', unauthorized: 'غیرمجاز', unsavedChanges: 'تغییرات ذخیره نشده ای دارید. قبل از ادامه ذخیره کنید یا رد کنید.', @@ -406,6 +437,7 @@ export const faTranslations: DefaultTranslationsObject = { username: 'نام کاربری', users: 'کاربران', value: 'مقدار', + viewing: 'مشاهده', viewReadOnly: 'فقط برای خواندن مشاهده کنید', welcome: 'خوش‌آمدید', yes: 'بله', @@ -529,6 +561,7 @@ export const faTranslations: DefaultTranslationsObject = { noRowsFound: 'هیچ {{label}} یافت نشد', noRowsSelected: 'هیچ {{label}} ای انتخاب نشده است', preview: 'پیش‌نمایش', + previouslyDraft: 'قبلا یک پیش‌نویس', previouslyPublished: 'قبلا منتشر شده', previousVersion: 'نسخه قبلی', problemRestoringVersion: 'مشکلی در بازیابی این نگارش وجود دارد', diff --git a/packages/translations/src/languages/fr.ts b/packages/translations/src/languages/fr.ts index 926a9917b..1c908c850 100644 --- a/packages/translations/src/languages/fr.ts +++ b/packages/translations/src/languages/fr.ts @@ -117,6 +117,8 @@ export const frTranslations: DefaultTranslationsObject = { noUser: 'Aucun utilisateur', 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.', + restoringTitle: + 'Il y a eu une erreur lors de la restauration de {{title}}. Veuillez vérifier votre connexion et réessayer.', tokenInvalidOrExpired: 'Le jeton n’est soit pas valide ou a expiré.', tokenNotProvided: 'Jeton non fourni.', unableToCopy: 'Impossible de copier.', @@ -221,6 +223,20 @@ export const frTranslations: DefaultTranslationsObject = { 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}}', + aboutToPermanentlyDelete: + 'Vous êtes sur le point de supprimer définitivement le {{label}} <1>{{title}}. Êtes-vous sûr ?', + aboutToPermanentlyDeleteTrash: + 'Vous êtes sur le point de supprimer définitivement <0>{{count}} <1>{{label}} de la corbeille. Êtes-vous sûr ?', + aboutToRestore: + 'Vous êtes sur le point de restaurer le {{label}} <1>{{title}}. Êtes-vous sûr ?', + aboutToRestoreAsDraft: + 'Vous êtes sur le point de restaurer le {{label}} <1>{{title}} en tant que brouillon. Êtes-vous sûr?', + aboutToRestoreAsDraftCount: + 'Vous êtes sur le point de restaurer {{count}} {{label}} en tant que brouillon', + aboutToRestoreCount: 'Vous êtes sur le point de restaurer {{count}} {{label}}', + aboutToTrash: + 'Vous êtes sur le point de déplacer le {{label}} <1>{{title}} dans la corbeille. Êtes-vous sûr ?', + aboutToTrashCount: 'Vous êtes sur le point de déplacer {{count}} {{label}} à la corbeille', addBelow: 'Ajoutez ci-dessous', addFilter: 'Ajouter un filtre', adminTheme: 'Thème d’administration', @@ -255,6 +271,7 @@ export const frTranslations: DefaultTranslationsObject = { 'Cela supprimera les index existants et réindexera les documents dans les collections {{collections}}.', confirmReindexDescriptionAll: 'Cela supprimera les index existants et réindexera les documents dans toutes les collections.', + confirmRestoration: 'Confirmer la restauration', copied: 'Copié', copy: 'Copie', copyField: 'Copier le champ', @@ -275,13 +292,17 @@ export const frTranslations: DefaultTranslationsObject = { dark: 'Sombre', dashboard: 'Tableau de bord', delete: 'Supprimer', + deleted: 'Supprimé', + deletedAt: 'Supprimé à', deletedCountSuccessfully: '{{count}} {{label}} supprimé avec succès.', deletedSuccessfully: 'Supprimé(e) avec succès.', + deletePermanently: 'Ignorer la corbeille et supprimer définitivement', deleting: 'Suppression en cours...', depth: 'Profondeur', descending: 'Descendant(e)', deselectAllRows: 'Désélectionner toutes les lignes', document: 'Document', + documentIsTrashed: 'Ce {{label}} est mis à la corbeille et est en lecture seule.', documentLocked: 'Document verrouillé', documents: 'Documents', duplicate: 'Dupliquer', @@ -297,6 +318,8 @@ export const frTranslations: DefaultTranslationsObject = { editLabel: 'Modifier {{label}}', email: 'E-mail', emailAddress: 'Adresse e-mail', + emptyTrash: 'Vider la corbeille', + emptyTrashLabel: 'Vider la corbeille {{label}}', enterAValue: 'Entrez une valeur', error: 'Erreur', errors: 'Erreurs', @@ -345,6 +368,7 @@ export const frTranslations: DefaultTranslationsObject = { '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', notFound: 'Pas trouvé', nothingFound: 'Rien n’a été trouvé', + noTrashResults: 'Aucun {{label}} dans la corbeille.', noUpcomingEventsScheduled: 'Aucun événement à venir prévu.', noValue: 'Aucune valeur', of: 'de', @@ -358,6 +382,8 @@ export const frTranslations: DefaultTranslationsObject = { pasteField: 'Coller le champ', pasteRow: 'Coller la ligne', payloadSettings: 'Paramètres de Payload', + permanentlyDelete: 'Supprimer définitivement', + permanentlyDeletedCountSuccessfully: 'Supprimé définitivement {{count}} {{label}} avec succès.', perPage: 'Par Page: {{limit}}', previous: 'Précédent', reindex: 'Réindexer', @@ -369,6 +395,10 @@ export const frTranslations: DefaultTranslationsObject = { resetPreferencesDescription: 'Cela réinitialisera toutes vos préférences aux paramètres par défaut.', resettingPreferences: 'Réinitialisation des préférences.', + restore: 'Restaurer', + restoreAsPublished: 'Restaurer en tant que version publiée', + restoredCountSuccessfully: '{{count}} {{label}} restauré avec succès.', + restoring: 'Restauration...', row: 'Ligne', rows: 'Lignes', save: 'Sauvegarder', @@ -399,6 +429,10 @@ export const frTranslations: DefaultTranslationsObject = { time: 'Temps', timezone: 'Fuseau horaire', titleDeleted: '{{label}} "{{title}}" supprimé(e) avec succès.', + titleRestored: '{{label}} "{{title}}" restauré avec succès.', + titleTrashed: '{{label}} "{{title}}" déplacé vers la corbeille.', + trash: 'Corbeille', + trashedCountSuccessfully: '{{count}} {{label}} déplacé à la corbeille.', true: 'Vrai', unauthorized: 'Non autorisé', unsavedChanges: @@ -419,6 +453,7 @@ export const frTranslations: DefaultTranslationsObject = { username: "Nom d'utilisateur", users: 'Utilisateurs', value: 'Valeur', + viewing: 'Visualisation', viewReadOnly: 'Afficher en lecture seule', welcome: 'Bienvenue', yes: 'Oui', @@ -547,6 +582,7 @@ export const frTranslations: DefaultTranslationsObject = { noRowsFound: 'Aucun(e) {{label}} trouvé(e)', noRowsSelected: 'Aucune {{étiquette}} sélectionnée', preview: 'Aperçu', + previouslyDraft: 'Précédemment un Brouillon', previouslyPublished: 'Précédemment publié', previousVersion: 'Version Précédente', problemRestoringVersion: 'Un problème est survenu lors de la restauration de cette version', diff --git a/packages/translations/src/languages/he.ts b/packages/translations/src/languages/he.ts index 394335db6..dc372ad11 100644 --- a/packages/translations/src/languages/he.ts +++ b/packages/translations/src/languages/he.ts @@ -111,6 +111,7 @@ export const heTranslations: DefaultTranslationsObject = { noUser: 'אין משתמש', previewing: 'אירעה בעיה בתצוגה מקדימה של מסמך זה.', problemUploadingFile: 'אירעה בעיה בזמן העלאת הקובץ.', + restoringTitle: 'אירעה שגיאה בעת שחזור {{title}}. אנא בדוק את החיבור שלך ונסה שוב.', tokenInvalidOrExpired: 'הטוקן אינו תקין או שפג תוקפו.', tokenNotProvided: 'טוקן לא סופק.', unableToCopy: 'לא ניתן להעתיק.', @@ -207,6 +208,16 @@ export const heTranslations: DefaultTranslationsObject = { aboutToDeleteCount_many: 'אתה עומד למחוק {{count}} {{label}}', aboutToDeleteCount_one: 'אתה עומד למחוק {{label}} אחד', aboutToDeleteCount_other: 'אתה עומד למחוק {{count}} {{label}}', + aboutToPermanentlyDelete: + 'אתה עומד למחוק לצמיתות את ה{{label}} <1>{{title}}. האם אתה בטוח?', + aboutToPermanentlyDeleteTrash: + 'אתה עומד למחוק לצמיתות <0>{{count}} <1>{{label}} מהאשפה. האם אתה בטוח?', + aboutToRestore: 'אתה עומד לשחזר את {{label}} <1>{{title}}. האם אתה בטוח?', + aboutToRestoreAsDraft: 'אתה עומד לשחזר את ה{{label}} <1>{{title}} כטיוטה. האם אתה בטוח?', + aboutToRestoreAsDraftCount: 'אתה עומד לשחזר {{count}} {{label}} כטיוטה', + aboutToRestoreCount: 'אתה עומד לשחזר {{count}} {{label}}', + aboutToTrash: 'אתה עומד להעביר את ה{{label}} <1>{{title}} לפח. האם אתה בטוח?', + aboutToTrashCount: 'אתה עומד להעביר {{count}} {{label}} לפח אשפה', addBelow: 'הוסף מתחת', addFilter: 'הוסף מסנן', adminTheme: 'ערכת נושא ממשק הניהול', @@ -240,6 +251,7 @@ export const heTranslations: DefaultTranslationsObject = { confirmReindexDescription: 'זה יסיר את האינדקסים הקיימים ויחזיר אינדקס למסמכים באוספים {{collections}}.', confirmReindexDescriptionAll: 'זה יסיר את האינדקסים הקיימים ויחזיר אינדקס למסמכים בכל האוספים.', + confirmRestoration: 'אשר שחזור', copied: 'הועתק', copy: 'העתק', copyField: 'העתק שדה', @@ -260,13 +272,17 @@ export const heTranslations: DefaultTranslationsObject = { dark: 'כהה', dashboard: 'לוח מחוונים', delete: 'מחיקה', + deleted: 'נמחק', + deletedAt: 'נמחק ב', deletedCountSuccessfully: 'נמחקו {{count}} {{label}} בהצלחה.', deletedSuccessfully: 'נמחק בהצלחה.', + deletePermanently: 'דלג על פח האשפה ומחק לצמיתות', deleting: 'מוחק...', depth: 'עומק', descending: 'בסדר יורד', deselectAllRows: 'בטל בחירת כל השורות', document: 'מסמך', + documentIsTrashed: 'ה{{label}} הזה במיחזור ובמצב לקריאה בלבד.', documentLocked: 'המסמך ננעל', documents: 'מסמכים', duplicate: 'שכפול', @@ -282,6 +298,8 @@ export const heTranslations: DefaultTranslationsObject = { editLabel: 'עריכת {{label}}', email: 'דוא"ל', emailAddress: 'כתובת דוא"ל', + emptyTrash: 'רוקן את הזבל', + emptyTrashLabel: 'רוקן את האשפה {{label}}', enterAValue: 'הזן ערך', error: 'שגיאה', errors: 'שגיאות', @@ -328,6 +346,7 @@ export const heTranslations: DefaultTranslationsObject = { noResults: 'לא נמצאו {{label}}. אין עדיין {{label}}, או שאינם תואמים למסננים שנבחרו.', notFound: 'לא נמצא', nothingFound: 'לא נמצא כלום', + noTrashResults: 'אין {{label}} בפח.', noUpcomingEventsScheduled: 'אין אירועים מתוכנתים בהמשך.', noValue: 'אין ערך', of: 'מתוך', @@ -341,6 +360,8 @@ export const heTranslations: DefaultTranslationsObject = { pasteField: 'הדבק שדה', pasteRow: 'הדבק שורה', payloadSettings: 'הגדרות מערכת Payload', + permanentlyDelete: 'מחק לצמיתות', + permanentlyDeletedCountSuccessfully: 'נמחקו לצמיתות {{count}} {{label}} בהצלחה.', perPage: '{{limit}} בכל עמוד', previous: 'קודם', reindex: 'החזרת אינדקס', @@ -351,6 +372,11 @@ export const heTranslations: DefaultTranslationsObject = { resetPreferences: 'איפוס העדפות', resetPreferencesDescription: 'זאת תאפס את כל ההעדפות שלך להגדרות ברירת המחדל.', resettingPreferences: 'מאפס העדפות.', + restore: 'שחזור', + restoreAsPublished: 'שחזר כגרסה שפורסמה', + restoredCountSuccessfully: 'שוחזרו בהצלחה {{count}} {{label}}.', + restoring: + 'שמעו למשמעות של הטקסט המקורי בהקשר של Payload. הנה רשימה של מונחים נפוצים של Payload שנושאים משמעויות מאוד מסוימות:\n- אוסף: אוסף הוא קבוצה של מסמכים ששותפים למבנה ולמטרה מש', row: 'שורה', rows: 'שורות', save: 'שמירה', @@ -381,6 +407,10 @@ export const heTranslations: DefaultTranslationsObject = { time: 'זמן', timezone: 'אזור זמן', titleDeleted: '{{label}} "{{title}}" נמחק בהצלחה.', + titleRestored: 'התווית "{{title}}" שוחזרה בהצלחה.', + titleTrashed: '{{label}} "{{title}}" הועבר לפח.', + trash: 'זבל', + trashedCountSuccessfully: '{{count}} {{label}} הועברו לפח.', true: 'True', unauthorized: 'אין הרשאה', unsavedChanges: 'יש לך שינויים שלא נשמרו. שמור או מחק לפני שתמשיך.', @@ -399,6 +429,7 @@ export const heTranslations: DefaultTranslationsObject = { username: 'שם משתמש', users: 'משתמשים', value: 'ערך', + viewing: 'צפיה', viewReadOnly: 'הצג קריאה בלבד', welcome: 'ברוך הבא', yes: 'כן', @@ -517,6 +548,7 @@ export const heTranslations: DefaultTranslationsObject = { noRowsFound: 'לא נמצאו {{label}}', noRowsSelected: 'לא נבחר {{תווית}}', preview: 'תצוגה מקדימה', + previouslyDraft: 'לשעבר טיוטה', previouslyPublished: 'פורסם בעבר', previousVersion: 'גרסה קודמת', problemRestoringVersion: 'הייתה בעיה בשחזור הגרסה הזו', diff --git a/packages/translations/src/languages/hr.ts b/packages/translations/src/languages/hr.ts index 5f2b7d7db..0276b3c5f 100644 --- a/packages/translations/src/languages/hr.ts +++ b/packages/translations/src/languages/hr.ts @@ -115,6 +115,8 @@ export const hrTranslations: DefaultTranslationsObject = { noUser: 'Nema korisnika', previewing: 'Došlo je do problema pri pregledavanju ovog dokumenta.', problemUploadingFile: 'Došlo je do problema pri učitavanju datoteke.', + restoringTitle: + 'Došlo je do pogreške prilikom vraćanja {{title}}. Provjerite svoju vezu i pokušajte ponovno.', tokenInvalidOrExpired: 'Token je neispravan ili je istekao.', tokenNotProvided: 'Token nije pružen.', unableToCopy: 'Nije moguće kopirati.', @@ -215,6 +217,17 @@ export const hrTranslations: DefaultTranslationsObject = { aboutToDeleteCount_many: 'Upravo ćete izbrisati {{count}} {{label}}', aboutToDeleteCount_one: 'Upravo ćete izbrisati {{count}} {{label}}', aboutToDeleteCount_other: 'Upravo ćete izbrisati {{count}} {{label}}', + aboutToPermanentlyDelete: + 'Na rubu ste trajnog brisanja {{label}} <1>{{title}}. Jeste li sigurni?', + aboutToPermanentlyDeleteTrash: + 'Na rubu ste trajnog brisanja <0>{{count}} <1>{{label}} iz smeća. Jeste li sigurni?', + aboutToRestore: 'Na rubu ste obnoviti {{label}} <1>{{title}}. Jeste li sigurni?', + aboutToRestoreAsDraft: + 'Uskoro ćete vratiti {{label}} <1>{{title}} kao skicu. Jeste li sigurni?', + aboutToRestoreAsDraftCount: 'Uskoro ćete obnoviti {{count}} {{label}} kao nacrt', + aboutToRestoreCount: 'Uskoro ćete obnoviti {{count}} {{label}}', + aboutToTrash: 'Na rubu ste premještanja {{label}} <1>{{title}} u otpad. Jeste li sigurni?', + aboutToTrashCount: 'Na korak ste od premještanja {{count}} {{label}} u smeće', addBelow: 'Dodaj ispod', addFilter: 'Dodaj filter', adminTheme: 'Administratorska tema', @@ -248,6 +261,7 @@ export const hrTranslations: DefaultTranslationsObject = { 'Ovo će ukloniti postojeće indekse i ponovno indeksirati dokumente u {{collections}} kolekcijama.', confirmReindexDescriptionAll: 'Ovo će ukloniti postojeće indekse i ponovno indeksirati dokumente u svim kolekcijama.', + confirmRestoration: 'Potvrdite obnovu', copied: 'Kopirano', copy: 'Kopiraj', copyField: 'Kopiraj polje', @@ -268,13 +282,17 @@ export const hrTranslations: DefaultTranslationsObject = { dark: 'Tamno', dashboard: 'Nadzorna ploča', delete: 'Izbriši', + deleted: 'Izbrisano', + deletedAt: 'Izbrisano U', deletedCountSuccessfully: 'Uspješno izbrisano {{count}} {{label}}.', deletedSuccessfully: 'Uspješno izbrisano.', + deletePermanently: 'Preskoči koš i trajno izbriši', deleting: 'Brisanje...', depth: 'Dubina', descending: 'Silazno', deselectAllRows: 'Odznači sve redove', document: 'Dokument', + documentIsTrashed: 'Ova {{label}} je u smeću i dostupna je samo za čitanje.', documentLocked: 'Dokument je zaključan', documents: 'Dokumenti', duplicate: 'Duplikat', @@ -290,6 +308,8 @@ export const hrTranslations: DefaultTranslationsObject = { editLabel: 'Uredi {{label}}', email: 'Email', emailAddress: 'Email adresa', + emptyTrash: 'Isprazni smeće', + emptyTrashLabel: 'Isprazni {{label}} kantu za smeće', enterAValue: 'Unesi vrijednost', error: 'Greška', errors: 'Greške', @@ -338,6 +358,7 @@ export const hrTranslations: DefaultTranslationsObject = { 'Nije pronađen nijedan {{label}}. Ili {{label}} još uvijek ne postoji ili nijedan od odgovara postavljenim filterima.', notFound: 'Nije pronađeno', nothingFound: 'Ništa nije pronađeno', + noTrashResults: 'Nema {{label}} u smeću.', noUpcomingEventsScheduled: 'Nema zakazanih nadolazećih događanja.', noValue: 'Bez vrijednosti', of: 'od', @@ -351,6 +372,8 @@ export const hrTranslations: DefaultTranslationsObject = { pasteField: 'Zalijepi polje', pasteRow: 'Zalijepi redak', payloadSettings: 'Payload postavke', + permanentlyDelete: 'Trajno izbriši', + permanentlyDeletedCountSuccessfully: 'Trajno izbrisano {{count}} {{label}} uspješno.', perPage: 'Po stranici: {{limit}}', previous: 'Prethodni', reindex: 'Ponovno indeksiraj', @@ -361,6 +384,11 @@ export const hrTranslations: DefaultTranslationsObject = { resetPreferences: 'Ponovno postavljanje postavki', resetPreferencesDescription: 'Ovo će vratiti sve vaše postavke na zadane vrijednosti.', resettingPreferences: 'Ponovno postavljanje postavki.', + restore: 'Obnovi', + restoreAsPublished: 'Vrati kao objavljenu verziju', + restoredCountSuccessfully: 'Uspješno obnovljeno {{count}} {{label}}.', + restoring: + 'Poštujte značenje izvornog teksta unutar konteksta Payloada. Evo popisa uobičajenih pojmova Payloada koji imaju vrlo specifična značenja:\n - Kolekcija: Kolekcija je skup dokumenata koji dijele zajedničku strukturu i svrhu. Kolekcije se koriste za organiziranje i upravljanje sadržajem u Payloadu.\n - Polje: Polje je specifičan dio podataka unutar dokumenta u kolekciji. Polja definiraju strukturu i vrstu podataka koji', row: 'Red', rows: 'Redovi', save: 'Spremi', @@ -391,6 +419,10 @@ export const hrTranslations: DefaultTranslationsObject = { time: 'Vrijeme', timezone: 'Vremenska zona', titleDeleted: '{{label}} "{{title}}" uspješno izbrisano.', + titleRestored: '{{label}} "{{title}}" uspješno je obnovljeno.', + titleTrashed: '{{label}} "{{title}}" premješteno u smeće.', + trash: 'Otpad', + trashedCountSuccessfully: '{{count}} {{label}} premješteno u smeće.', true: 'Istinito', unauthorized: 'Neovlašteno', unsavedChanges: 'Imate nespremljene promjene. Spremite ili odbacite prije nastavka.', @@ -409,6 +441,7 @@ export const hrTranslations: DefaultTranslationsObject = { username: 'Korisničko ime', users: 'Korisnici', value: 'Vrijednost', + viewing: 'Pregledavanje', viewReadOnly: 'Pogledaj samo za čitanje', welcome: 'Dobrodošli', yes: 'Da', @@ -531,6 +564,7 @@ export const hrTranslations: DefaultTranslationsObject = { noRowsFound: '{{label}} nije pronađeno', noRowsSelected: 'Nije odabrana {{oznaka}}', preview: 'Pregled', + previouslyDraft: 'Prethodno Nacrt', previouslyPublished: 'Prethodno objavljeno', previousVersion: 'Prethodna verzija', problemRestoringVersion: 'Nastao je problem pri vraćanju ove verzije', diff --git a/packages/translations/src/languages/hu.ts b/packages/translations/src/languages/hu.ts index 7cad548bb..a7d7d37d7 100644 --- a/packages/translations/src/languages/hu.ts +++ b/packages/translations/src/languages/hu.ts @@ -116,6 +116,8 @@ export const huTranslations: DefaultTranslationsObject = { noUser: 'Nincs felhasználó', 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.', + restoringTitle: + 'Hiba történt a {{title}} visszaállítása közben. Kérjük, ellenőrizze az internetkapcsolatát, és próbálkozzon újra.', tokenInvalidOrExpired: 'A token érvénytelen vagy lejárt.', tokenNotProvided: 'Token nem biztosított.', unableToCopy: 'Másolás nem lehetséges.', @@ -216,6 +218,19 @@ export const huTranslations: DefaultTranslationsObject = { 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}}', + aboutToPermanentlyDelete: + 'Ön véglegesen törölni készül a következőt: {{label}} <1>{{title}}. Biztos benne?', + aboutToPermanentlyDeleteTrash: + 'Ön véglegesen törölni készül <0>{{count}} <1>{{label}} elemet a szemetesből. Biztos benne?', + aboutToRestore: + 'Ön helyreállítja a következőt: {{label}} <1>{{title}}. Biztosan így szeretné?', + aboutToRestoreAsDraft: + 'Ön azzal készül, hogy a következőt: {{label}} <1>{{title}}, vázlatként állítja vissza. Biztos benne?', + aboutToRestoreAsDraftCount: 'Ön hamarosan visszaállít {{count}} {{label}}-t mint vázlat', + aboutToRestoreCount: 'Ön a következők visszaállítására készül: {{count}} {{label}}', + aboutToTrash: + 'Ön azon van, hogy a következőt: {{label}} <1>{{title}} áthelyezze a szemetesbe. Biztos benne?', + aboutToTrashCount: 'Ön a(z) {{count}} {{label}} elemet készül a kukába helyezni.', addBelow: 'Hozzáadás lent', addFilter: 'Szűrő hozzáadása', adminTheme: 'Admin téma', @@ -250,6 +265,7 @@ export const huTranslations: DefaultTranslationsObject = { 'Ez eltávolítja a meglévő indexeket, és újraindexálja a dokumentumokat a {{collections}} gyűjteményekben.', confirmReindexDescriptionAll: 'Ez eltávolítja a meglévő indexeket, és újraindexálja a dokumentumokat az összes gyűjteményben.', + confirmRestoration: 'Megerősíti a helyreállítást?', copied: 'Másolva', copy: 'Másolás', copyField: 'Mező másolása', @@ -270,13 +286,17 @@ export const huTranslations: DefaultTranslationsObject = { dark: 'Sötét', dashboard: 'Irányítópult', delete: 'Törlés', + deleted: 'Törölt', + deletedAt: 'Törölve Ekkor', deletedCountSuccessfully: '{{count}} {{label}} sikeresen törölve.', deletedSuccessfully: 'Sikeresen törölve.', + deletePermanently: 'Hagyja ki a kukát és törölje véglegesen', deleting: 'Törlés...', depth: 'Mélység', descending: 'Csökkenő', deselectAllRows: 'Jelölje ki az összes sort', document: 'Dokumentum', + documentIsTrashed: 'Ez a {{label}} szemétdobozba került, és csak olvasható.', documentLocked: 'A dokumentum zárolva van', documents: 'Dokumentumok', duplicate: 'Duplikálás', @@ -292,6 +312,8 @@ export const huTranslations: DefaultTranslationsObject = { editLabel: '{{label}} szerkesztése', email: 'E-mail', emailAddress: 'E-mail cím', + emptyTrash: 'Ürítse ki a szemetet', + emptyTrashLabel: 'Ürítse ki a {{label}} szemetest', enterAValue: 'Adjon meg egy értéket', error: 'Hiba', errors: 'Hibák', @@ -339,6 +361,7 @@ export const huTranslations: DefaultTranslationsObject = { 'Nem találtunk {{label}}. Vagy még nem létezik {{label}}, vagy egyik sem felel meg a fent megadott szűrőknek.', notFound: 'Nem található', nothingFound: 'Nincs találat', + noTrashResults: 'Nincs {{label}} a szemetesben.', noUpcomingEventsScheduled: 'Nincsenek közelgő események.', noValue: 'Nincs érték', of: 'a', @@ -352,6 +375,8 @@ export const huTranslations: DefaultTranslationsObject = { pasteField: 'Mező beillesztése', pasteRow: 'Sor beillesztése', payloadSettings: 'Payload beállítások', + permanentlyDelete: 'Végleges Törlés', + permanentlyDeletedCountSuccessfully: 'Véglegesen törölt {{count}} {{label}} sikeresen.', perPage: 'Oldalanként: {{limit}}', previous: 'Előző', reindex: 'Újraindexelés', @@ -363,6 +388,11 @@ export const huTranslations: DefaultTranslationsObject = { resetPreferencesDescription: 'Ez visszaállítja az összes beállítást az alapértelmezett értékekre.', resettingPreferences: 'Beállítások visszaállítása.', + restore: 'Visszaállítás', + restoreAsPublished: 'Állítsa vissza közzétett változatként', + restoredCountSuccessfully: 'Sikeresen visszaállított {{count}} {{label}}.', + restoring: + 'Tartsa tiszteletben az eredeti szöveg jelentését a Payload kontextusában. Íme egy lista a Payloadban gyakran használt kifejezésekről, amelyek rendkívül specifikus jelentéssel bírnak:\n - Gyűjtemény: A gyűjtemény egy olyan dokumentumcsoport, amelyek közös struktúrával és céllal rendelkeznek. A gyűjteményeket a tartalom szervezésére és kezelésére használjuk a Payloadban.\n - Mező', row: 'Sor', rows: 'Sorok', save: 'Mentés', @@ -393,6 +423,10 @@ export const huTranslations: DefaultTranslationsObject = { time: 'Idő', timezone: 'Időzóna', titleDeleted: '{{label}} "{{title}}" sikeresen törölve.', + titleRestored: '"{{label}}" "{{title}}" sikeresen visszaállítva.', + titleTrashed: '"{{label}}" "{{title}}" a szemétbe került.', + trash: 'Szemét', + trashedCountSuccessfully: '{{count}} {{label}} átkerült a szemeteskukába.', true: 'Igaz', unauthorized: 'Jogosulatlan', unsavedChanges: 'Vannak mentetlen változtatásai. Mentsen vagy dobja el mielőtt folytatja.', @@ -411,6 +445,7 @@ export const huTranslations: DefaultTranslationsObject = { username: 'Felhasználónév', users: 'Felhasználók', value: 'Érték', + viewing: 'Megtekintés', viewReadOnly: 'Csak olvasható nézet', welcome: 'Üdvözöljük', yes: 'Igen', @@ -538,6 +573,7 @@ export const huTranslations: DefaultTranslationsObject = { noRowsFound: 'Nem található {{label}}', noRowsSelected: 'Nincs {{címke}} kiválasztva', preview: 'Előnézet', + previouslyDraft: 'Korábban egy Vázlat', previouslyPublished: 'Korábban Közzétéve', previousVersion: 'Előző Verzió', problemRestoringVersion: 'Hiba történt a verzió visszaállításakor', diff --git a/packages/translations/src/languages/hy.ts b/packages/translations/src/languages/hy.ts index c35a99517..4b3843940 100644 --- a/packages/translations/src/languages/hy.ts +++ b/packages/translations/src/languages/hy.ts @@ -114,6 +114,8 @@ export const hyTranslations: DefaultTranslationsObject = { noUser: 'Օգտատեր չկա', previewing: 'Այս փաստաթուղթը նախադիտելու ժամանակ խնդիր է առաջացել։', problemUploadingFile: 'Ֆայլը վերբեռնելու ժամանակ խնդիր է առաջացել։', + restoringTitle: + 'Սխալ է տեղի ունեցել {{title}}-ի վերականգնելիս: Խնդրում ենք ստուգել ձեր կապը և կրկին փորձել:', tokenInvalidOrExpired: 'Թոքենն անվավեր է կամ ժամկետանց։', tokenNotProvided: 'Թոքենը տրամադրված չէ։', unableToCopy: 'Չհաջողվեց պատճենել։', @@ -214,6 +216,17 @@ export const hyTranslations: DefaultTranslationsObject = { aboutToDeleteCount_many: 'Դուք պատրաստվում եք ջնջել {{count}} {{label}}', aboutToDeleteCount_one: 'Դուք պատրաստվում եք ջնջել {{count}} {{label}}', aboutToDeleteCount_other: 'Դուք պատրաստվում եք ջնջել {{count}} {{label}}', + aboutToPermanentlyDelete: + 'Դուք պատրաստ եք հաստատականորեն ջնջել {{label}} <1>{{title}}։ Արդյոք վստահ եք:', + aboutToPermanentlyDeleteTrash: + 'Դուք պատրաստ եք ընդմիշտ ջնջել <0>{{count}} <1>{{label}} աղբավաղուց։ Վստահ եք։', + aboutToRestore: 'Մոտեցել եք {{label}} <1>{{title}} վերականգնելուն։ Համոզված ե՞ք։', + aboutToRestoreAsDraft: + 'Ձեր մտադրությունը վերականգնել է {{label}} <1>{{title}} նախագծի որպես: Վստահ եք:', + aboutToRestoreAsDraftCount: 'Դուք պատրաստ եք վերականգնել {{count}} {{label}} նախագծի որպես', + aboutToRestoreCount: 'Դուք պատրաստ եք վերականգնել {{count}} {{label}}', + aboutToTrash: 'Դուք պատրաստ եք տեղափոխել {{label}} <1>{{title}}-ը աղբականջը։ Վստահ եք։', + aboutToTrashCount: 'Դուք պատրաստ եք տեղափոխել {{count}} {{label}} աղբամանը', addBelow: 'Ավելացնել ներքևում', addFilter: 'Ավելացնել ֆիլտր', adminTheme: 'Կառավարման թեմա', @@ -249,6 +262,7 @@ export const hyTranslations: DefaultTranslationsObject = { 'Սա կհեռացնի գոյություն ունեցող ինդեքսները և կվերաինդեքսավորի փաստաթղթերը {{collections}} հավաքածուներում։', confirmReindexDescriptionAll: 'Սա կհեռացնի գոյություն ունեցող ինդեքսները և կվերաինդեքսավորի փաստաթղթերը բոլոր հավաքածուներում։', + confirmRestoration: 'Հաստատեք վերականգնումը', copied: 'Պատճենված', copy: 'Պատճենել', copyField: 'Պատճենել դաշտը', @@ -269,13 +283,17 @@ export const hyTranslations: DefaultTranslationsObject = { dark: 'Մուգ', dashboard: 'Վահանակ', delete: 'Ջնջել', + deleted: 'Ջնջված', + deletedAt: 'Ջնջված է', deletedCountSuccessfully: '{{count}} {{label}} հաջողությամբ ջնջված է։', deletedSuccessfully: 'Հաջողությամբ ջնջված է։', + deletePermanently: 'Բաց թողեք աղբատուփը և հեռացրեք հավերժ:', deleting: 'Ջնջվում է...', depth: 'Խորություն', descending: 'Նվազող', deselectAllRows: 'Հանել բոլոր տողերի ընտրությունը', document: 'Փաստաթուղթ', + documentIsTrashed: 'Այս {{label}}-ն աղբարկղած է և հասանելի է միայն ընթերցման համար։', documentLocked: 'Փաստաթուղթը կողպված է', documents: 'Փաստաթղթեր', duplicate: 'Կրկնօրինակել', @@ -291,6 +309,8 @@ export const hyTranslations: DefaultTranslationsObject = { editLabel: 'Խմբագրել {{label}}', email: 'Էլ. փոստ', emailAddress: 'Էլ. փոստի հասցե', + emptyTrash: 'Մաքրել աղբաղեցույցը', + emptyTrashLabel: 'Դատարկել {{label}} աղբուկը', enterAValue: 'Մուտքագրեք արժեք', error: 'Սխալ', errors: 'Սխալներ', @@ -339,6 +359,7 @@ export const hyTranslations: DefaultTranslationsObject = { '{{label}}-ը չի գտնվել։ Կա՛մ դեռևս {{label}} չկա, կա՛մ ոչ մեկը չի համապատասխանում վերևում նշված ֆիլտրերին։', notFound: 'Չի գտնվել', nothingFound: 'Ոչինչ չի գտնվել', + noTrashResults: 'Ոչ մի {{label}} աղբարկղում:', noUpcomingEventsScheduled: 'Իրադարձություններ նախատեսված չեն։', noValue: 'Արժեք չկա', of: 'ի', @@ -352,6 +373,8 @@ export const hyTranslations: DefaultTranslationsObject = { pasteField: 'Տեղադրել դաշտը', pasteRow: 'Տեղադրել տողը', payloadSettings: 'Payload-ի կարգավորումներ', + permanentlyDelete: 'Մշտականությամբ Ջնջել', + permanentlyDeletedCountSuccessfully: '{{count}} {{label}}-ը հաստատապես ջնջվել է հաջողակ:', perPage: 'Էջում՝ {{limit}}', previous: 'Նախորդ', reindex: 'Վերաինդեքսավորել', @@ -363,6 +386,11 @@ export const hyTranslations: DefaultTranslationsObject = { resetPreferencesDescription: 'Սա կվերակայի Ձեր բոլոր նախընտրությունները դեպի լռելյայն կարգավորումներ։', resettingPreferences: 'Նախընտրությունները վերակայվում են', + restore: 'Վերականգնել', + restoreAsPublished: 'Վերականգնել որպես հրատարակված տարբերակ', + restoredCountSuccessfully: '{{count}} {{label}} հաջողությամբ վերականգնվեց:', + restoring: + 'Payload-i original teksti mijocov achqers, nran avelacnum e urish Payload nshanakutyunner, oronq kangnvec en specifik texer:\n\n- Zuygh: Zuygh e ayd dokumnerneri jmum, oronq kanen arden mek ban u zoracnum en Payload-i nersum u bavararum.\n- Dasht: Dasht e ayd zuyghi bnutyun dokumneri mej. Dashter pahpanum en bnutyunneri banakanutyuny u texy, ete oronq sa patrastvi dokumentnerum.\n- Dokument: Dokument e mi', row: 'Տող', rows: 'Տողեր', save: 'Պահպանել', @@ -393,6 +421,10 @@ export const hyTranslations: DefaultTranslationsObject = { time: 'Ժամ', timezone: 'Ժամային գոտի', titleDeleted: '{{label}} "{{title}}" հաջողությամբ ջնջվել է։', + titleRestored: '"{{label}}" "{{title}}" հաջողությամբ վերականգնվել է։', + titleTrashed: '«{{label}}» «{{title}}» տեղափոխվել է աղբարկղում:', + trash: 'աղբ', + trashedCountSuccessfully: '{{count}} {{label}} տեղափոխվել է աղբարկղում։', true: 'Ճիշտ', unauthorized: 'Չթույլատրված', unsavedChanges: @@ -413,6 +445,7 @@ export const hyTranslations: DefaultTranslationsObject = { username: 'Օգտանուն', users: 'Օգտատերեր', value: 'Արժեք', + viewing: 'Դիտում', viewReadOnly: '«Միայն կարդալու» ռեժիմ', welcome: 'Բարի գալուստ', yes: 'Այո', @@ -542,6 +575,7 @@ export const hyTranslations: DefaultTranslationsObject = { noRowsFound: ' Ոչ մի {{label}} չի գտնվել', noRowsSelected: 'Ոչ մի {{label}} ընտրված չէ', preview: 'Նախադիտում', + previouslyDraft: 'Նախկինում Սևագիր', previouslyPublished: 'Նախկինում հրապարակված', previousVersion: 'Նախորդ Տարբերակ', problemRestoringVersion: 'Այս տարբերակը վերականգնելու ժամանակ խնդիր է առաջացել', diff --git a/packages/translations/src/languages/it.ts b/packages/translations/src/languages/it.ts index 86e0d42fb..af0c39962 100644 --- a/packages/translations/src/languages/it.ts +++ b/packages/translations/src/languages/it.ts @@ -116,6 +116,8 @@ export const itTranslations: DefaultTranslationsObject = { noUser: 'Nessun Utente', previewing: "Si è verificato un problema durante l'anteprima di questo documento.", problemUploadingFile: 'Si è verificato un problema durante il caricamento del file.', + restoringTitle: + 'Si è verificato un errore durante il ripristino di {{title}}. Si prega di controllare la connessione e riprovare.', tokenInvalidOrExpired: 'Il token non è valido o è scaduto.', tokenNotProvided: 'Token non fornito.', unableToCopy: 'Impossibile copiare.', @@ -218,6 +220,17 @@ export const itTranslations: DefaultTranslationsObject = { aboutToDeleteCount_many: 'Stai per eliminare {{count}} {{label}}', aboutToDeleteCount_one: 'Stai per eliminare {{count}} {{label}}', aboutToDeleteCount_other: 'Stai per eliminare {{count}} {{label}}', + aboutToPermanentlyDelete: + "Stai per eliminare definitivamente l'{{label}} <1>{{title}}. Sei sicuro?", + aboutToPermanentlyDeleteTrash: + 'Stai per eliminare definitivamente <0>{{count}} <1>{{label}} dal cestino. Sei sicuro?', + aboutToRestore: 'Stai per ripristinare il {{label}} <1>{{title}}. Sei sicuro?', + aboutToRestoreAsDraft: + "Stai per ripristinare l'etichetta {{label}} <1>{{title}} come bozza. Sei sicuro?", + aboutToRestoreAsDraftCount: 'Stai per ripristinare {{count}} {{label}} come bozza', + aboutToRestoreCount: 'Stai per ripristinare {{count}} {{label}}', + aboutToTrash: 'Stai per spostare il {{label}} <1>{{title}} nel cestino. Sei sicuro?', + aboutToTrashCount: 'Stai per spostare {{count}} {{label}} nel cestino', addBelow: 'Aggiungi sotto', addFilter: 'Aggiungi Filtro', adminTheme: 'Tema Admin', @@ -252,6 +265,7 @@ export const itTranslations: DefaultTranslationsObject = { "Questo rimuoverà gli indici esistenti e rifarà l'indice dei documenti nelle collezioni {{collections}}.", confirmReindexDescriptionAll: "Questo rimuoverà gli indici esistenti e rifarà l'indice dei documenti in tutte le collezioni.", + confirmRestoration: 'Conferma il ripristino', copied: 'Copiato', copy: 'Copia', copyField: 'Copia campo', @@ -271,13 +285,17 @@ export const itTranslations: DefaultTranslationsObject = { dark: 'Scuro', dashboard: 'Dashboard', delete: 'Elimina', + deleted: 'Cancellato', + deletedAt: 'Cancellato Alle', deletedCountSuccessfully: '{{count}} {{label}} eliminato con successo.', deletedSuccessfully: 'Eliminato con successo.', + deletePermanently: 'Salta il cestino ed elimina definitivamente', deleting: 'Sto eliminando...', depth: 'Profondità', descending: 'Decrescente', deselectAllRows: 'Deseleziona tutte le righe', document: 'Documento', + documentIsTrashed: 'Questo {{label}} è stato cestinato ed è in sola lettura.', documentLocked: 'Documento bloccato', documents: 'Documenti', duplicate: 'Duplica', @@ -293,6 +311,8 @@ export const itTranslations: DefaultTranslationsObject = { editLabel: 'Modifica {{label}}', email: 'Email', emailAddress: 'Indirizzo Email', + emptyTrash: 'Svuota cestino', + emptyTrashLabel: 'Svuota il cestino {{label}}', enterAValue: 'Inserisci un valore', error: 'Errore', errors: 'Errori', @@ -340,6 +360,7 @@ export const itTranslations: DefaultTranslationsObject = { 'Nessun {{label}} trovato. Non esiste ancora nessun {{label}} oppure nessuno corrisponde ai filtri che hai specificato sopra.', notFound: 'Non Trovato', nothingFound: 'Non è stato trovato nulla', + noTrashResults: 'Nessun {{label}} nel cestino.', noUpcomingEventsScheduled: 'Nessun evento in programma.', noValue: 'Nessun valore', of: 'di', @@ -353,6 +374,9 @@ export const itTranslations: DefaultTranslationsObject = { pasteField: 'Incolla campo', pasteRow: 'Incolla riga', payloadSettings: 'Impostazioni di Payload', + permanentlyDelete: 'Elimina Permanentemente', + permanentlyDeletedCountSuccessfully: + 'Eliminato definitivamente {{count}} {{label}} con successo.', perPage: 'Per Pagina: {{limit}}', previous: 'Precedente', reindex: 'Reindicizza', @@ -364,6 +388,11 @@ export const itTranslations: DefaultTranslationsObject = { resetPreferencesDescription: 'Questo ripristinerà tutte le tue preferenze alle impostazioni predefinite.', resettingPreferences: 'Ripristinando le preferenze.', + restore: 'Ripristina', + restoreAsPublished: 'Ripristina come versione pubblicata', + restoredCountSuccessfully: 'Ripristinato {{count}} {{label}} con successo.', + restoring: + "Rispetta il significato del testo originale nel contesto di Payload. Ecco una lista di termini comuni di Payload che hanno significati molto specifici:\n - Raccolta: Una raccolta è un gruppo di documenti che condividono una struttura e una finalità comuni. Le raccolte vengono utilizzate per organizzare e gestire i contenuti in Payload.\n - Campo: Un campo è un pezzo specifico di dati all'interno di un documento in una raccolta. I campi definiscono la struttura e il tipo di dati che possono essere memorizzati in un documento.\n - Documento: Un documento", row: 'Riga', rows: 'Righe', save: 'Salva', @@ -394,6 +423,10 @@ export const itTranslations: DefaultTranslationsObject = { time: 'Tempo', timezone: 'Fuso orario', titleDeleted: '{{label}} {{title}} eliminato con successo.', + titleRestored: '{{label}} "{{title}}" ripristinato con successo.', + titleTrashed: '{{label}} "{{title}}" spostato nel cestino.', + trash: 'Cestino', + trashedCountSuccessfully: '{{count}} {{label}} spostati nel cestino.', true: 'Vero', unauthorized: 'Non autorizzato', unsavedChanges: 'Hai delle modifiche non salvate. Salva o scarta prima di continuare.', @@ -412,6 +445,7 @@ export const itTranslations: DefaultTranslationsObject = { username: 'Nome utente', users: 'Utenti', value: 'Valore', + viewing: 'Visualizzazione', viewReadOnly: 'Visualizza solo lettura', welcome: 'Benvenuto', yes: 'Sì', @@ -538,6 +572,7 @@ export const itTranslations: DefaultTranslationsObject = { noRowsFound: 'Nessun {{label}} trovato', noRowsSelected: 'Nessuna {{etichetta}} selezionata', preview: 'Anteprima', + previouslyDraft: 'Precedentemente una Bozza', previouslyPublished: 'Precedentemente Pubblicato', previousVersion: 'Versione Precedente', problemRestoringVersion: 'Si è verificato un problema durante il ripristino di questa versione', diff --git a/packages/translations/src/languages/ja.ts b/packages/translations/src/languages/ja.ts index 128252db0..d4cab9756 100644 --- a/packages/translations/src/languages/ja.ts +++ b/packages/translations/src/languages/ja.ts @@ -115,6 +115,8 @@ export const jaTranslations: DefaultTranslationsObject = { noUser: 'ユーザーなし', previewing: 'このデータをプレビューする際に問題が発生しました。', problemUploadingFile: 'ファイルのアップロード中に問題が発生しました。', + restoringTitle: + '{{title}}の復元中にエラーが発生しました。接続を確認して、もう一度お試しください。', tokenInvalidOrExpired: 'トークンが無効、または、有効期限が切れています。', tokenNotProvided: 'トークンが提供されていません。', unableToCopy: 'コピーできません。', @@ -215,6 +217,19 @@ export const jaTranslations: DefaultTranslationsObject = { aboutToDeleteCount_many: '{{label}}を{{count}}つ削除しようとしています', aboutToDeleteCount_one: '{{label}}を{{count}}つ削除しようとしています', aboutToDeleteCount_other: '{{label}}を{{count}}つ削除しようとしています', + aboutToPermanentlyDelete: + 'あなたは永久に{{label}} <1>{{title}}を削除しようとしています。よろしいですか?', + aboutToPermanentlyDeleteTrash: + 'あなたはゴミ箱から<0>{{count}} <1>{{label}}を永久に削除しようとしています。よろしいですか?', + aboutToRestore: 'あなたは{{label}} <1>{{title}}を復元しようとしています。よろしいですか?', + aboutToRestoreAsDraft: + 'あなたは {{label}} <1>{{title}} を下書きとして復元しようとしています。よろしいですか?', + aboutToRestoreAsDraftCount: + 'あなたはまもなく、{{count}} {{label}}を下書きとして復元しようとしています。', + aboutToRestoreCount: 'あなたはまもなく{{count}} {{label}}を復元しようとしています。', + aboutToTrash: + 'あなたは{{label}} <1>{{title}}をゴミ箱に移動しようとしています。よろしいですか?', + aboutToTrashCount: 'あなたはまもなく{{count}} {{label}}をゴミ箱に移動しようとしています。', addBelow: '下に追加', addFilter: '絞り込みを追加', adminTheme: '管理画面のテーマ', @@ -248,6 +263,7 @@ export const jaTranslations: DefaultTranslationsObject = { 'これにより既存のインデックスが削除され、{{collections}}コレクション内のドキュメントが再インデックスされます。', confirmReindexDescriptionAll: 'これにより既存のインデックスが削除され、すべてのコレクション内のドキュメントが再インデックスされます。', + confirmRestoration: '復元を確認してください', copied: 'コピーしました', copy: 'コピー', copyField: 'フィールドをコピー', @@ -268,13 +284,17 @@ export const jaTranslations: DefaultTranslationsObject = { dark: 'ダークモード', dashboard: 'ダッシュボード', delete: '削除', + deleted: '削除されました', + deletedAt: '削除された時間', deletedCountSuccessfully: '{{count}}つの{{label}}を正常に削除しました。', deletedSuccessfully: '正常に削除されました。', + deletePermanently: 'ゴミ箱をスキップして完全に削除します', deleting: '削除しています...', depth: '深さ', descending: '降順', deselectAllRows: 'すべての行の選択を解除します', document: 'ドキュメント', + documentIsTrashed: 'この{{label}}は廃棄され、読み取り専用です。', documentLocked: 'ドキュメントがロックされました', documents: 'ドキュメント', duplicate: '複製', @@ -290,6 +310,8 @@ export const jaTranslations: DefaultTranslationsObject = { editLabel: '{{label}} を編集', email: 'メールアドレス', emailAddress: 'メールアドレス', + emptyTrash: 'ゴミ箱を空にする', + emptyTrashLabel: '{{label}}のゴミ箱を空にする', enterAValue: '値を入力', error: 'エラー', errors: 'エラー', @@ -338,6 +360,7 @@ export const jaTranslations: DefaultTranslationsObject = { '{{label}} データが見つかりませんでした。データが存在しない、または、絞り込みに一致するものがありません。', notFound: 'Not Found', nothingFound: 'Nothing found', + noTrashResults: 'ゴミ箱に{{label}}はありません。', noUpcomingEventsScheduled: '予定されているイベントはありません。', noValue: '未設定', of: '/', @@ -351,6 +374,8 @@ export const jaTranslations: DefaultTranslationsObject = { pasteField: 'フィールドを貼り付け', pasteRow: '行を貼り付け', payloadSettings: 'Payload 設定', + permanentlyDelete: '永久に削除する', + permanentlyDeletedCountSuccessfully: '{{count}} {{label}}を正常に完全に削除しました。', perPage: '表示件数: {{limit}}', previous: '前の', reindex: '再インデックス', @@ -361,6 +386,11 @@ export const jaTranslations: DefaultTranslationsObject = { resetPreferences: '設定をリセット', resetPreferencesDescription: 'これにより、すべての設定がデフォルト設定にリセットされます。', resettingPreferences: '設定をリセットしています。', + restore: '復元', + restoreAsPublished: '公開バージョンとして復元する', + restoredCountSuccessfully: '{{count}} {{label}} の復元に成功しました。', + restoring: + '以下はPayloadの文脈での原文の意味を尊重してください。以下に、特定の意味を持つ一般的なPayload用語のリストを示します。\n - コレクション: コレクションは、共通の構造と目的を共有する文書のグループです。コレクションは、Payload内のコンテンツを整理および管理するために使用されます。\n - フィールド: フィールドは、コレクション内の文', row: '列', rows: '列', save: '保存', @@ -391,6 +421,10 @@ export const jaTranslations: DefaultTranslationsObject = { time: '時間', timezone: 'タイムゾーン', titleDeleted: '{{label}} "{{title}}" が削除されました。', + titleRestored: '「{{label}}」"{{title}}" が正常に復元されました。', + titleTrashed: '{{label}} "{{title}}"がゴミ箱へ移動されました。', + trash: 'ゴミ', + trashedCountSuccessfully: '{{count}} {{label}}がゴミ箱に移動しました。', true: '真実', unauthorized: '未認証', unsavedChanges: '保存されていない変更があります。続行する前に保存または破棄してください。', @@ -409,6 +443,7 @@ export const jaTranslations: DefaultTranslationsObject = { username: 'ユーザーネーム', users: 'ユーザー', value: '値', + viewing: '閲覧', viewReadOnly: '読み取り専用で表示', welcome: 'ようこそ', yes: 'はい', @@ -532,6 +567,7 @@ export const jaTranslations: DefaultTranslationsObject = { noRowsFound: '{{label}} は未設定です', noRowsSelected: '選択された{{label}}はありません', preview: 'プレビュー', + previouslyDraft: '以前はドラフトでした', previouslyPublished: '以前に公開された', previousVersion: '以前のバージョン', problemRestoringVersion: 'このバージョンの復元に問題がありました。', diff --git a/packages/translations/src/languages/ko.ts b/packages/translations/src/languages/ko.ts index f093b2d0c..082356024 100644 --- a/packages/translations/src/languages/ko.ts +++ b/packages/translations/src/languages/ko.ts @@ -114,6 +114,8 @@ export const koTranslations: DefaultTranslationsObject = { noUser: '사용자가 없습니다.', previewing: '이 문서를 미리보는 중에 문제가 발생했습니다.', problemUploadingFile: '파일 업로드 중에 문제가 발생했습니다.', + restoringTitle: + '{{title}} 복원 중 오류가 발생했습니다. 연결 상태를 확인하고 다시 시도해 주세요.', tokenInvalidOrExpired: '토큰이 유효하지 않거나 만료되었습니다.', tokenNotProvided: '토큰이 제공되지 않았습니다.', unableToCopy: '복사할 수 없습니다.', @@ -212,6 +214,17 @@ export const koTranslations: DefaultTranslationsObject = { aboutToDeleteCount_many: '{{label}}를 {{count}}개 삭제하려고 합니다.', aboutToDeleteCount_one: '{{label}}를 {{count}}개 삭제하려고 합니다.', aboutToDeleteCount_other: '{{label}}를 {{count}}개 삭제하려고 합니다.', + aboutToPermanentlyDelete: + '당신은 {{label}} <1>{{title}}을 영구적으로 삭제하려고 합니다. 확실합니까?', + aboutToPermanentlyDeleteTrash: + '휴지통에서 <0>{{count}} <1>{{label}}을(를) 영구적으로 삭제하려고 합니다. 확실합니까?', + aboutToRestore: '당신은 {{label}} <1>{{title}}을 복원하려고 합니다. 확실합니까?', + aboutToRestoreAsDraft: + '당신은 {{label}} <1>{{title}}을 초안으로 복원하려고 합니다. 확실합니까?', + aboutToRestoreAsDraftCount: '당신은 {{count}}개의 {{label}}을 초안으로 복원하려고 합니다.', + aboutToRestoreCount: '당신은 {{count}} {{label}}을 복원하려고 합니다.', + aboutToTrash: '{{label}} <1>{{title}}을 휴지통으로 이동하려고 합니다. 확실합니까?', + aboutToTrashCount: '당신은 곧 {{count}} {{label}}을(를) 휴지통으로 이동하려고 합니다.', addBelow: '아래에 추가', addFilter: '필터 추가', adminTheme: '관리자 테마', @@ -246,6 +259,7 @@ export const koTranslations: DefaultTranslationsObject = { '이 작업은 기존 인덱스를 삭제하고 {{collections}} 컬렉션 내의 문서를 다시 인덱싱합니다.', confirmReindexDescriptionAll: '이 작업은 기존 인덱스를 삭제하고 모든 컬렉션 내의 문서를 다시 인덱싱합니다.', + confirmRestoration: '복구를 확인하십시오', copied: '복사됨', copy: '복사', copyField: '필드 복사', @@ -265,13 +279,17 @@ export const koTranslations: DefaultTranslationsObject = { dark: '다크', dashboard: '대시보드', delete: '삭제', + deleted: '삭제됨', + deletedAt: '삭제된 시간', deletedCountSuccessfully: '{{count}}개의 {{label}}를 삭제했습니다.', deletedSuccessfully: '삭제되었습니다.', + deletePermanently: '휴지통 건너뛰고 영구적으로 삭제하세요', deleting: '삭제 중...', depth: '깊이', descending: '내림차순', deselectAllRows: '모든 행 선택 해제', document: '문서', + documentIsTrashed: '이 {{label}}은 휴지통에 있으며 읽기 전용입니다.', documentLocked: '문서가 잠겼습니다', documents: '문서들', duplicate: '복제', @@ -287,6 +305,8 @@ export const koTranslations: DefaultTranslationsObject = { editLabel: '{{label}} 수정', email: '이메일', emailAddress: '이메일 주소', + emptyTrash: '휴지통 비우기', + emptyTrashLabel: '{{label}} 휴지통 비우기', enterAValue: '값을 입력하세요', error: '오류', errors: '오류', @@ -335,6 +355,7 @@ export const koTranslations: DefaultTranslationsObject = { '{{label}}를 찾을 수 없습니다. 아직 {{label}}이 없거나 설정한 필터와 일치하는 것이 없습니다.', notFound: '찾을 수 없음', nothingFound: '찾을 수 없습니다', + noTrashResults: '휴지통에 {{label}}이 없습니다.', noUpcomingEventsScheduled: '예정된 행사가 없습니다.', noValue: '값 없음', of: '의', @@ -348,6 +369,9 @@ export const koTranslations: DefaultTranslationsObject = { pasteField: '필드 붙여넣기', pasteRow: '행 붙여넣기', payloadSettings: 'Payload 설정', + permanentlyDelete: '영구적으로 삭제', + permanentlyDeletedCountSuccessfully: + '영구적으로 {{count}} {{label}}가 성공적으로 삭제되었습니다.', perPage: '페이지당 개수: {{limit}}', previous: '이전', reindex: '재인덱싱', @@ -358,6 +382,11 @@ export const koTranslations: DefaultTranslationsObject = { resetPreferences: '기본 설정으로 재설정', resetPreferencesDescription: '이렇게 하면 모든 기본 설정이 기본값으로 재설정됩니다.', resettingPreferences: '기본 설정을 재설정하는 중.', + restore: '복원', + restoreAsPublished: '게시된 버전으로 복원하다', + restoredCountSuccessfully: '성공적으로 {{count}} {{label}}를 복원했습니다.', + restoring: + '원래 텍스트의 의미를 Payload 문맥 내에서 존중하십시오. 여기에는 매우 특정한 의미를 가진 일반 Payload 용어 목록이 있습니다:\n - Collection: 컬렉션은 공통 구조와 목적을 공유하는 문서의 그룹입니다. 컬렉션은 Payload에서 컨텐츠를 구성하고 관리하는 데 사용됩니다.\n - Field: 필드는 컬렉션 내의 문서에 있는 특정 데이터 조각입니다.', row: '행', rows: '행', save: '저장', @@ -388,6 +417,10 @@ export const koTranslations: DefaultTranslationsObject = { time: '시간', timezone: '시간대', titleDeleted: '{{label}} "{{title}}"을(를) 삭제했습니다.', + titleRestored: '"{{label}}" "{{title}}"이(가) 성공적으로 복원되었습니다.', + titleTrashed: '"{{label}}" "{{title}}"이(가) 휴지통으로 이동되었습니다.', + trash: '휴지통', + trashedCountSuccessfully: '{{count}} {{label}}가 휴지통으로 이동했습니다.', true: '참', unauthorized: '권한 없음', unsavedChanges: '저장되지 않은 변경 사항이 있습니다. 계속하기 전에 저장하거나 무시하십시오.', @@ -406,6 +439,7 @@ export const koTranslations: DefaultTranslationsObject = { username: '사용자 이름', users: '사용자', value: '값', + viewing: '열람', viewReadOnly: '읽기 전용으로 보기', welcome: '환영합니다', yes: '네', @@ -526,6 +560,7 @@ export const koTranslations: DefaultTranslationsObject = { noRowsFound: '{{label}}을(를) 찾을 수 없음', noRowsSelected: '선택된 {{label}} 없음', preview: '미리보기', + previouslyDraft: '이전에는 초안', previouslyPublished: '이전에 발표된', previousVersion: '이전 버전', problemRestoringVersion: '이 버전을 복원하는 중 문제가 발생했습니다.', diff --git a/packages/translations/src/languages/lt.ts b/packages/translations/src/languages/lt.ts index ac2afd6c6..fc2e26bb1 100644 --- a/packages/translations/src/languages/lt.ts +++ b/packages/translations/src/languages/lt.ts @@ -115,6 +115,8 @@ export const ltTranslations: DefaultTranslationsObject = { noUser: 'Nėra vartotojo', previewing: 'Šiam dokumentui peržiūrėti kilo problema.', problemUploadingFile: 'Failo įkelti nepavyko dėl problemos.', + restoringTitle: + 'Įvyko klaida atkuriant {{title}}. Prašome patikrinti savo ryšį ir bandyti dar kartą.', tokenInvalidOrExpired: 'Žetonas yra neteisingas arba jo galiojimas pasibaigė.', tokenNotProvided: 'Žetonas nesuteiktas.', unableToCopy: 'Nepavyko nukopijuoti.', @@ -216,6 +218,18 @@ export const ltTranslations: DefaultTranslationsObject = { aboutToDeleteCount_many: 'Jūs ketinate ištrinti {{count}} {{label}}', aboutToDeleteCount_one: 'Jūs ketinate ištrinti {{count}} {{label}}', aboutToDeleteCount_other: 'Jūs ketinate ištrinti {{count}} {{label}}', + aboutToPermanentlyDelete: + 'Jūs ketinate visam laikui ištrinti {{label}} <1>{{title}}. Ar esate įsitikinęs?', + aboutToPermanentlyDeleteTrash: + 'Jūs ketinate visam laikui ištrinti <0>{{count}} <1>{{label}} iš šiukšliadėžės. Ar esate įsitikinęs?', + aboutToRestore: 'Jūs ketinate atkurti {{label}} <1>{{title}}. Ar esate tikri?', + aboutToRestoreAsDraft: + 'Jūs ketinate atkurti {{label}} <1>{{title}} kaip juodraštį. Ar esate įsitikinęs?', + aboutToRestoreAsDraftCount: 'Jūs ketinate atkurti {{count}} {{label}} kaip juodraštį', + aboutToRestoreCount: 'Jūs ketinate atkurti {{count}} {{label}}', + aboutToTrash: + 'Jūs ketinate perkelti {{label}} <1>{{title}} į šiukšliadėžę. Ar esate tikras?', + aboutToTrashCount: 'Jūs ketinate perkelti {{count}} {{label}} į šiukšlinę', addBelow: 'Pridėti žemiau', addFilter: 'Pridėti filtrą', adminTheme: 'Admin temos', @@ -250,6 +264,7 @@ export const ltTranslations: DefaultTranslationsObject = { 'Tai pašalins esamus indeksus ir iš naujo indeksuos dokumentus kolekcijose {{collections}}.', confirmReindexDescriptionAll: 'Tai pašalins esamas indeksus ir perindeksuos dokumentus visose kolekcijose.', + confirmRestoration: 'Patvirtinkite atkūrimą', copied: 'Nukopijuota', copy: 'Kopijuoti', copyField: 'Kopijuoti lauką', @@ -270,13 +285,17 @@ export const ltTranslations: DefaultTranslationsObject = { dark: 'Tamsus', dashboard: 'Prietaisų skydelis', delete: 'Ištrinti', + deleted: 'Ištrinta', + deletedAt: 'Ištrinta', deletedCountSuccessfully: 'Sėkmingai ištrinta {{count}} {{label}}.', deletedSuccessfully: 'Sėkmingai ištrinta.', + deletePermanently: 'Praleiskite šiukšliadėžę ir ištrinkite visam laikui', deleting: 'Trinama...', depth: 'Gylis', descending: 'Mažėjantis', deselectAllRows: 'Atžymėkite visas eilutes', document: 'Dokumentas', + documentIsTrashed: 'Šis {{label}} yra ištrintas ir yra tik skaitymui.', documentLocked: 'Dokumentas užrakintas', documents: 'Dokumentai', duplicate: 'Dublikatas', @@ -292,6 +311,8 @@ export const ltTranslations: DefaultTranslationsObject = { editLabel: 'Redaguoti {{label}}', email: 'El. paštas', emailAddress: 'El. pašto adresas', + emptyTrash: 'Ištuštinti šiukšliadėžę', + emptyTrashLabel: 'Ištuštuokite {{label}} šiukšliadėžę', enterAValue: 'Įveskite reikšmę', error: 'Klaida', errors: 'Klaidos', @@ -340,6 +361,7 @@ export const ltTranslations: DefaultTranslationsObject = { 'Nerasta jokių {{label}}. Arba dar nėra sukurtų {{label}}, arba jie neatitinka nurodytų filtrų aukščiau.', notFound: 'Nerasta', nothingFound: 'Nieko nerasta', + noTrashResults: 'Nėra {{label}} šiukšliadėžėje.', noUpcomingEventsScheduled: 'Nėra suplanuotų būsimų renginių.', noValue: 'Nėra vertės', of: 'apie', @@ -353,6 +375,8 @@ export const ltTranslations: DefaultTranslationsObject = { pasteField: 'Įklijuoti lauką', pasteRow: 'Įklijuoti eilutę', payloadSettings: 'Payload nustatymai', + permanentlyDelete: 'Visam laikui pašalinti', + permanentlyDeletedCountSuccessfully: 'Sėkmingai visam laikui ištrinta {{count}} {{label}}.', perPage: 'Puslapyje: {{limit}}', previous: 'Ankstesnis', reindex: 'Perindeksuoti', @@ -363,6 +387,10 @@ export const ltTranslations: DefaultTranslationsObject = { resetPreferences: 'Atstatyti nuostatas', resetPreferencesDescription: 'Tai atstatys visas jūsų nuostatas į numatytąsias reikšmes.', resettingPreferences: 'Nustatymų atstatymas.', + restore: 'Atkurti', + restoreAsPublished: 'Atkurti kaip publikuotą versiją', + restoredCountSuccessfully: 'Sėkmingai atkurtas {{count}} {{label}}.', + restoring: 'Atkurimas...', row: 'Eilutė', rows: 'Eilutės', save: 'Išsaugoti', @@ -393,6 +421,10 @@ export const ltTranslations: DefaultTranslationsObject = { time: 'Laikas', timezone: 'Laiko juosta', titleDeleted: '{{label}} "{{title}}" sėkmingai ištrinta.', + titleRestored: '{{label}} "{{title}}" sėkmingai atkurta.', + titleTrashed: '{{label}} "{{title}}" perkeltas į šiukšliadėžę.', + trash: 'Šiukšlės', + trashedCountSuccessfully: '{{count}} {{label}} perkeltas į šiukšlinę.', true: 'Tiesa', unauthorized: 'Neleistinas', unsavedChanges: 'Turite neišsaugotų pakeitimų. Išsaugokite arba atmestkite prieš tęsdami.', @@ -411,6 +443,7 @@ export const ltTranslations: DefaultTranslationsObject = { username: 'Vartotojo vardas', users: 'Vartotojai', value: 'Vertė', + viewing: 'Peržiūrėti', viewReadOnly: 'Peržiūrėti tik skaitymui', welcome: 'Sveiki', yes: 'Taip', @@ -538,6 +571,7 @@ export const ltTranslations: DefaultTranslationsObject = { noRowsFound: 'Nerasta {{label}}', noRowsSelected: 'Pasirinkta ne viena {{label}}', preview: 'Peržiūra', + previouslyDraft: 'Ankstesnis juodraštis', previouslyPublished: 'Ankstesnė publikacija', previousVersion: 'Ankstesnė versija', problemRestoringVersion: 'Buvo problema atkuriant šią versiją', diff --git a/packages/translations/src/languages/lv.ts b/packages/translations/src/languages/lv.ts index 62c907615..44a903d0e 100644 --- a/packages/translations/src/languages/lv.ts +++ b/packages/translations/src/languages/lv.ts @@ -114,6 +114,8 @@ export const lvTranslations: DefaultTranslationsObject = { noUser: 'Nav lietotāja', previewing: 'Radās problēma, priekšskatot šo dokumentu.', problemUploadingFile: 'Radās problēma, augšupielādējot failu.', + restoringTitle: + 'Notika kļūda, atjaunojot {{title}}. Lūdzu, pārbaudiet savu savienojumu un mēģiniet vēlreiz.', tokenInvalidOrExpired: 'Tokens ir nederīgs vai beidzies.', tokenNotProvided: 'Tokens nav norādīts.', unableToCopy: 'Neizdevās kopēt.', @@ -214,6 +216,18 @@ export const lvTranslations: DefaultTranslationsObject = { aboutToDeleteCount_many: 'Jūs grasāties dzēst {{count}} {{label}}', aboutToDeleteCount_one: 'Jūs grasāties dzēst {{count}} {{label}}', aboutToDeleteCount_other: 'Jūs grasāties dzēst {{count}} {{label}}', + aboutToPermanentlyDelete: + 'Jūs esat gatavs neatgriezeniski dzēst {{label}} <1>{{title}}. Vai esat pārliecināts?', + aboutToPermanentlyDeleteTrash: + 'Jūs gatavojaties neatgriezeniski dzēst <0>{{count}} <1>{{label}} no miskastes. Vai esat pārliecināts?', + aboutToRestore: 'Jūs esat gatavs atjaunot {{label}} <1>{{title}}. Vai esat pārliecināts?', + aboutToRestoreAsDraft: + 'Jūs gatavojaties atjaunot {{label}} <1>{{title}} kā melnrakstu. Vai esat pārliecināts?', + aboutToRestoreAsDraftCount: 'Jūs gatavojaties atjaunot {{count}} {{label}} kā melnrakstu', + aboutToRestoreCount: 'Jūs gatavojaties atjaunot {{count}} {{label}}', + aboutToTrash: + 'Jūs gatavojaties pārvietot {{label}} <1>{{title}} uz miskasti. Vai esat pārliecināts?', + aboutToTrashCount: 'Jūs gatavojaties pārvietot {{count}} {{label}} uz miskasti', addBelow: 'Pievienot zemāk', addFilter: 'Pievienot filtru', adminTheme: 'Administratora tēma', @@ -248,6 +262,7 @@ export const lvTranslations: DefaultTranslationsObject = { 'Tas noņems esošos indeksus un pārindeksēs dokumentus kolekcijās {{collections}}.', confirmReindexDescriptionAll: 'Tas noņems esošos indeksus un pārindeksēs dokumentus visās kolekcijās.', + confirmRestoration: 'Apstipriniet atjaunošanu', copied: 'Nokopēts', copy: 'Kopēt', copyField: 'Kopēt lauku', @@ -268,13 +283,17 @@ export const lvTranslations: DefaultTranslationsObject = { dark: 'Tumšs', dashboard: 'Panelis', delete: 'Dzēst', + deleted: 'Dzēsts', + deletedAt: 'Dzēsts datumā', deletedCountSuccessfully: 'Veiksmīgi izdzēsti {{count}} {{label}}.', deletedSuccessfully: 'Veiksmīgi izdzēsts.', + deletePermanently: 'Izlaidiet miskasti un dzēsiet neatgriezeniski', deleting: 'Dzēš...', depth: 'Dziļums', descending: 'Dilstošā secībā', deselectAllRows: 'Atdzēlēt visas rindas', document: 'Dokuments', + documentIsTrashed: 'Šis {{label}} ir miskastē un ir tikai lasāms.', documentLocked: 'Dokuments bloķēts', documents: 'Dokumenti', duplicate: 'Dublēt', @@ -290,6 +309,8 @@ export const lvTranslations: DefaultTranslationsObject = { editLabel: 'Rediģēt {{label}}', email: 'E-pasts', emailAddress: 'E-pasta adrese', + emptyTrash: 'Iztukšot miskasti', + emptyTrashLabel: 'Izrakstīt {{label}} atkritumu', enterAValue: 'Ievadiet vērtību', error: 'Kļūda', errors: 'Kļūdas', @@ -338,6 +359,7 @@ export const lvTranslations: DefaultTranslationsObject = { 'Nav atrasts neviens {{label}}. Vai nu vēl nav izveidots, vai neviens neatbilst augstāk norādītajiem filtriem.', notFound: 'Nav atrasts', nothingFound: 'Nekas nav atrasts', + noTrashResults: 'Nav {{label}} miskastē.', noUpcomingEventsScheduled: 'Nav ieplānotu notikumu.', noValue: 'Nav vērtības', of: 'no', @@ -351,6 +373,8 @@ export const lvTranslations: DefaultTranslationsObject = { pasteField: 'Ielīmēt lauku', pasteRow: 'Ielīmēt rindu', payloadSettings: 'Payload iestatījumi', + permanentlyDelete: 'Pastāvīgi Dzēst', + permanentlyDeletedCountSuccessfully: 'Veiksmīgi neatgriezeniski izdzēsts {{count}} {{label}}.', perPage: 'Lapas ieraksti: {{limit}}', previous: 'Iepriekšējais', reindex: 'Pārindeksēt', @@ -361,6 +385,10 @@ export const lvTranslations: DefaultTranslationsObject = { resetPreferences: 'Atiestatīt iestatījumus', resetPreferencesDescription: 'Tas atjaunos visus jūsu iestatījumus uz noklusētajiem.', resettingPreferences: 'Atiestata iestatījumus...', + restore: 'Atjaunot', + restoreAsPublished: 'Atjaunot kā publicēto versiju', + restoredCountSuccessfully: 'Veiksmīgi atjaunots {{count}} {{label}}.', + restoring: 'Atjaunojot...', row: 'Rinda', rows: 'Rindas', save: 'Saglabāt', @@ -391,6 +419,10 @@ export const lvTranslations: DefaultTranslationsObject = { time: 'Laiks', timezone: 'Laika zona', titleDeleted: '{{label}} "{{title}}" veiksmīgi izdzēsts.', + titleRestored: '{{label}} "{{title}}" veiksmīgi atjaunots.', + titleTrashed: '{{label}} "{{title}}" pārvietots uz miskasti.', + trash: 'Atkritumi', + trashedCountSuccessfully: '{{count}} {{label}} pārvietoti uz miskasti.', true: 'Patiesi', unauthorized: 'Neautorizēts', unsavedChanges: 'Jums ir nesaglabātas izmaiņas. Saglabājiet vai atceliet pirms turpināšanas.', @@ -409,6 +441,7 @@ export const lvTranslations: DefaultTranslationsObject = { username: 'Lietotājvārds', users: 'Lietotāji', value: 'Vērtība', + viewing: 'Skatīšanās', viewReadOnly: 'Skatīt tikai lasāmu', welcome: 'Laipni lūdzam', yes: 'Jā', @@ -534,6 +567,7 @@ export const lvTranslations: DefaultTranslationsObject = { noRowsFound: 'Nav atrasts neviens {{label}}', noRowsSelected: 'Nav atlasīts neviens {{label}}', preview: 'Priekšskatījums', + previouslyDraft: 'Iepriekšējais melnraksts', previouslyPublished: 'Iepriekš publicēts', previousVersion: 'Iepriekšējā versija', problemRestoringVersion: 'Radās problēma, atjaunojot šo versiju', diff --git a/packages/translations/src/languages/my.ts b/packages/translations/src/languages/my.ts index ec822f835..4374f169c 100644 --- a/packages/translations/src/languages/my.ts +++ b/packages/translations/src/languages/my.ts @@ -114,6 +114,8 @@ export const myTranslations: DefaultTranslationsObject = { noUser: 'အသုံးပြုသူ မရှိပါ။', previewing: 'ဖိုင်ကို အစမ်းကြည့်ရန် ပြဿနာရှိနေသည်။', problemUploadingFile: 'ဖိုင်ကို အပ်လုဒ်တင်ရာတွင် ပြဿနာရှိနေသည်။', + restoringTitle: + 'Terdapat ralat semasa memulihkan {{title}}. Sila semak sambungan anda dan cuba lagi.', tokenInvalidOrExpired: 'တိုကင်သည် မမှန်ကန်ပါ သို့မဟုတ် သက်တမ်းကုန်သွားပါပြီ။', tokenNotProvided: 'Token မပေးထားပါ။', unableToCopy: 'ကူးရန်မဖြစ်နိုင်ပါ။', @@ -215,6 +217,18 @@ export const myTranslations: DefaultTranslationsObject = { aboutToDeleteCount_many: 'သင်သည် {{count}} {{label}} ကို ဖျက်ပါတော့မည်။', aboutToDeleteCount_one: 'သင်သည် {{count}} {{label}} ကို ဖျက်ပါတော့မည်။', aboutToDeleteCount_other: 'သင်သည် {{count}} {{label}} ကို ဖျက်ပါတော့မည်။', + aboutToPermanentlyDelete: + 'Anda akan menghapuskan secara kekal {{label}} <1>{{title}}. Adakah anda pasti?', + aboutToPermanentlyDeleteTrash: + 'Anda akan menghapus secara kekal <0>{{count}} <1>{{label}} dari tong sampah. Adakah anda pasti?', + aboutToRestore: 'Anda akan memulihkan {{label}} <1>{{title}}. Adakah anda pasti?', + aboutToRestoreAsDraft: + 'Anda akan memulihkan {{label}} <1>{{title}} sebagai draf. Adakah anda pasti?', + aboutToRestoreAsDraftCount: 'Anda akan memulihkan {{count}} {{label}} sebagai draf', + aboutToRestoreCount: 'Anda akan memulihkan {{count}} {{label}}', + aboutToTrash: + 'Anda akan memindahkan {{label}} <1>{{title}} ke tong sampah. Adakah anda pasti?', + aboutToTrashCount: 'Anda akan memindah {{count}} {{label}} ke tong sampah', addBelow: 'အောက်တွင်ထည့်ပါ။', addFilter: 'ဇကာထည့်ပါ။', adminTheme: 'အက်ပ်ဒိုင်များစပ်စွာ', @@ -249,6 +263,7 @@ export const myTranslations: DefaultTranslationsObject = { 'ဤသည်သည် ရှိပြီးသား အညွှန်းများကို ဖျက်ပစ်ပြီး {{collections}} ကော်လက်ရှင်းများတွင် စာရွက်များကို ထပ်လိပ်ပါလိမ့်မည်။', confirmReindexDescriptionAll: 'ဤသည်သည် ရှိပြီးသား အညွှန်းများကို ဖျက်ပစ်ပြီး အားလုံးသော ကော်လက်ရှင်းများတွင် စာရွက်များကို ထပ်လိပ်ပါလိမ့်မည်။', + confirmRestoration: 'Sahkan pemulihan', copied: 'ကူးယူပြီးပြီ။', copy: 'ကူးယူမည်။', copyField: 'ကွက်လပ်ကိုကူးပါ', @@ -269,13 +284,17 @@ export const myTranslations: DefaultTranslationsObject = { dark: 'အမှောင်', dashboard: 'ပင်မစာမျက်နှာ', delete: 'ဖျက်မည်။', + deleted: 'ဖျက်ထား', + deletedAt: 'Dihapus Pada', deletedCountSuccessfully: '{{count}} {{label}} ကို အောင်မြင်စွာ ဖျက်လိုက်ပါပြီ။', deletedSuccessfully: 'အောင်မြင်စွာ ဖျက်လိုက်ပါပြီ။', + deletePermanently: 'Langkau sampah dan padam secara kekal', deleting: 'ဖျက်နေဆဲ ...', depth: 'ထိုင်းအောက်မှု', descending: 'ဆင်းသက်လာသည်။', deselectAllRows: 'အားလုံးကို မရွေးနိုင်ပါ', document: 'စာရွက်စာတမ်း', + documentIsTrashed: 'Ini {{label}} telah dibuang dan hanya boleh dibaca sahaja.', documentLocked: 'စာရွက်စာတမ်းကိုပိတ်ထားသည်', documents: 'စာရွက်စာတမ်းများ', duplicate: 'ပုံတူပွားမည်။', @@ -291,6 +310,8 @@ export const myTranslations: DefaultTranslationsObject = { editLabel: '{{label}} ပြင်ဆင်မည်။', email: 'အီးမေးလ်', emailAddress: 'အီးမေးလ် လိပ်စာ', + emptyTrash: 'Kosongkan tong sampah', + emptyTrashLabel: 'Kosongkan {{label}} sampah', enterAValue: 'တန်ဖိုးတစ်ခုထည့်ပါ။', error: 'အမှား', errors: 'အမှားများ', @@ -339,6 +360,7 @@ export const myTranslations: DefaultTranslationsObject = { '{{label}} မတွေ့ပါ။ {{label}} မရှိသေးသည်ဖြစ်စေ အထက်တွင်ဖော်ပြထားသော စစ်ထုတ်မှုများနှင့် ကိုက်ညီမှုမရှိပါ။', notFound: 'ဘာမှ မရှိတော့ဘူး။', nothingFound: 'ဘာမှလည်း မတွေ့ဘူး။', + noTrashResults: 'Tiada {{label}} dalam tong sampah.', noUpcomingEventsScheduled: 'Tiada acara yang akan datang dijadualkan.', noValue: 'တန်ဖိုး မရှိပါ။', of: '၏', @@ -352,6 +374,9 @@ export const myTranslations: DefaultTranslationsObject = { pasteField: 'ကွက်လပ်ကိုတင်ပါ', pasteRow: 'တန်းကိုတင်ပါ', payloadSettings: 'ရွေးချယ်စရာများ', + permanentlyDelete: 'Padam Selamanya', + permanentlyDeletedCountSuccessfully: + '{{count}} {{label}} telah berjaya dipadamkan secara kekal.', perPage: 'စာမျက်နှာ အလိုက်: {{limit}}', previous: 'ယခင်', reindex: 'ပြန်လည်အညွှန်းပြုလုပ်ပါ', @@ -363,6 +388,11 @@ export const myTranslations: DefaultTranslationsObject = { resetPreferencesDescription: 'ဤသည်သည် သင့်၏အကြိုက်များအားလုံးကို အခြားတပ်ဆင်မှုများမှ ပြန်လည်သတ်မှတ်ပေးပါလိမ့်မည်။', resettingPreferences: 'ကြိုတင်သတ်မှတ်ချက်များ ပြန်လည်တပ်ဆင်နေပါသည်။', + restore: 'Pulihkan', + restoreAsPublished: 'Pulihkan sebagai versi yang diterbitkan', + restoredCountSuccessfully: 'Berjaya memulihkan {{count}} {{label}}.', + restoring: + 'Hormati makna teks asal dalam konteks Payload. Berikut adalah senarai istilah Payload yang membawa maksud tertentu :\n - Koleksi : Koleksi ialah kumpulan dokumen yang berkongsi struktur dan tujuan yang sama. Koleksi digunakan untuk mengatur dan menguruskan kandungan dalam Payload.\n - Medan: Medan adalah sebahagian daripada data dalam dokumen dalam suatu koleksi. Medan menentukan struktur dan jenis data yang boleh disimpan dalam dokumen.\n - Dokumen: Dokumen adalah rekod individu dalam suatu koleksi. Ia mengandungi data yang telah', row: 'အတန်း', rows: 'Rows', save: 'သိမ်းဆည်းမည်။', @@ -393,6 +423,10 @@ export const myTranslations: DefaultTranslationsObject = { time: 'Masa', timezone: 'Masa Wilayah', titleDeleted: '{{label}} {{title}} အောင်မြင်စွာ ဖျက်သိမ်းခဲ့သည်။', + titleRestored: '"{{label}}" "{{title}}" အောင်မြင်စွာ ပြန်လည် ထည့်သွင်းပြီး ဖြစ်ပါတယ်။', + titleTrashed: '"{{label}}" "{{title}}" dipindahkan ke tong sampah.', + trash: 'ဖျက်သိမ်းခြင်း', + trashedCountSuccessfully: '{{count}} {{label}} သို့ ဖယ်ရှားလိုက်သည်။', true: 'အမှန်', unauthorized: 'အခွင့်မရှိပါ။', unsavedChanges: @@ -413,6 +447,7 @@ export const myTranslations: DefaultTranslationsObject = { username: 'Nama pengguna', users: 'အသုံးပြုသူများ', value: 'တန်ဖိုး', + viewing: 'Melihat', viewReadOnly: 'ဖတ်ရှုရန်သာကြည့်ပါ', welcome: 'ကြိုဆိုပါတယ်။', yes: 'ဟုတ်ကဲ့', @@ -541,6 +576,7 @@ export const myTranslations: DefaultTranslationsObject = { noRowsFound: '{{label}} အားမတွေ့ပါ။', noRowsSelected: 'Tiada {{label}} yang dipilih', preview: 'နမူနာပြရန်', + previouslyDraft: 'Sebelum ini Draf', previouslyPublished: 'တိုင်းရင်းသားထုတ်ဝေခဲ့', previousVersion: 'Versi Sebelumnya', problemRestoringVersion: 'ဤဗားရှင်းကို ပြန်လည်ရယူရာတွင် ပြဿနာရှိနေသည်။', diff --git a/packages/translations/src/languages/nb.ts b/packages/translations/src/languages/nb.ts index c454ab3e7..4c2ef0320 100644 --- a/packages/translations/src/languages/nb.ts +++ b/packages/translations/src/languages/nb.ts @@ -114,6 +114,8 @@ export const nbTranslations: DefaultTranslationsObject = { noUser: 'Ingen bruker', previewing: 'Det oppstod et problem under forhåndsvisning av dokumentet.', problemUploadingFile: 'Det oppstod et problem under opplasting av filen.', + restoringTitle: + 'Det oppstod en feil under gjenoppretting av {{title}}. Vennligst sjekk din tilkobling og prøv igjen.', tokenInvalidOrExpired: 'Token er enten ugyldig eller har utløpt.', tokenNotProvided: 'Token ikke angitt.', unableToCopy: 'Kan ikke kopiere.', @@ -213,6 +215,17 @@ export const nbTranslations: DefaultTranslationsObject = { 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}}', + aboutToPermanentlyDelete: + 'Du er i ferd med å permanent slette {{label}} <1>{{title}}. Er du sikker?', + aboutToPermanentlyDeleteTrash: + 'Du er i ferd med å permanent slette <0>{{count}} <1>{{label}} fra søppelkassen. Er du sikker?', + aboutToRestore: 'Du er i ferd med å gjenopprette {{label}} <1>{{title}}. Er du sikker?', + aboutToRestoreAsDraft: + 'Du er i ferd med å gjenopprette {{label}} <1>{{title}} som en kladd. Er du sikker?', + aboutToRestoreAsDraftCount: 'Du er i ferd med å gjenopprette {{count}} {{label}} som utkast', + aboutToRestoreCount: 'Du er i ferd med å gjenopprette {{count}} {{label}}', + aboutToTrash: 'Du er i ferd med å flytte {{label}} <1>{{title}} til søppel. Er du sikker?', + aboutToTrashCount: 'Du er i ferd med å flytte {{count}} {{label}} til søppelkurven', addBelow: 'Legg til under', addFilter: 'Legg til filter', adminTheme: 'Admin-tema', @@ -247,6 +260,7 @@ export const nbTranslations: DefaultTranslationsObject = { 'Dette vil fjerne eksisterende indekser og reindeksere dokumentene i {{collections}}-samlingene.', confirmReindexDescriptionAll: 'Dette vil fjerne eksisterende indekser og reindeksere dokumentene i alle samlinger.', + confirmRestoration: 'Bekreft gjenoppretting', copied: 'Kopiert', copy: 'Kopiér', copyField: 'Kopier felt', @@ -267,13 +281,17 @@ export const nbTranslations: DefaultTranslationsObject = { dark: 'Mørk', dashboard: 'Kontrollpanel', delete: 'Slett', + deleted: 'Slettet', + deletedAt: 'Slettet kl.', deletedCountSuccessfully: 'Slettet {{count}} {{label}}.', deletedSuccessfully: 'Slettet.', + deletePermanently: 'Hopp over søppel og slett permanent', deleting: 'Sletter...', depth: 'Dybde', descending: 'Synkende', deselectAllRows: 'Fjern markeringen fra alle rader', document: 'Dokument', + documentIsTrashed: 'Denne {{label}} er søppel og er skrivebeskyttet.', documentLocked: 'Låst dokument', documents: 'Dokumenter', duplicate: 'Dupliser', @@ -289,6 +307,8 @@ export const nbTranslations: DefaultTranslationsObject = { editLabel: 'Rediger {{label}}', email: 'E-post', emailAddress: 'E-postadresse', + emptyTrash: 'Tøm søppelkassen', + emptyTrashLabel: 'Tøm {{label}} søppel', enterAValue: 'Skriv inn en verdi', error: 'Feil', errors: 'Feil', @@ -337,6 +357,7 @@ export const nbTranslations: DefaultTranslationsObject = { 'Ingen {{label}} funnet. Enten finnes det ingen {{label}} enda eller ingen matcher filterne du har spesifisert ovenfor.', notFound: 'Ikke funnet', nothingFound: 'Ingenting funnet', + noTrashResults: 'Ingen {{label}} i søppelkassen.', noUpcomingEventsScheduled: 'Ingen kommende hendelser planlagt.', noValue: 'Ingen verdi', of: 'av', @@ -350,6 +371,8 @@ export const nbTranslations: DefaultTranslationsObject = { pasteField: 'Lim inn felt', pasteRow: 'Lim inn rad', payloadSettings: 'Payload-innstillinger', + permanentlyDelete: 'Permanent slett', + permanentlyDeletedCountSuccessfully: 'Permanent slettet {{count}} {{label}} med suksess.', perPage: 'Per side: {{limit}}', previous: 'Forrige', reindex: 'Reindekser', @@ -361,6 +384,11 @@ export const nbTranslations: DefaultTranslationsObject = { resetPreferencesDescription: 'Dette vil tilbakestille alle preferansene dine til standardinnstillingene.', resettingPreferences: 'Tilbakestiller preferanser.', + restore: 'Gjenopprett', + restoreAsPublished: 'Gjenopprett som publisert versjon', + restoredCountSuccessfully: 'Gjenopprettet {{count}} {{label}} vellykket.', + restoring: + 'Respekter betydningen av den opprinnelige teksten innenfor konteksten av Payload. Her er en liste over vanlige Payload-uttrykk som har veldig spesifikke betydninger:\n - Samling: En samling er en gruppe dokumenter som deler en felles struktur og formål. Samlinger brukes til å organisere og håndtere innhold i Payload.\n - Felt: Et felt er et bestemt stykke data innenfor et dokument i en samling. Felt definerer strukturen og typen data som kan lagres i et dokument.\n - Dokument: Et dokument er en individuell post innen', row: 'Rad', rows: 'Rader', save: 'Lagre', @@ -391,6 +419,10 @@ export const nbTranslations: DefaultTranslationsObject = { time: 'Tid', timezone: 'Tidssone', titleDeleted: '{{label}} "{{title}}" ble slettet.', + titleRestored: '{{label}} "{{title}}" ble gjenopprettet.', + titleTrashed: '{{label}} "{{title}}" flyttet til søppel.', + trash: 'Søppel', + trashedCountSuccessfully: '{{count}} {{label}} flyttet til søppel.', true: 'Sann', unauthorized: 'Ikke autorisert', unsavedChanges: 'Du har ulagrede endringer. Lagre eller forkast før du fortsetter.', @@ -409,6 +441,7 @@ export const nbTranslations: DefaultTranslationsObject = { username: 'Brukernavn', users: 'Brukere', value: 'Verdi', + viewing: 'Visning', viewReadOnly: 'Vis skrivebeskyttet', welcome: 'Velkommen', yes: 'Ja', @@ -534,6 +567,7 @@ export const nbTranslations: DefaultTranslationsObject = { noRowsFound: 'Ingen {{label}} funnet', noRowsSelected: 'Ingen {{label}} valgt', preview: 'Forhåndsvisning', + previouslyDraft: 'Tidligere et utkast', previouslyPublished: 'Tidligere Publisert', previousVersion: 'Tidligere versjon', problemRestoringVersion: 'Det oppstod et problem med gjenoppretting av denne versjonen', diff --git a/packages/translations/src/languages/nl.ts b/packages/translations/src/languages/nl.ts index 33ab43623..424d6dba4 100644 --- a/packages/translations/src/languages/nl.ts +++ b/packages/translations/src/languages/nl.ts @@ -115,6 +115,8 @@ export const nlTranslations: DefaultTranslationsObject = { noUser: 'Geen gebruiker', previewing: 'Er was een probleem met het voorvertonen van dit document.', problemUploadingFile: 'Er was een probleem bij het uploaden van het bestand.', + restoringTitle: + 'Er is een fout opgetreden bij het herstellen van {{title}}. Controleer uw verbinding en probeer het opnieuw.', tokenInvalidOrExpired: 'Token is ongeldig of verlopen.', tokenNotProvided: 'Token niet verstrekt.', unableToCopy: 'Kan niet kopiëren.', @@ -217,6 +219,21 @@ export const nlTranslations: DefaultTranslationsObject = { 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', + aboutToPermanentlyDelete: + 'U staat op het punt om de {{label}} <1>{{title}} permanent te verwijderen. Bent u zeker?', + aboutToPermanentlyDeleteTrash: + 'U staat op het punt om permanent <0>{{count}} <1>{{label}} uit de prullenbak te verwijderen. Bent u zeker?', + aboutToRestore: + 'U staat op het punt om de {{label}} <1>{{title}} te herstellen. Weet u het zeker?', + aboutToRestoreAsDraft: + 'U staat op het punt om het {{label}} <1>{{title}} als concept te herstellen. Weet u het zeker?', + aboutToRestoreAsDraftCount: + 'U staat op het punt om {{count}} {{label}} als concept te herstellen', + aboutToRestoreCount: 'U staat op het punt om {{count}} {{label}} te herstellen', + aboutToTrash: + 'U staat op het punt om het {{label}} <1>{{title}} naar de prullenbak te verplaatsen. Weet u het zeker?', + aboutToTrashCount: + 'U staat op het punt om {{count}} {{label}} naar de prullenbak te verplaatsen', addBelow: 'Onderaan toevoegen', addFilter: 'Filter toevoegen', adminTheme: 'Adminthema', @@ -251,6 +268,7 @@ export const nlTranslations: DefaultTranslationsObject = { 'Dit verwijdert bestaande indexen en indexeert de documenten in de {{collections}}-collecties opnieuw.', confirmReindexDescriptionAll: 'Dit verwijdert bestaande indexen en indexeert de documenten in alle collecties opnieuw.', + confirmRestoration: 'Bevestig herstel', copied: 'Gekopieerd', copy: 'Kopiëren', copyField: 'Veld kopiëren', @@ -271,13 +289,17 @@ export const nlTranslations: DefaultTranslationsObject = { dark: 'Donker', dashboard: 'Dashboard', delete: 'Verwijderen', + deleted: 'Verwijderd', + deletedAt: 'Verwijderd Op', deletedCountSuccessfully: '{{count}} {{label}} succesvol verwijderd.', deletedSuccessfully: 'Succesvol verwijderd.', + deletePermanently: 'Overslaan prullenbak en permanent verwijderen', deleting: 'Verwijderen...', depth: 'Diepte', descending: 'Aflopend', deselectAllRows: 'Deselecteer alle rijen', document: 'Document', + documentIsTrashed: 'Dit {{label}} is verwijderd en is alleen-lezen.', documentLocked: 'Document vergrendeld', documents: 'Documenten', duplicate: 'Dupliceren', @@ -293,6 +315,8 @@ export const nlTranslations: DefaultTranslationsObject = { editLabel: 'Bewerk {{label}}', email: 'E-mail', emailAddress: 'E-maildres', + emptyTrash: 'Prullenbak legen', + emptyTrashLabel: 'Leeg de prullenbak van {{label}}', enterAValue: 'Waarde invoeren', error: 'Fout', errors: 'Fouten', @@ -341,6 +365,7 @@ export const nlTranslations: DefaultTranslationsObject = { 'Geen {{label}} gevonden. Of er bestaat nog geen {{label}}, of niets komt overeen met de hierboven gespecifieerde filters.', notFound: 'Niet gevonden', nothingFound: 'Niets gevonden', + noTrashResults: 'Geen {{label}} in prullenbak.', noUpcomingEventsScheduled: 'Geen aankomende evenementen gepland.', noValue: 'Geen waarde', of: 'van', @@ -354,6 +379,8 @@ export const nlTranslations: DefaultTranslationsObject = { pasteField: 'Veld plakken', pasteRow: 'Rij plakken', payloadSettings: 'Payload Instellingen', + permanentlyDelete: 'Permanent Verwijderen', + permanentlyDeletedCountSuccessfully: 'Permanent {{count}} {{label}} succesvol verwijderd.', perPage: 'Per pagina: {{limit}}', previous: 'Vorige', reindex: 'Herindexeren', @@ -365,6 +392,11 @@ export const nlTranslations: DefaultTranslationsObject = { resetPreferencesDescription: 'Dit zal al je voorkeuren terugzetten naar de standaardinstellingen.', resettingPreferences: 'Voorkeuren worden gereset.', + restore: 'Herstellen', + restoreAsPublished: 'Herstellen als gepubliceerde versie', + restoredCountSuccessfully: '{{count}} {{label}} succesvol hersteld.', + restoring: + 'Respecteer de betekenis van de originele tekst in de context van Payload. Hier volgt een lijst van veelvoorkomende Payload-termen die zeer specifieke betekenissen hebben:\n - Collectie: Een collectie is een groep documenten die een gemeenschappelijke structuur en doel delen. Collecties worden gebruikt om content in Payload te organiseren en beheren.\n - Veld: Een veld is een specifiek stuk data binnen een document in een collectie. Velden bepalen de structuur en het type data dat in een document kan worden opgeslagen.\n - Document: Een document is een individueel record binnen', row: 'Rij', rows: 'Rijen', save: 'Bewaar', @@ -395,6 +427,10 @@ export const nlTranslations: DefaultTranslationsObject = { time: 'Tijd', timezone: 'Tijdzone', titleDeleted: '{{label}} "{{title}}" succesvol verwijderd.', + titleRestored: '{{label}} "{{title}}" succesvol hersteld.', + titleTrashed: '{{label}} "{{title}}" verplaatst naar prullenbak.', + trash: 'Prullenbak', + trashedCountSuccessfully: '{{count}} {{label}} verplaatst naar prullenbak.', true: 'Waar', unauthorized: 'Onbevoegd', unsavedChanges: 'U heeft niet-opgeslagen wijzigingen. Sla op of verwijder voordat u doorgaat.', @@ -413,6 +449,7 @@ export const nlTranslations: DefaultTranslationsObject = { username: 'Gebruikersnaam', users: 'Gebruikers', value: 'Waarde', + viewing: 'Bekijken', viewReadOnly: 'Alleen-lezen weergave', welcome: 'Welkom', yes: 'Ja', @@ -539,6 +576,7 @@ export const nlTranslations: DefaultTranslationsObject = { noRowsFound: 'Geen {{label}} gevonden', noRowsSelected: 'Geen {{label}} geselecteerd', preview: 'Voorbeeld', + previouslyDraft: 'Voorheen een Concept', previouslyPublished: 'Eerder gepubliceerd', previousVersion: 'Vorige Versie', problemRestoringVersion: 'Er was een probleem bij het herstellen van deze versie', diff --git a/packages/translations/src/languages/pl.ts b/packages/translations/src/languages/pl.ts index dd5d4ab4f..ee5980715 100644 --- a/packages/translations/src/languages/pl.ts +++ b/packages/translations/src/languages/pl.ts @@ -113,6 +113,8 @@ export const plTranslations: DefaultTranslationsObject = { noUser: 'Brak użytkownika', previewing: 'Wystąpił problem podczas podglądu tego dokumentu.', problemUploadingFile: 'Wystąpił problem podczas przesyłania pliku.', + restoringTitle: + 'Wystąpił błąd podczas przywracania {{title}}. Sprawdź swoje połączenie i spróbuj ponownie.', tokenInvalidOrExpired: 'Token jest nieprawidłowy lub wygasł.', tokenNotProvided: 'Token nie został dostarczony.', unableToCopy: 'Nie można skopiować.', @@ -213,6 +215,17 @@ export const plTranslations: DefaultTranslationsObject = { aboutToDeleteCount_many: 'Zamierzasz usunąć {{count}} {{label}}', aboutToDeleteCount_one: 'Zamierzasz usunąć {{count}} {{label}}', aboutToDeleteCount_other: 'Zamierzasz usunąć {{count}} {{label}}', + aboutToPermanentlyDelete: + 'Zamierzasz na stałe usunąć {{label}} <1>{{title}}. Czy jesteś pewien?', + aboutToPermanentlyDeleteTrash: + 'Zamierzasz na stałe usunąć <0>{{count}} <1>{{label}} z kosza. Czy jesteś pewny?', + aboutToRestore: 'Zamierzasz przywrócić {{label}} <1>{{title}}. Czy jesteś pewny?', + aboutToRestoreAsDraft: + 'Zamierzasz przywrócić {{label}} <1>{{title}} jako szkic. Czy jesteś pewien?', + aboutToRestoreAsDraftCount: 'Za chwilę przywrócisz {{count}} {{label}} jako szkic', + aboutToRestoreCount: 'Za chwilę przywrócisz {{count}} {{label}}', + aboutToTrash: 'Zamierzasz przenieść {{label}} <1>{{title}} do kosza. Czy jesteś pewien?', + aboutToTrashCount: 'Zamierzasz przenieść {{count}} {{label}} do kosza.', addBelow: 'Dodaj poniżej', addFilter: 'Dodaj filtr', adminTheme: 'Motyw administratora', @@ -247,6 +260,7 @@ export const plTranslations: DefaultTranslationsObject = { 'Spowoduje to usunięcie istniejących indeksów i ponowne zaindeksowanie dokumentów w kolekcjach {{collections}}.', confirmReindexDescriptionAll: 'Spowoduje to usunięcie istniejących indeksów i ponowne zaindeksowanie dokumentów we wszystkich kolekcjach.', + confirmRestoration: 'Potwierdź przywrócenie', copied: 'Skopiowano', copy: 'Skopiuj', copyField: 'Kopiuj pole', @@ -267,13 +281,17 @@ export const plTranslations: DefaultTranslationsObject = { dark: 'Ciemny', dashboard: 'Panel', delete: 'Usuń', + deleted: 'Usunięte', + deletedAt: 'Usunięto o', deletedCountSuccessfully: 'Pomyślnie usunięto {{count}} {{label}}.', deletedSuccessfully: 'Pomyślnie usunięto.', + deletePermanently: 'Pomiń kosz i usuń na stałe', deleting: 'Usuwanie...', depth: 'Głębokość', descending: 'Malejąco', deselectAllRows: 'Odznacz wszystkie wiersze', document: 'Dokument', + documentIsTrashed: 'To {{label}} jest w koszu i jest tylko do odczytu.', documentLocked: 'Dokument zablokowany', documents: 'Dokumenty', duplicate: 'Zduplikuj', @@ -289,6 +307,8 @@ export const plTranslations: DefaultTranslationsObject = { editLabel: 'Edytuj {{label}}', email: 'Email', emailAddress: 'Adres email', + emptyTrash: 'Opróżnij kosz', + emptyTrashLabel: 'Opróżnij śmieci {{label}}', enterAValue: 'Wpisz wartość', error: 'Błąd', errors: 'Błędy', @@ -337,6 +357,7 @@ export const plTranslations: DefaultTranslationsObject = { 'Nie znaleziono {{label}}. Być może {{label}} jeszcze nie istnieje, albo żaden nie pasuje do filtrów określonych powyżej.', notFound: 'Nie znaleziono', nothingFound: 'Nic nie znaleziono', + noTrashResults: 'Brak {{label}} w koszu.', noUpcomingEventsScheduled: 'Nie zaplanowano żadnych nadchodzących wydarzeń.', noValue: 'Brak wartości', of: 'z', @@ -350,6 +371,8 @@ export const plTranslations: DefaultTranslationsObject = { pasteField: 'Wklej pole', pasteRow: 'Wklej wiersz', payloadSettings: 'Ustawienia Payload', + permanentlyDelete: 'Trwale Usuń', + permanentlyDeletedCountSuccessfully: 'Trwale usunięto {{count}} {{label}} pomyślnie.', perPage: 'Na stronę: {{limit}}', previous: 'Poprzedni', reindex: 'Ponowne indeksowanie', @@ -360,6 +383,10 @@ export const plTranslations: DefaultTranslationsObject = { resetPreferences: 'Zresetuj preferencje', resetPreferencesDescription: 'To zresetuje wszystkie Twoje preferencje do ustawień domyślnych.', resettingPreferences: 'Resetowanie preferencji.', + restore: 'Przywróć', + restoreAsPublished: 'Przywróć jako opublikowaną wersję', + restoredCountSuccessfully: 'Pomyślnie przywrócono {{count}} {{label}}.', + restoring: 'Przywracanie...', row: 'Wiersz', rows: 'Wiersze', save: 'Zapisz', @@ -390,6 +417,10 @@ export const plTranslations: DefaultTranslationsObject = { time: 'Czas', timezone: 'Strefa czasowa', titleDeleted: 'Pomyślnie usunięto {{label}} {{title}}', + titleRestored: 'Etykieta "{{title}}" została pomyślnie przywrócona.', + titleTrashed: '{{label}} "{{title}}" przeniesiony do kosza.', + trash: 'Śmieci', + trashedCountSuccessfully: '{{count}} {{label}} przeniesiono do kosza.', true: 'Prawda', unauthorized: 'Brak autoryzacji', unsavedChanges: 'Masz niezapisane zmiany. Zapisz lub odrzuć, zanim kontynuujesz.', @@ -408,6 +439,7 @@ export const plTranslations: DefaultTranslationsObject = { username: 'Nazwa użytkownika', users: 'użytkownicy', value: 'Wartość', + viewing: 'Podgląd', viewReadOnly: 'Widok tylko do odczytu', welcome: 'Witaj', yes: 'Tak', @@ -533,6 +565,7 @@ export const plTranslations: DefaultTranslationsObject = { noRowsFound: 'Nie znaleziono {{label}}', noRowsSelected: 'Nie wybrano {{etykieta}}', preview: 'Podgląd', + previouslyDraft: 'Poprzednio Szkic', previouslyPublished: 'Wcześniej opublikowane', previousVersion: 'Poprzednia Wersja', problemRestoringVersion: 'Wystąpił problem podczas przywracania tej wersji', diff --git a/packages/translations/src/languages/pt.ts b/packages/translations/src/languages/pt.ts index 6a26c458b..ca01657d8 100644 --- a/packages/translations/src/languages/pt.ts +++ b/packages/translations/src/languages/pt.ts @@ -115,6 +115,8 @@ export const ptTranslations: DefaultTranslationsObject = { noUser: 'Nenhum Usuário', previewing: 'Ocorreu um problema ao visualizar esse documento.', problemUploadingFile: 'Ocorreu um problema ao carregar o arquivo.', + restoringTitle: + 'Ocorreu um erro ao restaurar {{title}}. Por favor, verifique sua conexão e tente novamente.', tokenInvalidOrExpired: 'Token expirado ou inválido.', tokenNotProvided: 'Token não fornecido.', unableToCopy: 'Não é possível copiar.', @@ -214,6 +216,18 @@ export const ptTranslations: DefaultTranslationsObject = { 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}}', + aboutToPermanentlyDelete: + 'Está prestes a apagar permanentemente o {{label}} <1>{{title}}. Tem certeza?', + aboutToPermanentlyDeleteTrash: + 'Você está prestes a excluir permanentemente <0>{{count}} <1>{{label}} da lixeira. Você tem certeza?', + aboutToRestore: 'Está prestes a restaurar o {{label}} <1>{{title}}. Tem certeza?', + aboutToRestoreAsDraft: + 'Está prestes a restaurar o {{label}} <1>{{title}} como um rascunho. Tem certeza?', + aboutToRestoreAsDraftCount: 'Está prestes a restaurar {{count}} {{label}} como rascunho', + aboutToRestoreCount: 'Você está prestes a restaurar {{count}} {{label}}', + aboutToTrash: + 'Você está prestes a mover o {{label}} <1>{{title}} para a lixeira. Tem certeza?', + aboutToTrashCount: 'Estás prestes a mover {{count}} {{label}} para o lixo', addBelow: 'Adicionar abaixo', addFilter: 'Adicionar Filtro', adminTheme: 'Tema do Admin', @@ -248,6 +262,7 @@ export const ptTranslations: DefaultTranslationsObject = { 'Isso removerá os índices existentes e reindexará os documentos nas coleções {{collections}}.', confirmReindexDescriptionAll: 'Isso removerá os índices existentes e reindexará os documentos em todas as coleções.', + confirmRestoration: 'Confirme a restauração', copied: 'Copiado', copy: 'Copiar', copyField: 'Copiar campo', @@ -268,13 +283,17 @@ export const ptTranslations: DefaultTranslationsObject = { dark: 'Escuro', dashboard: 'Painel de Controle', delete: 'Excluir', + deleted: 'Excluído', + deletedAt: 'Excluído Em', deletedCountSuccessfully: 'Excluído {{count}} {{label}} com sucesso.', deletedSuccessfully: 'Apagado com sucesso.', + deletePermanently: 'Pular lixeira e excluir permanentemente', deleting: 'Excluindo...', depth: 'Profundidade', descending: 'Decrescente', deselectAllRows: 'Desmarcar todas as linhas', document: 'Documento', + documentIsTrashed: 'Este {{label}} está na lixeira e é somente para leitura.', documentLocked: 'Documento bloqueado', documents: 'Documentos', duplicate: 'Duplicar', @@ -290,6 +309,8 @@ export const ptTranslations: DefaultTranslationsObject = { editLabel: 'Editar {{label}}', email: 'Email', emailAddress: 'Endereço de Email', + emptyTrash: 'Esvaziar lixo', + emptyTrashLabel: 'Esvazie o lixo {{label}}', enterAValue: 'Insira um valor', error: 'Erro', errors: 'Erros', @@ -338,6 +359,7 @@ export const ptTranslations: DefaultTranslationsObject = { 'Nenhum {{label}} encontrado. Ou nenhum(a) {{label}} existe ainda, ou nenhum(a) corresponde aos filtros que você especificou acima.', notFound: 'Não Encontrado', nothingFound: 'Nada encontrado', + noTrashResults: 'Não há {{label}} no lixo.', noUpcomingEventsScheduled: 'Não há eventos futuros agendados.', noValue: 'Nenhum valor', of: 'de', @@ -351,6 +373,8 @@ export const ptTranslations: DefaultTranslationsObject = { pasteField: 'Colar campo', pasteRow: 'Colar linha', payloadSettings: 'Configurações do Payload', + permanentlyDelete: 'Excluir Permanentemente', + permanentlyDeletedCountSuccessfully: 'Apagou permanentemente {{count}} {{label}} com sucesso.', perPage: 'Itens por Página: {{limit}}', previous: 'Anterior', reindex: 'Reindexar', @@ -362,6 +386,11 @@ export const ptTranslations: DefaultTranslationsObject = { resetPreferencesDescription: 'Isso redefinirá todas as suas preferências para as configurações padrão.', resettingPreferences: 'Redefinindo preferências.', + restore: 'Restaurar', + restoreAsPublished: 'Restaurar como versão publicada', + restoredCountSuccessfully: 'Restaurado {{count}} {{label}} com sucesso.', + restoring: + 'Respeite o significado do texto original dentro do contexto do Payload. Aqui está uma lista de termos comuns do Payload que possuem significados muito específicos:\n - Collection: Uma coleção é um grupo de documentos que compartilham uma estrutura e propósito comuns. As coleções são usadas para organizar e gerenciar conteúdo no Payload.\n - Field: Um campo é uma peça específica de dados dentro de um documento em uma coleção. Os campos definem a estrutura e o tipo de dados que podem ser armazenados em um documento.\n - Document: Um documento é um registro individual dentro de uma coleção. Ele contém dados estruturados de acordo', row: 'Linha', rows: 'Linhas', save: 'Salvar', @@ -392,6 +421,10 @@ export const ptTranslations: DefaultTranslationsObject = { time: 'Tempo', timezone: 'Fuso horário', titleDeleted: '{{label}} {{title}} excluído com sucesso.', + titleRestored: '{{label}} "{{title}}" restaurado com sucesso.', + titleTrashed: '{{label}} "{{title}}" movido para a lixeira.', + trash: 'Lixo', + trashedCountSuccessfully: '{{count}} {{label}} movido para o lixo.', true: 'Verdadeiro', unauthorized: 'Não autorizado', unsavedChanges: 'Você tem alterações não salvas. Salve ou descarte antes de continuar.', @@ -410,6 +443,7 @@ export const ptTranslations: DefaultTranslationsObject = { username: 'Nome de usuário', users: 'usuários', value: 'Valor', + viewing: 'Visualização', viewReadOnly: 'Visualizar somente leitura', welcome: 'Boas vindas', yes: 'Sim', @@ -535,6 +569,7 @@ export const ptTranslations: DefaultTranslationsObject = { noRowsFound: 'Nenhum(a) {{label}} encontrado(a)', noRowsSelected: 'Nenhum {{rótulo}} selecionado', preview: 'Pré-visualização', + previouslyDraft: 'Anteriormente um Rascunho', previouslyPublished: 'Publicado Anteriormente', previousVersion: 'Versão Anterior', problemRestoringVersion: 'Ocorreu um problema ao restaurar essa versão', diff --git a/packages/translations/src/languages/ro.ts b/packages/translations/src/languages/ro.ts index 8d58ed276..9b559551b 100644 --- a/packages/translations/src/languages/ro.ts +++ b/packages/translations/src/languages/ro.ts @@ -116,6 +116,8 @@ export const roTranslations: DefaultTranslationsObject = { noUser: 'Nici un utilizator', previewing: 'A existat o problemă la previzualizarea acestui document.', problemUploadingFile: 'A existat o problemă în timpul încărcării fișierului.', + restoringTitle: + 'A survenit o eroare în timpul restaurării {{title}}. Verificați conexiunea și încercați din nou.', tokenInvalidOrExpired: 'Tokenul este invalid sau a expirat.', tokenNotProvided: 'Tokenul nu a fost furnizat.', unableToCopy: 'Imposibil de copiat.', @@ -218,6 +220,18 @@ export const roTranslations: DefaultTranslationsObject = { 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}}', + aboutToPermanentlyDelete: + 'Sunteți pe cale să ștergeți definitiv {{label}} <1>{{title}}. Sunteți sigur?', + aboutToPermanentlyDeleteTrash: + 'Sunteți pe cale să ștergeți definitiv <0>{{count}} <1>{{label}} din coșul de gunoi. Sunteți sigur?', + aboutToRestore: 'Sunteți pe cale să restaurați {{label}} <1>{{title}}. Sunteți sigur?', + aboutToRestoreAsDraft: + 'Sunteți pe cale să restaurați {{label}} <1>{{title}} ca o versiune preliminară. Sunteți sigur?', + aboutToRestoreAsDraftCount: 'Sunteți pe cale să restaurați {{count}} {{label}} ca proiect', + aboutToRestoreCount: 'Sunteți pe cale să restaurați {{count}} {{label}}', + aboutToTrash: + 'Sunteți pe cale să mutați {{label}} <1>{{title}} în coșul de gunoi. Sunteți sigur?', + aboutToTrashCount: 'Sunteți pe cale să mutați {{count}} {{label}} la gunoi.', addBelow: 'Adaugă mai jos', addFilter: 'Adaugă filtru', adminTheme: 'Tema Admin', @@ -252,6 +266,7 @@ export const roTranslations: DefaultTranslationsObject = { 'Aceasta va elimina indexurile existente și va reindexa documentele din colecțiile {{collections}}.', confirmReindexDescriptionAll: 'Aceasta va elimina indexurile existente și va reindexa documentele din toate colecțiile.', + confirmRestoration: 'Confirmă restaurarea', copied: 'Copiat', copy: 'Copiați', copyField: 'Copiază câmpul', @@ -272,13 +287,17 @@ export const roTranslations: DefaultTranslationsObject = { dark: 'Dark', dashboard: 'Panoul de bord', delete: 'Șterge', + deleted: 'Șters', + deletedAt: 'Șters la', deletedCountSuccessfully: 'Șterse cu succes {{count}} {{label}}.', deletedSuccessfully: 'Șters cu succes.', + deletePermanently: 'Omite coșul și șterge definitiv', deleting: 'Deleting...', depth: 'Adâncime', descending: 'Descendentă', deselectAllRows: 'Deselectează toate rândurile', document: 'Document', + documentIsTrashed: 'Acest {{label}} este la gunoi și poate fi doar citit.', documentLocked: 'Document blocat', documents: 'Documente', duplicate: 'Duplicați', @@ -294,6 +313,8 @@ export const roTranslations: DefaultTranslationsObject = { editLabel: 'Editați {{label}}', email: 'Email', emailAddress: 'Adresa de email', + emptyTrash: 'Golește coșul de gunoi', + emptyTrashLabel: 'Goliți coșul {{label}}', enterAValue: 'Introduceți o valoare', error: 'Eroare', errors: 'Erori', @@ -342,6 +363,7 @@ export const roTranslations: DefaultTranslationsObject = { '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..', notFound: 'Nu a fost găsit', nothingFound: 'Nimic găsit', + noTrashResults: 'Niciun {{label}} în coșul de gunoi.', noUpcomingEventsScheduled: 'Nu sunt evenimente programate în viitor.', noValue: 'Nici o valoare', of: 'de', @@ -355,6 +377,8 @@ export const roTranslations: DefaultTranslationsObject = { pasteField: 'Lipește câmpul', pasteRow: 'Lipește rândul', payloadSettings: 'Setări de Payload', + permanentlyDelete: 'Șterge definitiv', + permanentlyDeletedCountSuccessfully: 'Șters permanent cu succes {{count}} {{label}}.', perPage: 'Pe pagină: {{limit}}', previous: 'Anterior', reindex: 'Reindexare', @@ -365,6 +389,11 @@ export const roTranslations: DefaultTranslationsObject = { resetPreferences: 'Resetare preferințe', resetPreferencesDescription: 'Aceasta va reseta toate preferințele tale la setările implicite.', resettingPreferences: 'Resetare preferințe.', + restore: 'Restaurare', + restoreAsPublished: 'Restabilește ca versiune publicată', + restoredCountSuccessfully: '{{count}} {{label}} restabilite cu succes.', + restoring: + 'Respectați semnificația textului original în contextul Payload. Iată o listă de termeni obișnuiți Payload care au semnificații foarte specifice:\n - Colectie: O colectie este un grup de documente care împart o structură și un scop comun. Colectiile sunt utilizate pentru a organiza și gestiona conținutul în Payload.\n - Câmp: Un câmp este o piesă specifică de date dintr-un document dintr-o colecție. Câmpurile definesc structura și tipul de date care pot fi stocate într-un document.\n - Document', row: 'Rând', rows: 'Rânduri', save: 'Salvează', @@ -395,6 +424,10 @@ export const roTranslations: DefaultTranslationsObject = { time: 'Timp', timezone: 'Fus orar', titleDeleted: '{{label}} "{{title}}" șters cu succes.', + titleRestored: '{{label}} "{{title}}" a fost restaurat cu succes.', + titleTrashed: '{{label}} "{{title}}" a fost mutat la coșul de gunoi.', + trash: 'Gunoi', + trashedCountSuccessfully: '{{count}} {{label}} mutate la coșul de gunoi.', true: 'Adevărat', unauthorized: 'neautorizat(ă)', unsavedChanges: 'Aveți modificări nesalvate. Salvați sau renunțați înainte de a continua.', @@ -413,6 +446,7 @@ export const roTranslations: DefaultTranslationsObject = { username: 'Nume de utilizator', users: 'Utilizatori', value: 'Valoare', + viewing: 'Vizualizare', viewReadOnly: 'Vizualizare doar pentru citire', welcome: 'Bine ați venit', yes: 'Da', @@ -542,6 +576,7 @@ export const roTranslations: DefaultTranslationsObject = { noRowsFound: 'Nu s-a găsit niciun {{label}}', noRowsSelected: 'Niciun {{etichetă}} selectat', preview: 'Previzualizare', + previouslyDraft: 'Anterior un Proiect', previouslyPublished: 'Publicat anterior', previousVersion: 'Versiune Anterioară', problemRestoringVersion: 'A existat o problemă la restaurarea acestei versiuni', diff --git a/packages/translations/src/languages/rs.ts b/packages/translations/src/languages/rs.ts index d8a2e3824..449cf51b8 100644 --- a/packages/translations/src/languages/rs.ts +++ b/packages/translations/src/languages/rs.ts @@ -115,6 +115,8 @@ export const rsTranslations: DefaultTranslationsObject = { noUser: 'Нема корисника', previewing: 'Постоји проблем при прегледу овог документа.', problemUploadingFile: 'Постоји проблем при учитавању датотеке.', + restoringTitle: + 'Došlo je do greške prilikom vraćanja {{title}}. Proverite svoju vezu i pokušajte ponovo.', tokenInvalidOrExpired: 'Токен је невалидан или је истекао.', tokenNotProvided: 'Token nije dostavljen.', unableToCopy: 'Није могуће копирати.', @@ -215,6 +217,18 @@ export const rsTranslations: DefaultTranslationsObject = { aboutToDeleteCount_many: 'Избрисаћете {{count}} {{label}}', aboutToDeleteCount_one: 'Избрисаћете {{count}} {{label}}', aboutToDeleteCount_other: 'Избрисаћете {{count}} {{label}}', + aboutToPermanentlyDelete: + 'Управо ћете заувек избрисати {{label}} <1>{{title}}. Јесте ли сигурни?', + aboutToPermanentlyDeleteTrash: + 'На путу сте да трајно обришете <0>{{count}} <1>{{label}} из смећа. Да ли сте сигурни?', + aboutToRestore: 'На путу сте да вратите {{label}} <1>{{title}}. Јесте ли сигурни?', + aboutToRestoreAsDraft: + 'Na korak ste od obnavljanja {{label}} <1>{{title}} kao nacrta. Da li ste sigurni?', + aboutToRestoreAsDraftCount: 'Upravo ste na koraku da povratite {{count}} {{label}} kao skicu', + aboutToRestoreCount: 'Uskoro ćete obnoviti {{count}} {{label}}', + aboutToTrash: + 'Na korak ste da premestite {{label}} <1>{{title}} u otpad. Da li ste sigurni?', + aboutToTrashCount: 'Upravo ćete premestiti {{count}} {{label}} u smeće', addBelow: 'Додај испод', addFilter: 'Додај филтер', adminTheme: 'Администраторска тема', @@ -248,6 +262,7 @@ export const rsTranslations: DefaultTranslationsObject = { 'Ovo će ukloniti postojeće indekse i ponovo indeksirati dokumente u kolekcijama {{collections}}.', confirmReindexDescriptionAll: 'Ovo će ukloniti postojeće indekse i ponovo indeksirati dokumente u svim kolekcijama.', + confirmRestoration: 'Potvrdite obnovu', copied: 'Копирано', copy: 'Копирај', copyField: 'Копирај поље', @@ -268,13 +283,17 @@ export const rsTranslations: DefaultTranslationsObject = { dark: 'Тамно', dashboard: 'Контролни панел', delete: 'Обриши', + deleted: 'Obrisano', + deletedAt: 'Obrisano u', deletedCountSuccessfully: 'Успешно избрисано {{count}} {{label}}.', deletedSuccessfully: 'Успешно избрисано.', + deletePermanently: 'Preskoči otpad i trajno izbriši', deleting: 'Брисање...', depth: 'Dubina', descending: 'Опадајуће', deselectAllRows: 'Деселектујте све редове', document: 'Dokument', + documentIsTrashed: 'Ova {{label}} je odbačena i samo je za čitanje.', documentLocked: 'Документ је закључан', documents: 'Dokumenti', duplicate: 'Дупликат', @@ -290,6 +309,8 @@ export const rsTranslations: DefaultTranslationsObject = { editLabel: 'Уреди {{label}}', email: 'Е-пошта', emailAddress: 'Адреса е-поште', + emptyTrash: 'Isprazni korpu', + emptyTrashLabel: 'Isprazni {{label}} korpu za smeće', enterAValue: 'Унеси вредност', error: 'Грешка', errors: 'Грешке', @@ -338,6 +359,7 @@ export const rsTranslations: DefaultTranslationsObject = { 'Нема пронађених {{label}}. Могуће да {{label}} још увек не постоји или нема резултата у складу са постављеним филтерима.', notFound: 'Није пронађено', nothingFound: 'Ништа није пронађено', + noTrashResults: 'Nema {{label}} u otpadu.', noUpcomingEventsScheduled: 'Nema zakazanih predstojećih događaja.', noValue: 'Без вредности', of: 'Од', @@ -351,6 +373,8 @@ export const rsTranslations: DefaultTranslationsObject = { pasteField: 'Залепи поље', pasteRow: 'Залепи ред', payloadSettings: 'Payload поставке', + permanentlyDelete: 'Trajno Izbriši', + permanentlyDeletedCountSuccessfully: 'Trajno obrisano {{count}} {{label}} uspešno.', perPage: 'По страници: {{limit}}', previous: 'Prethodni', reindex: 'Реиндексирај', @@ -361,6 +385,10 @@ export const rsTranslations: DefaultTranslationsObject = { resetPreferences: 'Поништи подешавања', resetPreferencesDescription: 'Ово ће поништити сва ваша подешавања на подразумеване вредности.', resettingPreferences: 'Поништавање подешавања.', + restore: 'Vrati', + restoreAsPublished: 'Vrati na objavljenu verziju', + restoredCountSuccessfully: 'Uspješno obnovljeno {{count}} {{label}}.', + restoring: 'Vraćanje u prvobitno stanje...', row: 'Ред', rows: 'Редови', save: 'Сачувај', @@ -391,6 +419,10 @@ export const rsTranslations: DefaultTranslationsObject = { time: 'Vreme', timezone: 'Vremenska zona', titleDeleted: '{{label}} "{{title}}" успешно обрисано.', + titleRestored: '{{label}} "{{title}}" uspešno obnovljen.', + titleTrashed: '{{label}} "{{title}}" premešten u otpad.', + trash: 'Smeće', + trashedCountSuccessfully: '{{count}} {{label}} premješteno u smeće.', true: 'Istinito', unauthorized: 'Нисте ауторизовани', unsavedChanges: 'Imate nesačuvane izmene. Sačuvajte ili odbacite pre nego što nastavite.', @@ -409,6 +441,7 @@ export const rsTranslations: DefaultTranslationsObject = { username: 'Korisničko ime', users: 'Корисници', value: 'Вредност', + viewing: 'Pregled', viewReadOnly: 'Прегледај само за читање', welcome: 'Добродошли', yes: 'Да', @@ -530,6 +563,7 @@ export const rsTranslations: DefaultTranslationsObject = { noRowsFound: '{{label}} није пронађено', noRowsSelected: 'Nije odabrana {{label}}', preview: 'Преглед', + previouslyDraft: 'Prethodno Nacrt', previouslyPublished: 'Prethodno objavljeno', previousVersion: 'Prethodna verzija', problemRestoringVersion: 'Настао је проблем при враћању ове верзије', diff --git a/packages/translations/src/languages/rsLatin.ts b/packages/translations/src/languages/rsLatin.ts index 1207d5cfb..8fe8b08d9 100644 --- a/packages/translations/src/languages/rsLatin.ts +++ b/packages/translations/src/languages/rsLatin.ts @@ -115,6 +115,8 @@ export const rsLatinTranslations: DefaultTranslationsObject = { noUser: 'Nema korisnika', previewing: 'Postoji problem pri pregledu ovog dokumenta.', problemUploadingFile: 'Postoji problem pri učitavanju datoteke.', + restoringTitle: + 'Došlo je do greške prilikom vraćanja {{title}}. Molimo vas da proverite svoju vezu i pokušate ponovo.', tokenInvalidOrExpired: 'Token je nevalidan ili je istekao.', tokenNotProvided: 'Token nije obezbeđen.', unableToCopy: 'Kopiranje nije moguće.', @@ -215,6 +217,18 @@ export const rsLatinTranslations: DefaultTranslationsObject = { aboutToDeleteCount_many: 'Izbrisaćete {{count}} {{label}}', aboutToDeleteCount_one: 'Izbrisaćete {{count}} {{label}}', aboutToDeleteCount_other: 'Izbrisaćete {{count}} {{label}}', + aboutToPermanentlyDelete: + 'Na korak ste da trajno izbrišete {{label}} <1>{{title}}. Da li ste sigurni?', + aboutToPermanentlyDeleteTrash: + 'Na korak ste da trajno obrišete <0>{{count}} <1>{{label}} iz otpada. Da li ste sigurni?', + aboutToRestore: 'Na korak ste da vratite {{label}} <1>{{title}}. Da li ste sigurni?', + aboutToRestoreAsDraft: + 'Uskoro ćete obnoviti {{label}} <1>{{title}} kao skicu. Da li ste sigurni?', + aboutToRestoreAsDraftCount: 'Uskoro ćete vratiti {{count}} {{label}} kao nacrt', + aboutToRestoreCount: 'Uskoro ćete obnoviti {{count}} {{label}}', + aboutToTrash: + 'Na korak ste da premestite {{label}} <1>{{title}} u otpad. Da li ste sigurni?', + aboutToTrashCount: 'Upravo ćete prebaciti {{count}} {{label}} u smeće', addBelow: 'Dodaj ispod', addFilter: 'Dodaj filter', adminTheme: 'Administratorska tema', @@ -248,6 +262,7 @@ export const rsLatinTranslations: DefaultTranslationsObject = { 'Ovo će ukloniti postojeće indekse i ponovo indeksirati dokumente u kolekcijama {{collections}}.', confirmReindexDescriptionAll: 'Ovo će ukloniti postojeće indekse i ponovo indeksirati dokumente u svim kolekcijama.', + confirmRestoration: 'Potvrdite obnovu', copied: 'Kopirano', copy: 'Kopiraj', copyField: 'Kopiraj polje', @@ -268,13 +283,17 @@ export const rsLatinTranslations: DefaultTranslationsObject = { dark: 'Tamno', dashboard: 'Kontrolni panel', delete: 'Obriši', + deleted: 'Obrisano', + deletedAt: 'Obrisano U', deletedCountSuccessfully: 'Uspešno izbrisano {{count}} {{label}}.', deletedSuccessfully: 'Uspešno izbrisano.', + deletePermanently: 'Preskoči kantu za smeće i trajno izbriši', deleting: 'Brisanje...', depth: 'Dubina', descending: 'Opadajuće', deselectAllRows: 'Deselektujte sve redove', document: 'Dokument', + documentIsTrashed: 'Ova {{label}} je odbačena i može se samo čitati.', documentLocked: 'Dokument je zaključan', documents: 'Dokumenti', duplicate: 'Duplikat', @@ -290,6 +309,8 @@ export const rsLatinTranslations: DefaultTranslationsObject = { editLabel: 'Uredi {{label}}', email: 'E-pošta', emailAddress: 'Аdresa e-pošte', + emptyTrash: 'Isprazni otpad', + emptyTrashLabel: 'Isprazni {{label}} korpu za smeće', enterAValue: 'Unesi vrednost', error: 'Greška', errors: 'Greške', @@ -338,6 +359,7 @@ export const rsLatinTranslations: DefaultTranslationsObject = { 'Nema pronađenih {{label}}. Moguće da {{label}} još uvek ne postoji ili nema rezultata u skladu sa postavljenim filterima.', notFound: 'Nije pronađeno', nothingFound: 'Ništa nije pronađeno', + noTrashResults: 'Nema {{label}} u otpadu.', noUpcomingEventsScheduled: 'Nema zakazanih predstojećih događaja.', noValue: 'Bez vrednosti', of: 'Od', @@ -351,6 +373,8 @@ export const rsLatinTranslations: DefaultTranslationsObject = { pasteField: 'Zalepi polje', pasteRow: 'Zalepi red', payloadSettings: 'Payload postavke', + permanentlyDelete: 'Trajno Obriši', + permanentlyDeletedCountSuccessfully: 'Trajno obrisano {{count}} {{label}} uspešno.', perPage: 'Po stranici: {{limit}}', previous: 'Prethodni', reindex: 'Reindeksiraj', @@ -362,6 +386,10 @@ export const rsLatinTranslations: DefaultTranslationsObject = { resetPreferencesDescription: 'Ovo će poništiti sva vaša podešavanja na podrazumevane vrednosti.', resettingPreferences: 'Poništavanje podešavanja.', + restore: 'Vrati', + restoreAsPublished: 'Vrati kao objavljenu verziju', + restoredCountSuccessfully: 'Uspešno obnovljeno {{count}} {{label}}.', + restoring: 'Vraćanje na prethodno stanje...', row: 'Red', rows: 'Redovi', save: 'Sačuvaj', @@ -392,6 +420,10 @@ export const rsLatinTranslations: DefaultTranslationsObject = { time: 'Vreme', timezone: 'Vremenska zona', titleDeleted: '{{label}} "{{title}}" uspešno obrisano.', + titleRestored: 'Oznaka "{{title}}" uspešno obnovljena.', + titleTrashed: '{{label}} "{{title}}" premešteno u smeće.', + trash: 'Otpad', + trashedCountSuccessfully: '{{count}} {{label}} premešteno u kantu za smeće.', true: 'Istinito', unauthorized: 'Niste autorizovani', unsavedChanges: 'Imate nesačuvane promene. Sačuvajte ili odbacite pre nego što nastavite.', @@ -410,6 +442,7 @@ export const rsLatinTranslations: DefaultTranslationsObject = { username: 'Korisničko ime', users: 'Korisnici', value: 'Vrednost', + viewing: 'Pregled', viewReadOnly: 'Pregledaj samo za čitanje', welcome: 'Dobrodošli', yes: 'Da', @@ -532,6 +565,7 @@ export const rsLatinTranslations: DefaultTranslationsObject = { noRowsFound: '{{label}} nije pronađeno', noRowsSelected: 'Nije odabrana {{label}}', preview: 'Pregled', + previouslyDraft: 'Prethodno Nacrt', previouslyPublished: 'Prethodno objavljeno', previousVersion: 'Prethodna Verzija', problemRestoringVersion: 'Nastao je problem pri vraćanju ove verzije', diff --git a/packages/translations/src/languages/ru.ts b/packages/translations/src/languages/ru.ts index 4eba3f49c..a50df7f59 100644 --- a/packages/translations/src/languages/ru.ts +++ b/packages/translations/src/languages/ru.ts @@ -115,6 +115,8 @@ export const ruTranslations: DefaultTranslationsObject = { noUser: 'Нет Пользователя', previewing: 'При предварительном просмотре этого документа возникла проблема.', problemUploadingFile: 'Возникла проблема при загрузке файла.', + restoringTitle: + 'Произошла ошибка при восстановлении {{title}}. Пожалуйста, проверьте свое соединение и попробуйте снова.', tokenInvalidOrExpired: 'Токен либо недействителен, либо срок его действия истек.', tokenNotProvided: 'Токен не предоставлен.', unableToCopy: 'Не удалось скопировать.', @@ -216,6 +218,17 @@ export const ruTranslations: DefaultTranslationsObject = { aboutToDeleteCount_many: 'Вы собираетесь удалить {{count}} {{label}}', aboutToDeleteCount_one: 'Вы собираетесь удалить {{count}} {{label}}', aboutToDeleteCount_other: 'Вы собираетесь удалить {{count}} {{label}}', + aboutToPermanentlyDelete: + 'Вы собираетесь навсегда удалить {{label}} <1>{{title}}. Вы уверены?', + aboutToPermanentlyDeleteTrash: + 'Вы собираетесь навсегда удалить <0>{{count}} <1>{{label}} из корзины. Вы уверены?', + aboutToRestore: 'Вы собираетесь восстановить {{label}} <1>{{title}}. Вы уверены?', + aboutToRestoreAsDraft: + 'Вы собираетесь восстановить {{label}} <1>{{title}} как черновик. Вы уверены?', + aboutToRestoreAsDraftCount: 'Вы собираетесь восстановить {{count}} {{label}} как черновик', + aboutToRestoreCount: 'Вы собираетесь восстановить {{count}} {{label}}', + aboutToTrash: 'Вы собираетесь переместить {{label}} <1>{{title}} в корзину. Вы уверены?', + aboutToTrashCount: 'Вы собираетесь переместить {{count}} {{label}} в корзину', addBelow: 'Добавить ниже', addFilter: 'Добавить фильтр', adminTheme: 'Тема Панели', @@ -250,6 +263,7 @@ export const ruTranslations: DefaultTranslationsObject = { 'Это удалит существующие индексы и переиндексирует документы в коллекциях {{collections}}.', confirmReindexDescriptionAll: 'Это удалит существующие индексы и переиндексирует документы во всех коллекциях.', + confirmRestoration: 'Подтвердите восстановление', copied: 'Скопировано', copy: 'Скопировать', copyField: 'Копировать поле', @@ -270,13 +284,17 @@ export const ruTranslations: DefaultTranslationsObject = { dark: 'Тёмная', dashboard: 'Панель', delete: 'Удалить', + deleted: 'Удалено', + deletedAt: 'Удалено В', deletedCountSuccessfully: 'Удалено {{count}} {{label}} успешно.', deletedSuccessfully: 'Удален успешно.', + deletePermanently: 'Пропустить корзину и удалить навсегда', deleting: 'Удаление...', depth: 'Глубина', descending: 'Уменьшение', deselectAllRows: 'Снять выделение со всех строк', document: 'Документ', + documentIsTrashed: 'Этот {{label}} находится в корзине и доступен только для чтения.', documentLocked: 'Документ заблокирован', documents: 'Документы', duplicate: 'Дублировать', @@ -292,6 +310,8 @@ export const ruTranslations: DefaultTranslationsObject = { editLabel: 'Редактировать {{label}}', email: 'Email', emailAddress: 'Email', + emptyTrash: 'Очистить корзину', + emptyTrashLabel: 'Очистить корзину для {{label}}', enterAValue: 'Введите значение', error: 'Ошибка', errors: 'Ошибки', @@ -340,6 +360,7 @@ export const ruTranslations: DefaultTranslationsObject = { 'Ничего не найдено. Возможно, {{label}} еще не существует или не соответствует указанным фильтрам.', notFound: 'Не найдено', nothingFound: 'Ничего не найдено', + noTrashResults: 'Нет {{label}} в корзине.', noUpcomingEventsScheduled: 'Нет запланированных предстоящих событий.', noValue: 'Нет значения', of: 'из', @@ -353,6 +374,8 @@ export const ruTranslations: DefaultTranslationsObject = { pasteField: 'Вставить поле', pasteRow: 'Вставить строку', payloadSettings: 'Настройки Payload', + permanentlyDelete: 'Удалить Навсегда', + permanentlyDeletedCountSuccessfully: 'Успешно удалено {{count}} {{label}} навсегда.', perPage: 'На странице: {{limit}}', previous: 'Предыдущий', reindex: 'Переиндексировать', @@ -363,6 +386,10 @@ export const ruTranslations: DefaultTranslationsObject = { resetPreferences: 'Сбросить настройки', resetPreferencesDescription: 'Это сбросит все ваши настройки до значений по умолчанию.', resettingPreferences: 'Сброс настроек.', + restore: 'Восстановить', + restoreAsPublished: 'Восстановить как опубликованную версию', + restoredCountSuccessfully: 'Восстановлено успешно {{count}} {{label}}.', + restoring: 'Восстановление...', row: 'Строка', rows: 'Строки', save: 'Сохранить', @@ -393,6 +420,10 @@ export const ruTranslations: DefaultTranslationsObject = { time: 'Время', timezone: 'Часовой пояс', titleDeleted: '{{label}} {{title}} успешно удалено.', + titleRestored: '{{label}} "{{title}}" успешно восстановлен.', + titleTrashed: '{{label}} "{{title}}" перемещен в корзину.', + trash: 'Мусор', + trashedCountSuccessfully: '{{count}} {{label}} перемещено в корзину.', true: 'Правда', unauthorized: 'Нет доступа', unsavedChanges: @@ -413,6 +444,7 @@ export const ruTranslations: DefaultTranslationsObject = { username: 'Имя пользователя', users: 'пользователи', value: 'Значение', + viewing: 'Просмотр', viewReadOnly: 'Просмотр только для чтения', welcome: 'Добро пожаловать', yes: 'Да', @@ -537,6 +569,7 @@ export const ruTranslations: DefaultTranslationsObject = { noRowsFound: 'Не найдено {{label}}', noRowsSelected: 'Не выбран {{label}}', preview: 'Предпросмотр', + previouslyDraft: 'Ранее был черновик', previouslyPublished: 'Ранее опубликовано', previousVersion: 'Предыдущая версия', problemRestoringVersion: 'Возникла проблема с восстановлением этой версии', diff --git a/packages/translations/src/languages/sk.ts b/packages/translations/src/languages/sk.ts index 13a6c5d5a..43fbe8b04 100644 --- a/packages/translations/src/languages/sk.ts +++ b/packages/translations/src/languages/sk.ts @@ -115,6 +115,8 @@ export const skTranslations: DefaultTranslationsObject = { noUser: 'Žiadny používateľ', previewing: 'Pri náhľade tohto dokumentu došlo k chybe.', problemUploadingFile: 'Pri nahrávaní súboru došlo k chybe.', + restoringTitle: + 'Pri obnovovaní {{title}} sa vyskytla chyba. Skontrolujte prosím svoje pripojenie a skúste to znova.', tokenInvalidOrExpired: 'Token je neplatný alebo vypršal.', tokenNotProvided: 'Token nie je poskytnutý.', unableToCopy: 'Kopírovanie nie je možné.', @@ -217,6 +219,17 @@ export const skTranslations: DefaultTranslationsObject = { aboutToDeleteCount_many: 'Chystáte sa zmazať {{count}} {{label}}', aboutToDeleteCount_one: 'Chystáte sa zmazať {{count}} {{label}}', aboutToDeleteCount_other: 'Chystáte sa zmazať {{count}} {{label}}', + aboutToPermanentlyDelete: + 'Chystáte sa natrvalo vymazať {{label}} <1>{{title}}. Ste si istý?', + aboutToPermanentlyDeleteTrash: + 'Chystáte sa natrvalo odstrániť <0>{{count}} <1>{{label}} z koša. Ste si istý?', + aboutToRestore: 'Chystáte sa obnoviť {{label}} <1>{{title}}. Ste si istý?', + aboutToRestoreAsDraft: + 'Chystáte sa obnoviť {{label}} <1>{{title}} ako koncept. Ste si istý?', + aboutToRestoreAsDraftCount: 'Chystáte sa obnoviť {{count}} {{label}} ako koncept', + aboutToRestoreCount: 'Chystáte sa obnoviť {{count}} {{label}}', + aboutToTrash: 'Chystáte sa presunúť {{label}} <1>{{title}} do koša. Ste si istý?', + aboutToTrashCount: 'Chystáte sa presunúť {{count}} {{label}} do koša', addBelow: 'Pridať pod', addFilter: 'Pridať filter', adminTheme: 'Motív administračného rozhrania', @@ -250,6 +263,7 @@ export const skTranslations: DefaultTranslationsObject = { 'Týmto sa odstránia existujúce indexy a znova sa zaindexujú dokumenty v kolekciách {{collections}}.', confirmReindexDescriptionAll: 'Týmto sa odstránia existujúce indexy a znova sa zaindexujú dokumenty vo všetkých kolekciách.', + confirmRestoration: 'Potvrďte obnovenie', copied: 'Skopírované', copy: 'Kopírovať', copyField: 'Kopírovať pole', @@ -269,13 +283,17 @@ export const skTranslations: DefaultTranslationsObject = { dark: 'Tmavý', dashboard: 'Nástenka', delete: 'Odstrániť', + deleted: 'Vymazané', + deletedAt: 'Vymazané dňa', deletedCountSuccessfully: 'Úspešne zmazané {{count}} {{label}}.', deletedSuccessfully: 'Úspešne odstránené.', + deletePermanently: 'Preskočiť kôš a odstrániť natrvalo', deleting: 'Odstraňovanie...', depth: 'Hĺbka', descending: 'Zostupne', deselectAllRows: 'Zrušiť výber všetkých riadkov', document: 'Dokument', + documentIsTrashed: 'Táto {{label}} je v koši a je iba na čítanie.', documentLocked: 'Dokument je zamknutý', documents: 'Dokumenty', duplicate: 'Duplikovať', @@ -291,6 +309,8 @@ export const skTranslations: DefaultTranslationsObject = { editLabel: 'Upraviť {{label}}', email: 'E-mail', emailAddress: 'E-mailová adresa', + emptyTrash: 'Vyprázdniť koš', + emptyTrashLabel: 'Vyprázdniť koš {{label}}', enterAValue: 'Zadajte hodnotu', error: 'Chyba', errors: 'Chyby', @@ -338,6 +358,7 @@ export const skTranslations: DefaultTranslationsObject = { 'Neboli nájdené žiadne {{label}}. Buď neexistujú žiadne {{label}}, alebo žiadne nespĺňajú filtre, ktoré ste zadali vyššie.', notFound: 'Nenájdené', nothingFound: 'Nič nenájdené', + noTrashResults: 'Žiadne {{label}} v koši.', noUpcomingEventsScheduled: 'Nie sú naplánované žiadne nadchádzajúce udalosti.', noValue: 'Žiadna hodnota', of: 'z', @@ -351,6 +372,8 @@ export const skTranslations: DefaultTranslationsObject = { pasteField: 'Prilepiť pole', pasteRow: 'Prilepiť riadok', payloadSettings: 'Nastavenia dátového záznamu', + permanentlyDelete: 'Trvalo odstrániť', + permanentlyDeletedCountSuccessfully: 'Úspešne ste natrvalo odstránili {{count}} {{label}}.', perPage: 'Na stránku: {{limit}}', previous: 'Predchádzajúci', reindex: 'Reindexovať', @@ -361,6 +384,10 @@ export const skTranslations: DefaultTranslationsObject = { resetPreferences: 'Obnoviť nastavenia', resetPreferencesDescription: 'Týmto sa všetky vaše nastavenia vrátia na predvolené hodnoty.', resettingPreferences: 'Obnovovanie nastavení.', + restore: 'Obnoviť', + restoreAsPublished: 'Obnoviť ako publikovanú verziu', + restoredCountSuccessfully: 'Úspešne obnovené {{count}} {{label}}.', + restoring: 'Obnovovanie...', row: 'Riadok', rows: 'Riadky', save: 'Uložiť', @@ -391,6 +418,10 @@ export const skTranslations: DefaultTranslationsObject = { time: 'Čas', timezone: 'Časové pásmo', titleDeleted: '{{label}} "{{title}}" úspešne zmazané.', + titleRestored: '{{label}} "{{title}}" úspešne obnovený.', + titleTrashed: '{{label}} "{{title}}" presunuté do koša.', + trash: 'Koš', + trashedCountSuccessfully: '{{count}} {{label}} presunuté do koša.', true: 'Pravda', unauthorized: 'Neoprávnený prístup', unsavedChanges: 'Máte neuložené zmeny. Uložte alebo zahoďte pred pokračovaním.', @@ -409,6 +440,7 @@ export const skTranslations: DefaultTranslationsObject = { username: 'Používateľské meno', users: 'Používatelia', value: 'Hodnota', + viewing: 'Prezeranie', viewReadOnly: 'Zobraziť iba na čítanie', welcome: 'Vitajte', yes: 'Áno', @@ -533,6 +565,7 @@ export const skTranslations: DefaultTranslationsObject = { noRowsFound: 'Nenájdené {{label}}', noRowsSelected: 'Nie je vybraté žiadne {{označenie}}', preview: 'Náhľad', + previouslyDraft: 'Predtým Koncept', previouslyPublished: 'Predtým publikované', previousVersion: 'Predchádzajúca verzia', problemRestoringVersion: 'Pri obnovovaní tejto verzie došlo k problému', diff --git a/packages/translations/src/languages/sl.ts b/packages/translations/src/languages/sl.ts index 6880c5a6e..5ce531d84 100644 --- a/packages/translations/src/languages/sl.ts +++ b/packages/translations/src/languages/sl.ts @@ -114,6 +114,8 @@ export const slTranslations: DefaultTranslationsObject = { noUser: 'Ni uporabnika', previewing: 'Pri predogledu tega dokumenta je prišlo do težave.', problemUploadingFile: 'Pri nalaganju datoteke je prišlo do težave.', + restoringTitle: + 'Pri obnavljanju {{title}} je prišlo do napake. Prosimo, preverite svojo povezavo in poskusite znova.', tokenInvalidOrExpired: 'Žeton je neveljaven ali je potekel.', tokenNotProvided: 'Žeton ni bil posredovan.', unableToCopy: 'Kopiranje ni mogoče.', @@ -214,6 +216,17 @@ export const slTranslations: DefaultTranslationsObject = { aboutToDeleteCount_many: 'Izbrisali boste {{count}} {{label}}', aboutToDeleteCount_one: 'Izbrisali boste {{count}} {{label}}', aboutToDeleteCount_other: 'Izbrisali boste {{count}} {{label}}', + aboutToPermanentlyDelete: + 'Ravno boste trajno izbrisali {{label}} <1>{{title}}. Ste prepričani?', + aboutToPermanentlyDeleteTrash: + 'Pravkar boste trajno izbrisali <0>{{count}} <1>{{label}} iz smetnjaka. Ali ste prepričani?', + aboutToRestore: 'Ravno se odpravljate na obnovitev {{label}} <1>{{title}}. Ste prepričani?', + aboutToRestoreAsDraft: + 'Pravkar boste obnovili {{label}} <1>{{title}} kot osnutek. Ali ste prepričani?', + aboutToRestoreAsDraftCount: 'Pravkar boste obnovili {{count}} {{label}} kot osnutek.', + aboutToRestoreCount: 'Pravkar boste obnovili {{count}} {{label}}', + aboutToTrash: 'Pravkar boste premaknili {{label}} <1>{{title}} v smeti. Ste prepričani?', + aboutToTrashCount: 'Pravkar boste premaknili {{count}} {{label}} v smeti.', addBelow: 'Dodaj spodaj', addFilter: 'Dodaj filter', adminTheme: 'Tema skrbnika', @@ -248,6 +261,7 @@ export const slTranslations: DefaultTranslationsObject = { 'To bo odstranilo obstoječe indekse in ponovno indeksiralo dokumente v zbirkah {{collections}}.', confirmReindexDescriptionAll: 'To bo odstranilo obstoječe indekse in ponovno indeksiralo dokumente v vseh zbirkah.', + confirmRestoration: 'Potrdite obnovitev', copied: 'Kopirano', copy: 'Kopiraj', copyField: 'Kopiraj polje', @@ -267,13 +281,17 @@ export const slTranslations: DefaultTranslationsObject = { dark: 'Temno', dashboard: 'Nadzorna plošča', delete: 'Izbriši', + deleted: 'Izbrisano', + deletedAt: 'Izbrisano ob', deletedCountSuccessfully: 'Uspešno izbrisano {{count}} {{label}}.', deletedSuccessfully: 'Uspešno izbrisano.', + deletePermanently: 'Preskoči smetnjak in trajno izbriši', deleting: 'Brisanje...', depth: 'Globina', descending: 'Padajoče', deselectAllRows: 'Odznači vse vrstice', document: 'Dokument', + documentIsTrashed: 'Ta {{label}} je v smetnjaku in je samo za branje.', documentLocked: 'Dokument zaklenjen', documents: 'Dokumenti', duplicate: 'Podvoji', @@ -289,6 +307,8 @@ export const slTranslations: DefaultTranslationsObject = { editLabel: 'Uredi {{label}}', email: 'E-pošta', emailAddress: 'E-poštni naslov', + emptyTrash: 'Izprazni koš', + emptyTrashLabel: 'Izprazni {{label}} smeti', enterAValue: 'Vnesite vrednost', error: 'Napaka', errors: 'Napake', @@ -337,6 +357,7 @@ export const slTranslations: DefaultTranslationsObject = { 'Ni najdenih {{label}}. Ali {{label}} še ne obstajajo ali pa ne ustrezajo filtrom, ki ste jih določili zgoraj.', notFound: 'Ni najdeno', nothingFound: 'Nič ni najdeno', + noTrashResults: 'Ni {{label}} v smetnjaku.', noUpcomingEventsScheduled: 'Ni načrtovanih prihajajočih dogodkov.', noValue: 'Ni vrednosti', of: 'od', @@ -350,6 +371,8 @@ export const slTranslations: DefaultTranslationsObject = { pasteField: 'Prilepi polje', pasteRow: 'Prilepi vrstico', payloadSettings: 'Nastavitve Payloada', + permanentlyDelete: 'Trajno Izbrisano', + permanentlyDeletedCountSuccessfully: 'Uspešno trajno izbrisano {{count}} {{label}}.', perPage: 'Na stran: {{limit}}', previous: 'Prejšnji', reindex: 'Reindeksiraj', @@ -360,6 +383,11 @@ export const slTranslations: DefaultTranslationsObject = { resetPreferences: 'Ponastavi nastavitve', resetPreferencesDescription: 'To bo ponastavilo vse vaše nastavitve na privzete vrednosti.', resettingPreferences: 'Ponastavitev nastavitve.', + restore: 'Obnovi', + restoreAsPublished: 'Obnovi kot objavljeno različico', + restoredCountSuccessfully: 'Uspešno obnovljeno {{count}} {{label}}.', + restoring: + 'Spoštujte pomen izvirnega besedila znotraj konteksta Payload. Tu je seznam pogostih izrazov Payload, ki imajo zelo specifične pomene:\n - Zbirka: Zbirka je skupina dokumentov, ki delijo skupno strukturo in namen. Zbirke se uporabljajo za organizacijo in upravljanje vsebine v Payload.\n - Polje: Polje je določen del podatkov znotraj dokumenta v zbirki. Polja opredeljujejo strukturo in vrsto podatkov, ki jih je mogoče sh', row: 'Vrstica', rows: 'Vrstice', save: 'Shrani', @@ -390,6 +418,10 @@ export const slTranslations: DefaultTranslationsObject = { time: 'Čas', timezone: 'Časovni pas', titleDeleted: '{{label}} "{{title}}" uspešno izbrisan.', + titleRestored: 'Oznaka "{{title}}" je bila uspešno obnovljena.', + titleTrashed: '{{label}} "{{title}}" premaknjeno v smeti.', + trash: 'Smeti', + trashedCountSuccessfully: '{{count}} {{label}} premaknjeno v smeti.', true: 'Da', unauthorized: 'Nepooblaščeno', unsavedChanges: 'Neshranjene spremembe', @@ -408,6 +440,7 @@ export const slTranslations: DefaultTranslationsObject = { username: 'Uporabniško ime', users: 'Uporabniki', value: 'Vrednost', + viewing: 'Ogled', viewReadOnly: 'Ogled samo za branje', welcome: 'Dobrodošli', yes: 'Da', @@ -531,6 +564,7 @@ export const slTranslations: DefaultTranslationsObject = { noRowsFound: 'Ni najdenih {{label}}', noRowsSelected: 'Ni izbranih {{label}}', preview: 'Predogled', + previouslyDraft: 'Prej osnutek', previouslyPublished: 'Predhodno objavljeno', previousVersion: 'Prejšnja različica', problemRestoringVersion: 'Pri obnavljanju te različice je prišlo do težave', diff --git a/packages/translations/src/languages/sv.ts b/packages/translations/src/languages/sv.ts index bad3e2435..a2e0350e4 100644 --- a/packages/translations/src/languages/sv.ts +++ b/packages/translations/src/languages/sv.ts @@ -114,6 +114,8 @@ export const svTranslations: DefaultTranslationsObject = { noUser: 'Ingen Användare', previewing: 'Det uppstod ett problem när det här dokumentet skulle förhandsgranskas.', problemUploadingFile: 'Det uppstod ett problem när filen laddades upp.', + restoringTitle: + 'Det uppstod ett fel vid återställning av {{title}}. Vänligen kontrollera din anslutning och försök igen.', tokenInvalidOrExpired: 'Token är antingen ogiltig eller har löpt ut.', tokenNotProvided: 'Token inte tillhandahållet.', unableToCopy: 'Kan inte kopiera.', @@ -213,6 +215,18 @@ export const svTranslations: DefaultTranslationsObject = { 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}}', + aboutToPermanentlyDelete: + 'Du är på väg att permanent radera {{label}} <1>{{title}}. Är du säker?', + aboutToPermanentlyDeleteTrash: + 'Du är på väg att permanent radera <0>{{count}} <1>{{label}} från papperskorgen. Är du säker?', + aboutToRestore: 'Du är på väg att återställa {{label}} <1>{{title}}. Är du säker?', + aboutToRestoreAsDraft: + 'Du är på väg att återställa {{label}} <1>{{title}} som ett utkast. Är du säker?', + aboutToRestoreAsDraftCount: 'Du är på väg att återställa {{count}} {{label}} som utkast', + aboutToRestoreCount: 'Du är på väg att återställa {{count}} {{label}}', + aboutToTrash: + 'Du håller på att flytta {{label}} <1>{{title}} till papperskorgen. Är du säker?', + aboutToTrashCount: 'Du håller på att flytta {{count}} {{label}} till papperskorgen', addBelow: 'Lägg till nedanför', addFilter: 'Lägg till filter', adminTheme: 'Adminutseende', @@ -247,6 +261,7 @@ export const svTranslations: DefaultTranslationsObject = { 'Detta kommer att ta bort befintliga index och omindexera dokumenten i {{collections}}-samlingarna.', confirmReindexDescriptionAll: 'Detta kommer att ta bort befintliga index och omindexera dokumenten i alla samlingar.', + confirmRestoration: 'Bekräfta återställning', copied: 'Kopierad', copy: 'Kopiera', copyField: 'Kopiera fält', @@ -267,13 +282,17 @@ export const svTranslations: DefaultTranslationsObject = { dark: 'Mörkt', dashboard: 'Översikt', delete: 'Ta bort', + deleted: 'Raderad', + deletedAt: 'Raderad Vid', deletedCountSuccessfully: 'Raderade {{count}} {{label}}', deletedSuccessfully: 'Borttaget', + deletePermanently: 'Hoppa över papperskorgen och radera permanent', deleting: 'Tar bort...', depth: 'Djup', descending: 'Fallande', deselectAllRows: 'Avmarkera alla rader', document: 'Dokument', + documentIsTrashed: 'Det här {{label}} har slagits i spill och är skrivskyddad.', documentLocked: 'Dokument låst', documents: 'Dokument', duplicate: 'Duplicera', @@ -289,6 +308,8 @@ export const svTranslations: DefaultTranslationsObject = { editLabel: 'Redigera {{label}}', email: 'E-post', emailAddress: 'E-postadress', + emptyTrash: 'Töm papperskorgen', + emptyTrashLabel: 'Töm {{label}} papperskorgen', enterAValue: 'Ange ett värde', error: 'Fel', errors: 'Fel', @@ -337,6 +358,7 @@ export const svTranslations: DefaultTranslationsObject = { 'Inga {{label}} hittades. Antingen finns inga {{label}} ännu eller så matchar inga filtren du har angett ovan.', notFound: 'Hittades inte', nothingFound: 'Inget hittades', + noTrashResults: 'Inget {{label}} i papperskorgen.', noUpcomingEventsScheduled: 'Inga kommande händelser är planerade.', noValue: 'Inget värde', of: 'av', @@ -350,6 +372,8 @@ export const svTranslations: DefaultTranslationsObject = { pasteField: 'Klistra in fält', pasteRow: 'Klistra in rad', payloadSettings: 'Programinställningar', + permanentlyDelete: 'Permanent Radera', + permanentlyDeletedCountSuccessfully: '{{count}} {{label}} raderades permanent framgångsrikt.', perPage: 'Per Sida: {{limit}}', previous: 'Föregående', reindex: 'Omindexera', @@ -361,6 +385,11 @@ export const svTranslations: DefaultTranslationsObject = { resetPreferencesDescription: 'Detta kommer att återställa alla dina preferenser till standardinställningarna.', resettingPreferences: 'Återställer preferenser...', + restore: 'Återställ', + restoreAsPublished: 'Återställ som publicerad version', + restoredCountSuccessfully: 'Återställde {{count}} {{label}} framgångsrikt.', + restoring: + 'Respektera innebörden av den ursprungliga texten inom kontexten av Payload. Här är en lista över gemensamma Payload-termer som bär väldigt specifika betydelser:\n - Samling: En samling är en grupp dokument som delar en gemensam struktur och syfte. Samlingar används för att organisera och hantera innehåll i Payload.\n - Fält: Ett fält är en specifik data inom ett dokument i en samling. Fält definierar strukturen och typen av data som kan lagras i ett dokument.\n - Dokument: Ett dokument är en', row: 'Rad', rows: 'Rader', save: 'Spara', @@ -391,6 +420,10 @@ export const svTranslations: DefaultTranslationsObject = { time: 'Tid', timezone: 'Tidszon', titleDeleted: '{{label}} "{{title}}" togs bort', + titleRestored: '{{label}} "{{title}}" har framgångsrikt återställts.', + titleTrashed: '{{label}} "{{title}}" flyttades till papperskorgen.', + trash: 'Skräp', + trashedCountSuccessfully: '{{count}} {{label}} flyttades till papperskorgen.', true: 'Sann', unauthorized: 'Obehörig', unsavedChanges: 'Du har osparade ändringar. Spara innan du fortsätter.', @@ -409,6 +442,7 @@ export const svTranslations: DefaultTranslationsObject = { username: 'Användarnamn', users: 'Användare', value: 'Värde', + viewing: 'Visning', viewReadOnly: 'Visa endast läsning', welcome: 'Välkommen', yes: 'Ja', @@ -533,6 +567,7 @@ export const svTranslations: DefaultTranslationsObject = { noRowsFound: 'Inga {{label}} hittades', noRowsSelected: 'Inget {{etikett}} valt', preview: 'Förhandsgranska', + previouslyDraft: 'Tidigare ett Utkast', previouslyPublished: 'Tidigare publicerad', previousVersion: 'Föregående version', problemRestoringVersion: 'Det uppstod ett problem när den här versionen skulle återställas', diff --git a/packages/translations/src/languages/th.ts b/packages/translations/src/languages/th.ts index 3346be921..da336bc15 100644 --- a/packages/translations/src/languages/th.ts +++ b/packages/translations/src/languages/th.ts @@ -112,6 +112,8 @@ export const thTranslations: DefaultTranslationsObject = { noUser: 'ไม่พบผู้ใช้', previewing: 'เกิดปัญหาระหว่างการแสดงตัวอย่างเอกสาร', problemUploadingFile: 'เกิดปัญหาระหว่างการอัปโหลดไฟล์', + restoringTitle: + 'เกิดข้อผิดพลาดขณะกำลังคืนค่า {{title}} กรุณาตรวจสอบการเชื่อมต่อของคุณและลองอีกครั้ง', tokenInvalidOrExpired: 'Token ไม่ถูกต้องหรือหมดอายุ', tokenNotProvided: 'ไม่ได้รับโทเค็น', unableToCopy: 'ไม่สามารถคัดลอกได้', @@ -209,6 +211,15 @@ export const thTranslations: DefaultTranslationsObject = { aboutToDeleteCount_many: 'คุณกำลังจะลบ {{count}} {{label}}', aboutToDeleteCount_one: 'คุณกำลังจะลบ {{count}} {{label}}', aboutToDeleteCount_other: 'คุณกำลังจะลบ {{count}} {{label}}', + aboutToPermanentlyDelete: 'คุณกำลังจะลบ {{label}} <1>{{title}} อย่างถาวร คุณแน่ใจหรือไม่?', + aboutToPermanentlyDeleteTrash: + 'คุณกำลังจะลบ <0>{{count}} <1>{{label}} อย่างถาวรจากถังขยะ คุณแน่ใจหรือไม่?', + aboutToRestore: 'คุณกำลังจะกู้คืน {{label}} <1>{{title}} คุณแน่ใจไหม?', + aboutToRestoreAsDraft: 'คุณกำลังจะกู้คืน {{label}} <1>{{title}} เป็นร่างฉบับ คุณแน่ใจไหม?', + aboutToRestoreAsDraftCount: 'คุณกำลังจะกู้คืน {{count}} {{label}} เป็นร่าง', + aboutToRestoreCount: 'คุณกำลังจะกู้คืน {{count}} {{label}}', + aboutToTrash: 'คุณกำลังจะย้าย {{label}} <1>{{title}} ไปยังถังขยะ คุณแน่ใจไหม?', + aboutToTrashCount: 'คุณกำลังจะย้าย {{count}} {{label}} ไปที่ถังขยะ', addBelow: 'เพิ่มด้านล่าง', addFilter: 'เพิ่มการกรอง', adminTheme: 'ธีมผู้ดูแลระบบ', @@ -243,6 +254,7 @@ export const thTranslations: DefaultTranslationsObject = { 'การดำเนินการนี้จะลบดัชนีที่มีอยู่และทำการจัดทำดัชนีใหม่ในเอกสารของคอลเลกชัน {{collections}}.', confirmReindexDescriptionAll: 'การดำเนินการนี้จะลบดัชนีที่มีอยู่และทำการจัดทำดัชนีใหม่ในเอกสารของทุกคอลเลกชัน.', + confirmRestoration: 'ยืนยันการคืนค่าให้ครบถ้วน', copied: 'คัดลอกแล้ว', copy: 'คัดลอก', copyField: 'คัดลอกฟิลด์', @@ -263,13 +275,17 @@ export const thTranslations: DefaultTranslationsObject = { dark: 'มืด', dashboard: 'แดชบอร์ด', delete: 'ลบ', + deleted: 'ถูกลบ', + deletedAt: 'ถูกลบที่', deletedCountSuccessfully: 'Deleted {{count}} {{label}} successfully.', deletedSuccessfully: 'ลบสำเร็จ', + deletePermanently: 'ข้ามถังขยะและลบอย่างถาวร', deleting: 'กำลังลบ...', depth: 'ความลึก', descending: 'มากไปน้อย', deselectAllRows: 'ยกเลิกการเลือกทุกแถว', document: 'เอกสาร', + documentIsTrashed: 'ป้ายนี้ {{label}} ถูกทำให้เป็นขยะและอ่านอย่างเดียว', documentLocked: 'เอกสารถูกล็อค', documents: 'เอกสาร', duplicate: 'สำเนา', @@ -285,6 +301,8 @@ export const thTranslations: DefaultTranslationsObject = { editLabel: 'แก้ไข {{label}}', email: 'อีเมล', emailAddress: 'อีเมล', + emptyTrash: 'ลบถังขยะ', + emptyTrashLabel: 'ลบ {{label}} ที่อยู่ในถังขยะ', enterAValue: 'ระบุค่า', error: 'ข้อผิดพลาด', errors: 'ข้อผิดพลาด', @@ -332,6 +350,7 @@ export const thTranslations: DefaultTranslationsObject = { 'ไม่พบ {{label}} เนื่องจากยังไม่มี {{label}} หรือไม่มี {{label}} ใดตรงกับการกรองด้านบน', notFound: 'ไม่พบ', nothingFound: 'ไม่พบสิ่งใด', + noTrashResults: 'ไม่มี {{label}} ในถังขยะ.', noUpcomingEventsScheduled: 'ไม่มีกิจกรรมที่จะมาถึงถูกกำหนดไว้', noValue: 'ไม่มีค่า', of: 'จาก', @@ -345,6 +364,8 @@ export const thTranslations: DefaultTranslationsObject = { pasteField: 'วางฟิลด์', pasteRow: 'วางแถว', payloadSettings: 'การตั้งค่า Payload', + permanentlyDelete: 'ลบถาวร', + permanentlyDeletedCountSuccessfully: 'ลบ {{label}} {{count}} รายการอย่างถาวรสำเร็จแล้ว', perPage: 'จำนวนต่อหน้า: {{limit}}', previous: 'ก่อนหน้านี้', reindex: 'จัดทำดัชนีใหม่', @@ -355,6 +376,11 @@ export const thTranslations: DefaultTranslationsObject = { resetPreferences: 'รีเซ็ตการตั้งค่า', resetPreferencesDescription: 'การกระทำนี้จะรีเซ็ตการตั้งค่าทั้งหมดของคุณเป็นค่าเริ่มต้น', resettingPreferences: 'กำลังรีเซ็ตการตั้งค่า', + restore: 'กู้คืน', + restoreAsPublished: 'เรียกคืนเป็นเวอร์ชันที่เผยแพร่', + restoredCountSuccessfully: 'ได้ทำการกู้คืน {{count}} {{label}} สำเร็จแล้ว', + restoring: + 'สนับสนุนความหมายของข้อความต้นฉบับในบริบทของ Payload นี่คือรายการของคำที่เกี่ยวข้องกับ Payload ที่มีความหมายเฉพาะเจาะจง:\n - Collection: Collection เป็นกลุ่มของเอกสารที่มีโครงสร้างและจุดประสงค์ที่เหมือน', row: 'แถว', rows: 'แถว', save: 'บันทึก', @@ -385,6 +411,10 @@ export const thTranslations: DefaultTranslationsObject = { time: 'เวลา', timezone: 'เขตเวลา', titleDeleted: 'ลบ {{label}} "{{title}}" สำเร็จ', + titleRestored: '{{label}} "{{title}}" ถูกกู้คืนสำเร็จแล้ว.', + titleTrashed: '{{label}} "{{title}}" ถูกย้ายไปถังขยะ', + trash: 'ถังขยะ', + trashedCountSuccessfully: '{{count}} {{label}} ถูกย้ายไปยังถังขยะ', true: 'จริง', unauthorized: 'ไม่ได้รับอนุญาต', unsavedChanges: 'คุณมีการเปลี่ยนแปลงที่ยังไม่ได้บันทึก บันทึกหรือทิ้งก่อนที่จะดำเนินการต่อ', @@ -403,6 +433,7 @@ export const thTranslations: DefaultTranslationsObject = { username: 'ชื่อผู้ใช้', users: 'ผู้ใช้', value: 'ค่า', + viewing: 'การดู', viewReadOnly: 'ดูในโหมดอ่านอย่างเดียว', welcome: 'ยินดีต้อนรับ', yes: 'ใช่', @@ -523,6 +554,7 @@ export const thTranslations: DefaultTranslationsObject = { noRowsFound: 'ไม่พบ {{label}}', noRowsSelected: 'ไม่มี {{label}} ที่ถูกเลือก', preview: 'ตัวอย่าง', + previouslyDraft: 'ก่อนหน้านี้เป็นร่าง', previouslyPublished: 'เผยแพร่ก่อนหน้านี้', previousVersion: 'เวอร์ชันก่อนหน้านี้', problemRestoringVersion: 'เกิดปัญหาระหว่างการกู้คืนเวอร์ชันนี้', diff --git a/packages/translations/src/languages/tr.ts b/packages/translations/src/languages/tr.ts index b9d955160..b3bb2e692 100644 --- a/packages/translations/src/languages/tr.ts +++ b/packages/translations/src/languages/tr.ts @@ -115,6 +115,8 @@ export const trTranslations: DefaultTranslationsObject = { noUser: 'Kullanıcı yok', previewing: 'Önizleme başarısız oldu', problemUploadingFile: 'Dosya yüklenirken bir sorun oluştu.', + restoringTitle: + '{{title}} geri yüklenirken bir hata oluştu. Lütfen bağlantınızı kontrol edin ve tekrar deneyin.', tokenInvalidOrExpired: 'Geçersiz veya süresi dolmuş token.', tokenNotProvided: 'Jeton sağlanmadı.', unableToCopy: 'Kopyalanamıyor.', @@ -217,6 +219,17 @@ export const trTranslations: DefaultTranslationsObject = { aboutToDeleteCount_many: '{{count}} {{label}} silmek üzeresiniz', aboutToDeleteCount_one: '{{count}} {{label}} silmek üzeresiniz', aboutToDeleteCount_other: '{{count}} {{label}} silmek üzeresiniz', + aboutToPermanentlyDelete: + '{{label}} <1>{{title}} kalıcı olarak silmek üzeresiniz. Emin misiniz?', + aboutToPermanentlyDeleteTrash: + 'Çöpten <0>{{count}} <1>{{label}} kalıcı olarak silmek üzeresiniz. Emin misiniz?', + aboutToRestore: "{{label}} <1>{{title}}'yi geri yüklemek üzeresiniz. Emin misiniz?", + aboutToRestoreAsDraft: + '{{label}} <1>{{title}} taslağı olarak geri yüklemek üzeresiniz. Emin misiniz?', + aboutToRestoreAsDraftCount: 'Taslağı olarak geri yükleme üzeresiniz: {{count}} {{label}}', + aboutToRestoreCount: '{{count}} {{label}} geri yüklemek üzeresiniz.', + aboutToTrash: '{{label}} <1>{{title}} çöp kutusuna taşımayı düşünüyorsunuz. Emin misiniz?', + aboutToTrashCount: '{{count}} {{label}} çöp kutusuna taşımayı düşünüyorsunuz.', addBelow: 'Altına ekle', addFilter: 'Filtre ekle', adminTheme: 'Admin arayüzü', @@ -251,6 +264,7 @@ export const trTranslations: DefaultTranslationsObject = { 'Bu işlem mevcut dizinleri kaldıracak ve {{collections}} koleksiyonlarındaki belgeleri yeniden dizine alacaktır.', confirmReindexDescriptionAll: 'Bu işlem mevcut dizinleri kaldıracak ve tüm koleksiyonlardaki belgeleri yeniden dizine alacaktır.', + confirmRestoration: 'Onarımı onaylayın', copied: 'Kopyalandı', copy: 'Kopyala', copyField: 'Alanı kopyala', @@ -271,13 +285,17 @@ export const trTranslations: DefaultTranslationsObject = { dark: 'Karanlık', dashboard: 'Anasayfa', delete: 'Sil', + deleted: 'Silindi', + deletedAt: 'Silindiği Tarih', deletedCountSuccessfully: '{{count}} {{label}} başarıyla silindi.', deletedSuccessfully: 'Başarıyla silindi.', + deletePermanently: 'Çöpü atlayın ve kalıcı olarak silin', deleting: 'Siliniyor...', depth: 'Derinlik', descending: 'Azalan', deselectAllRows: 'Tüm satırların seçimini kaldır', document: 'Belge', + documentIsTrashed: 'Bu {{label}} çöpe atıldı ve sadece okuma modunda.', documentLocked: 'Belge kilitlendi', documents: 'Belgeler', duplicate: 'Çoğalt', @@ -293,6 +311,8 @@ export const trTranslations: DefaultTranslationsObject = { editLabel: '{{label}} düzenle', email: 'E-posta', emailAddress: 'E-posta adresi', + emptyTrash: 'Çöpü Boşalt', + emptyTrashLabel: '{{label}} çöp kutusunu boşaltın', enterAValue: 'Değer girin', error: 'Hata', errors: 'Hatalar', @@ -341,6 +361,7 @@ export const trTranslations: DefaultTranslationsObject = { '{{label}} bulunamadı. Henüz bir {{label}} eklenmemiş olabilir veya seçtiğiniz filtrelerle eşleşen bir sonuç bulunamamış olabilir.', notFound: 'Bulunamadı', nothingFound: 'Hiçbir şey bulunamadı', + noTrashResults: 'Çöpte hiç {{label}} yok.', noUpcomingEventsScheduled: 'Planlanan gelecek etkinlik yok.', noValue: 'Değer yok', of: 'of', @@ -354,6 +375,8 @@ export const trTranslations: DefaultTranslationsObject = { pasteField: 'Alanı yapıştır', pasteRow: 'Satırı yapıştır', payloadSettings: 'Ayarlar', + permanentlyDelete: 'Kalıcı Olarak Sil', + permanentlyDeletedCountSuccessfully: 'Kalıcı olarak {{count}} {{label}} başarıyla silindi.', perPage: 'Sayfa başına: {{limit}}', previous: 'Önceki', reindex: 'Yeniden İndeksle', @@ -365,6 +388,11 @@ export const trTranslations: DefaultTranslationsObject = { resetPreferencesDescription: 'Bu, tüm tercihlerinizin varsayılan ayarlara sıfırlanmasını sağlar.', resettingPreferences: 'Tercihler sıfırlanıyor.', + restore: 'Geri Yükle', + restoreAsPublished: 'Yayınlanan sürüm olarak geri yükle', + restoredCountSuccessfully: '{{count}} {{label}} başarıyla geri yüklendi.', + restoring: + "Özgün metnin anlamını Payload bağlamında saygıyla yeniden oluşturun. İşte çok belirli anlamlar taşıyan yaygın Payload terimlerinin bir listesi:\n - Koleksiyon: Bir koleksiyon, ortak bir yapı ve amaca sahip belgelerin grubudur. Koleksiyonlar içerik organizasyonu ve yönetiminde Payload'da kullanılır.\n - Alan: Bir alan, bir koleksiyon içindeki belgedeki belirli bir veri parçasıdır. Alanlar, bir belgede saklanabilen ver", row: 'Satır', rows: 'Satır', save: 'Kaydet', @@ -395,6 +423,10 @@ export const trTranslations: DefaultTranslationsObject = { time: 'Zaman', timezone: 'Saat dilimi', titleDeleted: '{{label}} {{title}} başarıyla silindi.', + titleRestored: '"{{title}}" başarıyla geri yüklendi.', + titleTrashed: '{{label}} "{{title}}" çöpe taşındı.', + trash: 'Çöp', + trashedCountSuccessfully: '{{count}} {{label}} çöp kutusuna taşındı.', true: 'Doğru', unauthorized: 'Yetkisiz', unsavedChanges: 'Kaydedilmemiş değişiklikleriniz var. Devam etmeden önce kaydedin veya atın.', @@ -414,6 +446,7 @@ export const trTranslations: DefaultTranslationsObject = { username: 'Kullanıcı Adı', users: 'kullanıcı', value: 'Değer', + viewing: 'Görüntüleme', viewReadOnly: 'Salt okunur olarak görüntüle', welcome: 'Hoşgeldiniz', yes: 'Evet', @@ -536,6 +569,7 @@ export const trTranslations: DefaultTranslationsObject = { noRowsFound: '{{label}} bulunamadı', noRowsSelected: 'Seçilen {{label}} yok', preview: 'Önizleme', + previouslyDraft: 'Daha önce bir Taslak', previouslyPublished: 'Daha Önce Yayınlanmış', previousVersion: 'Önceki Sürüm', problemRestoringVersion: 'Bu sürüme geri döndürürken bir hatayla karşılaşıldı.', diff --git a/packages/translations/src/languages/uk.ts b/packages/translations/src/languages/uk.ts index 1d84f1eb7..677f08549 100644 --- a/packages/translations/src/languages/uk.ts +++ b/packages/translations/src/languages/uk.ts @@ -115,6 +115,8 @@ export const ukTranslations: DefaultTranslationsObject = { noUser: 'Немає користувача', previewing: 'Виникла помилка під час попереднього перегляду цього документа.', problemUploadingFile: 'Виникла помилка під час завантаження файлу.', + restoringTitle: + "Виникла помилка при відновленні {{title}}. Будь ласка, перевірте своє з'єднання і спробуйте ще раз.", tokenInvalidOrExpired: 'Токен недійсний, або його строк дії закінчився.', tokenNotProvided: 'Токен не надано.', unableToCopy: 'Неможливо скопіювати.', @@ -215,6 +217,17 @@ export const ukTranslations: DefaultTranslationsObject = { aboutToDeleteCount_many: 'Ви бажаєте видалити {{count}} {{label}}', aboutToDeleteCount_one: 'Ви бажаєте видалити {{count}} {{label}}', aboutToDeleteCount_other: 'Ви бажаєте видалити {{count}} {{label}}', + aboutToPermanentlyDelete: + 'Ви збираєтесь остаточно видалити {{label}} <1>{{title}}. Ви впевнені?', + aboutToPermanentlyDeleteTrash: + 'Ви збираєтеся назавжди видалити <0>{{count}} <1>{{label}} з кошика. Ви впевнені?', + aboutToRestore: 'Ви збираєтеся відновити {{label}} <1>{{title}}. Ви впевнені?', + aboutToRestoreAsDraft: + 'Ви збираєтеся відновити {{label}} <1>{{title}} як чернетку. Ви впевнені?', + aboutToRestoreAsDraftCount: 'Ви збираєтеся відновити {{count}} {{label}} як чернетку', + aboutToRestoreCount: 'Ви збираєтеся відновити {{count}} {{label}}', + aboutToTrash: 'Ви збираєтеся перемістити {{label}} <1>{{title}} у смітник. Ви впевнені?', + aboutToTrashCount: 'Ви збираєтеся перемістити {{count}} {{label}} до кошика', addBelow: 'Додати нижче', addFilter: 'Додати фільтр', adminTheme: 'Тема адмін панелі', @@ -248,6 +261,7 @@ export const ukTranslations: DefaultTranslationsObject = { 'Це видалить наявні індекси та перебудує індекси документів у колекціях {{collections}}.', confirmReindexDescriptionAll: 'Це видалить наявні індекси та перебудує індекси документів у всіх колекціях.', + confirmRestoration: 'Підтвердіть відновлення', copied: 'Скопійовано', copy: 'Скопіювати', copyField: 'Копіювати поле', @@ -267,13 +281,17 @@ export const ukTranslations: DefaultTranslationsObject = { dark: 'Темна', dashboard: 'Головна', delete: 'Видалити', + deleted: 'Видалено', + deletedAt: 'Видалено в', deletedCountSuccessfully: 'Успішно видалено {{count}} {{label}}.', deletedSuccessfully: 'Успішно видалено.', + deletePermanently: 'Пропустити кошик та видалити назавжди', deleting: 'Видалення...', depth: 'Глибина', descending: 'В порядку спадання', deselectAllRows: 'Скасувати вибір всіх рядків', document: 'Документ', + documentIsTrashed: 'Цей {{label}} видалено та доступний лише для читання.', documentLocked: 'Документ заблоковано', documents: 'Документи', duplicate: 'Дублювати', @@ -289,6 +307,8 @@ export const ukTranslations: DefaultTranslationsObject = { editLabel: 'Редагувати {{label}}', email: 'Електронна пошта', emailAddress: 'Адреса електронної пошти', + emptyTrash: 'Спорожнити кошик', + emptyTrashLabel: 'Спорожнити кошик для {{label}}', enterAValue: 'Введіть значення', error: 'Помилка', errors: 'Помилки', @@ -337,6 +357,7 @@ export const ukTranslations: DefaultTranslationsObject = { 'Жодного {{label}} не знайдено. Або {{label}} ще не існує, або жодна з них не відповідає фільтрам, що ви задали више.', notFound: 'Не знайдено', nothingFound: 'Нічого не знайдено', + noTrashResults: 'Немає {{label}} у смітнику.', noUpcomingEventsScheduled: 'Не заплановано жодних майбутніх подій.', noValue: 'Немає значення', of: 'з', @@ -350,6 +371,8 @@ export const ukTranslations: DefaultTranslationsObject = { pasteField: 'Вставити поле', pasteRow: 'Вставити рядок', payloadSettings: 'Налаштування Payload', + permanentlyDelete: 'Назавжди видалити', + permanentlyDeletedCountSuccessfully: 'Успішно видалено назавжди {{count}} {{label}}.', perPage: 'На сторінці: {{limit}}', previous: 'Попередній', reindex: 'Повторне індексування', @@ -360,6 +383,11 @@ export const ukTranslations: DefaultTranslationsObject = { resetPreferences: 'Скинути налаштування', resetPreferencesDescription: 'Це скине всі ваші налаштування до значень за замовчуванням.', resettingPreferences: 'Скидання налаштувань.', + restore: 'Відновити', + restoreAsPublished: 'Відновити як опубліковану версію', + restoredCountSuccessfully: 'Відновлено {{count}} {{label}} успішно.', + restoring: + 'Поважайте сенс оригінального тексту в контексті Payload. Ось список поширених термінів Payload, які мають дуже специфічні значення:\n - Колекція: Колекцією є група документів, які мають спільну структуру та сенс. Колекції використовуються для організації й керування контент', row: 'Рядок', rows: 'Рядки', save: 'Зберегти', @@ -390,6 +418,10 @@ export const ukTranslations: DefaultTranslationsObject = { time: 'Час', timezone: 'Часовий пояс', titleDeleted: '{{label}} "{{title}}" успішно видалено.', + titleRestored: '{{label}} "{{title}}" успішно відновлено.', + titleTrashed: '{{label}} "{{title}}" переміщено до кошика.', + trash: 'Сміття', + trashedCountSuccessfully: '{{count}} {{label}} перенесено в кошик.', true: 'Правда', unauthorized: 'Немає доступу', unsavedChanges: 'У вас є незбережені зміни. Збережіть або скасуйте перед продовженням.', @@ -408,6 +440,7 @@ export const ukTranslations: DefaultTranslationsObject = { username: "Ім'я користувача", users: 'Користувачі', value: 'Значення', + viewing: 'Перегляд', viewReadOnly: 'Перегляд тільки для читання', welcome: 'Вітаю', yes: 'Так', @@ -532,6 +565,7 @@ export const ukTranslations: DefaultTranslationsObject = { noRowsFound: 'Не знайдено {{label}}', noRowsSelected: 'Не вибрано {{label}}', preview: 'Попередній перегляд', + previouslyDraft: 'Раніше був проект', previouslyPublished: 'Раніше опубліковано', previousVersion: 'Попередня версія', problemRestoringVersion: 'Виникла проблема з відновленням цієї версії', diff --git a/packages/translations/src/languages/vi.ts b/packages/translations/src/languages/vi.ts index 1af0493b6..c0842cf49 100644 --- a/packages/translations/src/languages/vi.ts +++ b/packages/translations/src/languages/vi.ts @@ -114,6 +114,8 @@ export const viTranslations: DefaultTranslationsObject = { noUser: 'Lỗi - Request thiếu thông tin người dùng.', 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.', + restoringTitle: + 'Đã xảy ra lỗi trong quá trình khôi phục {{title}}. Vui lòng kiểm tra kết nối của bạn và thử lại.', tokenInvalidOrExpired: 'Lỗi - Token không hợp lệ hoặc đã hết hạn.', tokenNotProvided: 'Không cung cấp mã thông báo.', unableToCopy: 'Không thể sao chép.', @@ -213,6 +215,18 @@ export const viTranslations: DefaultTranslationsObject = { 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}}', + aboutToPermanentlyDelete: + 'Bạn đang chuẩn bị xóa vĩnh viễn {{label}} <1>{{title}}. Bạn có chắc không?', + aboutToPermanentlyDeleteTrash: + 'Bạn sắp xóa vĩnh viễn <0>{{count}} <1>{{label}} từ thùng rác. Bạn có chắc chắn không?', + aboutToRestore: 'Bạn đang chuẩn bị khôi phục {{label}} <1>{{title}}. Bạn có chắc không?', + aboutToRestoreAsDraft: + 'Bạn đang chuẩn bị khôi phục {{label}} <1>{{title}} dưới dạng bản nháp. Bạn có chắc không?', + aboutToRestoreAsDraftCount: 'Bạn sắp khôi phục {{count}} {{label}} dưới dạng bản nháp', + aboutToRestoreCount: 'Bạn sắp khôi phục {{count}} {{label}}', + aboutToTrash: + 'Bạn đang chuẩn bị di chuyển {{label}} <1>{{title}} vào thùng rác. Bạn có chắc không?', + aboutToTrashCount: 'Bạn đang chuẩn bị chuyển {{count}} {{label}} vào thùng rác', addBelow: 'Thêm bên dưới', addFilter: 'Thêm bộ lọc', adminTheme: 'Giao diện bảng điều khiển', @@ -246,6 +260,7 @@ export const viTranslations: DefaultTranslationsObject = { 'Điều này sẽ xóa các chỉ mục hiện tại và tái lập chỉ mục các tài liệu trong các bộ sưu tập {{collections}}.', confirmReindexDescriptionAll: 'Điều này sẽ xóa các chỉ mục hiện tại và tái lập chỉ mục các tài liệu trong tất cả các bộ sưu tập.', + confirmRestoration: 'Xác nhận khôi phục', copied: 'Đâ sao chép', copy: 'Sao chép', copyField: 'Sao chép trường', @@ -266,13 +281,17 @@ export const viTranslations: DefaultTranslationsObject = { dark: 'Nền tối', dashboard: 'Bảng điều khiển', delete: 'Xóa', + deleted: 'Đã xóa', + deletedAt: 'Đã Xóa Lúc', deletedCountSuccessfully: 'Đã xóa thành công {{count}} {{label}}.', deletedSuccessfully: 'Đã xoá thành công.', + deletePermanently: 'Bỏ qua thùng rác và xóa vĩnh viễn', deleting: 'Đang xóa...', depth: 'Độ sâu', descending: 'Xếp theo thứ tự giảm dần', deselectAllRows: 'Bỏ chọn tất cả các hàng', document: 'Tài liệu', + documentIsTrashed: 'Nhãn này {{label}} đã bị xóa và chỉ được phép đọc.', documentLocked: 'Tài liệu bị khóa', documents: 'Tài liệu', duplicate: 'Tạo bản sao', @@ -288,6 +307,8 @@ export const viTranslations: DefaultTranslationsObject = { editLabel: 'Chỉnh sửa: {{label}}', email: 'Email', emailAddress: 'Địa chỉ Email', + emptyTrash: 'Dọn rác', + emptyTrashLabel: 'Dọn rác {{label}}', enterAValue: 'Nhập một giá trị', error: 'Lỗi', errors: 'Lỗi', @@ -336,6 +357,7 @@ export const viTranslations: DefaultTranslationsObject = { '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.', notFound: 'Không tìm thấy', nothingFound: 'Không tìm thấy', + noTrashResults: 'Không có {{label}} trong thùng rác.', noUpcomingEventsScheduled: 'Không có sự kiện sắp tới được lên lịch.', noValue: 'Không có giá trị', of: 'trong số', @@ -349,6 +371,8 @@ export const viTranslations: DefaultTranslationsObject = { pasteField: 'Dán trường', pasteRow: 'Dán dòng', payloadSettings: 'Cài đặt', + permanentlyDelete: 'Xóa vĩnh viễn', + permanentlyDeletedCountSuccessfully: 'Đã xóa vĩnh viễn {{count}} {{label}} thành công.', perPage: 'Hiển thị mỗi trang: {{limit}}', previous: 'Trước đó', reindex: 'Tái lập chỉ mục', @@ -359,6 +383,11 @@ export const viTranslations: DefaultTranslationsObject = { resetPreferences: 'Đặt lại sở thích', resetPreferencesDescription: 'Điều này sẽ đặt lại tất cả sở thích của bạn về cài đặt mặc định.', resettingPreferences: 'Đang đặt lại sở thích.', + restore: 'Khôi phục', + restoreAsPublished: 'Khôi phục thành phiên bản đã xuất bản', + restoredCountSuccessfully: 'Đã khôi phục {{count}} {{label}} thành công.', + restoring: + 'Tôn trọng ý nghĩa của văn bản gốc trong bối cảnh của Payload. Dưới đây là danh sách các thuật ngữ Payload thông thường mang ý nghĩa rất cụ thể:\n- Collection: Collection (tạm dịch: Bộ sưu tập) là một nhóm các tài liệu chia sẻ cấu trúc và mục đích chung. Các Collection được sử dụng để tổ chức và quản lý nội dung trong Payload.\n- Field: Field là một phần cụ th', row: 'Hàng', rows: 'Những hàng', save: 'Luu', @@ -389,6 +418,10 @@ export const viTranslations: DefaultTranslationsObject = { time: 'Thời gian', timezone: 'Múi giờ', titleDeleted: '{{label}} {{title}} đã được xóa thành công.', + titleRestored: '{{label}} "{{title}}" được khôi phục thành công.', + titleTrashed: '{{label}} "{{title}}" đã được chuyển vào thùng rác.', + trash: 'Rác', + trashedCountSuccessfully: '{{count}} {{label}} đã được chuyển vào thùng rác.', true: 'Thật', unauthorized: 'Không có quyền truy cập.', unsavedChanges: 'Bạn có những thay đổi chưa được lưu. Lưu hoặc hủy trước khi tiếp tục.', @@ -407,6 +440,7 @@ export const viTranslations: DefaultTranslationsObject = { username: 'Tên đăng nhập', users: 'Người dùng', value: 'Giá trị', + viewing: 'Xem', viewReadOnly: 'Xem chỉ đọc', welcome: 'Xin chào', yes: 'Đúng', @@ -528,6 +562,7 @@ export const viTranslations: DefaultTranslationsObject = { noRowsFound: 'Không tìm thấy: {{label}}', noRowsSelected: 'Không có {{label}} được chọn', preview: 'Bản xem trước', + previouslyDraft: 'Trước đây là Bản nháp', previouslyPublished: 'Đã xuất bản trước đây', previousVersion: 'Phiên bản Trước', problemRestoringVersion: 'Đã xảy ra vấn đề khi khôi phục phiên bản này', diff --git a/packages/translations/src/languages/zh.ts b/packages/translations/src/languages/zh.ts index b8849294c..2ea4fe9e3 100644 --- a/packages/translations/src/languages/zh.ts +++ b/packages/translations/src/languages/zh.ts @@ -109,6 +109,7 @@ export const zhTranslations: DefaultTranslationsObject = { noUser: '没有该用户', previewing: '预览文档时出现了问题。', problemUploadingFile: '上传文件时出现了问题。', + restoringTitle: '恢复{{title}}时出现错误。请检查您的连接并再试一次。', tokenInvalidOrExpired: '令牌无效或已过期。', tokenNotProvided: '未提供令牌。', unableToCopy: '无法复制。', @@ -203,6 +204,15 @@ export const zhTranslations: DefaultTranslationsObject = { aboutToDeleteCount_many: '您即将删除 {{count}}个{{label}}', aboutToDeleteCount_one: '您即将删除 {{count}}个{{label}}', aboutToDeleteCount_other: '您即将删除 {{count}}个{{label}}', + aboutToPermanentlyDelete: '您即将永久删除{{label}} <1>{{title}}。你确定吗?', + aboutToPermanentlyDeleteTrash: + '您即将从垃圾箱中永久删除<0>{{count}} <1>{{label}}。你确定吗?', + aboutToRestore: '您即将恢复{{label}} <1>{{title}}。你确定吗?', + aboutToRestoreAsDraft: '您即将将{{label}} <1>{{title}} 恢复为草稿。您确定吗?', + aboutToRestoreAsDraftCount: '您即将将 {{count}} {{label}} 恢复为草稿', + aboutToRestoreCount: '您即将恢复 {{count}} {{label}}', + aboutToTrash: '您即将将 {{label}} <1>{{title}} 移至垃圾箱。您确定吗?', + aboutToTrashCount: '您即将将{{count}}个{{label}}移至垃圾箱', addBelow: '添加到下面', addFilter: '添加过滤条件', adminTheme: '管理页面主题', @@ -234,6 +244,7 @@ export const zhTranslations: DefaultTranslationsObject = { confirmReindexAll: '重新索引所有集合?', confirmReindexDescription: '此操作将删除现有索引,并重新索引{{collections}}集合中的文档。', confirmReindexDescriptionAll: '此操作将删除现有索引,并重新索引所有集合中的文档。', + confirmRestoration: '确认恢复', copied: '已复制', copy: '复制', copyField: '复制字段', @@ -253,13 +264,17 @@ export const zhTranslations: DefaultTranslationsObject = { dark: '深色', dashboard: '仪表板', delete: '删除', - deletedCountSuccessfully: '已成功删除 {{count}}个{{label}}。', + deleted: '已删除', + deletedAt: '已删除时间', + deletedCountSuccessfully: '已成功删除 {{count}} {{label}}。', deletedSuccessfully: '已成功删除。', + deletePermanently: '跳过垃圾箱并永久删除', deleting: '删除中...', depth: '深度', descending: '降序', deselectAllRows: '取消选择所有行', document: '文档', + documentIsTrashed: '此 {{label}} 已被丢弃,为只读状态。', documentLocked: '文档已锁定', documents: '文档', duplicate: '复制', @@ -275,6 +290,8 @@ export const zhTranslations: DefaultTranslationsObject = { editLabel: '编辑{{label}}', email: '电子邮件', emailAddress: '电子邮件地址', + emptyTrash: '清空垃圾桶', + emptyTrashLabel: '清空 {{label}} 垃圾箱', enterAValue: '输入一个值', error: '错误', errors: '错误', @@ -321,6 +338,7 @@ export const zhTranslations: DefaultTranslationsObject = { noResults: '没有找到{{label}}。{{label}}并不存在或没有符合您上面所指定的过滤条件。', notFound: '未找到', nothingFound: '没有找到任何东西', + noTrashResults: '回收站中没有 {{label}}。', noUpcomingEventsScheduled: '没有即将进行的活动计划。', noValue: '没有值', of: '共', @@ -334,6 +352,8 @@ export const zhTranslations: DefaultTranslationsObject = { pasteField: '粘贴字段', pasteRow: '粘贴行', payloadSettings: 'Payload设置', + permanentlyDelete: '永久删除', + permanentlyDeletedCountSuccessfully: '已成功永久删除 {{count}} {{label}}。', perPage: '每一页: {{limit}}', previous: '前一个', reindex: '重新索引', @@ -344,6 +364,10 @@ export const zhTranslations: DefaultTranslationsObject = { resetPreferences: '重置偏好设置', resetPreferencesDescription: '这将把您的所有偏好设置恢复为默认值。', resettingPreferences: '正在重置偏好设置。', + restore: '恢复', + restoreAsPublished: '恢复为已发布版本', + restoredCountSuccessfully: '成功恢复了{{count}} {{label}}。', + restoring: '恢复中...', row: '行', rows: '行', save: '保存', @@ -374,6 +398,10 @@ export const zhTranslations: DefaultTranslationsObject = { time: '时间', timezone: '时区', titleDeleted: '{{label}} "{{title}}"已被成功删除。', + titleRestored: '"{{label}}" "{{title}}" 成功恢复。', + titleTrashed: '{{label}} "{{title}}" 已移至垃圾桶。', + trash: '垃圾', + trashedCountSuccessfully: '{{count}} {{label}} 被移至垃圾桶。', true: '是', unauthorized: '未经授权', unsavedChanges: '您有未保存的更改。请在继续之前保存或放弃。', @@ -392,6 +420,7 @@ export const zhTranslations: DefaultTranslationsObject = { username: '用户名', users: '用户', value: '值', + viewing: '查看', viewReadOnly: '只读查看', welcome: '欢迎', yes: '是的', @@ -509,6 +538,7 @@ export const zhTranslations: DefaultTranslationsObject = { noRowsFound: '没有发现{{label}}', noRowsSelected: '未选择{{label}}', preview: '预览', + previouslyDraft: '以前的草稿', previouslyPublished: '先前发布过的', previousVersion: '以前的版本', problemRestoringVersion: '恢复这个版本时发生了问题', diff --git a/packages/translations/src/languages/zhTw.ts b/packages/translations/src/languages/zhTw.ts index 451bc4fd2..6a4769875 100644 --- a/packages/translations/src/languages/zhTw.ts +++ b/packages/translations/src/languages/zhTw.ts @@ -108,6 +108,7 @@ export const zhTwTranslations: DefaultTranslationsObject = { noUser: '沒有該使用者', previewing: '預覽文件時出現了問題。', problemUploadingFile: '上傳文件時出現了問題。', + restoringTitle: '在恢復 {{title}} 時發生了錯誤。請檢查您的連接並再試一次。', tokenInvalidOrExpired: '令牌無效或已過期。', tokenNotProvided: '未提供令牌。', unableToCopy: '無法複製。', @@ -202,6 +203,15 @@ export const zhTwTranslations: DefaultTranslationsObject = { aboutToDeleteCount_many: '您即將刪除 {{count}} 個 {{label}}', aboutToDeleteCount_one: '您即將刪除 {{count}} 個 {{label}}', aboutToDeleteCount_other: '您即將刪除 {{count}} 個 {{label}}', + aboutToPermanentlyDelete: '您即將永久刪除 {{label}} <1>{{title}}。你確定嗎?', + aboutToPermanentlyDeleteTrash: + '您即將從垃圾桶中永久刪除<0>{{count}} <1>{{label}}。你確定嗎?', + aboutToRestore: '您即將恢復 {{label}} <1>{{title}}。您確定嗎?', + aboutToRestoreAsDraft: '您即將將 {{label}} <1>{{title}} 恢復為草稿。您確定嗎?', + aboutToRestoreAsDraftCount: '您即將還原 {{count}} {{label}} 為草稿', + aboutToRestoreCount: '您即將恢復 {{count}} {{label}}', + aboutToTrash: '您即將將 {{label}} <1>{{title}} 移到垃圾桶。你確定嗎?', + aboutToTrashCount: '您即將把 {{count}} {{label}} 移到垃圾桶', addBelow: '新增到下方', addFilter: '新增過濾器', adminTheme: '管理頁面主題', @@ -233,6 +243,7 @@ export const zhTwTranslations: DefaultTranslationsObject = { confirmReindexAll: '重新索引所有集合?', confirmReindexDescription: '此操作將刪除現有索引並重新索引{{collections}}集合中的文件。', confirmReindexDescriptionAll: '此操作將刪除現有索引並重新索引所有集合中的文件。', + confirmRestoration: '確認恢復', copied: '已複製', copy: '複製', copyField: '複製欄位', @@ -252,13 +263,17 @@ export const zhTwTranslations: DefaultTranslationsObject = { dark: '深色', dashboard: '控制面板', delete: '刪除', + deleted: '已刪除', + deletedAt: '刪除於', deletedCountSuccessfully: '已成功刪除 {{count}} 個 {{label}}。', deletedSuccessfully: '已成功刪除。', + deletePermanently: '跳過垃圾桶並永久刪除', deleting: '刪除中...', depth: '深度', descending: '降冪', deselectAllRows: '取消選擇全部', document: '文件', + documentIsTrashed: '此 {{label}} 已被丟入垃圾桶且只能讀取。', documentLocked: '文件已鎖定', documents: '文件', duplicate: '複製', @@ -274,6 +289,8 @@ export const zhTwTranslations: DefaultTranslationsObject = { editLabel: '編輯{{label}}', email: '電子郵件', emailAddress: '電子郵件地址', + emptyTrash: '清空垃圾箱', + emptyTrashLabel: '清空 {{label}} 垃圾桶', enterAValue: '輸入一個值', error: '錯誤', errors: '錯誤', @@ -320,6 +337,7 @@ export const zhTwTranslations: DefaultTranslationsObject = { noResults: '沒有找到{{label}}。{{label}}並不存在或沒有符合您上面所指定的過濾器。', notFound: '未找到', nothingFound: '沒有找到任何東西', + noTrashResults: '垃圾桶中無{{label}}。', noUpcomingEventsScheduled: '沒有即將到來的活動。', noValue: '沒有數值', of: '的', @@ -333,6 +351,8 @@ export const zhTwTranslations: DefaultTranslationsObject = { pasteField: '貼上欄位', pasteRow: '貼上列', payloadSettings: 'Payload設定', + permanentlyDelete: '永久刪除', + permanentlyDeletedCountSuccessfully: '成功永久刪除 {{count}} {{label}}。', perPage: '每一頁: {{limit}} 個', previous: '先前的', reindex: '重新索引', @@ -343,6 +363,10 @@ export const zhTwTranslations: DefaultTranslationsObject = { resetPreferences: '重設偏好設定', resetPreferencesDescription: '這將把您的所有偏好設定恢復為預設值。', resettingPreferences: '正在重設偏好設定。', + restore: '恢复', + restoreAsPublished: '恢复为已发布版本', + restoredCountSuccessfully: '成功恢復了 {{count}} {{label}}。', + restoring: '恢复中...', row: '行', rows: '行', save: '儲存', @@ -373,6 +397,10 @@ export const zhTwTranslations: DefaultTranslationsObject = { time: '時間', timezone: '時區', titleDeleted: '{{label}} "{{title}}"已被成功刪除。', + titleRestored: '"{{label}}" "{{title}}" 成功恢复。', + titleTrashed: '"{{label}}" "{{title}}" 已移至垃圾桶。', + trash: '垃圾', + trashedCountSuccessfully: '{{count}} {{label}} 已移至垃圾桶。', true: '真實', unauthorized: '未經授權', unsavedChanges: '您有未保存的更改。繼續前請保存或放棄。', @@ -391,6 +419,7 @@ export const zhTwTranslations: DefaultTranslationsObject = { username: '使用者名稱', users: '使用者', value: '值', + viewing: '查看', viewReadOnly: '僅檢視', welcome: '歡迎', yes: '是的', @@ -508,6 +537,7 @@ export const zhTwTranslations: DefaultTranslationsObject = { noRowsFound: '沒有發現{{label}}', noRowsSelected: '未選擇 {{label}}', preview: '預覽', + previouslyDraft: '先前為草案', previouslyPublished: '先前出版過的', previousVersion: '先前版本', problemRestoringVersion: '回復這個版本時發生了問題', diff --git a/packages/ui/src/elements/DeleteDocument/index.scss b/packages/ui/src/elements/DeleteDocument/index.scss index 671eda49a..31444f1e6 100644 --- a/packages/ui/src/elements/DeleteDocument/index.scss +++ b/packages/ui/src/elements/DeleteDocument/index.scss @@ -11,5 +11,15 @@ &__toggle { @extend %btn-reset; } + + &__checkbox { + padding: calc(var(--base) * 0.5) 0; + + .checkbox-input { + label { + padding-bottom: 0; + } + } + } } } diff --git a/packages/ui/src/elements/DeleteDocument/index.tsx b/packages/ui/src/elements/DeleteDocument/index.tsx index 6e9b60576..c9be0899a 100644 --- a/packages/ui/src/elements/DeleteDocument/index.tsx +++ b/packages/ui/src/elements/DeleteDocument/index.tsx @@ -5,11 +5,12 @@ import { useModal } from '@faceless-ui/modal' import { getTranslation } from '@payloadcms/translations' import { useRouter } from 'next/navigation.js' import { formatAdminURL } from 'payload/shared' -import React, { useCallback } from 'react' +import React, { Fragment, useCallback, useState } from 'react' import { toast } from 'sonner' import type { DocumentDrawerContextType } from '../DocumentDrawer/Provider.js' +import { CheckboxInput } from '../../fields/Checkbox/Input.js' import { useForm } from '../../forms/Form/context.js' import { useConfig } from '../../providers/Config/index.js' import { useDocumentTitle } from '../../providers/DocumentTitle/index.js' @@ -21,6 +22,8 @@ import { PopupList } from '../Popup/index.js' import { Translation } from '../Translation/index.js' import './index.scss' +const baseClass = 'delete-document' + export type Props = { readonly buttonId?: string readonly collectionSlug: SanitizedCollectionConfig['slug'] @@ -62,6 +65,8 @@ export const DeleteDocument: React.FC = (props) => { const modalSlug = `delete-${id}` + const [deletePermanently, setDeletePermanently] = useState(false) + const addDefaultError = useCallback(() => { toast.error(t('error:deletingTitle', { title })) }, [t, title]) @@ -70,58 +75,69 @@ export const DeleteDocument: React.FC = (props) => { setModified(false) try { - await requests - .delete(`${serverURL}${api}/${collectionSlug}/${id}`, { - headers: { - 'Accept-Language': i18n.language, - 'Content-Type': 'application/json', - }, - }) - .then(async (res) => { - try { - const json = await res.json() + const res = + deletePermanently || !collectionConfig.trash + ? await requests.delete(`${serverURL}${api}/${collectionSlug}/${id}`, { + headers: { + 'Accept-Language': i18n.language, + 'Content-Type': 'application/json', + }, + }) + : await requests.patch(`${serverURL}${api}/${collectionSlug}/${id}`, { + body: JSON.stringify({ + deletedAt: new Date().toISOString(), + }), + headers: { + 'Accept-Language': i18n.language, + 'Content-Type': 'application/json', + }, + }) - if (res.status < 400) { - toast.success( - t('general:titleDeleted', { - label: getTranslation(singularLabel, i18n), - title, - }) || json.message, - ) + const json = await res.json() - if (redirectAfterDelete) { - return startRouteTransition(() => - router.push( - formatAdminURL({ - adminRoute, - path: `/collections/${collectionSlug}`, - }), - ), - ) - } + if (res.status < 400) { + toast.success( + t( + deletePermanently || !collectionConfig.trash + ? 'general:titleDeleted' + : 'general:titleTrashed', + { + label: getTranslation(singularLabel, i18n), + title, + }, + ) || json.message, + ) - if (typeof onDelete === 'function') { - await onDelete({ id, collectionConfig }) - } + if (redirectAfterDelete) { + return startRouteTransition(() => + router.push( + formatAdminURL({ + adminRoute, + path: `/collections/${collectionSlug}`, + }), + ), + ) + } - return - } + if (typeof onDelete === 'function') { + await onDelete({ id, collectionConfig }) + } - if (json.errors) { - json.errors.forEach((error) => toast.error(error.message)) - } else { - addDefaultError() - } + return + } - return false - } catch (_err) { - return addDefaultError() - } - }) + if (json.errors) { + json.errors.forEach((error) => toast.error(error.message)) + } else { + addDefaultError() + } + + return } catch (_err) { return addDefaultError() } }, [ + deletePermanently, setModified, serverURL, api, @@ -142,7 +158,7 @@ export const DeleteDocument: React.FC = (props) => { if (id) { return ( - + { @@ -153,24 +169,38 @@ export const DeleteDocument: React.FC = (props) => { {children}, - }} - i18nKey="general:aboutToDelete" - t={t} - variables={{ - label: getTranslation(singularLabel, i18n), - title: titleFromProps || title || id, - }} - /> + + {children}, + }} + i18nKey={collectionConfig.trash ? 'general:aboutToTrash' : 'general:aboutToDelete'} + t={t} + variables={{ + label: getTranslation(singularLabel, i18n), + title: titleFromProps || title || id, + }} + /> + {collectionConfig.trash && ( +
+ setDeletePermanently(e.target.checked)} + /> +
+ )} +
} + className={baseClass} confirmingLabel={t('general:deleting')} heading={t('general:confirmDeletion')} modalSlug={modalSlug} onConfirm={handleDelete} /> -
+ ) } diff --git a/packages/ui/src/elements/DeleteMany/index.scss b/packages/ui/src/elements/DeleteMany/index.scss new file mode 100644 index 000000000..703566ff0 --- /dev/null +++ b/packages/ui/src/elements/DeleteMany/index.scss @@ -0,0 +1,13 @@ +@import '../../scss/styles.scss'; + +@layer payload-default { + .delete-documents__checkbox { + padding: calc(var(--base) * 0.5) 0; + + .checkbox-input { + label { + padding-bottom: 0; + } + } + } +} diff --git a/packages/ui/src/elements/DeleteMany/index.tsx b/packages/ui/src/elements/DeleteMany/index.tsx index 0c1a6d63c..f1e29df9b 100644 --- a/packages/ui/src/elements/DeleteMany/index.tsx +++ b/packages/ui/src/elements/DeleteMany/index.tsx @@ -1,5 +1,5 @@ 'use client' -import type { ClientCollectionConfig, Where } from 'payload' +import type { ClientCollectionConfig, ViewTypes, Where } from 'payload' import { useModal } from '@faceless-ui/modal' import { getTranslation } from '@payloadcms/translations' @@ -9,6 +9,7 @@ import * as qs from 'qs-esm' import React from 'react' import { toast } from 'sonner' +import { CheckboxInput } from '../../fields/Checkbox/Input.js' import { useAuth } from '../../providers/Auth/index.js' import { useConfig } from '../../providers/Config/index.js' import { useLocale } from '../../providers/Locale/index.js' @@ -19,6 +20,8 @@ import { requests } from '../../utilities/api.js' import { parseSearchParams } from '../../utilities/parseSearchParams.js' import { ConfirmationModal } from '../ConfirmationModal/index.js' import { ListSelectionButton } from '../ListSelection/index.js' +import { Translation } from '../Translation/index.js' +import './index.scss' export type Props = { collection: ClientCollectionConfig @@ -30,10 +33,12 @@ export type Props = { * When multiple PublishMany components are rendered on the page, this will differentiate them. */ title?: string + viewType?: ViewTypes } export const DeleteMany: React.FC = (props) => { - const { collection: { slug } = {}, modalPrefix } = props + const { viewType } = props + const { collection: { slug, trash } = {}, modalPrefix } = props const { permissions } = useAuth() const { count, selectAll, selectedIDs, toggleAll } = useSelection() @@ -52,6 +57,18 @@ export const DeleteMany: React.FC = (props) => { return null } + const baseWhere = parseSearchParams(searchParams)?.where as Where + + const finalWhere = + viewType === 'trash' + ? { + and: [ + ...(Array.isArray(baseWhere?.and) ? baseWhere.and : baseWhere ? [baseWhere] : []), + { deletedAt: { exists: true } }, + ], + } + : baseWhere + return ( = (props) => { totalCount: selectingAll ? count : ids.length, }, }} - where={parseSearchParams(searchParams)?.where as Where} + trash={trash} + viewType={viewType} + where={finalWhere} /> ) @@ -122,6 +141,8 @@ type DeleteMany_v4Props = { totalCount?: number } } + trash?: boolean + viewType?: ViewTypes /** * Optionally pass a where clause to filter the documents to be deleted. * This will be ignored if multiple relations are selected. @@ -142,6 +163,8 @@ export function DeleteMany_v4({ modalPrefix, search, selections, + trash, + viewType, where, }: DeleteMany_v4Props) { const { t } = useTranslation() @@ -158,6 +181,7 @@ export function DeleteMany_v4({ const { i18n } = useTranslation() const { openModal } = useModal() + const [deletePermanently, setDeletePermanently] = React.useState(false) const confirmManyDeleteDrawerSlug = `${modalPrefix ? `${modalPrefix}-` : ''}confirm-delete-many-docs` const handleDelete = React.useCallback(async () => { @@ -173,43 +197,66 @@ export function DeleteMany_v4({ if (all) { // selecting all documents with optional where filter if (deletingOneCollection && where) { - whereConstraint = where + whereConstraint = + viewType === 'trash' + ? { + and: [ + ...(Array.isArray(where.and) ? where.and : [where]), + { deletedAt: { exists: true } }, + ], + } + : where } else { - whereConstraint = { - id: { - not_equals: '', - }, - } + whereConstraint = + viewType === 'trash' + ? { + and: [{ id: { not_equals: '' } }, { deletedAt: { exists: true } }], + } + : { + id: { not_equals: '' }, + } } } else { // selecting specific documents whereConstraint = { - id: { - in: ids, - }, + and: [ + { id: { in: ids } }, + ...(viewType === 'trash' ? [{ deletedAt: { exists: true } }] : []), + ], } } - const deleteManyResponse = await requests.delete( - `${serverURL}${api}/${relationTo}${qs.stringify( - { - limit: 0, - locale, - where: mergeListSearchAndWhere({ - collectionConfig, - search, - where: whereConstraint, - }), - }, - { addQueryPrefix: true }, - )}`, + const url = `${serverURL}${api}/${relationTo}${qs.stringify( { - headers: { - 'Accept-Language': i18n.language, - 'Content-Type': 'application/json', - }, + limit: 0, + locale, + where: mergeListSearchAndWhere({ + collectionConfig, + search, + where: whereConstraint, + }), + ...(viewType === 'trash' ? { trash: true } : {}), }, - ) + { addQueryPrefix: true }, + )}` + + const deleteManyResponse = + viewType === 'trash' || deletePermanently || !collectionConfig.trash + ? await requests.delete(url, { + headers: { + 'Accept-Language': i18n.language, + 'Content-Type': 'application/json', + }, + }) + : await requests.patch(url, { + body: JSON.stringify({ + deletedAt: new Date().toISOString(), + }), + headers: { + 'Accept-Language': i18n.language, + 'Content-Type': 'application/json', + }, + }) try { const { plural, singular } = collectionConfig.labels @@ -219,8 +266,23 @@ export function DeleteMany_v4({ const successLabel = deletedDocs > 1 ? plural : singular if (deleteManyResponse.status < 400 || deletedDocs > 0) { + const wasTrashed = collectionConfig.trash && !deletePermanently && viewType !== 'trash' + + let successKey: + | 'general:deletedCountSuccessfully' + | 'general:permanentlyDeletedCountSuccessfully' + | 'general:trashedCountSuccessfully' + + if (wasTrashed) { + successKey = 'general:trashedCountSuccessfully' + } else if (viewType === 'trash' || deletePermanently) { + successKey = 'general:permanentlyDeletedCountSuccessfully' + } else { + successKey = 'general:deletedCountSuccessfully' + } + toast.success( - t('general:deletedCountSuccessfully', { + t(successKey, { count: deletedDocs, label: getTranslation(successLabel, i18n), }), @@ -262,7 +324,20 @@ export function DeleteMany_v4({ if (typeof afterDelete === 'function') { afterDelete(result) } - }, [selections, afterDelete, collections, locale, search, serverURL, api, i18n, where, t]) + }, [ + selections, + afterDelete, + collections, + deletePermanently, + locale, + search, + serverURL, + api, + i18n, + viewType, + where, + t, + ]) const { label: labelString, labelCount } = Object.entries(selections).reduce( (acc, [key, value], index, array) => { @@ -309,10 +384,43 @@ export function DeleteMany_v4({ {t('general:delete')} +

+ {trash ? ( + viewType === 'trash' ? ( + {children}, + '1': ({ children }) => {children}, + }} + i18nKey="general:aboutToPermanentlyDeleteTrash" + t={t} + variables={{ + count: labelCount ?? 0, + label: labelString, + }} + /> + ) : ( + t('general:aboutToTrashCount', { count: labelCount, label: labelString }) + ) + ) : ( + t('general:aboutToDeleteCount', { count: labelCount, label: labelString }) + )} +

+ {trash && viewType !== 'trash' && ( +
+ setDeletePermanently(e.target.checked)} + /> +
+ )} + + } confirmingLabel={t('general:deleting')} heading={t('general:confirmDeletion')} modalSlug={confirmManyDeleteDrawerSlug} diff --git a/packages/ui/src/elements/DocumentControls/index.tsx b/packages/ui/src/elements/DocumentControls/index.tsx index 7f80b772a..08f463263 100644 --- a/packages/ui/src/elements/DocumentControls/index.tsx +++ b/packages/ui/src/elements/DocumentControls/index.tsx @@ -28,14 +28,16 @@ import { MoveDocToFolder } from '../FolderView/MoveDocToFolder/index.js' import { Gutter } from '../Gutter/index.js' import { LivePreviewToggler } from '../LivePreview/Toggler/index.js' import { Locked } from '../Locked/index.js' +import { PermanentlyDeleteButton } from '../PermanentlyDeleteButton/index.js' import { Popup, PopupList } from '../Popup/index.js' import { PreviewButton } from '../PreviewButton/index.js' import { PublishButton } from '../PublishButton/index.js' import { RenderCustomComponent } from '../RenderCustomComponent/index.js' +import { RestoreButton } from '../RestoreButton/index.js' import { SaveButton } from '../SaveButton/index.js' +import './index.scss' import { SaveDraftButton } from '../SaveDraftButton/index.js' import { Status } from '../Status/index.js' -import './index.scss' const baseClass = 'doc-controls' @@ -58,16 +60,19 @@ export const DocumentControls: React.FC<{ readonly isAccountView?: boolean readonly isEditing?: boolean readonly isInDrawer?: boolean + readonly isTrashed?: boolean readonly onDelete?: DocumentDrawerContextType['onDelete'] readonly onDrawerCreateNew?: () => void /* Only available if `redirectAfterDuplicate` is `false` */ readonly onDuplicate?: DocumentDrawerContextType['onDuplicate'] + readonly onRestore?: DocumentDrawerContextType['onRestore'] readonly onSave?: DocumentDrawerContextType['onSave'] readonly onTakeOver?: () => void readonly permissions: null | SanitizedCollectionPermission | SanitizedGlobalPermission readonly readOnlyForIncomingUser?: boolean readonly redirectAfterDelete?: boolean readonly redirectAfterDuplicate?: boolean + readonly redirectAfterRestore?: boolean readonly slug: SanitizedCollectionConfig['slug'] readonly user?: ClientUser }> = (props) => { @@ -89,14 +94,17 @@ export const DocumentControls: React.FC<{ isAccountView, isEditing, isInDrawer, + isTrashed, onDelete, onDrawerCreateNew, onDuplicate, + onRestore, onTakeOver, permissions, readOnlyForIncomingUser, redirectAfterDelete, redirectAfterDuplicate, + redirectAfterRestore, user, } = props @@ -177,7 +185,7 @@ export const DocumentControls: React.FC<{ {showLockedMetaIcon && ( )} - {showFolderMetaIcon && config.folders && ( + {showFolderMetaIcon && config.folders && !isTrashed && ( )} - {(collectionConfig?.versions?.drafts || globalConfig?.versions?.drafts) && ( {(globalConfig || (collectionConfig && isEditing)) && ( @@ -210,16 +217,19 @@ export const DocumentControls: React.FC<{ )} - {hasSavePermission && autosaveEnabled && !unsavedDraftWithValidations && ( -
  • - -
  • - )} + {hasSavePermission && + autosaveEnabled && + !unsavedDraftWithValidations && + !isTrashed && ( +
  • + +
  • + )}
    )} {collectionConfig?.timestamps && (isEditing || isAccountView) && ( @@ -230,7 +240,10 @@ export const DocumentControls: React.FC<{ .join(' ')} title={data?.updatedAt ? updatedAt : ''} > -

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

    +

    + {i18n.t(isTrashed ? 'general:deleted' : 'general:lastModified')}:  +

    + {data?.updatedAt &&

    {updatedAt}

    }
  • } /> )} - {hasSavePermission && ( + {hasSavePermission && !isTrashed && ( {collectionConfig?.versions?.drafts || globalConfig?.versions?.drafts ? ( @@ -281,6 +294,26 @@ export const DocumentControls: React.FC<{ )} )} + {hasDeletePermission && isTrashed && ( + + )} + {hasSavePermission && isTrashed && ( + + )} {user && readOnlyForIncomingUser && ( + {children}, + '1': ({ children }) => {children}, + }} + i18nKey="general:aboutToPermanentlyDeleteTrash" + t={t} + variables={{ + count: trashCount ?? 0, + label: getTranslation( + trashCount === 1 + ? collectionConfig.labels?.singular + : collectionConfig.labels?.plural, + i18n, + ), + }} + /> + } + confirmingLabel={t('general:deleting')} + heading={t('general:confirmDeletion')} + modalSlug={confirmEmptyTrashSlug} + onConfirm={handleEmptyTrash} + /> + + ) +} diff --git a/packages/ui/src/elements/ListHeader/TitleActions/index.tsx b/packages/ui/src/elements/ListHeader/TitleActions/index.tsx index 898963438..dd8a4e2a7 100644 --- a/packages/ui/src/elements/ListHeader/TitleActions/index.tsx +++ b/packages/ui/src/elements/ListHeader/TitleActions/index.tsx @@ -1,3 +1,4 @@ export { ListBulkUploadButton } from './ListBulkUploadButton.js' export { ListCreateNewButton } from './ListCreateNewDocButton.js' export { ListCreateNewDocInFolderButton } from './ListCreateNewDocInFolderButton.js' +export { ListEmptyTrashButton } from './ListEmptyTrashButton.js' diff --git a/packages/ui/src/elements/ListFolderPills/index.tsx b/packages/ui/src/elements/ListHeaderTabs/ByFolderPill.tsx similarity index 53% rename from packages/ui/src/elements/ListFolderPills/index.tsx rename to packages/ui/src/elements/ListHeaderTabs/ByFolderPill.tsx index 02f904886..0f3138c2c 100644 --- a/packages/ui/src/elements/ListFolderPills/index.tsx +++ b/packages/ui/src/elements/ListHeaderTabs/ByFolderPill.tsx @@ -1,8 +1,7 @@ 'use client' -import type { ClientCollectionConfig } from 'payload' +import type { ClientCollectionConfig, ViewTypes } from 'payload' -import { getTranslation } from '@payloadcms/translations' import { formatAdminURL } from 'payload/shared' import { useConfig } from '../../providers/Config/index.js' @@ -10,20 +9,20 @@ import { useTranslation } from '../../providers/Translation/index.js' import { Button } from '../Button/index.js' import './index.scss' -const baseClass = 'list-folder-pills' +const baseClass = 'list-pills' -type ListFolderPillsProps = { +type ByFolderPillProps = { readonly collectionConfig: ClientCollectionConfig readonly folderCollectionSlug: string - readonly viewType: 'folders' | 'list' + readonly viewType: ViewTypes } -export function ListFolderPills({ +export function ByFolderPill({ collectionConfig, folderCollectionSlug, viewType, -}: ListFolderPillsProps) { - const { i18n, t } = useTranslation() +}: ByFolderPillProps) { + const { t } = useTranslation() const { config } = useConfig() if (!folderCollectionSlug) { @@ -41,7 +40,7 @@ export function ListFolderPills({ .filter(Boolean) .join(' ')} disabled={viewType === 'folders'} - el={viewType === 'list' ? 'link' : 'div'} + el={viewType === 'list' || viewType === 'trash' ? 'link' : 'div'} to={formatAdminURL({ adminRoute: config.routes.admin, path: `/collections/${collectionConfig.slug}/${folderCollectionSlug}`, @@ -50,21 +49,6 @@ export function ListFolderPills({ > {t('folder:byFolder')} -
  • ) } diff --git a/packages/ui/src/elements/ListHeaderTabs/DefaultListPill.tsx b/packages/ui/src/elements/ListHeaderTabs/DefaultListPill.tsx new file mode 100644 index 000000000..147eb4808 --- /dev/null +++ b/packages/ui/src/elements/ListHeaderTabs/DefaultListPill.tsx @@ -0,0 +1,47 @@ +'use client' + +import type { ClientCollectionConfig, ViewTypes } from 'payload' + +import { getTranslation } from '@payloadcms/translations' +import { formatAdminURL } from 'payload/shared' + +import { useConfig } from '../../providers/Config/index.js' +import { useTranslation } from '../../providers/Translation/index.js' +import { Button } from '../Button/index.js' +import './index.scss' + +const baseClass = 'list-pills' + +type DefaultListPillProps = { + readonly collectionConfig: ClientCollectionConfig + readonly viewType: ViewTypes +} + +export function DefaultListPill({ collectionConfig, viewType }: DefaultListPillProps) { + const { i18n, t } = useTranslation() + const { config } = useConfig() + + const buttonLabel = `${t('general:all')} ${getTranslation(collectionConfig?.labels?.plural, i18n)}` + const buttonId = buttonLabel.toLowerCase().replace(/\s+/g, '-') + + return ( +
    + +
    + ) +} diff --git a/packages/ui/src/elements/ListHeaderTabs/TrashPill.tsx b/packages/ui/src/elements/ListHeaderTabs/TrashPill.tsx new file mode 100644 index 000000000..b800a7527 --- /dev/null +++ b/packages/ui/src/elements/ListHeaderTabs/TrashPill.tsx @@ -0,0 +1,41 @@ +'use client' + +import type { ClientCollectionConfig, ViewTypes } from 'payload' + +import { formatAdminURL } from 'payload/shared' + +import { useConfig } from '../../providers/Config/index.js' +import { useTranslation } from '../../providers/Translation/index.js' +import { Button } from '../Button/index.js' + +export function TrashPill({ + collectionConfig, + viewType, +}: { + collectionConfig: ClientCollectionConfig + readonly viewType: ViewTypes +}) { + const { t } = useTranslation() + const { config } = useConfig() + + if (!collectionConfig.trash) { + return null + } + + return ( + + ) +} diff --git a/packages/ui/src/elements/ListFolderPills/index.scss b/packages/ui/src/elements/ListHeaderTabs/index.scss similarity index 56% rename from packages/ui/src/elements/ListFolderPills/index.scss rename to packages/ui/src/elements/ListHeaderTabs/index.scss index 90e26c62f..bcf32448d 100644 --- a/packages/ui/src/elements/ListFolderPills/index.scss +++ b/packages/ui/src/elements/ListHeaderTabs/index.scss @@ -1,7 +1,6 @@ @layer payload-default { - .list-folder-pills { + .list-pills { display: flex; gap: calc(var(--base) * 0.5); - margin-left: calc(var(--base) * 0.5); } } diff --git a/packages/ui/src/elements/ListSelection/index.scss b/packages/ui/src/elements/ListSelection/index.scss index 951999210..30ea5eafd 100644 --- a/packages/ui/src/elements/ListSelection/index.scss +++ b/packages/ui/src/elements/ListSelection/index.scss @@ -10,7 +10,7 @@ &__actions { display: flex; - gap: calc(var(--base) * 0.3); + gap: calc(var(--base) * 0.5); } &__button { diff --git a/packages/ui/src/elements/PermanentlyDeleteButton/index.tsx b/packages/ui/src/elements/PermanentlyDeleteButton/index.tsx new file mode 100644 index 000000000..00e3b0ec1 --- /dev/null +++ b/packages/ui/src/elements/PermanentlyDeleteButton/index.tsx @@ -0,0 +1,172 @@ +'use client' + +import type { SanitizedCollectionConfig } from 'payload' + +import { useModal } from '@faceless-ui/modal' +import { getTranslation } from '@payloadcms/translations' +import { useRouter } from 'next/navigation.js' +import { formatAdminURL } from 'payload/shared' +import * as qs from 'qs-esm' +import React, { Fragment, useCallback } from 'react' +import { toast } from 'sonner' + +import type { DocumentDrawerContextType } from '../DocumentDrawer/Provider.js' + +import { useConfig } from '../../providers/Config/index.js' +import { useDocumentTitle } from '../../providers/DocumentTitle/index.js' +import { useRouteTransition } from '../../providers/RouteTransition/index.js' +import { useTranslation } from '../../providers/Translation/index.js' +import { requests } from '../../utilities/api.js' +import { Button } from '../Button/index.js' +import { ConfirmationModal } from '../ConfirmationModal/index.js' +import { Translation } from '../Translation/index.js' + +export type Props = { + readonly buttonId?: string + readonly collectionSlug: SanitizedCollectionConfig['slug'] + readonly id?: string + readonly onDelete?: DocumentDrawerContextType['onDelete'] + readonly redirectAfterDelete?: boolean + readonly singularLabel: SanitizedCollectionConfig['labels']['singular'] + readonly title?: string +} + +export const PermanentlyDeleteButton: React.FC = (props) => { + const { + id, + buttonId, + collectionSlug, + onDelete, + redirectAfterDelete = true, + singularLabel, + title: titleFromProps, + } = props + + const { + config: { + routes: { admin: adminRoute, api }, + serverURL, + }, + getEntityConfig, + } = useConfig() + + const collectionConfig = getEntityConfig({ collectionSlug }) + const router = useRouter() + const { i18n, t } = useTranslation() + const { title } = useDocumentTitle() + const { startRouteTransition } = useRouteTransition() + const { openModal } = useModal() + + const modalSlug = `perma-delete-${id}` + + const addDefaultError = useCallback(() => { + toast.error(t('error:deletingTitle', { title })) + }, [t, title]) + + const handleDelete = useCallback(async () => { + try { + const url = `${serverURL}${api}/${collectionSlug}?${qs.stringify({ + trash: true, + where: { + and: [{ id: { equals: id } }, { deletedAt: { exists: true } }], + }, + })}` + + const res = await requests.delete(url, { + headers: { + 'Accept-Language': i18n.language, + 'Content-Type': 'application/json', + }, + }) + + const json = await res.json() + + if (res.status < 400) { + toast.success( + t('general:titleDeleted', { + label: getTranslation(singularLabel, i18n), + title, + }) || json.message, + ) + + if (redirectAfterDelete) { + return startRouteTransition(() => + router.push( + formatAdminURL({ + adminRoute, + path: `/collections/${collectionSlug}/trash`, + }), + ), + ) + } + + if (typeof onDelete === 'function') { + await onDelete({ id, collectionConfig }) + } + + return + } + + if (json.errors) { + json.errors.forEach((error) => toast.error(error.message)) + } else { + addDefaultError() + } + } catch (_err) { + addDefaultError() + } + }, [ + serverURL, + api, + collectionSlug, + id, + t, + singularLabel, + addDefaultError, + i18n, + title, + router, + adminRoute, + redirectAfterDelete, + onDelete, + collectionConfig, + startRouteTransition, + ]) + + if (id) { + return ( + + + {children}, + }} + i18nKey="general:aboutToPermanentlyDelete" + t={t} + variables={{ + label: getTranslation(singularLabel, i18n), + title: titleFromProps || title || id, + }} + /> + } + confirmingLabel={t('general:deleting')} + heading={t('general:confirmDeletion')} + modalSlug={modalSlug} + onConfirm={handleDelete} + /> + + ) + } + + return null +} diff --git a/packages/ui/src/elements/RestoreButton/index.scss b/packages/ui/src/elements/RestoreButton/index.scss new file mode 100644 index 000000000..130b95e3f --- /dev/null +++ b/packages/ui/src/elements/RestoreButton/index.scss @@ -0,0 +1,25 @@ +@import '../../scss/styles.scss'; + +@layer payload-default { + .restore-button { + @include blur-bg; + display: flex; + align-items: center; + justify-content: center; + height: 100%; + + &__toggle { + @extend %btn-reset; + } + + &__checkbox { + padding: calc(var(--base) * 0.5) 0; + + .checkbox-input { + label { + padding-bottom: 0; + } + } + } + } +} diff --git a/packages/ui/src/elements/RestoreButton/index.tsx b/packages/ui/src/elements/RestoreButton/index.tsx new file mode 100644 index 000000000..3c6e9a30b --- /dev/null +++ b/packages/ui/src/elements/RestoreButton/index.tsx @@ -0,0 +1,208 @@ +'use client' + +import type { SanitizedCollectionConfig } from 'payload' + +import { useModal } from '@faceless-ui/modal' +import { getTranslation } from '@payloadcms/translations' +import { useRouter } from 'next/navigation.js' +import { formatAdminURL } from 'payload/shared' +import * as qs from 'qs-esm' +import React, { Fragment, useCallback, useState } from 'react' +import { toast } from 'sonner' + +import type { DocumentDrawerContextType } from '../DocumentDrawer/Provider.js' + +import { CheckboxInput } from '../../fields/Checkbox/Input.js' +import { useConfig } from '../../providers/Config/index.js' +import { useDocumentTitle } from '../../providers/DocumentTitle/index.js' +import { useRouteTransition } from '../../providers/RouteTransition/index.js' +import { useTranslation } from '../../providers/Translation/index.js' +import { requests } from '../../utilities/api.js' +import { Button } from '../Button/index.js' +import { ConfirmationModal } from '../ConfirmationModal/index.js' +import { Translation } from '../Translation/index.js' +import './index.scss' + +const baseClass = 'restore-button' + +export type Props = { + readonly buttonId?: string + readonly collectionSlug: SanitizedCollectionConfig['slug'] + readonly id?: string + readonly onRestore?: DocumentDrawerContextType['onRestore'] + readonly redirectAfterRestore?: boolean + readonly singularLabel: SanitizedCollectionConfig['labels']['singular'] + readonly title?: string +} + +export const RestoreButton: React.FC = (props) => { + const { + id, + buttonId, + collectionSlug, + onRestore, + redirectAfterRestore = true, + singularLabel, + title: titleFromProps, + } = props + + const { + config: { + routes: { admin: adminRoute, api }, + serverURL, + }, + getEntityConfig, + } = useConfig() + + const collectionConfig = getEntityConfig({ collectionSlug }) + const router = useRouter() + const { i18n, t } = useTranslation() + const { title } = useDocumentTitle() + const { startRouteTransition } = useRouteTransition() + const { openModal } = useModal() + + const modalSlug = `restore-${id}` + + const [restoreAsPublished, setRestoreAsPublished] = useState(false) + + const addDefaultError = useCallback(() => { + toast.error(t('error:restoringTitle', { title })) + }, [t, title]) + + const handleRestore = useCallback(async () => { + try { + const url = `${serverURL}${api}/${collectionSlug}?${qs.stringify({ + trash: true, + where: { + and: [{ id: { equals: id } }, { deletedAt: { exists: true } }], + }, + })}` + + const body: Record = { + deletedAt: null, + } + + // Only include _status if drafts are enabled + if (collectionConfig?.versions?.drafts) { + body._status = restoreAsPublished ? 'published' : 'draft' + } + + const res = await requests.patch(url, { + body: JSON.stringify(body), + headers: { + 'Accept-Language': i18n.language, + 'Content-Type': 'application/json', + }, + }) + + const json = await res.json() + + if (res.status < 400) { + toast.success( + t('general:titleRestored', { + label: getTranslation(singularLabel, i18n), + title, + }) || json.message, + ) + + if (redirectAfterRestore) { + return startRouteTransition(() => + router.push( + formatAdminURL({ + adminRoute, + path: `/collections/${collectionSlug}/${id}`, + }), + ), + ) + } + + if (typeof onRestore === 'function') { + await onRestore({ id, collectionConfig }) + } + + return + } + + if (json.errors) { + json.errors.forEach((error) => toast.error(error.message)) + } else { + addDefaultError() + } + } catch (_err) { + addDefaultError() + } + }, [ + serverURL, + api, + collectionSlug, + id, + t, + singularLabel, + addDefaultError, + i18n, + title, + router, + adminRoute, + redirectAfterRestore, + onRestore, + collectionConfig, + startRouteTransition, + restoreAsPublished, + ]) + + if (id) { + return ( + + + + {children}, + }} + i18nKey={ + collectionConfig?.versions?.drafts + ? 'general:aboutToRestoreAsDraft' + : 'general:aboutToRestore' + } + t={t} + variables={{ + label: getTranslation(singularLabel, i18n), + title: titleFromProps || title || id, + }} + /> + {collectionConfig?.versions?.drafts && ( +
    + setRestoreAsPublished(e.target.checked)} + /> +
    + )} +
    + } + className={baseClass} + confirmingLabel={t('general:restoring')} + heading={t('general:confirmRestoration')} + modalSlug={modalSlug} + onConfirm={handleRestore} + /> + + ) + } + + return null +} diff --git a/packages/ui/src/elements/RestoreMany/index.scss b/packages/ui/src/elements/RestoreMany/index.scss new file mode 100644 index 000000000..5b1905268 --- /dev/null +++ b/packages/ui/src/elements/RestoreMany/index.scss @@ -0,0 +1,25 @@ +@import '../../scss/styles.scss'; + +@layer payload-default { + .restore-many { + @include blur-bg; + display: flex; + align-items: center; + justify-content: center; + height: 100%; + + &__toggle { + @extend %btn-reset; + } + + &__checkbox { + padding: calc(var(--base) * 0.5) 0; + + .checkbox-input { + label { + padding-bottom: 0; + } + } + } + } +} diff --git a/packages/ui/src/elements/RestoreMany/index.tsx b/packages/ui/src/elements/RestoreMany/index.tsx new file mode 100644 index 000000000..e02ceb030 --- /dev/null +++ b/packages/ui/src/elements/RestoreMany/index.tsx @@ -0,0 +1,209 @@ +'use client' +import type { ClientCollectionConfig, ViewTypes, Where } from 'payload' + +import { useModal } from '@faceless-ui/modal' +import { getTranslation } from '@payloadcms/translations' +import { useRouter, useSearchParams } from 'next/navigation.js' +import { mergeListSearchAndWhere } from 'payload/shared' +import * as qs from 'qs-esm' +import React from 'react' +import { toast } from 'sonner' + +import { CheckboxInput } from '../../fields/Checkbox/Input.js' +import { useAuth } from '../../providers/Auth/index.js' +import { useConfig } from '../../providers/Config/index.js' +import { useLocale } from '../../providers/Locale/index.js' +import { useRouteCache } from '../../providers/RouteCache/index.js' +import { SelectAllStatus, useSelection } from '../../providers/Selection/index.js' +import { useTranslation } from '../../providers/Translation/index.js' +import { requests } from '../../utilities/api.js' +import { parseSearchParams } from '../../utilities/parseSearchParams.js' +import { ConfirmationModal } from '../ConfirmationModal/index.js' +import { ListSelectionButton } from '../ListSelection/index.js' +import './index.scss' + +const confirmManyRestoreDrawerSlug = `confirm-restore-many-docs` + +const baseClass = 'restore-many' + +export type Props = { + collection: ClientCollectionConfig + viewType?: ViewTypes +} + +export const RestoreMany: React.FC = (props) => { + const { collection: { slug } = {}, viewType } = props + + const { permissions } = useAuth() + const { + config: { collections, routes, serverURL }, + } = useConfig() + const { code: locale } = useLocale() + const router = useRouter() + const { clearRouteCache } = useRouteCache() + const searchParams = useSearchParams() + const { count, getSelectedIds, selectAll, toggleAll } = useSelection() + const { openModal } = useModal() + + const { i18n, t } = useTranslation() + + const [restoreAsPublished, setRestoreAsPublished] = React.useState(false) + + const collectionPermissions = permissions?.collections?.[slug] + const hasUpdatePermission = collectionPermissions?.update + + if (selectAll === SelectAllStatus.None || !hasUpdatePermission || viewType !== 'trash') { + return null + } + + const selectingAll = selectAll === SelectAllStatus.AllAvailable + const selectedIDs = !selectingAll ? getSelectedIds() : [] + + const baseWhere = parseSearchParams(searchParams)?.where as Where + + const finalWhere = { + and: [ + ...(Array.isArray(baseWhere?.and) ? baseWhere.and : baseWhere ? [baseWhere] : []), + { deletedAt: { exists: true } }, + ], + } + + const handleRestore = async () => { + const collectionConfig = collections.find((c) => c.slug === slug) + if (!collectionConfig) { + return + } + + let whereConstraint: Where + + if (selectingAll) { + whereConstraint = finalWhere + } else { + whereConstraint = { + and: [{ id: { in: selectedIDs } }, { deletedAt: { exists: true } }], + } + } + + const url = `${serverURL}${routes.api}/${slug}${qs.stringify( + { + limit: 0, + locale, + trash: true, // Ensure trashed docs are returned + where: mergeListSearchAndWhere({ + collectionConfig, + search: parseSearchParams(searchParams)?.search as string, + where: whereConstraint, + }), + }, + { addQueryPrefix: true }, + )}` + + const body: Record = { + deletedAt: null, + } + + // Only include _status if drafts are enabled + if (collectionConfig?.versions?.drafts) { + body._status = restoreAsPublished ? 'published' : 'draft' + } + + const restoreManyResponse = await requests.patch(url, { + body: JSON.stringify(body), + headers: { + 'Accept-Language': i18n.language, + 'Content-Type': 'application/json', + }, + }) + + try { + const { plural, singular } = collectionConfig.labels + const json = await restoreManyResponse.json() + + const restoredDocs = json?.docs?.length || 0 + const successLabel = restoredDocs > 1 ? plural : singular + + if (restoreManyResponse.status < 400 || restoredDocs > 0) { + toast.success( + t('general:restoredCountSuccessfully', { + count: restoredDocs, + label: getTranslation(successLabel, i18n), + }), + ) + } + + if (json?.errors?.length > 0) { + toast.error(json.message, { + description: json.errors.map((e) => e.message).join('\n'), + }) + } + } catch (err) { + toast.error(t('error:unknown')) + } + + toggleAll() + + router.replace( + qs.stringify( + { + ...parseSearchParams(searchParams), + page: selectingAll ? '1' : undefined, + }, + { addQueryPrefix: true }, + ), + ) + + clearRouteCache() + } + + const collectionConfig = collections.find(({ slug: s }) => s === slug) + + const labelString = getTranslation( + count === 1 ? collectionConfig.labels.singular : collectionConfig.labels.plural, + i18n, + ) + + return ( + + { + openModal(confirmManyRestoreDrawerSlug) + }} + > + {t('general:restore')} + + + {t( + collectionConfig?.versions?.drafts + ? 'general:aboutToRestoreAsDraftCount' + : 'general:aboutToRestoreCount', + { + count, + label: labelString, + }, + )} + {collectionConfig?.versions?.drafts && ( +
    + setRestoreAsPublished(e.target.checked)} + /> +
    + )} +
    + } + className={baseClass} + confirmingLabel={t('general:restoring')} + heading={t('general:confirmRestoration')} + modalSlug={confirmManyRestoreDrawerSlug} + onConfirm={handleRestore} + /> + + ) +} diff --git a/packages/ui/src/elements/Status/index.tsx b/packages/ui/src/elements/Status/index.tsx index cd7130e2c..735094ab5 100644 --- a/packages/ui/src/elements/Status/index.tsx +++ b/packages/ui/src/elements/Status/index.tsx @@ -23,6 +23,7 @@ export const Status: React.FC = () => { globalSlug, hasPublishedDoc, incrementVersionCount, + isTrashed, setHasPublishedDoc, setMostRecentVersionIsAutosaved, setUnpublishedVersionCount, @@ -55,6 +56,12 @@ export const Status: React.FC = () => { statusToRender = 'published' } + const displayStatusKey = isTrashed + ? hasPublishedDoc + ? 'previouslyPublished' + : 'previouslyDraft' + : statusToRender + const performAction = useCallback( async (action: 'revert' | 'unpublish') => { let url @@ -158,12 +165,12 @@ export const Status: React.FC = () => { return (
    {t('version:status')}:  - {t(`version:${statusToRender}`)} - {canUpdate && statusToRender === 'published' && ( + {t(`version:${displayStatusKey}`)} + {!isTrashed && canUpdate && statusToRender === 'published' && (  — 
    )}
    diff --git a/packages/ui/src/views/Edit/SetDocumentStepNav/index.tsx b/packages/ui/src/views/Edit/SetDocumentStepNav/index.tsx index 5102947af..181fc2819 100644 --- a/packages/ui/src/views/Edit/SetDocumentStepNav/index.tsx +++ b/packages/ui/src/views/Edit/SetDocumentStepNav/index.tsx @@ -19,11 +19,12 @@ export const SetDocumentStepNav: React.FC<{ globalLabel?: SanitizedGlobalConfig['label'] globalSlug?: SanitizedGlobalConfig['slug'] id?: number | string + isTrashed?: boolean pluralLabel?: SanitizedCollectionConfig['labels']['plural'] useAsTitle?: SanitizedCollectionConfig['admin']['useAsTitle'] view?: string }> = (props) => { - const { id, collectionSlug, globalSlug, pluralLabel, useAsTitle } = props + const { id, collectionSlug, globalSlug, isTrashed, pluralLabel, useAsTitle } = props const view: string | undefined = props?.view || undefined @@ -48,6 +49,7 @@ export const SetDocumentStepNav: React.FC<{ if (!isInitializing) { if (collectionSlug) { + // Collection label nav.push({ label: getTranslation(pluralLabel, i18n), url: isVisible @@ -58,13 +60,29 @@ export const SetDocumentStepNav: React.FC<{ : undefined, }) + // Trash breadcrumb (if in trash view) + if (isTrashed) { + nav.push({ + label: t('general:trash'), + url: isVisible + ? formatAdminURL({ + adminRoute, + path: `/collections/${collectionSlug}/trash`, + }) + : undefined, + }) + } + + // Document label if (isEditing) { nav.push({ label: (useAsTitle && useAsTitle !== 'id' && title) || `${id}`, url: isVisible ? formatAdminURL({ adminRoute, - path: `/collections/${collectionSlug}/${id}`, + path: isTrashed + ? `/collections/${collectionSlug}/trash/${id}` + : `/collections/${collectionSlug}/${id}`, }) : undefined, }) @@ -85,6 +103,7 @@ export const SetDocumentStepNav: React.FC<{ }) } + // Fallback view (used for versions, previews, etc.) if (view) { nav.push({ label: view, @@ -99,6 +118,7 @@ export const SetDocumentStepNav: React.FC<{ isEditing, pluralLabel, id, + isTrashed, useAsTitle, adminRoute, t, diff --git a/packages/ui/src/views/Edit/index.tsx b/packages/ui/src/views/Edit/index.tsx index b4b544686..b621fc87d 100644 --- a/packages/ui/src/views/Edit/index.tsx +++ b/packages/ui/src/views/Edit/index.tsx @@ -80,10 +80,12 @@ export function DefaultEditView({ initialState, isEditing, isInitializing, + isTrashed, lastUpdateTime, redirectAfterCreate, redirectAfterDelete, redirectAfterDuplicate, + redirectAfterRestore, savedDocumentData, setCurrentEditor, setDocumentIsLocked, @@ -97,6 +99,7 @@ export function DefaultEditView({ drawerSlug, onDelete, onDuplicate, + onRestore, onSave: onSaveFromContext, } = useDocumentDrawerContext() @@ -471,7 +474,7 @@ export function DefaultEditView({
    @@ -546,7 +550,7 @@ export function DefaultEditView({ SaveDraftButton, }} data={savedDocumentData} - disableActions={disableActions || isFolderCollection} + disableActions={disableActions || isFolderCollection || isTrashed} disableCreate={disableCreate} EditMenuItems={EditMenuItems} hasPublishPermission={hasPublishPermission} @@ -554,9 +558,11 @@ export function DefaultEditView({ id={id} isEditing={isEditing} isInDrawer={isInDrawer} + isTrashed={isTrashed} onDelete={onDelete} onDrawerCreateNew={clearDoc} onDuplicate={onDuplicate} + onRestore={onRestore} onSave={onSave} onTakeOver={() => handleTakeOver( @@ -576,6 +582,7 @@ export function DefaultEditView({ readOnlyForIncomingUser={isReadOnlyForIncomingUser} redirectAfterDelete={redirectAfterDelete} redirectAfterDuplicate={redirectAfterDuplicate} + redirectAfterRestore={redirectAfterRestore} slug={collectionConfig?.slug || globalConfig?.slug} user={currentEditor} /> @@ -637,7 +644,8 @@ export function DefaultEditView({ docPermissions={docPermissions} fields={docConfig.fields} forceSidebarWrap={isLivePreviewing} - readOnly={isReadOnlyForIncomingUser || !hasSavePermission} + isTrashed={isTrashed} + readOnly={isReadOnlyForIncomingUser || !hasSavePermission || isTrashed} schemaPathSegments={schemaPathSegments} /> {AfterDocument} diff --git a/packages/ui/src/views/List/ListHeader/index.tsx b/packages/ui/src/views/List/ListHeader/index.tsx index 49f49afbd..492729058 100644 --- a/packages/ui/src/views/List/ListHeader/index.tsx +++ b/packages/ui/src/views/List/ListHeader/index.tsx @@ -1,23 +1,26 @@ import type { I18nClient, TFunction } from '@payloadcms/translations' -import type { ClientCollectionConfig } from 'payload' +import type { ClientCollectionConfig, ViewTypes } from 'payload' import { getTranslation } from '@payloadcms/translations' import React from 'react' import { CloseModalButton } from '../../../elements/CloseModalButton/index.js' import { useListDrawerContext } from '../../../elements/ListDrawer/Provider.js' -import { ListFolderPills } from '../../../elements/ListFolderPills/index.js' import { DrawerRelationshipSelect } from '../../../elements/ListHeader/DrawerRelationshipSelect/index.js' import { ListDrawerCreateNewDocButton } from '../../../elements/ListHeader/DrawerTitleActions/index.js' import { ListHeader } from '../../../elements/ListHeader/index.js' import { ListBulkUploadButton, ListCreateNewButton, + ListEmptyTrashButton, } from '../../../elements/ListHeader/TitleActions/index.js' +import { ByFolderPill } from '../../../elements/ListHeaderTabs/ByFolderPill.js' +import { DefaultListPill } from '../../../elements/ListHeaderTabs/DefaultListPill.js' +import './index.scss' +import { TrashPill } from '../../../elements/ListHeaderTabs/TrashPill.js' import { useConfig } from '../../../providers/Config/index.js' import { useListQuery } from '../../../providers/ListQuery/index.js' import { ListSelection } from '../ListSelection/index.js' -import './index.scss' const drawerBaseClass = 'list-drawer' @@ -29,8 +32,10 @@ export type ListHeaderProps = { disableBulkDelete?: boolean disableBulkEdit?: boolean hasCreatePermission: boolean + hasDeletePermission?: boolean i18n: I18nClient isBulkUploadEnabled: boolean + isTrashEnabled?: boolean newDocumentURL: string onBulkUploadSuccess?: () => void /** @deprecated This prop will be removed in the next major version. @@ -44,7 +49,7 @@ export type ListHeaderProps = { /** @deprecated This prop will be removed in the next major version. */ t?: TFunction TitleActions?: React.ReactNode[] - viewType?: 'folders' | 'list' + viewType?: ViewTypes } export const CollectionListHeader: React.FC = ({ @@ -54,8 +59,10 @@ export const CollectionListHeader: React.FC = ({ disableBulkDelete, disableBulkEdit, hasCreatePermission, + hasDeletePermission, i18n, isBulkUploadEnabled, + isTrashEnabled, newDocumentURL, onBulkUploadSuccess, openBulkUpload, @@ -64,6 +71,7 @@ export const CollectionListHeader: React.FC = ({ }) => { const { config, getEntityConfig } = useConfig() const { drawerSlug, isInDrawer, selectedOption } = useListDrawerContext() + const isTrashRoute = viewType === 'trash' const { isGroupingBy } = useListQuery() if (isInDrawer) { @@ -108,13 +116,28 @@ export const CollectionListHeader: React.FC = ({ key="list-selection" label={getTranslation(collectionConfig?.labels?.plural, i18n)} showSelectAllAcrossPages={!isGroupingBy} + viewType={viewType} + /> + ), + ((collectionConfig.folders && config.folders) || isTrashEnabled) && ( + ), collectionConfig.folders && config.folders && ( - + ), + isTrashEnabled && ( + ), @@ -123,7 +146,7 @@ export const CollectionListHeader: React.FC = ({ className={className} title={getTranslation(collectionConfig?.labels?.plural, i18n)} TitleActions={[ - hasCreatePermission && ( + hasCreatePermission && !isTrashRoute && ( = ({ newDocumentURL={newDocumentURL} /> ), - hasCreatePermission && isBulkUploadEnabled && ( + hasCreatePermission && isBulkUploadEnabled && !isTrashRoute && ( = ({ openBulkUpload={openBulkUpload} /> ), + hasDeletePermission && isTrashEnabled && viewType === 'trash' && ( + + ), ].filter(Boolean)} /> ) diff --git a/packages/ui/src/views/List/ListSelection/index.tsx b/packages/ui/src/views/List/ListSelection/index.tsx index d67dabbe0..d062caf00 100644 --- a/packages/ui/src/views/List/ListSelection/index.tsx +++ b/packages/ui/src/views/List/ListSelection/index.tsx @@ -1,5 +1,5 @@ 'use client' -import type { ClientCollectionConfig, Where } from 'payload' +import type { ClientCollectionConfig, ViewTypes, Where } from 'payload' import React, { Fragment, useCallback } from 'react' @@ -7,6 +7,7 @@ import { DeleteMany } from '../../../elements/DeleteMany/index.js' import { EditMany_v4 } from '../../../elements/EditMany/index.js' import { ListSelection_v4, ListSelectionButton } from '../../../elements/ListSelection/index.js' import { PublishMany_v4 } from '../../../elements/PublishMany/index.js' +import { RestoreMany } from '../../../elements/RestoreMany/index.js' import { UnpublishMany_v4 } from '../../../elements/UnpublishMany/index.js' import { SelectAllStatus, useSelection } from '../../../providers/Selection/index.js' import { useTranslation } from '../../../providers/Translation/index.js' @@ -18,6 +19,7 @@ export type ListSelectionProps = { label: string modalPrefix?: string showSelectAllAcrossPages?: boolean + viewType?: ViewTypes where?: Where } @@ -28,6 +30,7 @@ export const ListSelection: React.FC = ({ label, modalPrefix, showSelectAllAcrossPages = true, + viewType, where, }) => { const { count, selectAll, selectedIDs, toggleAll, totalDocs } = useSelection() @@ -39,6 +42,8 @@ export const ListSelection: React.FC = ({ return null } + const isTrashView = collectionConfig?.trash && viewType === 'trash' + return ( = ({ ) : null, ].filter(Boolean)} SelectionActions={[ - !disableBulkEdit && ( + !disableBulkEdit && !isTrashView && ( = ({ /> ), + isTrashView && ( + + ), !disableBulkDelete && ( - + ), ].filter(Boolean)} /> diff --git a/packages/ui/src/views/List/index.tsx b/packages/ui/src/views/List/index.tsx index f720bde56..0997d03aa 100644 --- a/packages/ui/src/views/List/index.tsx +++ b/packages/ui/src/views/List/index.tsx @@ -4,7 +4,7 @@ import type { ListViewClientProps } from 'payload' import { getTranslation } from '@payloadcms/translations' import { useRouter } from 'next/navigation.js' -import { formatFilesize } from 'payload/shared' +import { formatAdminURL, formatFilesize } from 'payload/shared' import React, { Fragment, useEffect } from 'react' import { useBulkUpload } from '../../elements/BulkUpload/index.js' @@ -49,6 +49,7 @@ export function DefaultListView(props: ListViewClientProps) { disableQueryPresets, enableRowSelections, hasCreatePermission: hasCreatePermissionFromProps, + hasDeletePermission, listMenuItems, newDocumentURL, queryPreset, @@ -56,6 +57,7 @@ export function DefaultListView(props: ListViewClientProps) { renderedFilters, resolvedFilterOptions, Table: InitialTable, + viewType, } = props const [Table] = useControllableState(InitialTable) @@ -69,7 +71,12 @@ export function DefaultListView(props: ListViewClientProps) { const { user } = useAuth() - const { getEntityConfig } = useConfig() + const { + config: { + routes: { admin: adminRoute }, + }, + getEntityConfig, + } = useConfig() const router = useRouter() const { data, isGroupingBy } = useListQuery() @@ -85,6 +92,8 @@ export function DefaultListView(props: ListViewClientProps) { const isBulkUploadEnabled = isUploadCollection && collectionConfig.upload.bulkUpload + const isTrashEnabled = Boolean(collectionConfig.trash) + const { i18n } = useTranslation() const { setStepNav } = useStepNav() @@ -114,13 +123,27 @@ export function DefaultListView(props: ListViewClientProps) { useEffect(() => { if (!isInDrawer) { - setStepNav([ - { - label: labels?.plural, - }, - ]) + const baseLabel = { + label: getTranslation(labels?.plural, i18n), + url: + isTrashEnabled && viewType === 'trash' + ? formatAdminURL({ + adminRoute, + path: `/collections/${collectionSlug}`, + }) + : undefined, + } + + const trashLabel = { + label: i18n.t('general:trash'), + } + + const navItems = + isTrashEnabled && viewType === 'trash' ? [baseLabel, trashLabel] : [baseLabel] + + setStepNav(navItems) } - }, [setStepNav, labels, isInDrawer]) + }, [adminRoute, setStepNav, labels, isInDrawer, isTrashEnabled, viewType, i18n, collectionSlug]) return ( @@ -147,12 +170,14 @@ export function DefaultListView(props: ListViewClientProps) { disableBulkDelete={disableBulkDelete} disableBulkEdit={disableBulkEdit} hasCreatePermission={hasCreatePermission} + hasDeletePermission={hasDeletePermission} i18n={i18n} isBulkUploadEnabled={isBulkUploadEnabled && !upload.hideFileInputOnCreate} + isTrashEnabled={isTrashEnabled} newDocumentURL={newDocumentURL} openBulkUpload={openBulkUpload} smallBreak={smallBreak} - viewType="list" + viewType={viewType} />

    - {i18n.t('general:noResults', { label: getTranslation(labels?.plural, i18n) })} + {i18n.t(viewType === 'trash' ? 'general:noTrashResults' : 'general:noResults', { + label: getTranslation(labels?.plural, i18n), + })}

    - {hasCreatePermission && newDocumentURL && ( + {hasCreatePermission && newDocumentURL && viewType !== 'trash' && ( {isInDrawer ? (