From 2f8c9ab0e2246c75574cb08940c9a1142d29e6ba Mon Sep 17 00:00:00 2001 From: Jessica Chowdhury Date: Wed, 1 Oct 2025 13:29:21 +0100 Subject: [PATCH 01/24] feat: stubs out unpublishSpecificLocale --- .../src/collections/endpoints/updateByID.ts | 2 + .../collections/operations/local/update.ts | 6 + .../src/collections/operations/update.ts | 3 + .../src/collections/operations/updateByID.ts | 6 + .../operations/utilities/update.ts | 4 + .../payload/src/globals/endpoints/update.ts | 2 + .../src/globals/operations/local/update.ts | 6 + .../payload/src/globals/operations/update.ts | 7 + packages/translations/src/clientKeys.ts | 7 + packages/translations/src/languages/en.ts | 7 + .../src/elements/DocumentControls/index.tsx | 12 +- .../ui/src/elements/PublishButton/index.tsx | 4 +- .../ui/src/elements/UnpublishButton/index.tsx | 226 ++++++++++++++++++ 13 files changed, 286 insertions(+), 6 deletions(-) create mode 100644 packages/ui/src/elements/UnpublishButton/index.tsx diff --git a/packages/payload/src/collections/endpoints/updateByID.ts b/packages/payload/src/collections/endpoints/updateByID.ts index 78d2f74adae..f5d8553aebd 100644 --- a/packages/payload/src/collections/endpoints/updateByID.ts +++ b/packages/payload/src/collections/endpoints/updateByID.ts @@ -18,6 +18,7 @@ export const updateByIDHandler: PayloadHandler = async (req) => { const overrideLock = searchParams.get('overrideLock') const trash = searchParams.get('trash') === 'true' const publishSpecificLocale = req.query.publishSpecificLocale as string | undefined + const unpublishSpecificLocale = req.query.unpublishSpecificLocale as string | undefined const doc = await updateByIDOperation({ id, @@ -32,6 +33,7 @@ export const updateByIDHandler: PayloadHandler = async (req) => { req, select: sanitizeSelectParam(req.query.select), trash, + unpublishSpecificLocale, }) let message = req.t('general:updatedSuccessfully') diff --git a/packages/payload/src/collections/operations/local/update.ts b/packages/payload/src/collections/operations/local/update.ts index 74947151524..ed7d5091c62 100644 --- a/packages/payload/src/collections/operations/local/update.ts +++ b/packages/payload/src/collections/operations/local/update.ts @@ -120,6 +120,10 @@ export type BaseOptions = { */ sort?: Sort trash?: boolean + unpublishSpecificLocale?: string where: Where } @@ -112,6 +113,7 @@ export const updateOperation = async < showHiddenFields, sort: incomingSort, trash = false, + unpublishSpecificLocale, where, } = args @@ -259,6 +261,7 @@ export const updateOperation = async < req, select: select!, showHiddenFields: showHiddenFields!, + unpublishSpecificLocale, }) return updatedDoc diff --git a/packages/payload/src/collections/operations/updateByID.ts b/packages/payload/src/collections/operations/updateByID.ts index 5b5dfb0478c..15262722a91 100644 --- a/packages/payload/src/collections/operations/updateByID.ts +++ b/packages/payload/src/collections/operations/updateByID.ts @@ -49,6 +49,7 @@ export type Arguments = { select?: SelectType showHiddenFields?: boolean trash?: boolean + unpublishSpecificLocale?: string } export const updateByIDOperation = async < @@ -83,6 +84,10 @@ export const updateByIDOperation = async < args.req.locale = args.publishSpecificLocale } + if (args.unpublishSpecificLocale) { + args.req.locale = args.unpublishSpecificLocale + } + const { id, autosave = false, @@ -105,6 +110,7 @@ export const updateByIDOperation = async < select: incomingSelect, showHiddenFields, trash = false, + unpublishSpecificLocale, } = args if (!id) { diff --git a/packages/payload/src/collections/operations/utilities/update.ts b/packages/payload/src/collections/operations/utilities/update.ts index da5d7db8036..0ab4eb26d9d 100644 --- a/packages/payload/src/collections/operations/utilities/update.ts +++ b/packages/payload/src/collections/operations/utilities/update.ts @@ -55,6 +55,7 @@ export type SharedUpdateDocumentArgs = { req: PayloadRequest select: SelectType showHiddenFields: boolean + unpublishSpecificLocale?: string } /** @@ -94,6 +95,7 @@ export const updateDocument = async < req, select, showHiddenFields, + unpublishSpecificLocale, }: SharedUpdateDocumentArgs): Promise> => { const password = data?.password const shouldSaveDraft = @@ -243,6 +245,7 @@ export const updateDocument = async < } if (publishSpecificLocale) { + // JESS TODO versionSnapshotResult = await beforeChange({ ...beforeChangeArgs, docWithLocales, @@ -323,6 +326,7 @@ export const updateDocument = async < req, select, snapshot: versionSnapshotResult, + unpublishSpecificLocale, }) } diff --git a/packages/payload/src/globals/endpoints/update.ts b/packages/payload/src/globals/endpoints/update.ts index 79f4e9d4f1c..1e558dc82a3 100644 --- a/packages/payload/src/globals/endpoints/update.ts +++ b/packages/payload/src/globals/endpoints/update.ts @@ -16,6 +16,7 @@ export const updateHandler: PayloadHandler = async (req) => { const draft = searchParams.get('draft') === 'true' const autosave = searchParams.get('autosave') === 'true' const publishSpecificLocale = req.query.publishSpecificLocale as string | undefined + const unpublishSpecificLocale = req.query.unpublishSpecificLocale as string | undefined const result = await updateOperation({ slug: globalConfig.slug, @@ -28,6 +29,7 @@ export const updateHandler: PayloadHandler = async (req) => { publishSpecificLocale, req, select: sanitizeSelectParam(req.query.select), + unpublishSpecificLocale, }) let message = req.t('general:updatedSuccessfully') diff --git a/packages/payload/src/globals/operations/local/update.ts b/packages/payload/src/globals/operations/local/update.ts index b5e0bc3fc3d..5487f37b0be 100644 --- a/packages/payload/src/globals/operations/local/update.ts +++ b/packages/payload/src/globals/operations/local/update.ts @@ -87,6 +87,10 @@ export type Options = { * the Global slug to operate against. */ slug: TSlug + /** + * Unpublish the document / documents for a specific locale. + */ + unpublishSpecificLocale?: TypedLocale /** * If you set `overrideAccess` to `false`, you can pass a user to use against the access control checks. */ @@ -111,6 +115,7 @@ export async function updateGlobalLocal< publishSpecificLocale, select, showHiddenFields, + unpublishSpecificLocale, } = options const globalConfig = payload.globals.config.find((config) => config.slug === globalSlug) @@ -132,5 +137,6 @@ export async function updateGlobalLocal< req: await createLocalReq(options as CreateLocalReqOptions, payload), select, showHiddenFields, + unpublishSpecificLocale: unpublishSpecificLocale!, }) } diff --git a/packages/payload/src/globals/operations/update.ts b/packages/payload/src/globals/operations/update.ts index 3913b7bb011..26153d9d14c 100644 --- a/packages/payload/src/globals/operations/update.ts +++ b/packages/payload/src/globals/operations/update.ts @@ -45,6 +45,7 @@ type Args = { select?: SelectType showHiddenFields?: boolean slug: string + unpublishSpecificLocale?: string } export const updateOperation = async < @@ -57,6 +58,10 @@ export const updateOperation = async < args.req.locale = args.publishSpecificLocale } + if (args.unpublishSpecificLocale) { + args.req.locale = args.unpublishSpecificLocale + } + const { slug, autosave, @@ -72,6 +77,7 @@ export const updateOperation = async < req, select: incomingSelect, showHiddenFields, + unpublishSpecificLocale, } = args try { @@ -218,6 +224,7 @@ export const updateOperation = async < } if (publishSpecificLocale) { + // JESS TODO const latestVersion = await getLatestGlobalVersion({ slug, config: globalConfig, diff --git a/packages/translations/src/clientKeys.ts b/packages/translations/src/clientKeys.ts index af0d632a9e3..4f9212f96b5 100644 --- a/packages/translations/src/clientKeys.ts +++ b/packages/translations/src/clientKeys.ts @@ -431,6 +431,8 @@ export const clientTranslationKeys = createClientTranslationKeys([ 'validation:invalidSelections', 'validation:lessThanMin', 'validation:limitReached', + 'validation:invalidBlock', + 'validation:invalidBlocks', 'validation:longerThanMin', 'validation:notValidDate', 'validation:required', @@ -448,6 +450,7 @@ export const clientTranslationKeys = createClientTranslationKeys([ 'version:aboutToRestoreGlobal', 'version:aboutToRevertToPublished', 'version:aboutToUnpublish', + 'version:aboutToUnpublishIn', 'version:aboutToUnpublishSelection', 'version:autosave', 'version:autosavedSuccessfully', @@ -471,6 +474,7 @@ export const clientTranslationKeys = createClientTranslationKeys([ 'version:lastSavedAgo', 'version:modifiedOnly', 'version:noFurtherVersionsFound', + 'version:noLabelGroup', 'version:noRowsFound', 'version:noRowsSelected', 'version:preview', @@ -489,6 +493,7 @@ export const clientTranslationKeys = createClientTranslationKeys([ 'version:restoreThisVersion', 'version:restoring', 'version:reverting', + 'version:revertUnsuccessful', 'version:revertToPublished', 'version:saveDraft', 'version:scheduledSuccessfully', @@ -500,7 +505,9 @@ export const clientTranslationKeys = createClientTranslationKeys([ 'version:status', 'version:type', 'version:unpublish', + 'version:unpublishIn', 'version:unpublishing', + 'version:unpublishedSuccessfully', 'version:versionID', 'version:version', 'version:versions', diff --git a/packages/translations/src/languages/en.ts b/packages/translations/src/languages/en.ts index ae4122639aa..7126aed2074 100644 --- a/packages/translations/src/languages/en.ts +++ b/packages/translations/src/languages/en.ts @@ -514,6 +514,8 @@ export const enTranslations = { enterNumber: 'Please enter a valid number.', fieldHasNo: 'This field has no {{label}}', greaterThanMax: '{{value}} is greater than the max allowed {{label}} of {{max}}.', + invalidBlock: 'The block "{{block}}" is not allowed.', + invalidBlocks: 'This field contains blocks that are no longer allowed: {{blocks}}.', invalidInput: 'This field has an invalid input.', invalidSelection: 'This field has an invalid selection.', invalidSelections: 'This field has the following invalid selections:', @@ -543,6 +545,7 @@ export const enTranslations = { aboutToRevertToPublished: "You are about to revert this document's changes to its published state. Are you sure?", aboutToUnpublish: 'You are about to unpublish this document. Are you sure?', + aboutToUnpublishIn: 'You are about to unpublish this document in {{locale}}. Are you sure?', aboutToUnpublishSelection: 'You are about to unpublish all {{label}} in the selection. Are you sure?', autosave: 'Autosave', @@ -569,6 +572,7 @@ export const enTranslations = { modifiedOnly: 'Modified only', moreVersions: 'More versions...', noFurtherVersionsFound: 'No further versions found', + noLabelGroup: 'Unnamed Group', noRowsFound: 'No {{label}} found', noRowsSelected: 'No {{label}} selected', preview: 'Preview', @@ -588,6 +592,7 @@ export const enTranslations = { restoring: 'Restoring...', reverting: 'Reverting...', revertToPublished: 'Revert to published', + revertUnsuccessful: 'Revert unsuccessful. No previously published version found.', saveDraft: 'Save Draft', scheduledSuccessfully: 'Scheduled successfully.', schedulePublish: 'Schedule Publish', @@ -598,6 +603,8 @@ export const enTranslations = { specificVersion: 'Specific Version', status: 'Status', unpublish: 'Unpublish', + unpublishedSuccessfully: 'Unpublished successfully.', + unpublishIn: 'Unpublish in {{locale}}', unpublishing: 'Unpublishing...', version: 'Version', versionAgo: '{{distance}} ago', diff --git a/packages/ui/src/elements/DocumentControls/index.tsx b/packages/ui/src/elements/DocumentControls/index.tsx index 08f463263af..4255fa2cb79 100644 --- a/packages/ui/src/elements/DocumentControls/index.tsx +++ b/packages/ui/src/elements/DocumentControls/index.tsx @@ -38,6 +38,7 @@ import { SaveButton } from '../SaveButton/index.js' import './index.scss' import { SaveDraftButton } from '../SaveDraftButton/index.js' import { Status } from '../Status/index.js' +import { UnpublishButton } from '../UnpublishButton/index.js' const baseClass = 'doc-controls' @@ -276,11 +277,12 @@ export const DocumentControls: React.FC<{ {(unsavedDraftWithValidations || !autosaveEnabled || (autosaveEnabled && showSaveDraftButton)) && ( - } - /> - )} + } + /> + )} + } diff --git a/packages/ui/src/elements/PublishButton/index.tsx b/packages/ui/src/elements/PublishButton/index.tsx index d48b701f29a..de5583c5639 100644 --- a/packages/ui/src/elements/PublishButton/index.tsx +++ b/packages/ui/src/elements/PublishButton/index.tsx @@ -186,9 +186,11 @@ export function PublishButton({ label: labelProp }: PublishButtonClientProps) { if (result) { setHasPublishedDoc(true) + setUnpublishedVersionCount(0) + setMostRecentVersionIsAutosaved(false) } }, - [api, collectionSlug, globalSlug, id, serverURL, setHasPublishedDoc, submit, uploadStatus], + [api, collectionSlug, globalSlug, id, serverURL, setHasPublishedDoc, submit, uploadStatus, setUnpublishedVersionCount, setMostRecentVersionIsAutosaved], ) const publishAll = diff --git a/packages/ui/src/elements/UnpublishButton/index.tsx b/packages/ui/src/elements/UnpublishButton/index.tsx new file mode 100644 index 00000000000..163bb736fa9 --- /dev/null +++ b/packages/ui/src/elements/UnpublishButton/index.tsx @@ -0,0 +1,226 @@ +'use client' + +import * as qs from 'qs-esm' +import React, { useCallback, useEffect, useState } from 'react' +import { toast } from 'sonner' + +import { useForm } from '../../forms/Form/context.js' +import { FormSubmit } from '../../forms/Submit/index.js' +import { useHotkey } from '../../hooks/useHotkey.js' +import { useConfig } from '../../providers/Config/index.js' +import { useDocumentInfo } from '../../providers/DocumentInfo/index.js' +import { useEditDepth } from '../../providers/EditDepth/index.js' +import { useLocale } from '../../providers/Locale/index.js' +import { useTranslation } from '../../providers/Translation/index.js' +import { requests } from '../../utilities/api.js' +import { traverseForLocalizedFields } from '../../utilities/traverseForLocalizedFields.js' +import { PopupList } from '../Popup/index.js' + +export function UnpublishButton() { + const { + id, + collectionSlug, + docConfig, + globalSlug, + hasPublishedDoc, + incrementVersionCount, + setHasPublishedDoc, + setMostRecentVersionIsAutosaved, + setUnpublishedVersionCount, + unpublishedVersionCount, + } = useDocumentInfo() + + const { config, getEntityConfig } = useConfig() + const { reset: resetForm } = useForm() + const editDepth = useEditDepth() + const { code: localeCode } = useLocale() + + const { + localization, + routes: { api }, + serverURL, + } = config + + const { i18n, t } = useTranslation() + + const entityConfig = React.useMemo(() => { + if (collectionSlug) { + return getEntityConfig({ collectionSlug }) + } + + if (globalSlug) { + return getEntityConfig({ globalSlug }) + } + }, [collectionSlug, globalSlug, getEntityConfig]) + + + const [hasLocalizedFields, setHasLocalizedFields] = useState(false) + + useEffect(() => { + const hasLocalizedField = traverseForLocalizedFields(entityConfig?.fields) + setHasLocalizedFields(hasLocalizedField) + }, [entityConfig?.fields]) + + + const unpublish = useCallback(async () => { + let url + let method + const body = { + _status: 'draft', + } + if (collectionSlug) { + url = `${serverURL}${api}/${collectionSlug}/${id}?locale=${localeCode}&fallback-locale=null&depth=0` + method = 'patch' + } + + if (globalSlug) { + url = `${serverURL}${api}/globals/${globalSlug}?locale=${localeCode}&fallback-locale=null&depth=0` + method = 'post' + } + + const res = await requests[method](url, { + body: JSON.stringify(body), + headers: { + 'Accept-Language': i18n.language, + 'Content-Type': 'application/json', + }, + }) + + if (res.status === 200) { + let data + const json = await res.json() + + if (globalSlug) { + data = json.result + } else if (collectionSlug) { + data = json.doc + } + + // eslint-disable-next-line @typescript-eslint/no-floating-promises + resetForm(data) + toast.success(json.message) + incrementVersionCount() + setUnpublishedVersionCount(1) + setMostRecentVersionIsAutosaved(false) + setHasPublishedDoc(false) + } else { + try { + const json = await res.json() + if (json.errors?.[0]?.message) { + toast.error(json.errors[0].message) + } else if (json.error) { + toast.error(json.error) + } else { + toast.error(t('error:unPublishingDocument')) + } + } catch (err) { + toast.error(t('error:unPublishingDocument')) + } + } + }, [ + resetForm, + collectionSlug, + globalSlug, + serverURL, + api, + localeCode, + id, + i18n.language, + incrementVersionCount, + setHasPublishedDoc, + setMostRecentVersionIsAutosaved, + setUnpublishedVersionCount, + t, + ]) + + useHotkey({ cmdCtrlKey: true, editDepth, keyCodes: ['s'] }, (e) => { + e.preventDefault() + e.stopPropagation() + + if (unpublish && docConfig.versions?.drafts && docConfig.versions?.drafts?.autosave) { + void unpublish() + } + }) + + const unpublishSpecificLocale = useCallback( + async (locale) => { + let url + let method + const params = qs.stringify({ + unpublishSpecificLocale: locale, + }) + const body = { + _status: 'published', + } + + if (collectionSlug) { + url = `${serverURL}${api}/${collectionSlug}/${id}?locale=${localeCode}&fallback-locale=null&depth=0${params ? '?' + params : ''}` + method = 'patch' + } + + if (globalSlug) { + url = `${serverURL}${api}/globals/${globalSlug}?locale=${localeCode}&fallback-locale=null&depth=0${params ? '?' + params : ''}` + method = 'post' + } + + const result = await requests[method](url, { + body: JSON.stringify(body), + headers: { + 'Accept-Language': i18n.language, + 'Content-Type': 'application/json', + }, + }) + + if (result) { + setHasPublishedDoc(true) + } + }, + [api, collectionSlug, globalSlug, id, serverURL, setHasPublishedDoc, i18n.language, localeCode], + ) + + const canUnpublish = hasPublishedDoc && unpublishedVersionCount === 0 + + const canUnpublishCurrentLocale = hasLocalizedFields && hasPublishedDoc + + const activeLocale = + localization && + localization?.locales.find((locale) => + typeof locale === 'string' ? locale === localeCode : locale.code === localeCode, + ) + + const activeLocaleLabel = + activeLocale && + (typeof activeLocale.label === 'string' + ? activeLocale.label + : (activeLocale.label?.[localeCode] ?? undefined)) + + return ( + + {canUnpublish && + { + return ( + + + Unpublish in {activeLocaleLabel} + + + ) + } + : undefined + } + type="button" + > + Unpublish + + } + + ) +} From b714acb23fc3c5082127c122691c6bbb4366c0fc Mon Sep 17 00:00:00 2001 From: Jessica Chowdhury Date: Wed, 1 Oct 2025 16:38:57 +0100 Subject: [PATCH 02/24] chore: add translations --- packages/translations/src/languages/ar.ts | 4 ++++ packages/translations/src/languages/az.ts | 5 +++++ packages/translations/src/languages/bg.ts | 5 +++++ packages/translations/src/languages/bnBd.ts | 4 ++++ packages/translations/src/languages/bnIn.ts | 5 +++++ packages/translations/src/languages/ca.ts | 4 ++++ packages/translations/src/languages/cs.ts | 5 +++++ packages/translations/src/languages/da.ts | 4 ++++ packages/translations/src/languages/de.ts | 6 ++++++ packages/translations/src/languages/es.ts | 5 +++++ packages/translations/src/languages/et.ts | 4 ++++ packages/translations/src/languages/fa.ts | 4 ++++ packages/translations/src/languages/fr.ts | 6 ++++++ packages/translations/src/languages/he.ts | 4 ++++ packages/translations/src/languages/hr.ts | 5 +++++ packages/translations/src/languages/hu.ts | 5 +++++ packages/translations/src/languages/hy.ts | 4 ++++ packages/translations/src/languages/id.ts | 6 ++++++ packages/translations/src/languages/is.ts | 4 ++++ packages/translations/src/languages/it.ts | 6 ++++++ packages/translations/src/languages/ja.ts | 6 ++++++ packages/translations/src/languages/ko.ts | 4 ++++ packages/translations/src/languages/lt.ts | 4 ++++ packages/translations/src/languages/lv.ts | 5 +++++ packages/translations/src/languages/my.ts | 6 ++++++ packages/translations/src/languages/nb.ts | 5 +++++ packages/translations/src/languages/nl.ts | 5 +++++ packages/translations/src/languages/pl.ts | 5 +++++ packages/translations/src/languages/pt.ts | 5 +++++ packages/translations/src/languages/ro.ts | 5 +++++ packages/translations/src/languages/rs.ts | 5 +++++ packages/translations/src/languages/rsLatin.ts | 4 ++++ packages/translations/src/languages/ru.ts | 4 ++++ packages/translations/src/languages/sk.ts | 5 +++++ packages/translations/src/languages/sl.ts | 5 +++++ packages/translations/src/languages/sv.ts | 4 ++++ packages/translations/src/languages/ta.ts | 6 ++++++ packages/translations/src/languages/th.ts | 4 ++++ packages/translations/src/languages/tr.ts | 4 ++++ packages/translations/src/languages/uk.ts | 5 +++++ packages/translations/src/languages/vi.ts | 6 ++++++ packages/translations/src/languages/zh.ts | 4 ++++ packages/translations/src/languages/zhTw.ts | 4 ++++ 43 files changed, 205 insertions(+) diff --git a/packages/translations/src/languages/ar.ts b/packages/translations/src/languages/ar.ts index 3836edb8f1e..0aee939e919 100644 --- a/packages/translations/src/languages/ar.ts +++ b/packages/translations/src/languages/ar.ts @@ -528,6 +528,7 @@ export const arTranslations: DefaultTranslationsObject = { 'أنت على وشك استرجاع الاعداد العامّ {{label}} إلى الحالة التي كان عليها في {{versionDate}}.', aboutToRevertToPublished: 'أنت على وشك إعادة هذا المستند إلى حالته المنشورة. هل أنت متأكّد؟', aboutToUnpublish: 'أنت على وشك إلغاء نشر هذا المستند. هل أنت متأكّد؟', + aboutToUnpublishIn: 'أنت على وشك إلغاء نشر هذا المستند في {{locale}}. هل أنت متأكد؟', aboutToUnpublishSelection: 'أنت على وشك إلغاء نشر كلّ {{label}} في التّحديد. هل أنت متأكّد؟', autosave: 'حفظ تلقائي', autosavedSuccessfully: 'تمّ الحفظ التّلقائي بنجاح.', @@ -573,6 +574,7 @@ export const arTranslations: DefaultTranslationsObject = { restoring: 'تتمّ الاستعادة...', reverting: 'يتمّ الاسترجاع...', revertToPublished: 'الرّجوع للنسخة المنشورة', + revertUnsuccessful: 'العودة غير ناجحة. لم يتم العثور على نسخة منشورة سابقة.', saveDraft: 'حفظ المسودّة', scheduledSuccessfully: 'تم الجدولة بنجاح.', schedulePublish: 'جدول النشر', @@ -583,6 +585,8 @@ export const arTranslations: DefaultTranslationsObject = { specificVersion: 'الإصدار المحدد', status: 'الحالة', unpublish: 'الغاء النّشر', + unpublishedSuccessfully: 'تم إلغاء النشر بنجاح.', + unpublishIn: 'إلغاء النشر في {{locale}}', unpublishing: 'يتمّ الغاء النّشر...', version: 'النّسخة', versionAgo: 'منذ {{distance}}', diff --git a/packages/translations/src/languages/az.ts b/packages/translations/src/languages/az.ts index c1136be3bc9..0ca0bdbe538 100644 --- a/packages/translations/src/languages/az.ts +++ b/packages/translations/src/languages/az.ts @@ -545,6 +545,8 @@ export const azTranslations: DefaultTranslationsObject = { aboutToRevertToPublished: 'Bu sənədin dəyişikliklərini dərc edilmiş vəziyyətinə qaytarmağa hazırsınız. Əminsiniz?', aboutToUnpublish: 'Bu sənədi dərcdən çıxartmağa hazırsınız. Əminsiniz?', + aboutToUnpublishIn: + 'Siz bu sənədi {{locale}} dildə nəşr etməyi dayandırmaq ətrafında deyilsiniz. Eminsinizmi?', aboutToUnpublishSelection: 'Seçimdə olan bütün {{label}}-i dərcdən çıxartmağa hazırsınız. Əminsiniz?', autosave: 'Avtomatik yadda saxlama', @@ -591,6 +593,7 @@ export const azTranslations: DefaultTranslationsObject = { restoring: 'Bərpa olunur...', reverting: 'Qayıdılır...', revertToPublished: 'Dərc edilmişə qayıt', + revertUnsuccessful: 'Əvvəlki dərc olunmuş versiya tapılmadı. Geri dönmə uğursuz oldu.', saveDraft: 'Qaralamayı yadda saxla', scheduledSuccessfully: 'Uğurla cədvələ qoyuldu.', schedulePublish: 'Nəşr Cədvəli', @@ -601,6 +604,8 @@ export const azTranslations: DefaultTranslationsObject = { specificVersion: 'Xüsusi Versiya', status: 'Status', unpublish: 'Dərcdən çıxart', + unpublishedSuccessfully: 'Uğurla dərc olunmadı.', + unpublishIn: '{{locale}} dilində yayınlanmaması', unpublishing: 'Dərcdən çıxarılır...', version: 'Versiya', versionAgo: '{{distance}} əvvəl', diff --git a/packages/translations/src/languages/bg.ts b/packages/translations/src/languages/bg.ts index 009431d9a35..a6791774bb1 100644 --- a/packages/translations/src/languages/bg.ts +++ b/packages/translations/src/languages/bg.ts @@ -542,6 +542,8 @@ export const bgTranslations: DefaultTranslationsObject = { aboutToRevertToPublished: 'На път си да възстановиш промените на този документ до публикуваното му състояние. Сигурен ли си?', aboutToUnpublish: 'На път си да скриеш този документ. Сигурен ли си?', + aboutToUnpublishIn: + 'Предстои да премахнете публикацията на този документ в {{locale}}. Сигурни ли сте?', aboutToUnpublishSelection: 'На път си да скриеш всички избрани {{label}}. Сигурен ли си?', autosave: 'Автоматично запазване', autosavedSuccessfully: 'Успешно автоматично запазване.', @@ -587,6 +589,7 @@ export const bgTranslations: DefaultTranslationsObject = { restoring: 'Възстановяване...', reverting: 'Връщане..', revertToPublished: 'Върни се до публикуваното', + revertUnsuccessful: 'Неуспешно възстановяване. Не е открита предишна публикувана версия.', saveDraft: 'Запази чернова', scheduledSuccessfully: 'Успешно насрочено.', schedulePublish: 'Планирано публикуване', @@ -597,6 +600,8 @@ export const bgTranslations: DefaultTranslationsObject = { specificVersion: 'Специфична версия', status: 'Статус', unpublish: 'Скрий', + unpublishedSuccessfully: 'Успешно нее публикувано.', + unpublishIn: 'Спиране на публикуване в {{locale}}', unpublishing: 'Скриване...', version: 'Версия', versionAgo: 'преди {{distance}}', diff --git a/packages/translations/src/languages/bnBd.ts b/packages/translations/src/languages/bnBd.ts index 9c17f5c460d..bd72ddfe5a8 100644 --- a/packages/translations/src/languages/bnBd.ts +++ b/packages/translations/src/languages/bnBd.ts @@ -547,6 +547,7 @@ export const bnBdTranslations: DefaultTranslationsObject = { aboutToRevertToPublished: 'আপনি এই ডকুমেন্টের পরিবর্তনগুলি তার প্রকাশিত অবস্থায় ফিরিয়ে আনতে চলেছেন। আপনি কি নিশ্চিত?', aboutToUnpublish: 'আপনি এই ডকুমেন্টটি আনপাবলিশ করতে চলেছেন। আপনি কি নিশ্চিত?', + aboutToUnpublishIn: 'আপনি এই দস্তাবেজটি {{locale}} এ অপ্রকাশিত করতে চলেছেন। আপনি কি নিশ্চিত?', aboutToUnpublishSelection: 'আপনি নির্বাচনে সমস্ত {{label}} আনপাবলিশ করতে চলেছেন। আপনি কি নিশ্চিত?', autosave: 'স্বয়ংক্রিয় সংরক্ষণ', @@ -594,6 +595,7 @@ export const bnBdTranslations: DefaultTranslationsObject = { restoring: 'পুনরুদ্ধার করা হচ্ছে...', reverting: 'পূর্বাবস্থায় ফেরানো হচ্ছে...', revertToPublished: 'প্রকাশিত সংস্করণে ফিরে যান', + revertUnsuccessful: 'পূর্ববর্তী প্রকাশিত সংস্করণ পাওয়া যায় নি। ধরার ওপর ধরা ব্যর্থ হয়েছে।', saveDraft: 'খসড়া সংরক্ষণ করুন', scheduledSuccessfully: 'সফলভাবে নির্ধারিত হয়েছে।', schedulePublish: 'প্রকাশের সময়সূচী নির্ধারণ করুন', @@ -604,6 +606,8 @@ export const bnBdTranslations: DefaultTranslationsObject = { specificVersion: 'নির্দিষ্ট সংস্করণ', status: 'স্থিতি', unpublish: 'প্রকাশ বাতিল করুন', + unpublishedSuccessfully: 'সফলভাবে অপ্রকাশিত হয়েছে।', + unpublishIn: '{{locale}} এ অপ্রকাশিত করুন', unpublishing: 'প্রকাশ বাতিল করা হচ্ছে...', version: 'সংস্করণ', versionAgo: '{{distance}} পূর্বে', diff --git a/packages/translations/src/languages/bnIn.ts b/packages/translations/src/languages/bnIn.ts index 53932927e63..7ba4891140d 100644 --- a/packages/translations/src/languages/bnIn.ts +++ b/packages/translations/src/languages/bnIn.ts @@ -546,6 +546,7 @@ export const bnInTranslations: DefaultTranslationsObject = { aboutToRevertToPublished: 'আপনি এই ডকুমেন্টের পরিবর্তনগুলি তার প্রকাশিত অবস্থায় ফিরিয়ে আনতে চলেছেন। আপনি কি নিশ্চিত?', aboutToUnpublish: 'আপনি এই ডকুমেন্টটি আনপাবলিশ করতে চলেছেন। আপনি কি নিশ্চিত?', + aboutToUnpublishIn: 'আপনি এই দস্তাবেজটি {{locale}} তে অপ্রকাশিত করতে চলেছেন। আপনি কি নিশ্চিত?', aboutToUnpublishSelection: 'আপনি নির্বাচনে সমস্ত {{label}} আনপাবলিশ করতে চলেছেন। আপনি কি নিশ্চিত?', autosave: 'স্বয়ংক্রিয় সংরক্ষণ', @@ -592,6 +593,8 @@ export const bnInTranslations: DefaultTranslationsObject = { restoring: 'পুনরুদ্ধার করা হচ্ছে...', reverting: 'পূর্বাবস্থায় ফেরানো হচ্ছে...', revertToPublished: 'প্রকাশিত সংস্করণে ফিরে যান', + revertUnsuccessful: + 'পূর্বের প্রকাশিত ভার্সন পাওয়া যায়নি, তাই পূর্ববর্তীর অবস্থায় ফেরা যাওয়া সম্ভব হয়নি।', saveDraft: 'খসড়া সংরক্ষণ করুন', scheduledSuccessfully: 'সফলভাবে নির্ধারিত হয়েছে।', schedulePublish: 'প্রকাশের সময়সূচী নির্ধারণ করুন', @@ -602,6 +605,8 @@ export const bnInTranslations: DefaultTranslationsObject = { specificVersion: 'নির্দিষ্ট সংস্করণ', status: 'স্থিতি', unpublish: 'প্রকাশ বাতিল করুন', + unpublishedSuccessfully: 'সফলভাবে অপ্রকাশিত হয়েছে।', + unpublishIn: '{{locale}} এ অপ্রকাশিত করুন', unpublishing: 'প্রকাশ বাতিল করা হচ্ছে...', version: 'সংস্করণ', versionAgo: '{{distance}} পূর্বে', diff --git a/packages/translations/src/languages/ca.ts b/packages/translations/src/languages/ca.ts index 2a52ae5b8d4..af4e04dec08 100644 --- a/packages/translations/src/languages/ca.ts +++ b/packages/translations/src/languages/ca.ts @@ -546,6 +546,7 @@ export const caTranslations: DefaultTranslationsObject = { aboutToRevertToPublished: "Estàs a punt de revertir els canvis d'aquest document a l'estat publicat. Estàs segur?", aboutToUnpublish: 'Estàs a punt de despublicar aquest document. Estàs segur?', + aboutToUnpublishIn: "Estàs a punt de despublicar aquest document a {{locale}}. N'estic segur?", aboutToUnpublishSelection: 'Estàs a punt de despublicar tots els {{label}} de la selecció. Estàs segur?', autosave: 'Desa automàticament', @@ -592,6 +593,7 @@ export const caTranslations: DefaultTranslationsObject = { restoring: 'Restaurant...', reverting: 'Revertint...', revertToPublished: 'Revertir a publicat', + revertUnsuccessful: "Reversió sense èxit. No s'ha trobat cap versió anteriorment publicada.", saveDraft: 'Desar borrador', scheduledSuccessfully: 'Programat amb èxit.', schedulePublish: 'Programar publicació', @@ -602,6 +604,8 @@ export const caTranslations: DefaultTranslationsObject = { specificVersion: 'Versió Específica', status: 'Estat', unpublish: 'Despublicar', + unpublishedSuccessfully: 'No publicat amb èxit.', + unpublishIn: 'Despublicar a {{locale}}', unpublishing: 'Despublicant...', version: 'Versió', versionAgo: 'fa {{distance}}', diff --git a/packages/translations/src/languages/cs.ts b/packages/translations/src/languages/cs.ts index c9ad698b7b1..552b5061ad4 100644 --- a/packages/translations/src/languages/cs.ts +++ b/packages/translations/src/languages/cs.ts @@ -539,6 +539,8 @@ export const csTranslations: DefaultTranslationsObject = { aboutToRevertToPublished: 'Chystáte se vrátit změny tohoto dokumentu do jeho publikovaného stavu. Jste si jisti?', aboutToUnpublish: 'Chystáte se zrušit publikování tohoto dokumentu. Jste si jisti?', + aboutToUnpublishIn: + 'Chystáte se zrušit publikování tohoto dokumentu v {{locale}}. Jste si jisti?', aboutToUnpublishSelection: 'Chystáte se zrušit publikování všech {{label}} ve výběru. Jsi si jistá?', autosave: 'Automatické uložení', @@ -585,6 +587,7 @@ export const csTranslations: DefaultTranslationsObject = { restoring: 'Obnovování...', reverting: 'Vracení...', revertToPublished: 'Vrátit se k publikovanému', + revertUnsuccessful: 'Vrácení neúspěšné. Nebyla nalezena žádná dříve publikovaná verze.', saveDraft: 'Uložit koncept', scheduledSuccessfully: 'Úspěšně naplánováno.', schedulePublish: 'Naplánovat publikaci', @@ -595,6 +598,8 @@ export const csTranslations: DefaultTranslationsObject = { specificVersion: 'Specifická verze', status: 'Stav', unpublish: 'Zrušit publikování', + unpublishedSuccessfully: 'Úspěšně nezveřejněno.', + unpublishIn: 'Zrušit publikování v {{locale}}', unpublishing: 'Zrušuji publikování...', version: 'Verze', versionAgo: 'před {{distance}}', diff --git a/packages/translations/src/languages/da.ts b/packages/translations/src/languages/da.ts index 0f501abe7d9..7aaf6a01b5b 100644 --- a/packages/translations/src/languages/da.ts +++ b/packages/translations/src/languages/da.ts @@ -541,6 +541,7 @@ export const daTranslations: DefaultTranslationsObject = { aboutToRevertToPublished: 'Du er ved at tilbagerulle dette dokuments ændringer til dets offentliggjorte tilstand. Er du sikker?', aboutToUnpublish: 'Du er ved at afpublicere dette dokument. Er du sikker?', + aboutToUnpublishIn: 'Du er ved at afpublicere dette dokument i {{locale}}. Er du sikker?', aboutToUnpublishSelection: 'Du er ved at afpublicere alt {{label}} i denne sektion. Er du sikker?', autosave: 'Autosave', @@ -587,6 +588,7 @@ export const daTranslations: DefaultTranslationsObject = { restoring: 'Gendanner...', reverting: 'Tilbageruller...', revertToPublished: 'Tilbagerul til offentliggjort', + revertUnsuccessful: 'Fortryd mislykkedes. Ingen tidligere offentliggjort version fundet.', saveDraft: 'Gem kladde', scheduledSuccessfully: 'Planlagt med succes.', schedulePublish: 'Planlæg offentliggørelse', @@ -597,6 +599,8 @@ export const daTranslations: DefaultTranslationsObject = { specificVersion: 'Specifik Version', status: 'Status', unpublish: 'Afpublicer', + unpublishedSuccessfully: 'Offentliggjort succesfuldt.', + unpublishIn: 'Afbryd offentliggørelse i {{locale}}', unpublishing: 'Afpublicerer...', version: 'Version', versionAgo: '{{distance}} siden', diff --git a/packages/translations/src/languages/de.ts b/packages/translations/src/languages/de.ts index 7278f0484ae..2704a215e25 100644 --- a/packages/translations/src/languages/de.ts +++ b/packages/translations/src/languages/de.ts @@ -553,6 +553,8 @@ export const deTranslations: DefaultTranslationsObject = { aboutToRevertToPublished: 'Du bist dabei, dieses Dokument auf den Stand des ersten Veröffentlichungsdatums zurückzusetzen. Bist du sicher?', aboutToUnpublish: 'Du bist dabei dieses Dokument auf Entwurf zu setzen. Bist du dir sicher?', + aboutToUnpublishIn: + 'Sie sind dabei, dieses Dokument in {{locale}} zu entveröffentlichen. Sind Sie sicher?', aboutToUnpublishSelection: 'Du bist dabei, die Veröffentlichung aller {{label}} in der Auswahl aufzuheben. Bist du dir sicher?', autosave: 'Automatische Speicherung', @@ -599,6 +601,8 @@ export const deTranslations: DefaultTranslationsObject = { restoring: 'Wiederherstellen...', reverting: 'Zurücksetzen...', revertToPublished: 'Auf veröffentlichte Version zurücksetzen', + revertUnsuccessful: + 'Rückgängig machen fehlgeschlagen. Keine zuvor veröffentlichte Version gefunden.', saveDraft: 'Entwurf speichern', scheduledSuccessfully: 'Erfolgreich geplant.', schedulePublish: 'Veröffentlichungsplan', @@ -609,6 +613,8 @@ export const deTranslations: DefaultTranslationsObject = { specificVersion: 'Spezifische Version', status: 'Status', unpublish: 'Veröffentlichung aufheben', + unpublishedSuccessfully: 'Erfolgreich nicht veröffentlicht.', + unpublishIn: 'Nicht veröffentlichen in {{locale}}', unpublishing: 'Veröffentlichung aufheben...', version: 'Version', versionAgo: 'vor {{distance}}', diff --git a/packages/translations/src/languages/es.ts b/packages/translations/src/languages/es.ts index b247074e981..391d69220af 100644 --- a/packages/translations/src/languages/es.ts +++ b/packages/translations/src/languages/es.ts @@ -548,6 +548,7 @@ export const esTranslations: DefaultTranslationsObject = { aboutToRevertToPublished: 'Estás a punto de revertir los cambios de este documento a su estado publicado. ¿Estás seguro?', aboutToUnpublish: 'Estás a punto de despublicar este documento. ¿Estás seguro?', + aboutToUnpublishIn: 'Está a punto de despublicar este documento en {{locale}}. ¿Está seguro?', aboutToUnpublishSelection: 'Estás a punto de despublicar todos los {{label}} seleccionados. ¿Estás seguro?', autosave: 'Autoguardado', @@ -594,6 +595,8 @@ export const esTranslations: DefaultTranslationsObject = { restoring: 'Restaurando...', reverting: 'Revirtiendo...', revertToPublished: 'Revertir a la versión publicada', + revertUnsuccessful: + 'Reversión no exitosa. No se encontró ninguna versión previamente publicada.', saveDraft: 'Guardar borrador', scheduledSuccessfully: 'Programado con éxito.', schedulePublish: 'Programar publicación', @@ -604,6 +607,8 @@ export const esTranslations: DefaultTranslationsObject = { specificVersion: 'Versión Específica', status: 'Estado', unpublish: 'Despublicar', + unpublishedSuccessfully: 'No publicado con éxito.', + unpublishIn: 'Despublicar en {{locale}}', unpublishing: 'Despublicando...', version: 'Versión', versionAgo: 'hace {{distance}}', diff --git a/packages/translations/src/languages/et.ts b/packages/translations/src/languages/et.ts index c83f5f8df93..bcf0a8b374f 100644 --- a/packages/translations/src/languages/et.ts +++ b/packages/translations/src/languages/et.ts @@ -535,6 +535,7 @@ export const etTranslations: DefaultTranslationsObject = { aboutToRevertToPublished: 'Olete taastamas selle dokumendi muudatusi avaldatud seisundisse. Olete kindel?', aboutToUnpublish: 'Olete tühistamas selle dokumendi avaldamist. Olete kindel?', + aboutToUnpublishIn: 'Te olete katki avaldamas seda dokumenti {{locale}}. Olete kindel?', aboutToUnpublishSelection: 'Olete tühistamas kõigi valitud {{label}} avaldamist. Olete kindel?', autosave: 'Automaatne salvestamine', autosavedSuccessfully: 'Automaatselt salvestatud.', @@ -580,6 +581,7 @@ export const etTranslations: DefaultTranslationsObject = { restoring: 'Taastamine...', reverting: 'Taastamine...', revertToPublished: 'Taasta avaldatud seisund', + revertUnsuccessful: 'Tühistamine ebaõnnestus. Varasemaid avaldatud versioone ei leitud.', saveDraft: 'Salvesta mustand', scheduledSuccessfully: 'Planeeritud edukalt.', schedulePublish: 'Planeeri avaldamine', @@ -590,6 +592,8 @@ export const etTranslations: DefaultTranslationsObject = { specificVersion: 'Spetsiifiline versioon', status: 'Olek', unpublish: 'Tühista avaldamine', + unpublishedSuccessfully: 'Edukalt avaldamata.', + unpublishIn: 'Tühista avaldamine {{locale}}', unpublishing: 'Avaldamise tühistamine...', version: 'Versioon', versionAgo: '{{distance}} tagasi', diff --git a/packages/translations/src/languages/fa.ts b/packages/translations/src/languages/fa.ts index 8d881d4ad54..8b7d5a936fd 100644 --- a/packages/translations/src/languages/fa.ts +++ b/packages/translations/src/languages/fa.ts @@ -537,6 +537,7 @@ export const faTranslations: DefaultTranslationsObject = { aboutToRevertToPublished: 'شما در حال بازگردانی تغییرات این رسانه به وضعیت منتشر شده آن هستید. از این کار اطمینان دارید؟', aboutToUnpublish: 'شما در حال لغو انتشار این سند هستید، آیا از این کار اطمینان دارید؟', + aboutToUnpublishIn: 'شما در حال عدم انتشار این سند در {{locale}} هستید. آیا مطمئنید؟', aboutToUnpublishSelection: 'شما در شرف لغو انتشار {{label}} برگزیده هستید. ایا اطمینان دارید؟', autosave: 'ذخیره خودکار', autosavedSuccessfully: 'با موفقیت ذخیره خودکار شد.', @@ -582,6 +583,7 @@ export const faTranslations: DefaultTranslationsObject = { restoring: 'در حال بازیابی...', reverting: 'در حال بازگردانی...', revertToPublished: 'بازگردانی به انتشار یافته', + revertUnsuccessful: 'بازگشت ناموفق بود. نسخه منتشر شده قبلی یافت نشد.', saveDraft: 'ذخیره پیش‌نویس', scheduledSuccessfully: 'با موفقیت زمانبندی شد.', schedulePublish: 'برنامه انتشار', @@ -592,6 +594,8 @@ export const faTranslations: DefaultTranslationsObject = { specificVersion: 'نسخه مشخص', status: 'وضعیت', unpublish: 'لغو انتشار', + unpublishedSuccessfully: 'با موفقیت منتشر نشد.', + unpublishIn: 'لغو انتشار در {{locale}}', unpublishing: 'در حال لغو انتشار...', version: 'نگارش', versionAgo: '{{distance}} پیش', diff --git a/packages/translations/src/languages/fr.ts b/packages/translations/src/languages/fr.ts index da84806762f..62082d10827 100644 --- a/packages/translations/src/languages/fr.ts +++ b/packages/translations/src/languages/fr.ts @@ -557,6 +557,8 @@ export const frTranslations: DefaultTranslationsObject = { 'Vous êtes sur le point de rétablir les modifications apportées à ce document à la version publiée. Êtes-vous sûr ?', aboutToUnpublish: 'Vous êtes sur le point d’annuler la publication de ce document. Êtes-vous sûr ?', + aboutToUnpublishIn: + 'Vous êtes sur le point de dépublier ce document en {{locale}}. Êtes-vous sûr ?', aboutToUnpublishSelection: 'Vous êtes sur le point de dépublier tous les {{label}} de la sélection. Êtes-vous sûr ?', autosave: 'Enregistrement automatique', @@ -603,6 +605,8 @@ export const frTranslations: DefaultTranslationsObject = { restoring: 'Restauration en cours...', reverting: 'Republication en cours...', revertToPublished: 'Republier', + revertUnsuccessful: + "Échec de la réinitialisation. Aucune version précédemment publiée n'a été trouvée.", saveDraft: 'Enregistrer le brouillon', scheduledSuccessfully: 'Programmé avec succès.', schedulePublish: 'Programmer la publication', @@ -613,6 +617,8 @@ export const frTranslations: DefaultTranslationsObject = { specificVersion: 'Version spécifique', status: 'Statut', unpublish: 'Annuler la publication', + unpublishedSuccessfully: 'Non publié avec succès.', + unpublishIn: 'Dépublier en {{locale}}', unpublishing: 'Annulation en cours...', version: 'Version', versionAgo: 'il y a {{distance}}', diff --git a/packages/translations/src/languages/he.ts b/packages/translations/src/languages/he.ts index 7d866883cb8..65efe92ee35 100644 --- a/packages/translations/src/languages/he.ts +++ b/packages/translations/src/languages/he.ts @@ -524,6 +524,7 @@ export const heTranslations: DefaultTranslationsObject = { 'אתה עומד לשחזר את {{label}} הגלובלי למצב שהיה בו בתאריך {{versionDate}}.', aboutToRevertToPublished: 'אתה עומד להחזיר את השינויים במסמך הזה לגרסה שפורסמה. האם אתה בטוח?', aboutToUnpublish: 'אתה עומד לבטל את הפרסום של מסמך זה. האם אתה בטוח?', + aboutToUnpublishIn: 'אתה עומד לבטל את פרסום מסמך זה ב{{locale}}. האם אתה בטוח?', aboutToUnpublishSelection: 'אתה עומד לבטל את הפרסום של כל ה{{label}} שנבחרו. האם אתה בטוח?', autosave: 'שמירה אוטומטית', autosavedSuccessfully: 'נשמר בהצלחה.', @@ -569,6 +570,7 @@ export const heTranslations: DefaultTranslationsObject = { restoring: 'משחזר...', reverting: 'משחזר...', revertToPublished: 'שחזר לגרסה שפורסמה', + revertUnsuccessful: 'חזרה לא הצליחה. לא נמצאה גרסה שפורסמה בעבר.', saveDraft: 'שמור טיוטה', scheduledSuccessfully: 'תוזמן בהצלחה.', schedulePublish: 'לוח זמנים לפרסום', @@ -579,6 +581,8 @@ export const heTranslations: DefaultTranslationsObject = { specificVersion: 'גרסה מסוימת', status: 'סטטוס', unpublish: 'בטל פרסום', + unpublishedSuccessfully: 'לא פורסם בהצלחה.', + unpublishIn: 'בטל פרסום ב{{locale}}', unpublishing: 'מבטל פרסום...', version: 'גרסה', versionAgo: 'לפני {{distance}}', diff --git a/packages/translations/src/languages/hr.ts b/packages/translations/src/languages/hr.ts index b74c4af9d6f..e21f064f039 100644 --- a/packages/translations/src/languages/hr.ts +++ b/packages/translations/src/languages/hr.ts @@ -539,6 +539,8 @@ export const hrTranslations: DefaultTranslationsObject = { aboutToRevertToPublished: 'Vratit ćete promjene u dokumentu u objavljeno stanje. Jeste li sigurni? ', aboutToUnpublish: 'Poništit ćete objavu ovog dokumenta. Jeste li sigurni?', + aboutToUnpublishIn: + 'Uskoro ćete povući objavljivanje ovog dokumenta na {{locale}}. Jeste li sigurni?', aboutToUnpublishSelection: 'Upravo ćete poništiti objavu svih {{label}} u odabiru. Jeste li sigurni?', autosave: 'Automatsko spremanje', @@ -586,6 +588,7 @@ export const hrTranslations: DefaultTranslationsObject = { restoring: 'Vraćanje...', reverting: 'Vraćanje...', revertToPublished: 'Vrati na objavljeno', + revertUnsuccessful: 'Vraćanje neuspješno. Nije pronađena prethodno objavljena verzija.', saveDraft: 'Sačuvaj nacrt', scheduledSuccessfully: 'Uspješno zakazano.', schedulePublish: 'Raspored objavljivanja', @@ -596,6 +599,8 @@ export const hrTranslations: DefaultTranslationsObject = { specificVersion: 'Specifična verzija', status: 'Status', unpublish: 'Poništi objavu', + unpublishedSuccessfully: 'Uspješno nepobjavljeno.', + unpublishIn: 'Povuci objavljivanje na {{locale}}', unpublishing: 'Poništavanje objave...', version: 'Verzija', versionAgo: 'prije {{distance}}', diff --git a/packages/translations/src/languages/hu.ts b/packages/translations/src/languages/hu.ts index 903502596ac..8364f31f0fb 100644 --- a/packages/translations/src/languages/hu.ts +++ b/packages/translations/src/languages/hu.ts @@ -549,6 +549,8 @@ export const huTranslations: DefaultTranslationsObject = { aboutToRevertToPublished: 'Arra készül, hogy visszaállítsa a dokumentum módosításait a közzétett állapotába. Biztos benne?', aboutToUnpublish: 'A dokumentum közzétételének visszavonására készül. Biztos benne?', + aboutToUnpublishIn: + 'Ön készül visszavonni ennek a dokumentumnak a közzétételét a {{locale}} beállításban. Biztos benne?', aboutToUnpublishSelection: 'Arra készül, hogy visszavonja a kijelölésben szereplő összes {{label}} közzétételét. biztos vagy ebben?', autosave: 'Automatikus mentés', @@ -595,6 +597,7 @@ export const huTranslations: DefaultTranslationsObject = { restoring: 'Visszaállítás...', reverting: 'Visszaállítás...', revertToPublished: 'Visszatérés a közzétetthez', + revertUnsuccessful: 'Visszavonás sikertelen. Nem található korábban publikált verzió.', saveDraft: 'Piszkozat mentése', scheduledSuccessfully: 'Sikeresen ütemezve.', schedulePublish: 'Közzététel ütemezése', @@ -605,6 +608,8 @@ export const huTranslations: DefaultTranslationsObject = { specificVersion: 'Specifikus verzió', status: 'Állapot', unpublish: 'Közzététel visszavonása', + unpublishedSuccessfully: 'Sikeresen visszavonták a közzétételt.', + unpublishIn: 'Vonatkozás {{locale}} nem közzététele', unpublishing: 'Közzététel visszavonása...', version: 'Verzió', versionAgo: '{{distance}} ezelőtt', diff --git a/packages/translations/src/languages/hy.ts b/packages/translations/src/languages/hy.ts index 2f9bce9549b..6872eefa834 100644 --- a/packages/translations/src/languages/hy.ts +++ b/packages/translations/src/languages/hy.ts @@ -550,6 +550,7 @@ export const hyTranslations: DefaultTranslationsObject = { 'Դուք պատրաստվում եք հետ բերել այս փաստաթղթի փոփոխությունները դեպի իր հրապարակված վիճակին։ Համոզվա՞ծ եք։', aboutToUnpublish: 'Դուք պատրաստվում եք այս փաստաթուղթը բերել չհրապարակված վիճակի։ Համոզվա՞ծ եք։', + aboutToUnpublishIn: 'Դուք պատրաստ եք այս փաստաթուղթը չհրատարակել {{locale}}։ Արդյոք վստահ եք:', aboutToUnpublishSelection: 'Դուք պատրաստվում եք ընտրության մեջ գտնվող բոլոր {{label}}-ները բերել չհրապարակված վիճակի։ Համոզվա՞ծ եք։', autosave: 'Ինքնապահպանում', @@ -596,6 +597,7 @@ export const hyTranslations: DefaultTranslationsObject = { restoring: 'Վերականգնվում է...', reverting: 'Հետ է բերվում...', revertToPublished: 'Հետ բերել հրապարակված վիճակին', + revertUnsuccessful: 'Վերադարձը չհաջողվեց: Չի գտնվել նախկինում հրատարակված տարբերակ։', saveDraft: 'Պահպանել սևագիրը', scheduledSuccessfully: 'Հաջողությամբ պլանավորված։', schedulePublish: 'Պլանավորել հրապարակումը', @@ -606,6 +608,8 @@ export const hyTranslations: DefaultTranslationsObject = { specificVersion: 'Մասնավոր Տարբերակ', status: 'Կարգավիճակ', unpublish: 'Բերել չհրապարակված վիճակի։', + unpublishedSuccessfully: 'Չհրատարակված է հաջողությամբ:', + unpublishIn: 'Չհրատարակել {{locale}}', unpublishing: 'Բերվում է չհրապարակված վիճակի...', version: 'Տարբերակ', versionAgo: '{{distance}} առաջ', diff --git a/packages/translations/src/languages/id.ts b/packages/translations/src/languages/id.ts index 0e31622af72..d29eed82ff3 100644 --- a/packages/translations/src/languages/id.ts +++ b/packages/translations/src/languages/id.ts @@ -543,6 +543,8 @@ export const idTranslations: DefaultTranslationsObject = { aboutToRevertToPublished: 'Anda akan mengembalikan perubahan dokumen ini ke keadaan yang dipublikasikan. Apakah Anda yakin?', aboutToUnpublish: 'Anda akan membatalkan publikasi dokumen ini. Apakah Anda yakin?', + aboutToUnpublishIn: + 'Anda akan mencabut publikasi dokumen ini dalam {{locale}}. Apakah Anda yakin?', aboutToUnpublishSelection: 'Anda akan membatalkan publikasi semua {{label}} dalam pilihan. Apakah Anda yakin?', autosave: 'Simpan Otomatis', @@ -589,6 +591,8 @@ export const idTranslations: DefaultTranslationsObject = { restoring: 'Memulihkan...', reverting: 'Mengembalikan...', revertToPublished: 'Kembali ke yang dipublikasikan', + revertUnsuccessful: + 'Pembatalan tidak berhasil. Tidak ditemukan versi yang sebelumnya telah dipublikasikan.', saveDraft: 'Simpan Draf', scheduledSuccessfully: 'Berhasil dijadwalkan.', schedulePublish: 'Jadwalkan Publikasi', @@ -599,6 +603,8 @@ export const idTranslations: DefaultTranslationsObject = { specificVersion: 'Versi Spesifik', status: 'Status', unpublish: 'Batalkan Publikasi', + unpublishedSuccessfully: 'Berhasil tidak diterbitkan.', + unpublishIn: 'Batal publikasi dalam {{locale}}', unpublishing: 'Membatalkan publikasi...', version: 'Versi', versionAgo: '{{distance}} yang lalu', diff --git a/packages/translations/src/languages/is.ts b/packages/translations/src/languages/is.ts index 7ee92561a89..4850a9a245a 100644 --- a/packages/translations/src/languages/is.ts +++ b/packages/translations/src/languages/is.ts @@ -541,6 +541,7 @@ export const isTranslations: DefaultTranslationsObject = { aboutToRevertToPublished: 'Þú ert að fara að snúa breytingum þessa skjals til baka í útgefna ástandið. Ertu viss?', aboutToUnpublish: 'Þú ert að fara að fela þetta skjal. Ertu viss?', + aboutToUnpublishIn: 'Þú ert um það bil að afrita þetta skjal í {{locale}}. Ertu viss?', aboutToUnpublishSelection: 'Þú ert að fara að fela öll {{label}} í valinu. Ertu viss?', autosave: 'Sjálfvirk vistun', autosavedSuccessfully: 'Sjálfvirk vistun tókst.', @@ -586,6 +587,7 @@ export const isTranslations: DefaultTranslationsObject = { restoring: 'Endurheimti...', reverting: 'Sný til baka...', revertToPublished: 'Snúa til baka í útgefið', + revertUnsuccessful: 'Afturköllun mistókst. Engin fyrr um birt útgáfa fundin.', saveDraft: 'Vista drög', scheduledSuccessfully: 'Áætlað.', schedulePublish: 'Áætla útgáfu', @@ -596,6 +598,8 @@ export const isTranslations: DefaultTranslationsObject = { specificVersion: 'Tiltekin útgáfa', status: 'Staða', unpublish: 'Fela', + unpublishedSuccessfully: 'Ekkert birting.', + unpublishIn: 'Afbóka í {{locale}}', unpublishing: 'Fel...', version: 'Útgáfa', versionAgo: '{{distance}} síðan', diff --git a/packages/translations/src/languages/it.ts b/packages/translations/src/languages/it.ts index b0c4121c50f..5fe042d0af0 100644 --- a/packages/translations/src/languages/it.ts +++ b/packages/translations/src/languages/it.ts @@ -547,6 +547,8 @@ export const itTranslations: DefaultTranslationsObject = { aboutToRevertToPublished: 'Stai per ripristinare le modifiche di questo documento al suo stato pubblicato. Sei sicuro?', aboutToUnpublish: 'Stai per annullare la pubblicazione di questo documento. Sei sicuro?', + aboutToUnpublishIn: + 'Stai per annullare la pubblicazione di questo documento in {{locale}}. Sei sicuro?', aboutToUnpublishSelection: 'Stai per annullare la pubblicazione di tutte le {{label}} nella selezione. Sei sicuro?', autosave: 'Salvataggio automatico', @@ -593,6 +595,8 @@ export const itTranslations: DefaultTranslationsObject = { restoring: 'Ripristino...', reverting: 'Ritorno...', revertToPublished: 'Ritorna alla versione pubblicata', + revertUnsuccessful: + 'Ritorno non riuscito. Nessuna versione precedentemente pubblicata trovata.', saveDraft: 'Salva Bozza', scheduledSuccessfully: 'Programmato con successo.', schedulePublish: 'Pubblicazione Programmata', @@ -603,6 +607,8 @@ export const itTranslations: DefaultTranslationsObject = { specificVersion: 'Versione Specifica', status: 'Stato', unpublish: 'Annulla pubblicazione', + unpublishedSuccessfully: 'Pubblicazione annullata con successo.', + unpublishIn: 'Non pubblicare in {{locale}}', unpublishing: 'Annullamento pubblicazione...', version: 'Versione', versionAgo: '{{distance}} fa', diff --git a/packages/translations/src/languages/ja.ts b/packages/translations/src/languages/ja.ts index a71c271f23b..f51731bc868 100644 --- a/packages/translations/src/languages/ja.ts +++ b/packages/translations/src/languages/ja.ts @@ -542,6 +542,8 @@ export const jaTranslations: DefaultTranslationsObject = { aboutToRevertToPublished: 'このデータの変更を公開時の状態に戻そうとしています。よろしいですか?', aboutToUnpublish: 'このデータを非公開にしようとしています。よろしいですか?', + aboutToUnpublishIn: + 'あなたはこのドキュメントを{{locale}}で非公開にする予定です。よろしいですか?', aboutToUnpublishSelection: '選択したすべての{{label}}の公開を取り消そうとしています。よろしいですか?', autosave: '自動保存', @@ -588,6 +590,8 @@ export const jaTranslations: DefaultTranslationsObject = { restoring: '復元しています...', reverting: '内容を戻しています...', revertToPublished: '公開時の内容に戻す', + revertUnsuccessful: + '元に戻す操作に失敗しました。以前に公開されたバージョンが見つかりませんでした。', saveDraft: 'ドラフトを保存', scheduledSuccessfully: '正常にスケジュールされました。', schedulePublish: 'スケジュール公開', @@ -598,6 +602,8 @@ export const jaTranslations: DefaultTranslationsObject = { specificVersion: '特定のバージョン', status: 'ステータス', unpublish: '非公開', + unpublishedSuccessfully: '公開停止が成功しました。', + unpublishIn: '{{locale}}で非公開にする', unpublishing: '非公開中...', version: 'バージョン', versionAgo: '{{distance}}前', diff --git a/packages/translations/src/languages/ko.ts b/packages/translations/src/languages/ko.ts index 750fd868fd9..7131aaf88ff 100644 --- a/packages/translations/src/languages/ko.ts +++ b/packages/translations/src/languages/ko.ts @@ -536,6 +536,7 @@ export const koTranslations: DefaultTranslationsObject = { aboutToRevertToPublished: '이 문서의 변경 사항을 게시된 상태로 되돌리려고 합니다. 계속하시겠습니까?', aboutToUnpublish: '이 문서를 게시 해제하려고 합니다. 계속하시겠습니까?', + aboutToUnpublishIn: '당신은 이 문서를 {{locale}}에서 게시 취소하려고 합니다. 확실합니까?', aboutToUnpublishSelection: '선택한 {{label}}을(를) 게시 해제하려고 합니다. 계속하시겠습니까?', autosave: '자동 저장', autosavedSuccessfully: '자동 저장이 완료되었습니다.', @@ -581,6 +582,7 @@ export const koTranslations: DefaultTranslationsObject = { restoring: '복원 중...', reverting: '되돌리는 중...', revertToPublished: '게시된 상태로 되돌리기', + revertUnsuccessful: '되돌리기 실패. 이전에 발행된 버전을 찾을 수 없습니다.', saveDraft: '초안 저장', scheduledSuccessfully: '성공적으로 예약되었습니다.', schedulePublish: '발행 일정', @@ -591,6 +593,8 @@ export const koTranslations: DefaultTranslationsObject = { specificVersion: '특정 버전', status: '상태', unpublish: '게시 해제', + unpublishedSuccessfully: '성공적으로 비공개되었습니다.', + unpublishIn: '{{locale}}에서 비공개', unpublishing: '게시 해제 중...', version: '버전', versionAgo: '{{distance}} 전', diff --git a/packages/translations/src/languages/lt.ts b/packages/translations/src/languages/lt.ts index 91824191351..85217642ff5 100644 --- a/packages/translations/src/languages/lt.ts +++ b/packages/translations/src/languages/lt.ts @@ -546,6 +546,7 @@ export const ltTranslations: DefaultTranslationsObject = { aboutToRevertToPublished: 'Jūs ketinate atšaukti šio dokumento pakeitimus ir grįžti prie publikuotos versijos. Ar esate įsitikinęs?', aboutToUnpublish: 'Jūs ketinate panaikinti šio dokumento publikavimą. Ar esate tikri?', + aboutToUnpublishIn: 'Jūs ketinate nepublikuoti šio dokumento {{locale}}. Ar jūs įsitikinęs?', aboutToUnpublishSelection: 'Jūs ketinate atšaukti visų {{label}} pasirinkime. Ar esate įsitikinęs?', autosave: 'Automatinis išsaugojimas', @@ -592,6 +593,7 @@ export const ltTranslations: DefaultTranslationsObject = { restoring: 'Atkuriamas...', reverting: 'Grįžtama...', revertToPublished: 'Grįžti prie publikuotojo', + revertUnsuccessful: 'Grąžinimas nepavyko. Ankstesnės publikuotos versijos nerasta.', saveDraft: 'Išsaugoti juodraštį', scheduledSuccessfully: 'Sėkmingai suplanuota.', schedulePublish: 'Suplanuokite publikaciją', @@ -602,6 +604,8 @@ export const ltTranslations: DefaultTranslationsObject = { specificVersion: 'Specifinė versija', status: 'Būsena', unpublish: 'Nebepublikuoti', + unpublishedSuccessfully: 'Sėkmingai nepaskelbta.', + unpublishIn: 'Nepublikuoti {{locale}}', unpublishing: 'Nebepublikuojama...', version: 'Versija', versionAgo: 'prieš {{distance}}', diff --git a/packages/translations/src/languages/lv.ts b/packages/translations/src/languages/lv.ts index 8fbd69266d3..95395219cd9 100644 --- a/packages/translations/src/languages/lv.ts +++ b/packages/translations/src/languages/lv.ts @@ -542,6 +542,8 @@ export const lvTranslations: DefaultTranslationsObject = { aboutToRevertToPublished: 'Jūs grasāties atsaukt šī dokumenta izmaiņas uz publicēto versiju. Vai esat pārliecināts?', aboutToUnpublish: 'Jūs grasāties atcelt šī dokumenta publicēšanu. Vai esat pārliecināts?', + aboutToUnpublishIn: + 'Jūs tūlīt noņemsiet šo dokumentu no publicēšanas {{locale}}. Vai esat pārliecināts?', aboutToUnpublishSelection: 'Jūs grasāties atcelt publicēšanu visiem {{label}} izvēlētajā sarakstā. Vai esat pārliecināts?', autosave: 'Automātiskā saglabāšana', @@ -588,6 +590,7 @@ export const lvTranslations: DefaultTranslationsObject = { restoring: 'Atjauno...', reverting: 'Atgriež...', revertToPublished: 'Atgriezt uz publicēto', + revertUnsuccessful: 'Atcelšana neizdevās. Iepriekš publicēta versija nav atrasta.', saveDraft: 'Saglabāt melnrakstu', scheduledSuccessfully: 'Veiksmīgi ieplānots.', schedulePublish: 'Ieplānot publicēšanu', @@ -598,6 +601,8 @@ export const lvTranslations: DefaultTranslationsObject = { specificVersion: 'Konkrētā versija', status: 'Statuss', unpublish: 'Atcelt publicēšanu', + unpublishedSuccessfully: 'Veiksmīgi nepublicēts.', + unpublishIn: 'Nepublicēt {{locale}}', unpublishing: 'Atceļ publicēšanu...', version: 'Versija', versionAgo: '{{distance}} pirms', diff --git a/packages/translations/src/languages/my.ts b/packages/translations/src/languages/my.ts index 0941d1c730c..cfc0df99f38 100644 --- a/packages/translations/src/languages/my.ts +++ b/packages/translations/src/languages/my.ts @@ -551,6 +551,8 @@ export const myTranslations: DefaultTranslationsObject = { aboutToRevertToPublished: 'သင်သည် အပြောင်းအလဲများကို အများဆိုင် အခြေအနေသို့ ပြန်ပြောင်းပါတော့မည်။ သေချာလား?', aboutToUnpublish: 'အများဆိုင်မှ ပြန်ဖြုတ်တော့မည်။ သေချာလား', + aboutToUnpublishIn: + 'Anda akan membatalkan penerbitan dokumen ini dalam {{locale}}. Adakah anda pasti?', aboutToUnpublishSelection: 'သင်သည် ရွေးချယ်မှုတွင် {{label}} အားလုံးကို ထုတ်ဝေတော့မည် ဖြစ်သည်။ သေချာလား?', autosave: 'အလိုအလျောက်သိမ်းဆည်းပါ။', @@ -597,6 +599,8 @@ export const myTranslations: DefaultTranslationsObject = { restoring: 'ပြန်ယူနေဆဲ...', reverting: 'ပြန်ပြောင်းနေဆဲ...', revertToPublished: 'အများဆိုင်သို့ ပြန်ပြောင်းပါ။', + revertUnsuccessful: + 'Pemulihan tidak berjaya. Tiada versi yang diterbitkan sebelum ini ditemui.', saveDraft: 'မှုကြမ်းကို သိမ်းဆည်းမည်။', scheduledSuccessfully: 'အောင်မြင်စွာ နေ့စွဲထားသည်။', schedulePublish: 'ပြဌာန်းထုတ်ဝေချိန်း', @@ -607,6 +611,8 @@ export const myTranslations: DefaultTranslationsObject = { specificVersion: 'အထူးဗားရှင်း', status: 'အခြေအနေ', unpublish: 'ပြန်ဖြုတ်မည်။', + unpublishedSuccessfully: 'Tidak diterbitkan dengan jayanya.', + unpublishIn: 'Batalkan penerbitan dalam {{locale}}', unpublishing: 'ပြန်ဖြုတ်နေဆဲ ...', version: 'ဗားရှင်း', versionAgo: '{{distance}} ကြာပြီ', diff --git a/packages/translations/src/languages/nb.ts b/packages/translations/src/languages/nb.ts index 9fb5e1472a1..7733ed1a6ae 100644 --- a/packages/translations/src/languages/nb.ts +++ b/packages/translations/src/languages/nb.ts @@ -543,6 +543,8 @@ export const nbTranslations: DefaultTranslationsObject = { aboutToRevertToPublished: 'Du er i ferd med å tilbakestille endringene i dette dokumentet til den publiserte tilstanden. Er du sikker?', aboutToUnpublish: 'Du er i ferd med å avpublisere dette dokumentet. Er du sikker?', + aboutToUnpublishIn: + 'Du er i ferd med å avpublisere dette dokumentet i {{locale}}. Er du sikker?', aboutToUnpublishSelection: 'Du er i ferd med å oppheve publiseringen av alle {{label}} i utvalget. Er du sikker?', autosave: 'Lagre automatisk', @@ -589,6 +591,7 @@ export const nbTranslations: DefaultTranslationsObject = { restoring: 'Gjenoppretter...', reverting: 'Tilbakestiller...', revertToPublished: 'Tilbakestill til publisert', + revertUnsuccessful: 'Tilbakeføring mislykket. Ingen tidligere publisert versjon funnet.', saveDraft: 'Lagre utkast', scheduledSuccessfully: 'Planlegging vellykket.', schedulePublish: 'Planlegg publisering', @@ -599,6 +602,8 @@ export const nbTranslations: DefaultTranslationsObject = { specificVersion: 'Spesifikk versjon', status: 'Status', unpublish: 'Avpubliser', + unpublishedSuccessfully: 'Utgivelse avbrutt vellykket.', + unpublishIn: 'Avpubliser på {{locale}}', unpublishing: 'Avpubliserer...', version: 'Versjon', versionAgo: '{{distance}} siden', diff --git a/packages/translations/src/languages/nl.ts b/packages/translations/src/languages/nl.ts index b2cb1d1f876..8e8a53d47b2 100644 --- a/packages/translations/src/languages/nl.ts +++ b/packages/translations/src/languages/nl.ts @@ -551,6 +551,8 @@ export const nlTranslations: DefaultTranslationsObject = { 'U staat op het punt om de wijzigingen van dit document terug te draaien naar de gepubliceerde staat. Weet u het zeker?', aboutToUnpublish: 'U staat op het punt om de publicatie van dit document ongedaan te maken. Weet u het zeker?', + aboutToUnpublishIn: + 'U staat op het punt dit document in {{locale}} te depubliceren. Weet u het zeker?', aboutToUnpublishSelection: 'You are about to unpublish all {{label}} in the selection. Are you sure?', autosave: 'Automatisch bewaren', @@ -597,6 +599,7 @@ export const nlTranslations: DefaultTranslationsObject = { restoring: 'Herstellen...', reverting: 'Terugdraaien...', revertToPublished: 'Terugdraaien naar gepubliceerde versie', + revertUnsuccessful: 'Herstel mislukt. Geen eerder gepubliceerde versie gevonden.', saveDraft: 'Bewaar concept', scheduledSuccessfully: 'Succesvol gepland.', schedulePublish: 'Publicatie plannen', @@ -607,6 +610,8 @@ export const nlTranslations: DefaultTranslationsObject = { specificVersion: 'Specifieke versie', status: 'Status', unpublish: 'Publicatie ongedaan maken', + unpublishedSuccessfully: 'Met succes niet gepubliceerd.', + unpublishIn: 'Depubliceren in {{locale}}', unpublishing: 'Publicatie ongedaan maken...', version: 'Versie', versionAgo: '{{distance}} geleden', diff --git a/packages/translations/src/languages/pl.ts b/packages/translations/src/languages/pl.ts index 2f6a35efb64..aab532846fb 100644 --- a/packages/translations/src/languages/pl.ts +++ b/packages/translations/src/languages/pl.ts @@ -540,6 +540,8 @@ export const plTranslations: DefaultTranslationsObject = { aboutToRevertToPublished: 'Zamierzasz przywrócić zmiany w tym dokumencie do stanu opublikowanego. Jesteś pewien?', aboutToUnpublish: 'Zamierzasz cofnąć publikację tego dokumentu. Jesteś pewien?', + aboutToUnpublishIn: + 'Zamierzasz wycofać publikację tego dokumentu w {{locale}}. Czy jesteś pewny?', aboutToUnpublishSelection: 'Zamierzasz cofnąć publikację wszystkich {{label}} w zaznaczeniu. Jesteś pewny?', autosave: 'Autozapis', @@ -586,6 +588,7 @@ export const plTranslations: DefaultTranslationsObject = { restoring: 'Przywracanie...', reverting: 'Cofanie...', revertToPublished: 'Przywróć do opublikowanego', + revertUnsuccessful: 'Cofnij nieudane. Nie znaleziono wcześniej opublikowanej wersji.', saveDraft: 'Zapisz szkic', scheduledSuccessfully: 'Zaplanowano pomyślnie.', schedulePublish: 'Zaplanuj publikację', @@ -596,6 +599,8 @@ export const plTranslations: DefaultTranslationsObject = { specificVersion: 'Konkretna Wersja', status: 'Status', unpublish: 'Cofnij publikację', + unpublishedSuccessfully: 'Nieopublikowano pomyślnie.', + unpublishIn: 'Cofnij publikację w {{locale}}', unpublishing: 'Cofanie publikacji...', version: 'Wersja', versionAgo: '{{distance}} temu', diff --git a/packages/translations/src/languages/pt.ts b/packages/translations/src/languages/pt.ts index 5aa78d11b71..bb3cc303dd2 100644 --- a/packages/translations/src/languages/pt.ts +++ b/packages/translations/src/languages/pt.ts @@ -544,6 +544,8 @@ export const ptTranslations: DefaultTranslationsObject = { aboutToRevertToPublished: 'Você está prestes a reverter as alterações desse documento para seu estado de publicação. Tem certeza?', aboutToUnpublish: 'Você está prestes a despublicar esse documento. Tem certeza?', + aboutToUnpublishIn: + 'Você está prestes a retirar a publicação deste documento em {{locale}}. Tem certeza?', aboutToUnpublishSelection: 'Você está prestes a cancelar a publicação de todos os {{label}} na seleção. Tem certeza?', autosave: 'Salvamento automático', @@ -590,6 +592,7 @@ export const ptTranslations: DefaultTranslationsObject = { restoring: 'Restaurando...', reverting: 'Revertendo...', revertToPublished: 'Reverter para publicado', + revertUnsuccessful: 'Reversão sem sucesso. Nenhuma versão publicada anteriormente encontrada.', saveDraft: 'Salvar rascunho', scheduledSuccessfully: 'Agendado com sucesso.', schedulePublish: 'Agendar Publicação', @@ -600,6 +603,8 @@ export const ptTranslations: DefaultTranslationsObject = { specificVersion: 'Versão Específica', status: 'Status', unpublish: 'Despublicar', + unpublishedSuccessfully: 'Não publicado com sucesso.', + unpublishIn: 'Despublicar em {{locale}}', unpublishing: 'Despublicando...', version: 'Versão', versionAgo: 'há {{distance}}', diff --git a/packages/translations/src/languages/ro.ts b/packages/translations/src/languages/ro.ts index 99de2fd2dbf..14cdfd0007f 100644 --- a/packages/translations/src/languages/ro.ts +++ b/packages/translations/src/languages/ro.ts @@ -551,6 +551,8 @@ export const roTranslations: DefaultTranslationsObject = { aboutToRevertToPublished: 'Sunteți pe cale să readuceți modificările aduse acestui document la starea sa publicată. Sunteți sigur?', aboutToUnpublish: 'Sunteți pe cale să nepublicați acest document. Sunteți sigur?', + aboutToUnpublishIn: + 'Sunteți pe cale să anulați publicarea acestui document în {{locale}}. Sunteți sigur?', aboutToUnpublishSelection: 'Sunteți pe punctul de a nepublica toate {{label}} din selecție. Sunteți sigur?', autosave: 'Autosalvare', @@ -597,6 +599,7 @@ export const roTranslations: DefaultTranslationsObject = { restoring: 'Restaurare...', reverting: 'Revenire...', revertToPublished: 'Reveniți la publicat', + revertUnsuccessful: 'Revenire nereușită. Nu a fost găsită nicio versiune publicată anterior.', saveDraft: 'Salvați proiectul', scheduledSuccessfully: 'Programat cu succes.', schedulePublish: 'Programare Publicare', @@ -607,6 +610,8 @@ export const roTranslations: DefaultTranslationsObject = { specificVersion: 'Versiunea specifică', status: 'Status', unpublish: 'Dezpublicare', + unpublishedSuccessfully: 'Publicare anulată cu succes.', + unpublishIn: 'Anulați publicarea în {{locale}}', unpublishing: 'Dezpublicare...', version: 'Versiune', versionAgo: '{{distance}} în urmă', diff --git a/packages/translations/src/languages/rs.ts b/packages/translations/src/languages/rs.ts index aed84d4cbed..c64f54825b2 100644 --- a/packages/translations/src/languages/rs.ts +++ b/packages/translations/src/languages/rs.ts @@ -538,6 +538,8 @@ export const rsTranslations: DefaultTranslationsObject = { aboutToRestoreGlobal: 'Вратићете глобални {{label}} у стање у којем је био {{versionDate}}.', aboutToRevertToPublished: 'Вратићете промене у документу у објављено стање. Да ли сте сигурни?', aboutToUnpublish: 'Поништићете објаву овог документа. Да ли сте сигурни?', + aboutToUnpublishIn: + 'Uskoro ćete da opozovete objavljivanje ovog dokumenta na {{locale}}. Da li ste sigurni?', aboutToUnpublishSelection: 'Управо ћете поништити објаву свих {{label}} у одабиру. Да ли сте сигурни?', autosave: 'Аутоматско чување', @@ -584,6 +586,7 @@ export const rsTranslations: DefaultTranslationsObject = { restoring: 'Враћање...', reverting: 'Враћање...', revertToPublished: 'Врати на објављено', + revertUnsuccessful: 'Povratak neuspešan. Nije pronađena prethodno objavljena verzija.', saveDraft: 'Сачувај нацрт', scheduledSuccessfully: 'Успешно заказано.', schedulePublish: 'Planiranje publikovanja', @@ -594,6 +597,8 @@ export const rsTranslations: DefaultTranslationsObject = { specificVersion: 'Specifična verzija', status: 'Статус', unpublish: 'Поништи објаву', + unpublishedSuccessfully: 'Uspješno povučeno iz objave.', + unpublishIn: 'Otkaži objavljivanje na {{locale}}', unpublishing: 'Поништавање објаве...', version: 'Верзија', versionAgo: 'pre {{distance}}', diff --git a/packages/translations/src/languages/rsLatin.ts b/packages/translations/src/languages/rsLatin.ts index fd2fe176508..d0155db5e43 100644 --- a/packages/translations/src/languages/rsLatin.ts +++ b/packages/translations/src/languages/rsLatin.ts @@ -540,6 +540,7 @@ export const rsLatinTranslations: DefaultTranslationsObject = { aboutToRevertToPublished: 'Vratićete promene u dokumentu u objavljeno stanje. Da li ste sigurni?', aboutToUnpublish: 'Poništićete objavu ovog dokumenta. Da li ste sigurni?', + aboutToUnpublishIn: 'Na korak ste da povučete ovaj dokument u {{locale}}. Da li ste sigurni?', aboutToUnpublishSelection: 'Upravo ćete poništiti objavu svih {{label}} u odabiru. Da li ste sigurni?', autosave: 'Automatsko čuvanje', @@ -586,6 +587,7 @@ export const rsLatinTranslations: DefaultTranslationsObject = { restoring: 'Vraćanje...', reverting: 'Vraćanje...', revertToPublished: 'Vrati na objavljeno', + revertUnsuccessful: 'Povratak nije uspeo. Nije pronađena prethodno objavljena verzija.', saveDraft: 'Sačuvaj nacrt', scheduledSuccessfully: 'Uspešno zakazano.', schedulePublish: 'Zakaži objavljivanje', @@ -596,6 +598,8 @@ export const rsLatinTranslations: DefaultTranslationsObject = { specificVersion: 'Specifična verzija', status: 'Status', unpublish: 'Poništi objavu', + unpublishedSuccessfully: 'Uspešno nepublikovano.', + unpublishIn: 'Otkaži objavljivanje na {{locale}}', unpublishing: 'Poništavanje objave...', version: 'Verzija', versionAgo: 'pre {{distance}}', diff --git a/packages/translations/src/languages/ru.ts b/packages/translations/src/languages/ru.ts index 254333ca680..7178d79f93f 100644 --- a/packages/translations/src/languages/ru.ts +++ b/packages/translations/src/languages/ru.ts @@ -544,6 +544,7 @@ export const ruTranslations: DefaultTranslationsObject = { aboutToRevertToPublished: 'Вы собираетесь вернуть изменения этого документа к его опубликованному состоянию. Вы уверены?', aboutToUnpublish: 'Вы собираетесь отменить публикацию этого документа. Вы уверены?', + aboutToUnpublishIn: 'Вы собираетесь снять с публикации этот документ в {{locale}}. Вы уверены?', aboutToUnpublishSelection: 'Вы собираетесь отменить публикацию всех выбранных {{label}}. Вы уверены?', autosave: 'Автосохранение', @@ -590,6 +591,7 @@ export const ruTranslations: DefaultTranslationsObject = { restoring: 'Восстановление...', reverting: 'Возврат...', revertToPublished: 'Вернуться к опубликованному', + revertUnsuccessful: 'Не удалось отменить. Ранее опубликованная версия не найдена.', saveDraft: 'Сохранить черновик', scheduledSuccessfully: 'Успешно запланировано.', schedulePublish: 'Планирование публикации', @@ -600,6 +602,8 @@ export const ruTranslations: DefaultTranslationsObject = { specificVersion: 'Конкретная версия', status: 'Статус', unpublish: 'Отменить публикацию', + unpublishedSuccessfully: 'Успешно снято с публикации.', + unpublishIn: 'Отменить публикацию на {{locale}}', unpublishing: 'Отмена публикации...', version: 'Версия', versionAgo: '{{distance}} назад', diff --git a/packages/translations/src/languages/sk.ts b/packages/translations/src/languages/sk.ts index 148fa2b6f22..99948f32e66 100644 --- a/packages/translations/src/languages/sk.ts +++ b/packages/translations/src/languages/sk.ts @@ -540,6 +540,8 @@ export const skTranslations: DefaultTranslationsObject = { aboutToRevertToPublished: 'Chystáte sa vrátiť zmeny tohto dokumentu do jeho publikovaného stavu. Ste si istý?', aboutToUnpublish: 'Chystáte sa zrušiť publikovanie tohto dokumentu. Ste si istý?', + aboutToUnpublishIn: + 'Chystáte sa zrušiť publikovanie tohto dokumentu v {{locale}}. Ste si istý?', aboutToUnpublishSelection: 'Chystáte sa zrušiť publikovanie všetkých {{label}} vo výbere. Ste si istý?', autosave: 'Automatické uloženie', @@ -586,6 +588,7 @@ export const skTranslations: DefaultTranslationsObject = { restoring: 'Obnovovanie...', reverting: 'Vracanie...', revertToPublished: 'Vrátiť sa k publikovanému', + revertUnsuccessful: 'Vrátenie neúspešné. Nebola nájdená žiadna predtým publikovaná verzia.', saveDraft: 'Uložiť návrh', scheduledSuccessfully: 'Úspešne naplánované.', schedulePublish: 'Naplánovať publikovanie', @@ -596,6 +599,8 @@ export const skTranslations: DefaultTranslationsObject = { specificVersion: 'Špecifická verzia', status: 'Stav', unpublish: 'Zrušiť publikovanie', + unpublishedSuccessfully: 'Úspešne nezverejnené.', + unpublishIn: 'Zrušiť publikovanie v {{locale}}', unpublishing: 'Zrušujem publikovanie...', version: 'Verzia', versionAgo: 'pred {{distance}}', diff --git a/packages/translations/src/languages/sl.ts b/packages/translations/src/languages/sl.ts index 49895148f20..04fad7349d8 100644 --- a/packages/translations/src/languages/sl.ts +++ b/packages/translations/src/languages/sl.ts @@ -540,6 +540,8 @@ export const slTranslations: DefaultTranslationsObject = { aboutToRevertToPublished: 'Spremembe tega dokumenta boste povrnili v objavljeno stanje. Ste prepričani?', aboutToUnpublish: 'Ta dokument boste umaknili iz objave. Ste prepričani?', + aboutToUnpublishIn: + 'Ravno boste prenehali z objavo tega dokumenta v {{locale}}. Ste prepričani?', aboutToUnpublishSelection: 'Umaknili boste iz objave vse {{label}} v izboru. Ste prepričani?', autosave: 'Samodejno shranjevanje', autosavedSuccessfully: 'Samodejno shranjeno uspešno.', @@ -585,6 +587,7 @@ export const slTranslations: DefaultTranslationsObject = { restoring: 'Obnavljanje...', reverting: 'Razveljavljanje...', revertToPublished: 'Vrni na objavljeno', + revertUnsuccessful: 'Povrnitev ni uspela. Ni najdena nobena prej objavljena različica.', saveDraft: 'Shrani osnutek', scheduledSuccessfully: 'Uspešno načrtovano.', schedulePublish: 'Razporedi objavo', @@ -595,6 +598,8 @@ export const slTranslations: DefaultTranslationsObject = { specificVersion: 'Specifična različica', status: 'Status', unpublish: 'Razveljavi objavo', + unpublishedSuccessfully: 'Uspešno neobjavljeno.', + unpublishIn: 'Prekliči objavo v {{locale}}', unpublishing: 'Razveljavljanje objave...', version: 'Različica', versionAgo: 'pred {{distance}}', diff --git a/packages/translations/src/languages/sv.ts b/packages/translations/src/languages/sv.ts index 13ea0e1bdad..5ebe539ee5d 100644 --- a/packages/translations/src/languages/sv.ts +++ b/packages/translations/src/languages/sv.ts @@ -542,6 +542,7 @@ export const svTranslations: DefaultTranslationsObject = { aboutToRevertToPublished: 'Du kommer återställa det här dokumentets ändringar till dess publicerade tillstånd. Är du säker?', aboutToUnpublish: 'Du kommer avpublicera detta dokument. Är du säker?', + aboutToUnpublishIn: 'Du håller på att avpublicera detta dokument i {{locale}}. Är du säker?', aboutToUnpublishSelection: 'Du är på väg att avpublicera alla {{label}} i urvalet. Är du säker?', autosave: 'Spara automatiskt', @@ -588,6 +589,7 @@ export const svTranslations: DefaultTranslationsObject = { restoring: 'Återställer...', reverting: 'Återställer...', revertToPublished: 'Återgå till publicerad', + revertUnsuccessful: 'Återställning misslyckades. Ingen tidigare publicerad version hittades.', saveDraft: 'Spara Utkast', scheduledSuccessfully: 'Schemalagd', schedulePublish: 'Schemalägg publicering', @@ -598,6 +600,8 @@ export const svTranslations: DefaultTranslationsObject = { specificVersion: 'Specifik version', status: 'Status', unpublish: 'Avpublicera', + unpublishedSuccessfully: 'Ej publicerad framgångsrikt.', + unpublishIn: 'Avpublicera i {{locale}}', unpublishing: 'Avpublicerar...', version: 'Version', versionAgo: '{{distance}} sedan', diff --git a/packages/translations/src/languages/ta.ts b/packages/translations/src/languages/ta.ts index 5a7a76a66bd..88259f930c9 100644 --- a/packages/translations/src/languages/ta.ts +++ b/packages/translations/src/languages/ta.ts @@ -543,6 +543,8 @@ export const taTranslations: DefaultTranslationsObject = { aboutToRevertToPublished: 'இந்த ஆவணத்தின் மாற்றங்களை வெளியிடப்பட்ட நிலைக்கு மாற்றப்போகிறீர்கள். உறுதியா?', aboutToUnpublish: 'இந்த ஆவணத்தை வெளியிடாமல் செய்யப் போகிறீர்கள். உறுதியா?', + aboutToUnpublishIn: + 'நீங்கள் இந்த ஆவணத்தை {{locale}}-இல் வெளியீடு செய்யதேவையாக உள்ளீர்கள். நீங்கள் உறுதியாக உள்ளீர்களா?', aboutToUnpublishSelection: 'நீங்கள் தேர்வில் உள்ள அனைத்து {{label}}-ஐ வெளியிடாமல் செய்யப் போகிறீர்கள். உறுதியா?', autosave: 'தானியங்க சேமிப்பு', @@ -589,6 +591,8 @@ export const taTranslations: DefaultTranslationsObject = { restoring: 'மீட்டமைக்கப்படுகிறது...', reverting: 'மாற்றப்படுகிறது...', revertToPublished: 'வெளியிடப்பட்ட நிலைக்கு மாற்று', + revertUnsuccessful: + 'திரும்பப் பெற முடியவில்லை. முன்னர் வெளியிடப்பட்ட பதிப்புகள் எதுவும் காணப்படவில்லை.', saveDraft: 'வரைவை சேமிக்கவும்', scheduledSuccessfully: 'அட்டவணைப்படுத்தப்பட்டது வெற்றிகரமாக.', schedulePublish: 'வெளியீட்டை அட்டவணைப்படுத்தவும்', @@ -599,6 +603,8 @@ export const taTranslations: DefaultTranslationsObject = { specificVersion: 'குறிப்பிட்ட பதிப்பு', status: 'நிலை', unpublish: 'வெளியீட்டை நீக்கு', + unpublishedSuccessfully: 'வெற்றிகரமாக வெளியீடு நிறுத்தப்பட்டது.', + unpublishIn: '{{locale}} இல் வெளியீட்டை அவிழ்க்க', unpublishing: 'வெளியீடு நீக்கப்படுகிறது...', version: 'பதிப்பு', versionAgo: '{{distance}} முன்பு', diff --git a/packages/translations/src/languages/th.ts b/packages/translations/src/languages/th.ts index 7fe52fa8a6a..ce2bb3d46c5 100644 --- a/packages/translations/src/languages/th.ts +++ b/packages/translations/src/languages/th.ts @@ -530,6 +530,7 @@ export const thTranslations: DefaultTranslationsObject = { aboutToRevertToPublished: 'คุณกำลังจะย้อนการเปลี่ยนแปลงของเอกสารนี้ไปยังเวอร์ชันที่เผยแพร่อยู่ คุณต้องการดำเนินการต่อหรือไม่?', aboutToUnpublish: 'คุณกำลังจะยกเลิกเผยแพร่เอกสารนี้ คุณต้องการดำเนินการต่อหรือไม่?', + aboutToUnpublishIn: 'คุณกำลังจะยกเลิกการเผยแพร่เอกสารนี้ใน {{locale}} คุณแน่ใจไหม?', aboutToUnpublishSelection: 'คุณกำลังจะเลิกเผยแพร่ {{label}} ทั้งหมดในส่วนที่เลือก คุณแน่ใจไหม?', autosave: 'บันทึกอัตโนมัติ', autosavedSuccessfully: 'บันทึกอัตโนมัติสำเร็จ', @@ -576,6 +577,7 @@ export const thTranslations: DefaultTranslationsObject = { restoring: 'กำลังกู้คืน...', reverting: 'กำลังย้อน...', revertToPublished: 'ย้อนกลับไปเวอร์ชันที่เผยแพร่อยู่', + revertUnsuccessful: 'ย้อนกลับไม่สำเร็จ ไม่พบเวอร์ชันที่เผยแพร่ก่อนหน้านี้', saveDraft: 'บันทึกร่าง', scheduledSuccessfully: 'ได้ทำการจัดตารางเรียบร้อยแล้ว', schedulePublish: 'ตั้งเวลาเผยแพร่', @@ -586,6 +588,8 @@ export const thTranslations: DefaultTranslationsObject = { specificVersion: 'เวอร์ชันเฉพาะ', status: 'สถานะ', unpublish: 'หยุดเผยแพร่', + unpublishedSuccessfully: 'ยกเลิกการเผยแพร่เรียบร้อยแล้ว', + unpublishIn: 'ยกเลิกการเผยแพร่ใน {{locale}}', unpublishing: 'กำลังหยุดการเผยแพร่...', version: 'เวอร์ชัน', versionAgo: '{{distance}} ที่แล้ว', diff --git a/packages/translations/src/languages/tr.ts b/packages/translations/src/languages/tr.ts index 8ece021f966..4b5dec4d9b7 100644 --- a/packages/translations/src/languages/tr.ts +++ b/packages/translations/src/languages/tr.ts @@ -545,6 +545,7 @@ export const trTranslations: DefaultTranslationsObject = { aboutToRevertToPublished: 'Bu dökümanın değişikliklerini yayınladığı haline geri getirmek üzeresiniz. Devam etmek istiyor musunuz?', aboutToUnpublish: 'Bu dökümanı yayından kaldırmak üzeresiniz. Devam etmek istiyor musunuz?', + aboutToUnpublishIn: 'Bu belgeyi {{locale}} olarak yayından kaldırmak üzeresiniz. Emin misiniz?', aboutToUnpublishSelection: 'Seçimdeki tüm {{label}} yayınını kaldırmak üzeresiniz. Emin misin?', autosave: 'Otomatik kaydet', autosavedSuccessfully: 'Otomatik kaydetme başarılı', @@ -590,6 +591,7 @@ export const trTranslations: DefaultTranslationsObject = { restoring: 'Geri döndürülüyor...', reverting: 'Değişiklikler geri alınıyor...', revertToPublished: 'Yayınlanana geri döndür', + revertUnsuccessful: 'Geri almada başarısız. Daha önce yayınlanmış bir versiyon bulunamadı.', saveDraft: 'Taslağı kaydet', scheduledSuccessfully: 'Başarıyla planlandı.', schedulePublish: 'Yayını Planla', @@ -600,6 +602,8 @@ export const trTranslations: DefaultTranslationsObject = { specificVersion: 'Belirli Sürüm', status: 'Durum', unpublish: 'Yayından Kaldır', + unpublishedSuccessfully: 'Başarıyla yayınlanmadı.', + unpublishIn: "{{locale}}'da Yayından Kaldır", unpublishing: 'Yayından kaldırılıyor...', version: 'Sürüm', versionAgo: '{{distance}} önce', diff --git a/packages/translations/src/languages/uk.ts b/packages/translations/src/languages/uk.ts index cf5fe3bcb8f..9c71ef558ad 100644 --- a/packages/translations/src/languages/uk.ts +++ b/packages/translations/src/languages/uk.ts @@ -539,6 +539,8 @@ export const ukTranslations: DefaultTranslationsObject = { aboutToRevertToPublished: 'Ви бажаєте повернути зміни цього документа до його опублікованого стану. Ви впевнені?', aboutToUnpublish: 'Ви бажаєте скасувати публікацю цього документа. Ви впевнені?', + aboutToUnpublishIn: + 'Ви збираєтеся скасувати публікацію цього документа в {{locale}}. Ви впевнені?', aboutToUnpublishSelection: 'Ви бажаєте скасувати публікацію всіх {{label}} у вибірці. Ви впевнені?', autosave: 'Автозбереження', @@ -585,6 +587,7 @@ export const ukTranslations: DefaultTranslationsObject = { restoring: 'Відновлення...', reverting: 'Повернення до опублікованого стану...', revertToPublished: 'Повернутися до опублікованого стану', + revertUnsuccessful: 'Відкат невдалий. Не знайдено попередньо опублікованої версії.', saveDraft: 'Зберегти чернетку', scheduledSuccessfully: 'Успішно заплановано.', schedulePublish: 'Розклад публікації', @@ -595,6 +598,8 @@ export const ukTranslations: DefaultTranslationsObject = { specificVersion: 'Специфічна версія', status: 'Статус', unpublish: 'Скасувати публікацію', + unpublishedSuccessfully: 'Успішно скасовано публікацію.', + unpublishIn: 'Скасувати публікацію в {{locale}}', unpublishing: 'Скасування публікації...', version: 'Версія', versionAgo: '{{distance}} тому', diff --git a/packages/translations/src/languages/vi.ts b/packages/translations/src/languages/vi.ts index c31022cfaf7..d5929e49847 100644 --- a/packages/translations/src/languages/vi.ts +++ b/packages/translations/src/languages/vi.ts @@ -538,6 +538,8 @@ export const viTranslations: DefaultTranslationsObject = { 'Bạn chuẩn bị khôi phục lại bản toàn thể (global) của {{label}} về phiên bản {{versionDate}}.', aboutToRevertToPublished: 'Bạn có muốn tái xuất bản bản nháp này không?', aboutToUnpublish: 'Bạn có muốn ngưng xuất bản?', + aboutToUnpublishIn: + 'Bạn đang chuẩn bị hủy xuất bản tài liệu này trong {{locale}}. Bạn có chắc chắn không?', aboutToUnpublishSelection: 'Bạn có muốn ngưng xuất bản tất cả {{label}} không?', autosave: 'Tự động lưu dữ liệu', autosavedSuccessfully: 'Đã tự động lưu thành công.', @@ -583,6 +585,8 @@ export const viTranslations: DefaultTranslationsObject = { restoring: 'Đang khôi phục...', reverting: 'Đang về trạng thái cũ...', revertToPublished: 'Quay về trạng thái đã xuất bản', + revertUnsuccessful: + 'Hoàn tác không thành công. Không tìm thấy phiên bản đã được xuất bản trước đó.', saveDraft: 'Lưu bản nháp', scheduledSuccessfully: 'Đã lên lịch thành công.', schedulePublish: 'Lịch xuất bản', @@ -593,6 +597,8 @@ export const viTranslations: DefaultTranslationsObject = { specificVersion: 'Phiên bản cụ thể', status: 'Trạng thái', unpublish: 'Ẩn tài liệu', + unpublishedSuccessfully: 'Đã hủy xuất bản thành công.', + unpublishIn: 'Hủy công bố trong {{locale}}', unpublishing: 'Đang ẩn tài liệu...', version: 'Phiên bản', versionAgo: '{{distance}} trước', diff --git a/packages/translations/src/languages/zh.ts b/packages/translations/src/languages/zh.ts index 3525f200255..f1763c19961 100644 --- a/packages/translations/src/languages/zh.ts +++ b/packages/translations/src/languages/zh.ts @@ -516,6 +516,7 @@ export const zhTranslations: DefaultTranslationsObject = { aboutToRestoreGlobal: '您要将全局的 {{label}} 恢复到 {{versionDate}} 时的状态', aboutToRevertToPublished: '您将要把这个文档的内容还原到它的发布状态。您确定吗?', aboutToUnpublish: '您即将取消发布这个文档。您确定吗?', + aboutToUnpublishIn: '您正准备取消发布此文档在 {{locale}}。您确定吗?', aboutToUnpublishSelection: '您即将取消发布所选内容中的所有 {{label}}。 您确定吗?', autosave: '自动保存', autosavedSuccessfully: '自动保存成功。', @@ -561,6 +562,7 @@ export const zhTranslations: DefaultTranslationsObject = { restoring: '恢复中...', reverting: '还原中...', revertToPublished: '还原到已发布的版本', + revertUnsuccessful: '撤销失败。未找到以前发布的版本。', saveDraft: '保存草稿', scheduledSuccessfully: '预约发布成功。', schedulePublish: '预约发布', @@ -571,6 +573,8 @@ export const zhTranslations: DefaultTranslationsObject = { specificVersion: '特定版本', status: '状态', unpublish: '取消发布', + unpublishedSuccessfully: '成功取消发布。', + unpublishIn: '在{{locale}}中取消发布', unpublishing: '取消发布中...', version: '版本', versionAgo: '{{distance}} 前', diff --git a/packages/translations/src/languages/zhTw.ts b/packages/translations/src/languages/zhTw.ts index d146f2b8d8a..2519c281436 100644 --- a/packages/translations/src/languages/zhTw.ts +++ b/packages/translations/src/languages/zhTw.ts @@ -514,6 +514,7 @@ export const zhTwTranslations: DefaultTranslationsObject = { aboutToRestoreGlobal: '您即將將全域 {{label}} 還原至 {{versionDate}} 的狀態。', aboutToRevertToPublished: '您即將還原此文件至已發佈狀態。確定要繼續?', aboutToUnpublish: '您即將取消發佈此文件。確定要繼續?', + aboutToUnpublishIn: '您即將在 {{locale}} 中取消發布此文件。你確定嗎?', aboutToUnpublishSelection: '您即將取消發佈所有選取的 {{label}}。確定要繼續?', autosave: '自動儲存', autosavedSuccessfully: '已成功自動儲存。', @@ -559,6 +560,7 @@ export const zhTwTranslations: DefaultTranslationsObject = { restoring: '還原中…', reverting: '還原中…', revertToPublished: '還原至已發佈版本', + revertUnsuccessful: '還原失敗。找不到先前發布的版本。', saveDraft: '儲存草稿', scheduledSuccessfully: '排程成功。', schedulePublish: '排程發佈', @@ -569,6 +571,8 @@ export const zhTwTranslations: DefaultTranslationsObject = { specificVersion: '指定版本', status: '狀態', unpublish: '取消發佈', + unpublishedSuccessfully: '成功取消發佈。', + unpublishIn: '在{{locale}}中取消發布', unpublishing: '取消發佈中…', version: '版本', versionAgo: '{{distance}} 前', From fd4c45238106dd4184dafe2f02a756022f53e5b5 Mon Sep 17 00:00:00 2001 From: Jessica Chowdhury Date: Fri, 3 Oct 2025 12:35:12 +0100 Subject: [PATCH 03/24] chore: finish unpublish specific locale logic --- .../db-mongodb/src/createGlobalVersion.ts | 2 + packages/db-mongodb/src/createVersion.ts | 2 + packages/drizzle/src/createGlobalVersion.ts | 2 + packages/drizzle/src/createVersion.ts | 2 + .../VersionPillLabel/VersionPillLabel.tsx | 15 +- .../Versions/cells/AutosaveCell/index.tsx | 1 + .../src/collections/operations/updateByID.ts | 1 + .../operations/utilities/update.ts | 10 +- packages/payload/src/database/types.ts | 2 + .../payload/src/globals/operations/update.ts | 4 +- .../src/versions/buildCollectionFields.ts | 17 ++ .../payload/src/versions/buildGlobalFields.ts | 17 ++ packages/payload/src/versions/saveVersion.ts | 5 +- packages/payload/src/versions/types.ts | 1 + .../ui/src/elements/UnpublishButton/index.tsx | 225 ++++++++---------- 15 files changed, 179 insertions(+), 127 deletions(-) diff --git a/packages/db-mongodb/src/createGlobalVersion.ts b/packages/db-mongodb/src/createGlobalVersion.ts index c948881b55b..621c9185d8f 100644 --- a/packages/db-mongodb/src/createGlobalVersion.ts +++ b/packages/db-mongodb/src/createGlobalVersion.ts @@ -17,6 +17,7 @@ export const createGlobalVersion: CreateGlobalVersion = async function createGlo req, returning, snapshot, + unpublishedLocale, updatedAt, versionData, }, @@ -36,6 +37,7 @@ export const createGlobalVersion: CreateGlobalVersion = async function createGlo parent, publishedLocale, snapshot, + unpublishedLocale, updatedAt, version: versionData, } diff --git a/packages/db-mongodb/src/createVersion.ts b/packages/db-mongodb/src/createVersion.ts index a6a7b5c2c20..068a630e7d5 100644 --- a/packages/db-mongodb/src/createVersion.ts +++ b/packages/db-mongodb/src/createVersion.ts @@ -17,6 +17,7 @@ export const createVersion: CreateVersion = async function createVersion( req, returning, snapshot, + unpublishedLocale, updatedAt, versionData, }, @@ -40,6 +41,7 @@ export const createVersion: CreateVersion = async function createVersion( parent, publishedLocale, snapshot, + unpublishedLocale, updatedAt, version: versionData, } diff --git a/packages/drizzle/src/createGlobalVersion.ts b/packages/drizzle/src/createGlobalVersion.ts index 1ae54dfcf21..050b9633815 100644 --- a/packages/drizzle/src/createGlobalVersion.ts +++ b/packages/drizzle/src/createGlobalVersion.ts @@ -20,6 +20,7 @@ export async function createGlobalVersion( returning, select, snapshot, + unpublishedLocale, updatedAt, versionData, }: CreateGlobalVersionArgs, @@ -37,6 +38,7 @@ export async function createGlobalVersion( latest: true, publishedLocale, snapshot, + unpublishedLocale, updatedAt, version: versionData, }, diff --git a/packages/drizzle/src/createVersion.ts b/packages/drizzle/src/createVersion.ts index cb756463868..b555fa072ae 100644 --- a/packages/drizzle/src/createVersion.ts +++ b/packages/drizzle/src/createVersion.ts @@ -21,6 +21,7 @@ export async function createVersion( returning, select, snapshot, + unpublishedLocale, updatedAt, versionData, }: CreateVersionArgs, @@ -43,6 +44,7 @@ export async function createVersion( parent, publishedLocale, snapshot, + unpublishedLocale, updatedAt, version, } diff --git a/packages/next/src/views/Version/VersionPillLabel/VersionPillLabel.tsx b/packages/next/src/views/Version/VersionPillLabel/VersionPillLabel.tsx index 45a5cde220e..3179bb0306d 100644 --- a/packages/next/src/views/Version/VersionPillLabel/VersionPillLabel.tsx +++ b/packages/next/src/views/Version/VersionPillLabel/VersionPillLabel.tsx @@ -28,6 +28,7 @@ export const VersionPillLabel: React.FC<{ [key: string]: unknown id: number | string publishedLocale?: string + unpublishedLocale?: string updatedAt?: string version: { [key: string]: unknown @@ -85,10 +86,20 @@ export const VersionPillLabel: React.FC<{ ? formatDate({ date: doc.updatedAt, i18n, pattern: dateFormat }) : null + const unpublishedLocaleCode = Array.isArray(doc.unpublishedLocale) + ? doc.unpublishedLocale[0] + : doc.unpublishedLocale + const unpublishedLocale = + localization && localization?.locales + ? localization.locales.find((loc) => loc.code === unpublishedLocaleCode) + : null + const unpublishedLocaleLabel = unpublishedLocale + ? unpublishedLocale?.label?.[i18n?.language] || unpublishedLocale?.label + : null + const localeCode = Array.isArray(doc.publishedLocale) ? doc.publishedLocale[0] : doc.publishedLocale - const locale = localization && localization?.locales ? localization.locales.find((loc) => loc.code === localeCode) @@ -117,6 +128,8 @@ export const VersionPillLabel: React.FC<{ )} {localeLabel && {localeLabel}} + {/* TODO: add translation */} + {unpublishedLocaleCode && {unpublishedLocaleLabel} Unpublished} ) } diff --git a/packages/next/src/views/Versions/cells/AutosaveCell/index.tsx b/packages/next/src/views/Versions/cells/AutosaveCell/index.tsx index ee18767109c..f1cf3fd05cc 100644 --- a/packages/next/src/views/Versions/cells/AutosaveCell/index.tsx +++ b/packages/next/src/views/Versions/cells/AutosaveCell/index.tsx @@ -20,6 +20,7 @@ type AutosaveCellProps = { autosave?: boolean id: number | string publishedLocale?: string + unpublishedLocale?: string version: { _status: string } diff --git a/packages/payload/src/collections/operations/updateByID.ts b/packages/payload/src/collections/operations/updateByID.ts index 15262722a91..890188656d1 100644 --- a/packages/payload/src/collections/operations/updateByID.ts +++ b/packages/payload/src/collections/operations/updateByID.ts @@ -222,6 +222,7 @@ export const updateByIDOperation = async < req, select: select!, showHiddenFields: showHiddenFields!, + unpublishSpecificLocale, }) await unlinkTempFiles({ diff --git a/packages/payload/src/collections/operations/utilities/update.ts b/packages/payload/src/collections/operations/utilities/update.ts index 0e149a22263..02dcfb13bb9 100644 --- a/packages/payload/src/collections/operations/utilities/update.ts +++ b/packages/payload/src/collections/operations/utilities/update.ts @@ -246,8 +246,7 @@ export const updateDocument = async < Boolean(data?.deletedAt), } - if (publishSpecificLocale) { - // JESS TODO + if (publishSpecificLocale || unpublishSpecificLocale) { versionSnapshotResult = await beforeChange({ ...beforeChangeArgs, docWithLocales, @@ -272,9 +271,16 @@ export const updateDocument = async < let result = await beforeChange({ ...beforeChangeArgs, + data: unpublishSpecificLocale ? { id } : { ...data, id }, docWithLocales: publishedDocWithLocales, }) + if (unpublishSpecificLocale && versionSnapshotResult) { + if (Object.keys(result).length <= 1 && result.id) { + result = versionSnapshotResult + } + } + // ///////////////////////////////////// // Handle potential password update // ///////////////////////////////////// diff --git a/packages/payload/src/database/types.ts b/packages/payload/src/database/types.ts index 1451025145f..a7ce5bda4bf 100644 --- a/packages/payload/src/database/types.ts +++ b/packages/payload/src/database/types.ts @@ -402,6 +402,7 @@ export type CreateVersionArgs = { returning?: boolean select?: SelectType snapshot?: true + unpublishedLocale?: string updatedAt: string versionData: T } @@ -426,6 +427,7 @@ export type CreateGlobalVersionArgs = { returning?: boolean select?: SelectType snapshot?: true + unpublishedLocale?: string updatedAt: string versionData: T } diff --git a/packages/payload/src/globals/operations/update.ts b/packages/payload/src/globals/operations/update.ts index 34c1b1bb2cd..0b19ea06bda 100644 --- a/packages/payload/src/globals/operations/update.ts +++ b/packages/payload/src/globals/operations/update.ts @@ -240,8 +240,7 @@ export const updateOperation = async < shouldSaveDraft && globalConfig.versions.drafts && !globalConfig.versions.drafts.validate, } - if (publishSpecificLocale) { - // JESS TODO + if (publishSpecificLocale || unpublishSpecificLocale) { const latestVersion = await getLatestGlobalVersion({ slug, config: globalConfig, @@ -315,6 +314,7 @@ export const updateOperation = async < req, select, snapshot: versionSnapshotResult, + unpublishSpecificLocale, }) result = { diff --git a/packages/payload/src/versions/buildCollectionFields.ts b/packages/payload/src/versions/buildCollectionFields.ts index 0896591896f..f1dbab11a59 100644 --- a/packages/payload/src/versions/buildCollectionFields.ts +++ b/packages/payload/src/versions/buildCollectionFields.ts @@ -62,6 +62,23 @@ export const buildVersionCollectionFields = ( return locale.code }), }) + + fields.push({ + name: 'unpublishedLocale', + type: 'select', + admin: { + disableBulkEdit: true, + disabled: true, + }, + index: true, + options: config.localization.locales.map((locale) => { + if (typeof locale === 'string') { + return locale + } + + return locale.code + }), + }) } fields.push({ diff --git a/packages/payload/src/versions/buildGlobalFields.ts b/packages/payload/src/versions/buildGlobalFields.ts index 06c1a067cd5..3cae17092d6 100644 --- a/packages/payload/src/versions/buildGlobalFields.ts +++ b/packages/payload/src/versions/buildGlobalFields.ts @@ -56,6 +56,23 @@ export const buildVersionGlobalFields = ( return locale.code }), }) + + fields.push({ + name: 'unpublishedLocale', + type: 'select', + admin: { + disableBulkEdit: true, + disabled: true, + }, + index: true, + options: config.localization.locales.map((locale) => { + if (typeof locale === 'string') { + return locale + } + + return locale.code + }), + }) } fields.push({ diff --git a/packages/payload/src/versions/saveVersion.ts b/packages/payload/src/versions/saveVersion.ts index 24b6feef3e9..8493c348083 100644 --- a/packages/payload/src/versions/saveVersion.ts +++ b/packages/payload/src/versions/saveVersion.ts @@ -22,6 +22,7 @@ type Args = { req?: PayloadRequest select?: SelectType snapshot?: any + unpublishSpecificLocale?: string } export const saveVersion = async ({ @@ -37,6 +38,7 @@ export const saveVersion = async ({ req, select, snapshot, + unpublishSpecificLocale, }: Args): Promise => { let result: TypeWithID | undefined let createNewVersion = true @@ -134,6 +136,7 @@ export const saveVersion = async ({ publishedLocale: publishSpecificLocale || undefined, req, select: getQueryDraftsSelect({ select }), + unpublishedLocale: unpublishSpecificLocale || undefined, updatedAt: now, versionData, } @@ -148,7 +151,7 @@ export const saveVersion = async ({ result = await payload.db.createGlobalVersion(createVersionArgs as CreateGlobalVersionArgs) } - if (publishSpecificLocale && snapshot) { + if ((publishSpecificLocale || unpublishSpecificLocale) && snapshot) { const snapshotData = deepCopyObjectSimple(snapshot) if (snapshotData._id) { delete snapshotData._id diff --git a/packages/payload/src/versions/types.ts b/packages/payload/src/versions/types.ts index efbc4e3c954..d0363c0cbcc 100644 --- a/packages/payload/src/versions/types.ts +++ b/packages/payload/src/versions/types.ts @@ -125,6 +125,7 @@ export type TypeWithVersion = { parent: number | string publishedLocale?: string snapshot?: boolean + unpublishedLocale?: string updatedAt: string version: T } diff --git a/packages/ui/src/elements/UnpublishButton/index.tsx b/packages/ui/src/elements/UnpublishButton/index.tsx index 163bb736fa9..4b4b7b1a534 100644 --- a/packages/ui/src/elements/UnpublishButton/index.tsx +++ b/packages/ui/src/elements/UnpublishButton/index.tsx @@ -20,6 +20,7 @@ export function UnpublishButton() { const { id, collectionSlug, + data: dataFromProps, docConfig, globalSlug, hasPublishedDoc, @@ -27,7 +28,6 @@ export function UnpublishButton() { setHasPublishedDoc, setMostRecentVersionIsAutosaved, setUnpublishedVersionCount, - unpublishedVersionCount, } = useDocumentInfo() const { config, getEntityConfig } = useConfig() @@ -53,7 +53,6 @@ export function UnpublishButton() { } }, [collectionSlug, globalSlug, getEntityConfig]) - const [hasLocalizedFields, setHasLocalizedFields] = useState(false) useEffect(() => { @@ -61,124 +60,103 @@ export function UnpublishButton() { setHasLocalizedFields(hasLocalizedField) }, [entityConfig?.fields]) + const unpublish = useCallback( + (unpublishSpecificLocale?: boolean) => { + ;(async () => { + let url + let method - const unpublish = useCallback(async () => { - let url - let method - const body = { - _status: 'draft', - } - if (collectionSlug) { - url = `${serverURL}${api}/${collectionSlug}/${id}?locale=${localeCode}&fallback-locale=null&depth=0` - method = 'patch' - } + const body = unpublishSpecificLocale ? {} : { _status: 'draft' } + const params = + unpublishSpecificLocale && localeCode ? `&unpublishSpecificLocale=${localeCode}` : '' - if (globalSlug) { - url = `${serverURL}${api}/globals/${globalSlug}?locale=${localeCode}&fallback-locale=null&depth=0` - method = 'post' - } + if (collectionSlug) { + url = `${serverURL}${api}/${collectionSlug}/${id}?locale=${localeCode}&fallback-locale=null&depth=0${params}` + method = 'patch' + } + + if (globalSlug) { + url = `${serverURL}${api}/globals/${globalSlug}?locale=${localeCode}&fallback-locale=null&depth=0${params}` + method = 'post' + } - const res = await requests[method](url, { - body: JSON.stringify(body), - headers: { - 'Accept-Language': i18n.language, - 'Content-Type': 'application/json', - }, - }) - - if (res.status === 200) { - let data - const json = await res.json() - - if (globalSlug) { - data = json.result - } else if (collectionSlug) { - data = json.doc - } - - // eslint-disable-next-line @typescript-eslint/no-floating-promises - resetForm(data) - toast.success(json.message) - incrementVersionCount() - setUnpublishedVersionCount(1) - setMostRecentVersionIsAutosaved(false) - setHasPublishedDoc(false) - } else { - try { - const json = await res.json() - if (json.errors?.[0]?.message) { - toast.error(json.errors[0].message) - } else if (json.error) { - toast.error(json.error) - } else { + try { + const res = await requests[method](url, { + body: JSON.stringify(body), + headers: { + 'Accept-Language': i18n.language, + 'Content-Type': 'application/json', + }, + }) + + if (res.status === 200) { + let data + const json = await res.json() + + if (globalSlug) { + data = json.result + } else if (collectionSlug) { + data = json.doc + } + + void resetForm({ + ...(dataFromProps || {}), + _status: 'draft', + }) + toast.success(json.message) + incrementVersionCount() + setUnpublishedVersionCount(1) + setMostRecentVersionIsAutosaved(false) + setHasPublishedDoc(false) + } else { + try { + const json = await res.json() + if (json.errors?.[0]?.message) { + toast.error(json.errors[0].message) + } else if (json.error) { + toast.error(json.error) + } else { + toast.error(t('error:unPublishingDocument')) + } + } catch { + toast.error(t('error:unPublishingDocument')) + } + } + } catch { toast.error(t('error:unPublishingDocument')) } - } catch (err) { + })().catch(() => { toast.error(t('error:unPublishingDocument')) - } - } - }, [ - resetForm, - collectionSlug, - globalSlug, - serverURL, - api, - localeCode, - id, - i18n.language, - incrementVersionCount, - setHasPublishedDoc, - setMostRecentVersionIsAutosaved, - setUnpublishedVersionCount, - t, - ]) + }) + }, + [ + dataFromProps, + resetForm, + collectionSlug, + globalSlug, + serverURL, + api, + localeCode, + id, + i18n.language, + incrementVersionCount, + setHasPublishedDoc, + setMostRecentVersionIsAutosaved, + setUnpublishedVersionCount, + t, + ], + ) useHotkey({ cmdCtrlKey: true, editDepth, keyCodes: ['s'] }, (e) => { e.preventDefault() e.stopPropagation() if (unpublish && docConfig.versions?.drafts && docConfig.versions?.drafts?.autosave) { - void unpublish() + unpublish(false) } }) - const unpublishSpecificLocale = useCallback( - async (locale) => { - let url - let method - const params = qs.stringify({ - unpublishSpecificLocale: locale, - }) - const body = { - _status: 'published', - } - - if (collectionSlug) { - url = `${serverURL}${api}/${collectionSlug}/${id}?locale=${localeCode}&fallback-locale=null&depth=0${params ? '?' + params : ''}` - method = 'patch' - } - - if (globalSlug) { - url = `${serverURL}${api}/globals/${globalSlug}?locale=${localeCode}&fallback-locale=null&depth=0${params ? '?' + params : ''}` - method = 'post' - } - - const result = await requests[method](url, { - body: JSON.stringify(body), - headers: { - 'Accept-Language': i18n.language, - 'Content-Type': 'application/json', - }, - }) - - if (result) { - setHasPublishedDoc(true) - } - }, - [api, collectionSlug, globalSlug, id, serverURL, setHasPublishedDoc, i18n.language, localeCode], - ) - - const canUnpublish = hasPublishedDoc && unpublishedVersionCount === 0 + const canUnpublish = hasPublishedDoc const canUnpublishCurrentLocale = hasLocalizedFields && hasPublishedDoc @@ -196,31 +174,36 @@ export function UnpublishButton() { return ( - {canUnpublish && + {canUnpublish && ( { + unpublish(false) + }} size="medium" - SubMenuPopupContent={ - canUnpublishCurrentLocale - ? ({ close }) => { - return ( - - - Unpublish in {activeLocaleLabel} - - - ) - } - : undefined - } + SubMenuPopupContent={({ close }) => { + return ( + + { + unpublish(true) + close() + }} + > + {/* TODO: add translation */} + Unpublish in {activeLocaleLabel} + + + ) + }} type="button" > Unpublish - } + )} ) } From e7d90045dcefe57f69dfa291e146041840393b4a Mon Sep 17 00:00:00 2001 From: Jessica Chowdhury Date: Fri, 3 Oct 2025 14:45:26 +0100 Subject: [PATCH 04/24] chore: hide existing unpublish button --- packages/ui/src/elements/Status/index.tsx | 62 +++----------- .../ui/src/elements/UnpublishButton/index.tsx | 80 ++++++++++++------- test/versions/e2e.spec.ts | 2 +- 3 files changed, 64 insertions(+), 80 deletions(-) diff --git a/packages/ui/src/elements/Status/index.tsx b/packages/ui/src/elements/Status/index.tsx index fc59f452bf1..36fbea0dafe 100644 --- a/packages/ui/src/elements/Status/index.tsx +++ b/packages/ui/src/elements/Status/index.tsx @@ -24,7 +24,6 @@ export const Status: React.FC = () => { hasPublishedDoc, incrementVersionCount, isTrashed, - setHasPublishedDoc, setMostRecentVersionIsAutosaved, setUnpublishedVersionCount, unpublishedVersionCount, @@ -43,7 +42,6 @@ export const Status: React.FC = () => { const { code: locale } = useLocale() const { i18n, t } = useTranslation() - const unPublishModalSlug = `confirm-un-publish-${id}` const revertModalSlug = `confirm-revert-${id}` let statusToRender: 'changed' | 'draft' | 'published' @@ -63,16 +61,9 @@ export const Status: React.FC = () => { : statusToRender const performAction = useCallback( - async (action: 'revert' | 'unpublish') => { + async () => { let url let method - let body - - if (action === 'unpublish') { - body = { - _status: 'draft', - } - } if (collectionSlug) { url = `${serverURL}${api}/${collectionSlug}/${id}?locale=${locale}&fallback-locale=null&depth=0` @@ -84,18 +75,16 @@ export const Status: React.FC = () => { method = 'post' } - if (action === 'revert') { - const publishedDoc = await requests - .get(url, { - headers: { - 'Accept-Language': i18n.language, - 'Content-Type': 'application/json', - }, - }) - .then((res) => res.json()) - - body = publishedDoc - } + const publishedDoc = await requests + .get(url, { + headers: { + 'Accept-Language': i18n.language, + 'Content-Type': 'application/json', + }, + }) + .then((res) => res.json()) + + const body = publishedDoc const res = await requests[method](url, { body: JSON.stringify(body), @@ -121,11 +110,7 @@ export const Status: React.FC = () => { incrementVersionCount() setMostRecentVersionIsAutosaved(false) - if (action === 'unpublish') { - setHasPublishedDoc(false) - } else if (action === 'revert') { - setUnpublishedVersionCount(0) - } + setUnpublishedVersionCount(0) } else { try { const json = await res.json() @@ -155,7 +140,6 @@ export const Status: React.FC = () => { setUnpublishedVersionCount, setMostRecentVersionIsAutosaved, t, - setHasPublishedDoc, ], ) @@ -170,26 +154,6 @@ export const Status: React.FC = () => {
{t('version:status')}:  {t(`version:${displayStatusKey}`)} - {!isTrashed && canUpdate && statusToRender === 'published' && ( - -  —  - - performAction('unpublish')} - /> - - )} {!isTrashed && canUpdate && hasPublishedDoc && @@ -209,7 +173,7 @@ export const Status: React.FC = () => { confirmingLabel={t('version:reverting')} heading={t('version:confirmRevertToSaved')} modalSlug={revertModalSlug} - onConfirm={() => performAction('revert')} + onConfirm={() => performAction()} /> )} diff --git a/packages/ui/src/elements/UnpublishButton/index.tsx b/packages/ui/src/elements/UnpublishButton/index.tsx index 4b4b7b1a534..85731d458f8 100644 --- a/packages/ui/src/elements/UnpublishButton/index.tsx +++ b/packages/ui/src/elements/UnpublishButton/index.tsx @@ -1,5 +1,6 @@ 'use client' +import { useModal } from '@faceless-ui/modal' import * as qs from 'qs-esm' import React, { useCallback, useEffect, useState } from 'react' import { toast } from 'sonner' @@ -14,8 +15,8 @@ import { useLocale } from '../../providers/Locale/index.js' import { useTranslation } from '../../providers/Translation/index.js' import { requests } from '../../utilities/api.js' import { traverseForLocalizedFields } from '../../utilities/traverseForLocalizedFields.js' +import { ConfirmationModal } from '../ConfirmationModal/index.js' import { PopupList } from '../Popup/index.js' - export function UnpublishButton() { const { id, @@ -30,10 +31,16 @@ export function UnpublishButton() { setUnpublishedVersionCount, } = useDocumentInfo() + + const { toggleModal } = useModal() + const { config, getEntityConfig } = useConfig() const { reset: resetForm } = useForm() const editDepth = useEditDepth() const { code: localeCode } = useLocale() + const [unpublishSpecificLocale, setUnpublishSpecificLocale] = useState(false) + + const unPublishModalSlug = `confirm-un-publish-${id}` const { localization, @@ -62,7 +69,7 @@ export function UnpublishButton() { const unpublish = useCallback( (unpublishSpecificLocale?: boolean) => { - ;(async () => { + ; (async () => { let url let method @@ -175,34 +182,47 @@ export function UnpublishButton() { return ( {canUnpublish && ( - { - unpublish(false) - }} - size="medium" - SubMenuPopupContent={({ close }) => { - return ( - - { - unpublish(true) - close() - }} - > - {/* TODO: add translation */} - Unpublish in {activeLocaleLabel} - - - ) - }} - type="button" - > - Unpublish - + <> + { + setUnpublishSpecificLocale(false) + + toggleModal(unPublishModalSlug) + }} + size="medium" + SubMenuPopupContent={({ close }) => { + return ( + + { + setUnpublishSpecificLocale(true) + toggleModal(unPublishModalSlug) + close() + }} + > + {/* TODO: add translation */} + Unpublish in {activeLocaleLabel} + + + ) + }} + type="button" + > + Unpublish + + + unpublish(unpublishSpecificLocale)} + /> + )} ) diff --git a/test/versions/e2e.spec.ts b/test/versions/e2e.spec.ts index d669435d27a..5fd711822b2 100644 --- a/test/versions/e2e.spec.ts +++ b/test/versions/e2e.spec.ts @@ -1101,7 +1101,7 @@ describe('Versions', () => { await changeLocale(page, 'en') await textField.fill('english published') - const publishOptions = page.locator('.doc-controls__controls .popup') + const publishOptions = page.locator('#action-save-popup') await publishOptions.click() const publishSpecificLocale = page.locator('#publish-locale') From a563ecc56073a5926d8e96cc2a8fc64afe02ff67 Mon Sep 17 00:00:00 2001 From: Jessica Chowdhury Date: Fri, 3 Oct 2025 15:43:13 +0100 Subject: [PATCH 05/24] chore: add translations --- packages/ui/src/elements/Status/index.tsx | 184 +++++++++--------- .../ui/src/elements/UnpublishButton/index.tsx | 33 ++-- 2 files changed, 101 insertions(+), 116 deletions(-) diff --git a/packages/ui/src/elements/Status/index.tsx b/packages/ui/src/elements/Status/index.tsx index 36fbea0dafe..290ae2a46ee 100644 --- a/packages/ui/src/elements/Status/index.tsx +++ b/packages/ui/src/elements/Status/index.tsx @@ -60,88 +60,85 @@ export const Status: React.FC = () => { : 'previouslyDraft' : statusToRender - const performAction = useCallback( - async () => { - let url - let method - - if (collectionSlug) { - url = `${serverURL}${api}/${collectionSlug}/${id}?locale=${locale}&fallback-locale=null&depth=0` - method = 'patch' - } - - if (globalSlug) { - url = `${serverURL}${api}/globals/${globalSlug}?locale=${locale}&fallback-locale=null&depth=0` - method = 'post' - } - - const publishedDoc = await requests - .get(url, { - headers: { - 'Accept-Language': i18n.language, - 'Content-Type': 'application/json', - }, - }) - .then((res) => res.json()) - - const body = publishedDoc - - const res = await requests[method](url, { - body: JSON.stringify(body), + const performAction = useCallback(async () => { + let url + let method + + if (collectionSlug) { + url = `${serverURL}${api}/${collectionSlug}/${id}?locale=${locale}&fallback-locale=null&depth=0` + method = 'patch' + } + + if (globalSlug) { + url = `${serverURL}${api}/globals/${globalSlug}?locale=${locale}&fallback-locale=null&depth=0` + method = 'post' + } + + const publishedDoc = await requests + .get(url, { headers: { 'Accept-Language': i18n.language, 'Content-Type': 'application/json', }, }) + .then((res) => res.json()) - if (res.status === 200) { - let data - const json = await res.json() + const body = publishedDoc - if (globalSlug) { - data = json.result - } else if (collectionSlug) { - data = json.doc - } + const res = await requests[method](url, { + body: JSON.stringify(body), + headers: { + 'Accept-Language': i18n.language, + 'Content-Type': 'application/json', + }, + }) - // eslint-disable-next-line @typescript-eslint/no-floating-promises - resetForm(data) - toast.success(json.message) - incrementVersionCount() - setMostRecentVersionIsAutosaved(false) - - setUnpublishedVersionCount(0) - } else { - try { - const json = await res.json() - if (json.errors?.[0]?.message) { - toast.error(json.errors[0].message) - } else if (json.error) { - toast.error(json.error) - } else { - toast.error(t('error:unPublishingDocument')) - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - } catch (err) { - toast.error(t('error:unPublishingDocument')) + if (res.status === 200) { + let data + const json = await res.json() + + if (globalSlug) { + data = json.result + } else if (collectionSlug) { + data = json.doc + } + + // eslint-disable-next-line @typescript-eslint/no-floating-promises + resetForm(data) + toast.success(json.message) + incrementVersionCount() + setMostRecentVersionIsAutosaved(false) + + setUnpublishedVersionCount(0) + } else { + try { + const json = await res.json() + if (json.errors?.[0]?.message) { + toast.error(json.errors[0].message) + } else if (json.error) { + toast.error(json.error) + } else { + toast.error(t('version:revertUnsuccessful')) } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + } catch (err) { + toast.error(t('version:revertUnsuccessful')) } - }, - [ - api, - collectionSlug, - globalSlug, - id, - i18n.language, - incrementVersionCount, - locale, - resetForm, - serverURL, - setUnpublishedVersionCount, - setMostRecentVersionIsAutosaved, - t, - ], - ) + } + }, [ + api, + collectionSlug, + globalSlug, + id, + i18n.language, + incrementVersionCount, + locale, + resetForm, + serverURL, + setUnpublishedVersionCount, + setMostRecentVersionIsAutosaved, + t, + ]) const canUpdate = docPermissions?.update @@ -154,29 +151,26 @@ export const Status: React.FC = () => {
{t('version:status')}:  {t(`version:${displayStatusKey}`)} - {!isTrashed && - canUpdate && - hasPublishedDoc && - statusToRender === 'changed' && ( - -  —  - - performAction()} - /> - - )} + {!isTrashed && canUpdate && hasPublishedDoc && statusToRender === 'changed' && ( + +  —  + + performAction()} + /> + + )}
) diff --git a/packages/ui/src/elements/UnpublishButton/index.tsx b/packages/ui/src/elements/UnpublishButton/index.tsx index 85731d458f8..3cb52c86db1 100644 --- a/packages/ui/src/elements/UnpublishButton/index.tsx +++ b/packages/ui/src/elements/UnpublishButton/index.tsx @@ -30,8 +30,6 @@ export function UnpublishButton() { setMostRecentVersionIsAutosaved, setUnpublishedVersionCount, } = useDocumentInfo() - - const { toggleModal } = useModal() const { config, getEntityConfig } = useConfig() @@ -69,7 +67,7 @@ export function UnpublishButton() { const unpublish = useCallback( (unpublishSpecificLocale?: boolean) => { - ; (async () => { + ;(async () => { let url let method @@ -97,20 +95,12 @@ export function UnpublishButton() { }) if (res.status === 200) { - let data - const json = await res.json() - - if (globalSlug) { - data = json.result - } else if (collectionSlug) { - data = json.doc - } - void resetForm({ ...(dataFromProps || {}), _status: 'draft', }) - toast.success(json.message) + + toast.success(t('version:unpublishedSuccessfully')) incrementVersionCount() setUnpublishedVersionCount(1) setMostRecentVersionIsAutosaved(false) @@ -165,7 +155,7 @@ export function UnpublishButton() { const canUnpublish = hasPublishedDoc - const canUnpublishCurrentLocale = hasLocalizedFields && hasPublishedDoc + const canUnpublishCurrentLocale = hasLocalizedFields && canUnpublish const activeLocale = localization && @@ -189,7 +179,6 @@ export function UnpublishButton() { enableSubMenu={canUnpublishCurrentLocale} onClick={() => { setUnpublishSpecificLocale(false) - toggleModal(unPublishModalSlug) }} size="medium" @@ -204,23 +193,25 @@ export function UnpublishButton() { close() }} > - {/* TODO: add translation */} - Unpublish in {activeLocaleLabel} + {t('version:unpublishIn', { locale: activeLocaleLabel })} ) }} type="button" > - Unpublish + {t('version:unpublish')} - unpublish(unpublishSpecificLocale)} + onConfirm={() => unpublish(unpublishSpecificLocale)} /> )} From 5441e28f151d081fd9431ab8a71cce932189c508 Mon Sep 17 00:00:00 2001 From: Jessica Chowdhury Date: Fri, 3 Oct 2025 17:05:11 +0100 Subject: [PATCH 06/24] chore: fix globals and clean up --- .../VersionPillLabel/VersionPillLabel.tsx | 32 +++++++------------ .../payload/src/globals/operations/update.ts | 7 ++++ packages/translations/src/clientKeys.ts | 1 + packages/translations/src/languages/ar.ts | 1 + packages/translations/src/languages/az.ts | 1 + packages/translations/src/languages/bg.ts | 1 + packages/translations/src/languages/bnBd.ts | 1 + packages/translations/src/languages/bnIn.ts | 1 + packages/translations/src/languages/ca.ts | 1 + packages/translations/src/languages/cs.ts | 1 + packages/translations/src/languages/da.ts | 1 + packages/translations/src/languages/de.ts | 1 + packages/translations/src/languages/en.ts | 1 + packages/translations/src/languages/es.ts | 1 + packages/translations/src/languages/et.ts | 1 + packages/translations/src/languages/fa.ts | 1 + packages/translations/src/languages/fr.ts | 1 + packages/translations/src/languages/he.ts | 1 + packages/translations/src/languages/hr.ts | 1 + packages/translations/src/languages/hu.ts | 1 + packages/translations/src/languages/hy.ts | 1 + packages/translations/src/languages/id.ts | 1 + packages/translations/src/languages/is.ts | 1 + packages/translations/src/languages/it.ts | 1 + packages/translations/src/languages/ja.ts | 1 + packages/translations/src/languages/ko.ts | 1 + packages/translations/src/languages/lt.ts | 1 + packages/translations/src/languages/lv.ts | 1 + packages/translations/src/languages/my.ts | 1 + packages/translations/src/languages/nb.ts | 1 + packages/translations/src/languages/nl.ts | 1 + packages/translations/src/languages/pl.ts | 1 + packages/translations/src/languages/pt.ts | 1 + packages/translations/src/languages/ro.ts | 1 + packages/translations/src/languages/rs.ts | 1 + .../translations/src/languages/rsLatin.ts | 1 + packages/translations/src/languages/ru.ts | 1 + packages/translations/src/languages/sk.ts | 1 + packages/translations/src/languages/sl.ts | 1 + packages/translations/src/languages/sv.ts | 1 + packages/translations/src/languages/ta.ts | 1 + packages/translations/src/languages/th.ts | 1 + packages/translations/src/languages/tr.ts | 1 + packages/translations/src/languages/uk.ts | 1 + packages/translations/src/languages/vi.ts | 1 + packages/translations/src/languages/zh.ts | 1 + packages/translations/src/languages/zhTw.ts | 1 + 47 files changed, 64 insertions(+), 20 deletions(-) diff --git a/packages/next/src/views/Version/VersionPillLabel/VersionPillLabel.tsx b/packages/next/src/views/Version/VersionPillLabel/VersionPillLabel.tsx index 3179bb0306d..4e0190bedae 100644 --- a/packages/next/src/views/Version/VersionPillLabel/VersionPillLabel.tsx +++ b/packages/next/src/views/Version/VersionPillLabel/VersionPillLabel.tsx @@ -86,25 +86,14 @@ export const VersionPillLabel: React.FC<{ ? formatDate({ date: doc.updatedAt, i18n, pattern: dateFormat }) : null - const unpublishedLocaleCode = Array.isArray(doc.unpublishedLocale) - ? doc.unpublishedLocale[0] - : doc.unpublishedLocale - const unpublishedLocale = - localization && localization?.locales - ? localization.locales.find((loc) => loc.code === unpublishedLocaleCode) - : null - const unpublishedLocaleLabel = unpublishedLocale - ? unpublishedLocale?.label?.[i18n?.language] || unpublishedLocale?.label - : null + const getLocaleLabel = (input) => { + const code = Array.isArray(input) ? input[0] : input + const loc = localization?.locales?.find((l) => l.code === code) + return loc?.label?.[i18n?.language] || loc?.label || null + } - const localeCode = Array.isArray(doc.publishedLocale) - ? doc.publishedLocale[0] - : doc.publishedLocale - const locale = - localization && localization?.locales - ? localization.locales.find((loc) => loc.code === localeCode) - : null - const localeLabel = locale ? locale?.label?.[i18n?.language] || locale?.label : null + const unpublishedLocaleLabel = getLocaleLabel(doc.unpublishedLocale) + const localeLabel = getLocaleLabel(doc.publishedLocale) return (
@@ -128,8 +117,11 @@ export const VersionPillLabel: React.FC<{ )} {localeLabel && {localeLabel}} - {/* TODO: add translation */} - {unpublishedLocaleCode && {unpublishedLocaleLabel} Unpublished} + {unpublishedLocaleLabel && ( + + {unpublishedLocaleLabel} {t('version:unpublished')} + + )}
) } diff --git a/packages/payload/src/globals/operations/update.ts b/packages/payload/src/globals/operations/update.ts index 0b19ea06bda..1a914d4b209 100644 --- a/packages/payload/src/globals/operations/update.ts +++ b/packages/payload/src/globals/operations/update.ts @@ -260,9 +260,16 @@ export const updateOperation = async < let result = await beforeChange({ ...beforeChangeArgs, + data: unpublishSpecificLocale ? {} : data, docWithLocales: publishedDocWithLocales, }) + if (unpublishSpecificLocale && versionSnapshotResult) { + if (Object.keys(result).length === 0) { + result = versionSnapshotResult + } + } + // ///////////////////////////////////// // Update // ///////////////////////////////////// diff --git a/packages/translations/src/clientKeys.ts b/packages/translations/src/clientKeys.ts index 4f9212f96b5..324d865f86d 100644 --- a/packages/translations/src/clientKeys.ts +++ b/packages/translations/src/clientKeys.ts @@ -505,6 +505,7 @@ export const clientTranslationKeys = createClientTranslationKeys([ 'version:status', 'version:type', 'version:unpublish', + 'version:unpublished', 'version:unpublishIn', 'version:unpublishing', 'version:unpublishedSuccessfully', diff --git a/packages/translations/src/languages/ar.ts b/packages/translations/src/languages/ar.ts index 0aee939e919..cefccacbaa5 100644 --- a/packages/translations/src/languages/ar.ts +++ b/packages/translations/src/languages/ar.ts @@ -585,6 +585,7 @@ export const arTranslations: DefaultTranslationsObject = { specificVersion: 'الإصدار المحدد', status: 'الحالة', unpublish: 'الغاء النّشر', + unpublished: 'غير منشور', unpublishedSuccessfully: 'تم إلغاء النشر بنجاح.', unpublishIn: 'إلغاء النشر في {{locale}}', unpublishing: 'يتمّ الغاء النّشر...', diff --git a/packages/translations/src/languages/az.ts b/packages/translations/src/languages/az.ts index 0ca0bdbe538..7272ad9e31d 100644 --- a/packages/translations/src/languages/az.ts +++ b/packages/translations/src/languages/az.ts @@ -604,6 +604,7 @@ export const azTranslations: DefaultTranslationsObject = { specificVersion: 'Xüsusi Versiya', status: 'Status', unpublish: 'Dərcdən çıxart', + unpublished: 'Nəşr olunmamış', unpublishedSuccessfully: 'Uğurla dərc olunmadı.', unpublishIn: '{{locale}} dilində yayınlanmaması', unpublishing: 'Dərcdən çıxarılır...', diff --git a/packages/translations/src/languages/bg.ts b/packages/translations/src/languages/bg.ts index a6791774bb1..ffa43b18508 100644 --- a/packages/translations/src/languages/bg.ts +++ b/packages/translations/src/languages/bg.ts @@ -600,6 +600,7 @@ export const bgTranslations: DefaultTranslationsObject = { specificVersion: 'Специфична версия', status: 'Статус', unpublish: 'Скрий', + unpublished: 'Непубликуван', unpublishedSuccessfully: 'Успешно нее публикувано.', unpublishIn: 'Спиране на публикуване в {{locale}}', unpublishing: 'Скриване...', diff --git a/packages/translations/src/languages/bnBd.ts b/packages/translations/src/languages/bnBd.ts index bd72ddfe5a8..060bc2e5852 100644 --- a/packages/translations/src/languages/bnBd.ts +++ b/packages/translations/src/languages/bnBd.ts @@ -606,6 +606,7 @@ export const bnBdTranslations: DefaultTranslationsObject = { specificVersion: 'নির্দিষ্ট সংস্করণ', status: 'স্থিতি', unpublish: 'প্রকাশ বাতিল করুন', + unpublished: 'অপ্রকাশিত', unpublishedSuccessfully: 'সফলভাবে অপ্রকাশিত হয়েছে।', unpublishIn: '{{locale}} এ অপ্রকাশিত করুন', unpublishing: 'প্রকাশ বাতিল করা হচ্ছে...', diff --git a/packages/translations/src/languages/bnIn.ts b/packages/translations/src/languages/bnIn.ts index 7ba4891140d..b8bc3184994 100644 --- a/packages/translations/src/languages/bnIn.ts +++ b/packages/translations/src/languages/bnIn.ts @@ -605,6 +605,7 @@ export const bnInTranslations: DefaultTranslationsObject = { specificVersion: 'নির্দিষ্ট সংস্করণ', status: 'স্থিতি', unpublish: 'প্রকাশ বাতিল করুন', + unpublished: 'অপ্রকাশিত', unpublishedSuccessfully: 'সফলভাবে অপ্রকাশিত হয়েছে।', unpublishIn: '{{locale}} এ অপ্রকাশিত করুন', unpublishing: 'প্রকাশ বাতিল করা হচ্ছে...', diff --git a/packages/translations/src/languages/ca.ts b/packages/translations/src/languages/ca.ts index af4e04dec08..f9b609c41f1 100644 --- a/packages/translations/src/languages/ca.ts +++ b/packages/translations/src/languages/ca.ts @@ -604,6 +604,7 @@ export const caTranslations: DefaultTranslationsObject = { specificVersion: 'Versió Específica', status: 'Estat', unpublish: 'Despublicar', + unpublished: 'Inèdit', unpublishedSuccessfully: 'No publicat amb èxit.', unpublishIn: 'Despublicar a {{locale}}', unpublishing: 'Despublicant...', diff --git a/packages/translations/src/languages/cs.ts b/packages/translations/src/languages/cs.ts index 552b5061ad4..264984bf5ba 100644 --- a/packages/translations/src/languages/cs.ts +++ b/packages/translations/src/languages/cs.ts @@ -598,6 +598,7 @@ export const csTranslations: DefaultTranslationsObject = { specificVersion: 'Specifická verze', status: 'Stav', unpublish: 'Zrušit publikování', + unpublished: 'Nezveřejněno', unpublishedSuccessfully: 'Úspěšně nezveřejněno.', unpublishIn: 'Zrušit publikování v {{locale}}', unpublishing: 'Zrušuji publikování...', diff --git a/packages/translations/src/languages/da.ts b/packages/translations/src/languages/da.ts index 7aaf6a01b5b..4e1baed5da5 100644 --- a/packages/translations/src/languages/da.ts +++ b/packages/translations/src/languages/da.ts @@ -599,6 +599,7 @@ export const daTranslations: DefaultTranslationsObject = { specificVersion: 'Specifik Version', status: 'Status', unpublish: 'Afpublicer', + unpublished: 'Upubliceret', unpublishedSuccessfully: 'Offentliggjort succesfuldt.', unpublishIn: 'Afbryd offentliggørelse i {{locale}}', unpublishing: 'Afpublicerer...', diff --git a/packages/translations/src/languages/de.ts b/packages/translations/src/languages/de.ts index 2704a215e25..5c553fbcf23 100644 --- a/packages/translations/src/languages/de.ts +++ b/packages/translations/src/languages/de.ts @@ -613,6 +613,7 @@ export const deTranslations: DefaultTranslationsObject = { specificVersion: 'Spezifische Version', status: 'Status', unpublish: 'Veröffentlichung aufheben', + unpublished: 'Unveröffentlicht', unpublishedSuccessfully: 'Erfolgreich nicht veröffentlicht.', unpublishIn: 'Nicht veröffentlichen in {{locale}}', unpublishing: 'Veröffentlichung aufheben...', diff --git a/packages/translations/src/languages/en.ts b/packages/translations/src/languages/en.ts index 7126aed2074..0b7914e9f70 100644 --- a/packages/translations/src/languages/en.ts +++ b/packages/translations/src/languages/en.ts @@ -603,6 +603,7 @@ export const enTranslations = { specificVersion: 'Specific Version', status: 'Status', unpublish: 'Unpublish', + unpublished: 'Unpublished', unpublishedSuccessfully: 'Unpublished successfully.', unpublishIn: 'Unpublish in {{locale}}', unpublishing: 'Unpublishing...', diff --git a/packages/translations/src/languages/es.ts b/packages/translations/src/languages/es.ts index 391d69220af..f3a1273269f 100644 --- a/packages/translations/src/languages/es.ts +++ b/packages/translations/src/languages/es.ts @@ -607,6 +607,7 @@ export const esTranslations: DefaultTranslationsObject = { specificVersion: 'Versión Específica', status: 'Estado', unpublish: 'Despublicar', + unpublished: 'No publicado', unpublishedSuccessfully: 'No publicado con éxito.', unpublishIn: 'Despublicar en {{locale}}', unpublishing: 'Despublicando...', diff --git a/packages/translations/src/languages/et.ts b/packages/translations/src/languages/et.ts index bcf0a8b374f..18e86b81ff5 100644 --- a/packages/translations/src/languages/et.ts +++ b/packages/translations/src/languages/et.ts @@ -592,6 +592,7 @@ export const etTranslations: DefaultTranslationsObject = { specificVersion: 'Spetsiifiline versioon', status: 'Olek', unpublish: 'Tühista avaldamine', + unpublished: 'Avaldamata', unpublishedSuccessfully: 'Edukalt avaldamata.', unpublishIn: 'Tühista avaldamine {{locale}}', unpublishing: 'Avaldamise tühistamine...', diff --git a/packages/translations/src/languages/fa.ts b/packages/translations/src/languages/fa.ts index 8b7d5a936fd..36170bcfd01 100644 --- a/packages/translations/src/languages/fa.ts +++ b/packages/translations/src/languages/fa.ts @@ -594,6 +594,7 @@ export const faTranslations: DefaultTranslationsObject = { specificVersion: 'نسخه مشخص', status: 'وضعیت', unpublish: 'لغو انتشار', + unpublished: 'نشر نشده', unpublishedSuccessfully: 'با موفقیت منتشر نشد.', unpublishIn: 'لغو انتشار در {{locale}}', unpublishing: 'در حال لغو انتشار...', diff --git a/packages/translations/src/languages/fr.ts b/packages/translations/src/languages/fr.ts index 62082d10827..a20affa42a9 100644 --- a/packages/translations/src/languages/fr.ts +++ b/packages/translations/src/languages/fr.ts @@ -617,6 +617,7 @@ export const frTranslations: DefaultTranslationsObject = { specificVersion: 'Version spécifique', status: 'Statut', unpublish: 'Annuler la publication', + unpublished: 'Non publié', unpublishedSuccessfully: 'Non publié avec succès.', unpublishIn: 'Dépublier en {{locale}}', unpublishing: 'Annulation en cours...', diff --git a/packages/translations/src/languages/he.ts b/packages/translations/src/languages/he.ts index 65efe92ee35..ee8e2d49984 100644 --- a/packages/translations/src/languages/he.ts +++ b/packages/translations/src/languages/he.ts @@ -581,6 +581,7 @@ export const heTranslations: DefaultTranslationsObject = { specificVersion: 'גרסה מסוימת', status: 'סטטוס', unpublish: 'בטל פרסום', + unpublished: 'לא פורסם', unpublishedSuccessfully: 'לא פורסם בהצלחה.', unpublishIn: 'בטל פרסום ב{{locale}}', unpublishing: 'מבטל פרסום...', diff --git a/packages/translations/src/languages/hr.ts b/packages/translations/src/languages/hr.ts index e21f064f039..879cf532d49 100644 --- a/packages/translations/src/languages/hr.ts +++ b/packages/translations/src/languages/hr.ts @@ -599,6 +599,7 @@ export const hrTranslations: DefaultTranslationsObject = { specificVersion: 'Specifična verzija', status: 'Status', unpublish: 'Poništi objavu', + unpublished: 'Neobjavljeno', unpublishedSuccessfully: 'Uspješno nepobjavljeno.', unpublishIn: 'Povuci objavljivanje na {{locale}}', unpublishing: 'Poništavanje objave...', diff --git a/packages/translations/src/languages/hu.ts b/packages/translations/src/languages/hu.ts index 8364f31f0fb..acd731680fc 100644 --- a/packages/translations/src/languages/hu.ts +++ b/packages/translations/src/languages/hu.ts @@ -608,6 +608,7 @@ export const huTranslations: DefaultTranslationsObject = { specificVersion: 'Specifikus verzió', status: 'Állapot', unpublish: 'Közzététel visszavonása', + unpublished: 'Közzétételre váró', unpublishedSuccessfully: 'Sikeresen visszavonták a közzétételt.', unpublishIn: 'Vonatkozás {{locale}} nem közzététele', unpublishing: 'Közzététel visszavonása...', diff --git a/packages/translations/src/languages/hy.ts b/packages/translations/src/languages/hy.ts index 6872eefa834..9f3e37b2333 100644 --- a/packages/translations/src/languages/hy.ts +++ b/packages/translations/src/languages/hy.ts @@ -608,6 +608,7 @@ export const hyTranslations: DefaultTranslationsObject = { specificVersion: 'Մասնավոր Տարբերակ', status: 'Կարգավիճակ', unpublish: 'Բերել չհրապարակված վիճակի։', + unpublished: 'Չհրատարակված', unpublishedSuccessfully: 'Չհրատարակված է հաջողությամբ:', unpublishIn: 'Չհրատարակել {{locale}}', unpublishing: 'Բերվում է չհրապարակված վիճակի...', diff --git a/packages/translations/src/languages/id.ts b/packages/translations/src/languages/id.ts index d29eed82ff3..76fda4405ec 100644 --- a/packages/translations/src/languages/id.ts +++ b/packages/translations/src/languages/id.ts @@ -603,6 +603,7 @@ export const idTranslations: DefaultTranslationsObject = { specificVersion: 'Versi Spesifik', status: 'Status', unpublish: 'Batalkan Publikasi', + unpublished: 'Tidak diterbitkan', unpublishedSuccessfully: 'Berhasil tidak diterbitkan.', unpublishIn: 'Batal publikasi dalam {{locale}}', unpublishing: 'Membatalkan publikasi...', diff --git a/packages/translations/src/languages/is.ts b/packages/translations/src/languages/is.ts index 9105ed15712..765c848c932 100644 --- a/packages/translations/src/languages/is.ts +++ b/packages/translations/src/languages/is.ts @@ -597,6 +597,7 @@ export const isTranslations: DefaultTranslationsObject = { specificVersion: 'Tiltekin útgáfa', status: 'Staða', unpublish: 'Taka úr birtingu', + unpublished: 'Óútgefið', unpublishedSuccessfully: 'Ekkert birting.', unpublishIn: 'Afbóka í {{locale}}', unpublishing: 'Tek úr birtingu...', diff --git a/packages/translations/src/languages/it.ts b/packages/translations/src/languages/it.ts index 5fe042d0af0..07b0b485ec2 100644 --- a/packages/translations/src/languages/it.ts +++ b/packages/translations/src/languages/it.ts @@ -607,6 +607,7 @@ export const itTranslations: DefaultTranslationsObject = { specificVersion: 'Versione Specifica', status: 'Stato', unpublish: 'Annulla pubblicazione', + unpublished: 'Non pubblicato', unpublishedSuccessfully: 'Pubblicazione annullata con successo.', unpublishIn: 'Non pubblicare in {{locale}}', unpublishing: 'Annullamento pubblicazione...', diff --git a/packages/translations/src/languages/ja.ts b/packages/translations/src/languages/ja.ts index f51731bc868..bbc8373de81 100644 --- a/packages/translations/src/languages/ja.ts +++ b/packages/translations/src/languages/ja.ts @@ -602,6 +602,7 @@ export const jaTranslations: DefaultTranslationsObject = { specificVersion: '特定のバージョン', status: 'ステータス', unpublish: '非公開', + unpublished: '未公開', unpublishedSuccessfully: '公開停止が成功しました。', unpublishIn: '{{locale}}で非公開にする', unpublishing: '非公開中...', diff --git a/packages/translations/src/languages/ko.ts b/packages/translations/src/languages/ko.ts index 7131aaf88ff..e44723f7d41 100644 --- a/packages/translations/src/languages/ko.ts +++ b/packages/translations/src/languages/ko.ts @@ -593,6 +593,7 @@ export const koTranslations: DefaultTranslationsObject = { specificVersion: '특정 버전', status: '상태', unpublish: '게시 해제', + unpublished: '미발행', unpublishedSuccessfully: '성공적으로 비공개되었습니다.', unpublishIn: '{{locale}}에서 비공개', unpublishing: '게시 해제 중...', diff --git a/packages/translations/src/languages/lt.ts b/packages/translations/src/languages/lt.ts index 85217642ff5..4499ade385c 100644 --- a/packages/translations/src/languages/lt.ts +++ b/packages/translations/src/languages/lt.ts @@ -604,6 +604,7 @@ export const ltTranslations: DefaultTranslationsObject = { specificVersion: 'Specifinė versija', status: 'Būsena', unpublish: 'Nebepublikuoti', + unpublished: 'Nepublikuotas', unpublishedSuccessfully: 'Sėkmingai nepaskelbta.', unpublishIn: 'Nepublikuoti {{locale}}', unpublishing: 'Nebepublikuojama...', diff --git a/packages/translations/src/languages/lv.ts b/packages/translations/src/languages/lv.ts index 95395219cd9..37be81c4d0b 100644 --- a/packages/translations/src/languages/lv.ts +++ b/packages/translations/src/languages/lv.ts @@ -601,6 +601,7 @@ export const lvTranslations: DefaultTranslationsObject = { specificVersion: 'Konkrētā versija', status: 'Statuss', unpublish: 'Atcelt publicēšanu', + unpublished: 'Nepublicēts', unpublishedSuccessfully: 'Veiksmīgi nepublicēts.', unpublishIn: 'Nepublicēt {{locale}}', unpublishing: 'Atceļ publicēšanu...', diff --git a/packages/translations/src/languages/my.ts b/packages/translations/src/languages/my.ts index cfc0df99f38..dd753ec178e 100644 --- a/packages/translations/src/languages/my.ts +++ b/packages/translations/src/languages/my.ts @@ -611,6 +611,7 @@ export const myTranslations: DefaultTranslationsObject = { specificVersion: 'အထူးဗားရှင်း', status: 'အခြေအနေ', unpublish: 'ပြန်ဖြုတ်မည်။', + unpublished: 'Belum diterbitkan', unpublishedSuccessfully: 'Tidak diterbitkan dengan jayanya.', unpublishIn: 'Batalkan penerbitan dalam {{locale}}', unpublishing: 'ပြန်ဖြုတ်နေဆဲ ...', diff --git a/packages/translations/src/languages/nb.ts b/packages/translations/src/languages/nb.ts index 7733ed1a6ae..e9259b6db5f 100644 --- a/packages/translations/src/languages/nb.ts +++ b/packages/translations/src/languages/nb.ts @@ -602,6 +602,7 @@ export const nbTranslations: DefaultTranslationsObject = { specificVersion: 'Spesifikk versjon', status: 'Status', unpublish: 'Avpubliser', + unpublished: 'Upublisert', unpublishedSuccessfully: 'Utgivelse avbrutt vellykket.', unpublishIn: 'Avpubliser på {{locale}}', unpublishing: 'Avpubliserer...', diff --git a/packages/translations/src/languages/nl.ts b/packages/translations/src/languages/nl.ts index 8e8a53d47b2..55313fb6db0 100644 --- a/packages/translations/src/languages/nl.ts +++ b/packages/translations/src/languages/nl.ts @@ -610,6 +610,7 @@ export const nlTranslations: DefaultTranslationsObject = { specificVersion: 'Specifieke versie', status: 'Status', unpublish: 'Publicatie ongedaan maken', + unpublished: 'Ongepubliceerd', unpublishedSuccessfully: 'Met succes niet gepubliceerd.', unpublishIn: 'Depubliceren in {{locale}}', unpublishing: 'Publicatie ongedaan maken...', diff --git a/packages/translations/src/languages/pl.ts b/packages/translations/src/languages/pl.ts index aab532846fb..9a661d2b36c 100644 --- a/packages/translations/src/languages/pl.ts +++ b/packages/translations/src/languages/pl.ts @@ -599,6 +599,7 @@ export const plTranslations: DefaultTranslationsObject = { specificVersion: 'Konkretna Wersja', status: 'Status', unpublish: 'Cofnij publikację', + unpublished: 'Nieopublikowany', unpublishedSuccessfully: 'Nieopublikowano pomyślnie.', unpublishIn: 'Cofnij publikację w {{locale}}', unpublishing: 'Cofanie publikacji...', diff --git a/packages/translations/src/languages/pt.ts b/packages/translations/src/languages/pt.ts index bb3cc303dd2..6f77fb49916 100644 --- a/packages/translations/src/languages/pt.ts +++ b/packages/translations/src/languages/pt.ts @@ -603,6 +603,7 @@ export const ptTranslations: DefaultTranslationsObject = { specificVersion: 'Versão Específica', status: 'Status', unpublish: 'Despublicar', + unpublished: 'Não publicado', unpublishedSuccessfully: 'Não publicado com sucesso.', unpublishIn: 'Despublicar em {{locale}}', unpublishing: 'Despublicando...', diff --git a/packages/translations/src/languages/ro.ts b/packages/translations/src/languages/ro.ts index 14cdfd0007f..13d950fe9f9 100644 --- a/packages/translations/src/languages/ro.ts +++ b/packages/translations/src/languages/ro.ts @@ -610,6 +610,7 @@ export const roTranslations: DefaultTranslationsObject = { specificVersion: 'Versiunea specifică', status: 'Status', unpublish: 'Dezpublicare', + unpublished: 'Nepublicat', unpublishedSuccessfully: 'Publicare anulată cu succes.', unpublishIn: 'Anulați publicarea în {{locale}}', unpublishing: 'Dezpublicare...', diff --git a/packages/translations/src/languages/rs.ts b/packages/translations/src/languages/rs.ts index c64f54825b2..c1cb2e450b3 100644 --- a/packages/translations/src/languages/rs.ts +++ b/packages/translations/src/languages/rs.ts @@ -597,6 +597,7 @@ export const rsTranslations: DefaultTranslationsObject = { specificVersion: 'Specifična verzija', status: 'Статус', unpublish: 'Поништи објаву', + unpublished: 'Необјављено', unpublishedSuccessfully: 'Uspješno povučeno iz objave.', unpublishIn: 'Otkaži objavljivanje na {{locale}}', unpublishing: 'Поништавање објаве...', diff --git a/packages/translations/src/languages/rsLatin.ts b/packages/translations/src/languages/rsLatin.ts index d0155db5e43..9d96980503f 100644 --- a/packages/translations/src/languages/rsLatin.ts +++ b/packages/translations/src/languages/rsLatin.ts @@ -598,6 +598,7 @@ export const rsLatinTranslations: DefaultTranslationsObject = { specificVersion: 'Specifična verzija', status: 'Status', unpublish: 'Poništi objavu', + unpublished: 'Neobjavljeno', unpublishedSuccessfully: 'Uspešno nepublikovano.', unpublishIn: 'Otkaži objavljivanje na {{locale}}', unpublishing: 'Poništavanje objave...', diff --git a/packages/translations/src/languages/ru.ts b/packages/translations/src/languages/ru.ts index 7178d79f93f..157d502409f 100644 --- a/packages/translations/src/languages/ru.ts +++ b/packages/translations/src/languages/ru.ts @@ -602,6 +602,7 @@ export const ruTranslations: DefaultTranslationsObject = { specificVersion: 'Конкретная версия', status: 'Статус', unpublish: 'Отменить публикацию', + unpublished: 'Неопубликованный', unpublishedSuccessfully: 'Успешно снято с публикации.', unpublishIn: 'Отменить публикацию на {{locale}}', unpublishing: 'Отмена публикации...', diff --git a/packages/translations/src/languages/sk.ts b/packages/translations/src/languages/sk.ts index 99948f32e66..2c96e1fc8d9 100644 --- a/packages/translations/src/languages/sk.ts +++ b/packages/translations/src/languages/sk.ts @@ -599,6 +599,7 @@ export const skTranslations: DefaultTranslationsObject = { specificVersion: 'Špecifická verzia', status: 'Stav', unpublish: 'Zrušiť publikovanie', + unpublished: 'Neuverejnené', unpublishedSuccessfully: 'Úspešne nezverejnené.', unpublishIn: 'Zrušiť publikovanie v {{locale}}', unpublishing: 'Zrušujem publikovanie...', diff --git a/packages/translations/src/languages/sl.ts b/packages/translations/src/languages/sl.ts index 04fad7349d8..2c1542699fd 100644 --- a/packages/translations/src/languages/sl.ts +++ b/packages/translations/src/languages/sl.ts @@ -598,6 +598,7 @@ export const slTranslations: DefaultTranslationsObject = { specificVersion: 'Specifična različica', status: 'Status', unpublish: 'Razveljavi objavo', + unpublished: 'Neobjavljeno', unpublishedSuccessfully: 'Uspešno neobjavljeno.', unpublishIn: 'Prekliči objavo v {{locale}}', unpublishing: 'Razveljavljanje objave...', diff --git a/packages/translations/src/languages/sv.ts b/packages/translations/src/languages/sv.ts index 57c05733565..b41f3045e2d 100644 --- a/packages/translations/src/languages/sv.ts +++ b/packages/translations/src/languages/sv.ts @@ -600,6 +600,7 @@ export const svTranslations: DefaultTranslationsObject = { specificVersion: 'Specifik version', status: 'Status', unpublish: 'Avpublicera', + unpublished: 'Opublicerad', unpublishedSuccessfully: 'Ej publicerad framgångsrikt.', unpublishIn: 'Avpublicera i {{locale}}', unpublishing: 'Avpublicerar...', diff --git a/packages/translations/src/languages/ta.ts b/packages/translations/src/languages/ta.ts index 88259f930c9..f0401c54e50 100644 --- a/packages/translations/src/languages/ta.ts +++ b/packages/translations/src/languages/ta.ts @@ -603,6 +603,7 @@ export const taTranslations: DefaultTranslationsObject = { specificVersion: 'குறிப்பிட்ட பதிப்பு', status: 'நிலை', unpublish: 'வெளியீட்டை நீக்கு', + unpublished: 'வெளியிடப்படாதது', unpublishedSuccessfully: 'வெற்றிகரமாக வெளியீடு நிறுத்தப்பட்டது.', unpublishIn: '{{locale}} இல் வெளியீட்டை அவிழ்க்க', unpublishing: 'வெளியீடு நீக்கப்படுகிறது...', diff --git a/packages/translations/src/languages/th.ts b/packages/translations/src/languages/th.ts index ce2bb3d46c5..d24365f6d14 100644 --- a/packages/translations/src/languages/th.ts +++ b/packages/translations/src/languages/th.ts @@ -588,6 +588,7 @@ export const thTranslations: DefaultTranslationsObject = { specificVersion: 'เวอร์ชันเฉพาะ', status: 'สถานะ', unpublish: 'หยุดเผยแพร่', + unpublished: 'ไม่เผยแพร่', unpublishedSuccessfully: 'ยกเลิกการเผยแพร่เรียบร้อยแล้ว', unpublishIn: 'ยกเลิกการเผยแพร่ใน {{locale}}', unpublishing: 'กำลังหยุดการเผยแพร่...', diff --git a/packages/translations/src/languages/tr.ts b/packages/translations/src/languages/tr.ts index 4b5dec4d9b7..8031d978d7a 100644 --- a/packages/translations/src/languages/tr.ts +++ b/packages/translations/src/languages/tr.ts @@ -602,6 +602,7 @@ export const trTranslations: DefaultTranslationsObject = { specificVersion: 'Belirli Sürüm', status: 'Durum', unpublish: 'Yayından Kaldır', + unpublished: 'Yayınlanmamış', unpublishedSuccessfully: 'Başarıyla yayınlanmadı.', unpublishIn: "{{locale}}'da Yayından Kaldır", unpublishing: 'Yayından kaldırılıyor...', diff --git a/packages/translations/src/languages/uk.ts b/packages/translations/src/languages/uk.ts index 9c71ef558ad..25e3572378e 100644 --- a/packages/translations/src/languages/uk.ts +++ b/packages/translations/src/languages/uk.ts @@ -598,6 +598,7 @@ export const ukTranslations: DefaultTranslationsObject = { specificVersion: 'Специфічна версія', status: 'Статус', unpublish: 'Скасувати публікацію', + unpublished: 'Неопубліковано', unpublishedSuccessfully: 'Успішно скасовано публікацію.', unpublishIn: 'Скасувати публікацію в {{locale}}', unpublishing: 'Скасування публікації...', diff --git a/packages/translations/src/languages/vi.ts b/packages/translations/src/languages/vi.ts index d5929e49847..1bbe05ed626 100644 --- a/packages/translations/src/languages/vi.ts +++ b/packages/translations/src/languages/vi.ts @@ -597,6 +597,7 @@ export const viTranslations: DefaultTranslationsObject = { specificVersion: 'Phiên bản cụ thể', status: 'Trạng thái', unpublish: 'Ẩn tài liệu', + unpublished: 'Chưa được xuất bản', unpublishedSuccessfully: 'Đã hủy xuất bản thành công.', unpublishIn: 'Hủy công bố trong {{locale}}', unpublishing: 'Đang ẩn tài liệu...', diff --git a/packages/translations/src/languages/zh.ts b/packages/translations/src/languages/zh.ts index f1763c19961..39fe76dfc06 100644 --- a/packages/translations/src/languages/zh.ts +++ b/packages/translations/src/languages/zh.ts @@ -573,6 +573,7 @@ export const zhTranslations: DefaultTranslationsObject = { specificVersion: '特定版本', status: '状态', unpublish: '取消发布', + unpublished: '未发布', unpublishedSuccessfully: '成功取消发布。', unpublishIn: '在{{locale}}中取消发布', unpublishing: '取消发布中...', diff --git a/packages/translations/src/languages/zhTw.ts b/packages/translations/src/languages/zhTw.ts index 2519c281436..808fc2861aa 100644 --- a/packages/translations/src/languages/zhTw.ts +++ b/packages/translations/src/languages/zhTw.ts @@ -571,6 +571,7 @@ export const zhTwTranslations: DefaultTranslationsObject = { specificVersion: '指定版本', status: '狀態', unpublish: '取消發佈', + unpublished: '未出版', unpublishedSuccessfully: '成功取消發佈。', unpublishIn: '在{{locale}}中取消發布', unpublishing: '取消發佈中…', From 5f96446fc99a1e8e14942970521160d3d2abd66d Mon Sep 17 00:00:00 2001 From: Jessica Chowdhury Date: Mon, 6 Oct 2025 12:42:23 +0100 Subject: [PATCH 07/24] chore: fix version pill label error --- .../src/views/Version/VersionPillLabel/VersionPillLabel.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/next/src/views/Version/VersionPillLabel/VersionPillLabel.tsx b/packages/next/src/views/Version/VersionPillLabel/VersionPillLabel.tsx index 4e0190bedae..25effd5b438 100644 --- a/packages/next/src/views/Version/VersionPillLabel/VersionPillLabel.tsx +++ b/packages/next/src/views/Version/VersionPillLabel/VersionPillLabel.tsx @@ -88,7 +88,7 @@ export const VersionPillLabel: React.FC<{ const getLocaleLabel = (input) => { const code = Array.isArray(input) ? input[0] : input - const loc = localization?.locales?.find((l) => l.code === code) + const loc = localization && localization?.locales?.find((l) => l.code === code) return loc?.label?.[i18n?.language] || loc?.label || null } From e545c6dbf4f375f58568fc8be1aff3087685c188 Mon Sep 17 00:00:00 2001 From: Jessica Chowdhury Date: Wed, 8 Oct 2025 16:08:48 +0100 Subject: [PATCH 08/24] chore: add int tests for unpublish specific locale --- test/versions/int.spec.ts | 162 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 162 insertions(+) diff --git a/test/versions/int.spec.ts b/test/versions/int.spec.ts index 5e2d3edeca0..86015ea8fb8 100644 --- a/test/versions/int.spec.ts +++ b/test/versions/int.spec.ts @@ -3153,4 +3153,166 @@ describe('Versions', () => { }) }) }) + + describe('Unpublish Individual Locale', () => { + const collection = localizedCollectionSlug + const global = localizedGlobalSlug + + describe('Collections', () => { + let postID: string + + beforeEach(async () => { + await payload.delete({ + collection, + where: {}, + }) + }) + + it('should return correct data after unpublishing specific locale', async () => { + // publish spanish + const doc1 = await payload.create({ + collection, + data: { + text: 'Spanish', + _status: 'published', + }, + locale: 'es', + }) + + postID = doc1.id as any + + // publish english + const doc2 = await payload.update({ + id: postID, + collection, + data: { + text: 'English', + _status: 'published', + }, + locale: 'en', + }) + + // publish german + const doc3 = await payload.update({ + id: postID, + collection, + data: { + text: 'German', + _status: 'published', + }, + locale: 'de', + }) + + const publishedDoc = await payload.findByID({ + collection, + id: postID, + locale: 'all', + }) + + expect(publishedDoc?.text?.es).toStrictEqual('Spanish') + expect(publishedDoc?.text?.en).toStrictEqual('English') + expect(publishedDoc?.text?.de).toStrictEqual('German') + + // unpublish only english + const unpublish = await payload.update({ + id: postID, + data: {}, + collection, + unpublishSpecificLocale: 'en', + }) + + const latestPublishedDoc = await payload.findByID({ + collection, + id: postID, + locale: 'all', + }) + + expect(latestPublishedDoc?.text?.es).toStrictEqual('Spanish') + expect(latestPublishedDoc?.text?.en).toBeUndefined() + expect(latestPublishedDoc?.text?.de).toStrictEqual('German') + + const latestDraft = await payload.findByID({ + collection, + id: postID, + locale: 'all', + draft: true, + }) + + expect(latestDraft._status).toBe('draft') + expect(latestDraft?.text?.es).toStrictEqual('Spanish') + expect(latestDraft?.text?.en).toStrictEqual('English') + expect(latestDraft?.text?.de).toStrictEqual('German') + }) + }) + + describe('Globals', () => { + it('should save correct data when unpublishing individual locale', async () => { + // publish german + await payload.updateGlobal({ + slug: global, + data: { + title: 'German', + _status: 'published', + }, + locale: 'de', + }) + + // publish spanish + await payload.updateGlobal({ + slug: global, + data: { + title: 'Spanish', + _status: 'published', + }, + locale: 'es', + }) + + // publish english + await payload.updateGlobal({ + slug: global, + data: { + title: 'English', + _status: 'published', + }, + locale: 'en', + }) + + const globalData = await payload.findGlobal({ + slug: global, + locale: 'all', + }) + + expect(globalData?.title?.es).toStrictEqual('Spanish') + expect(globalData?.title?.en).toStrictEqual('English') + expect(globalData?.title?.de).toStrictEqual('German') + + // unpublish only english + await payload.updateGlobal({ + slug: global, + data: {}, + unpublishSpecificLocale: 'en', + }) + + const latestGlobal = await payload.findGlobal({ + slug: global, + locale: 'all', + }) + + expect(latestGlobal?.title?.es).toStrictEqual('Spanish') + expect(latestGlobal?.title?.en).toBeUndefined() + expect(latestGlobal?.title?.de).toStrictEqual('German') + + const latestDraft = await payload.findGlobal({ + slug: global, + locale: 'all', + draft: true, + }) + + expect(latestDraft._status).toBe('draft') + expect(latestDraft?.title?.es).toStrictEqual('Spanish') + expect(latestDraft?.title?.en).toStrictEqual('English') + expect(latestDraft?.title?.de).toStrictEqual('German') + }) + }) + }) }) From f32fa3dc52b7e4fc28452a14a168217c6c7101c3 Mon Sep 17 00:00:00 2001 From: Jarrod Flesch Date: Thu, 16 Oct 2025 13:33:25 -0400 Subject: [PATCH 09/24] adjust var naming, adds comments --- .../operations/utilities/update.ts | 43 +++++++++++-------- .../src/fields/hooks/beforeChange/index.ts | 16 ++++++- .../payload/src/globals/operations/update.ts | 35 +++++++++------ .../versions/getLatestCollectionVersion.ts | 11 ++--- packages/payload/src/versions/saveVersion.ts | 17 +++++--- 5 files changed, 80 insertions(+), 42 deletions(-) diff --git a/packages/payload/src/collections/operations/utilities/update.ts b/packages/payload/src/collections/operations/utilities/update.ts index 02dcfb13bb9..d896967f753 100644 --- a/packages/payload/src/collections/operations/utilities/update.ts +++ b/packages/payload/src/collections/operations/utilities/update.ts @@ -82,7 +82,7 @@ export const updateDocument = async < config, data, depth, - docWithLocales, + docWithLocales: originalDocWithLocales, draftArg, fallbackLocale, filesToUpload, @@ -121,11 +121,16 @@ export const updateDocument = async < req, }) + // ///////////////////////////////////// + // AfterRead runs on original doc + // to transform doc into 1 locale + // ///////////////////////////////////// + const originalDoc = await afterRead({ collection: collectionConfig, context: req.context, depth: 0, - doc: deepCopyObjectSimple(docWithLocales), + doc: deepCopyObjectSimple(originalDocWithLocales), draft: draftArg, fallbackLocale: id ? null : fallbackLocale, global: null, @@ -153,7 +158,7 @@ export const updateDocument = async < await deleteAssociatedFiles({ collectionConfig, config, - doc: docWithLocales, + doc: originalDocWithLocales, files: filesToUpload, overrideDelete: false, req, @@ -223,17 +228,12 @@ export const updateDocument = async < // beforeChange - Fields // ///////////////////////////////////// - let publishedDocWithLocales = docWithLocales - let versionSnapshotResult - - const beforeChangeArgs: Args> = { + const beforeChangeArgs: Omit>, 'docWithLocales'> = { id, collection: collectionConfig, context: req.context, data: { ...data, id }, doc: originalDoc, - // @ts-expect-error - vestiges of when tsconfig was not strict. Feel free to improve - docWithLocales: undefined, global: null, operation: 'update', overrideAccess, @@ -246,10 +246,18 @@ export const updateDocument = async < Boolean(data?.deletedAt), } - if (publishSpecificLocale || unpublishSpecificLocale) { - versionSnapshotResult = await beforeChange({ + let snapshotDocWithLocales + let docWithLocales = originalDocWithLocales + + /** + * Locale-Specific Snapshot Logic + * + * Both `publishSpecificLocale` and `unpublishSpecificLocale` require snapshots + */ + if (collectionConfig.versions && (publishSpecificLocale || unpublishSpecificLocale)) { + snapshotDocWithLocales = await beforeChange({ ...beforeChangeArgs, - docWithLocales, + docWithLocales: originalDocWithLocales, }) const lastPublished = await getLatestCollectionVersion({ @@ -266,18 +274,19 @@ export const updateDocument = async < req, }) - publishedDocWithLocales = lastPublished ? lastPublished : {} + docWithLocales = lastPublished ? lastPublished : {} } let result = await beforeChange({ ...beforeChangeArgs, data: unpublishSpecificLocale ? { id } : { ...data, id }, - docWithLocales: publishedDocWithLocales, + docWithLocales, + skipValidation: unpublishSpecificLocale ? true : beforeChangeArgs.skipValidation, }) - if (unpublishSpecificLocale && versionSnapshotResult) { + if (unpublishSpecificLocale && snapshotDocWithLocales) { if (Object.keys(result).length <= 1 && result.id) { - result = versionSnapshotResult + result = snapshotDocWithLocales } } @@ -330,7 +339,7 @@ export const updateDocument = async < payload, publishSpecificLocale, req, - snapshot: versionSnapshotResult, + snapshot: snapshotDocWithLocales, unpublishSpecificLocale, }) } diff --git a/packages/payload/src/fields/hooks/beforeChange/index.ts b/packages/payload/src/fields/hooks/beforeChange/index.ts index c412b4311dd..9d0e2eb98e4 100644 --- a/packages/payload/src/fields/hooks/beforeChange/index.ts +++ b/packages/payload/src/fields/hooks/beforeChange/index.ts @@ -28,7 +28,21 @@ export type Args = { * - Execute field hooks * - Validate data * - Transform data for storage - * - Unflatten locales. The input `data` is the normal document for one locale. The output result will become the document with locales. + * - Unflatten locales + * + * The input `data` is the normal document for one locale. + * + * The returned data will be localized. + * + * E.g. a localized `title` field returned as: + * ```ts + * { + * title: { + * en: 'new title from data', + * fr: 'previous title from docWithLocales', + * } + * } + * ``` */ export const beforeChange = async ({ diff --git a/packages/payload/src/globals/operations/update.ts b/packages/payload/src/globals/operations/update.ts index 1a914d4b209..5f9e47c0874 100644 --- a/packages/payload/src/globals/operations/update.ts +++ b/packages/payload/src/globals/operations/update.ts @@ -224,8 +224,6 @@ export const updateOperation = async < // ///////////////////////////////////// // beforeChange - Fields // ///////////////////////////////////// - let publishedDocWithLocales = globalJSON - let versionSnapshotResult const beforeChangeArgs = { collection: null, @@ -240,8 +238,21 @@ export const updateOperation = async < shouldSaveDraft && globalConfig.versions.drafts && !globalConfig.versions.drafts.validate, } - if (publishSpecificLocale || unpublishSpecificLocale) { - const latestVersion = await getLatestGlobalVersion({ + let snapshotDocWithLocales + let docWithLocales = globalJSON + + /** + * Locale-Specific Snapshot Logic + * + * Both `publishSpecificLocale` and `unpublishSpecificLocale` require snapshots + */ + if (globalConfig.versions && (publishSpecificLocale || unpublishSpecificLocale)) { + snapshotDocWithLocales = await beforeChange({ + ...beforeChangeArgs, + docWithLocales: globalJSON, + }) + + const lastPublished = await getLatestGlobalVersion({ slug, config: globalConfig, payload, @@ -250,23 +261,19 @@ export const updateOperation = async < where: query, }) - publishedDocWithLocales = latestVersion?.global || {} - - versionSnapshotResult = await beforeChange({ - ...beforeChangeArgs, - docWithLocales: globalJSON, - }) + docWithLocales = lastPublished ? lastPublished : {} } let result = await beforeChange({ ...beforeChangeArgs, data: unpublishSpecificLocale ? {} : data, - docWithLocales: publishedDocWithLocales, + docWithLocales, + skipValidation: unpublishSpecificLocale ? true : beforeChangeArgs.skipValidation, }) - if (unpublishSpecificLocale && versionSnapshotResult) { + if (unpublishSpecificLocale && snapshotDocWithLocales) { if (Object.keys(result).length === 0) { - result = versionSnapshotResult + result = snapshotDocWithLocales } } @@ -320,7 +327,7 @@ export const updateOperation = async < publishSpecificLocale, req, select, - snapshot: versionSnapshotResult, + snapshot: snapshotDocWithLocales, unpublishSpecificLocale, }) diff --git a/packages/payload/src/versions/getLatestCollectionVersion.ts b/packages/payload/src/versions/getLatestCollectionVersion.ts index cc23997dab6..811f2a6c7a3 100644 --- a/packages/payload/src/versions/getLatestCollectionVersion.ts +++ b/packages/payload/src/versions/getLatestCollectionVersion.ts @@ -25,10 +25,6 @@ export const getLatestCollectionVersion = async ({ }: Args): Promise => { let latestVersion!: TypeWithVersion - const whereQuery = published - ? { and: [{ parent: { equals: id } }, { 'version._status': { equals: 'published' } }] } - : { and: [{ parent: { equals: id } }, { latest: { equals: true } }] } - if (config.versions?.drafts) { const { docs } = await payload.db.findVersions({ collection: config.slug, @@ -36,7 +32,12 @@ export const getLatestCollectionVersion = async ({ pagination: false, req, sort: '-updatedAt', - where: combineQueries(appendVersionToQueryKey(query.where), whereQuery as unknown as Where), + where: combineQueries( + appendVersionToQueryKey(query.where), + published + ? { and: [{ parent: { equals: id } }, { 'version._status': { equals: 'published' } }] } + : { and: [{ parent: { equals: id } }, { latest: { equals: true } }] }, + ), }) latestVersion = docs[0]! } diff --git a/packages/payload/src/versions/saveVersion.ts b/packages/payload/src/versions/saveVersion.ts index 8493c348083..1727c2e73cc 100644 --- a/packages/payload/src/versions/saveVersion.ts +++ b/packages/payload/src/versions/saveVersion.ts @@ -21,6 +21,10 @@ type Args = { publishSpecificLocale?: string req?: PayloadRequest select?: SelectType + /** + * If present, this is the document state before the update operation was applied. + * The data should be in localized format for localized fields. + */ snapshot?: any unpublishSpecificLocale?: string } @@ -29,7 +33,7 @@ export const saveVersion = async ({ id, autosave, collection, - docWithLocales: doc, + docWithLocales, draft, global, operation, @@ -37,13 +41,13 @@ export const saveVersion = async ({ publishSpecificLocale, req, select, - snapshot, + snapshot: snapshotDocWithLocales, unpublishSpecificLocale, }: Args): Promise => { let result: TypeWithID | undefined let createNewVersion = true const now = new Date().toISOString() - const versionData = deepCopyObjectSimple(doc) + const versionData = deepCopyObjectSimple(docWithLocales) if (draft) { versionData._status = 'draft' } @@ -151,8 +155,11 @@ export const saveVersion = async ({ result = await payload.db.createGlobalVersion(createVersionArgs as CreateGlobalVersionArgs) } - if ((publishSpecificLocale || unpublishSpecificLocale) && snapshot) { - const snapshotData = deepCopyObjectSimple(snapshot) + // ///////////////////////////////////// + // Locale-Specific Snapshot Logic + // ///////////////////////////////////// + if (snapshotDocWithLocales) { + const snapshotData = deepCopyObjectSimple(snapshotDocWithLocales) if (snapshotData._id) { delete snapshotData._id } From 409ecaaa3b544b39986e0ec2794d3555ae981f58 Mon Sep 17 00:00:00 2001 From: Jarrod Flesch Date: Thu, 16 Oct 2025 14:04:36 -0400 Subject: [PATCH 10/24] add snapshot exclusion to getVersions helper --- .../next/src/views/Document/getVersions.ts | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/packages/next/src/views/Document/getVersions.ts b/packages/next/src/views/Document/getVersions.ts index d9690732711..be0a722000b 100644 --- a/packages/next/src/views/Document/getVersions.ts +++ b/packages/next/src/views/Document/getVersions.ts @@ -143,6 +143,11 @@ export const getVersions = async ({ equals: id, }, }, + { + snapshot: { + not_equals: true, + }, + }, ], }, extractAccessFromPermission(docPermissions.readVersions), @@ -170,6 +175,11 @@ export const getVersions = async ({ equals: id, }, }, + { + snapshot: { + not_equals: true, + }, + }, { 'version._status': { equals: 'draft', @@ -200,6 +210,11 @@ export const getVersions = async ({ equals: id, }, }, + { + snapshot: { + not_equals: true, + }, + }, ], }, extractAccessFromPermission(docPermissions.readVersions), @@ -236,6 +251,11 @@ export const getVersions = async ({ autosave: true, }, user, + where: { + snapshot: { + not_equals: true, + }, + }, }) if ( @@ -260,6 +280,11 @@ export const getVersions = async ({ equals: 'draft', }, }, + { + snapshot: { + not_equals: true, + }, + }, { updatedAt: { greater_than: publishedDoc.updatedAt, From 5c8b10e6d44ffd0d5a55aef0e4a276795c14f7d2 Mon Sep 17 00:00:00 2001 From: Jarrod Flesch Date: Fri, 17 Oct 2025 10:15:32 -0400 Subject: [PATCH 11/24] adds comments around snapshot logic --- .../operations/utilities/update.ts | 82 ++++++++++--------- .../payload/src/globals/operations/update.ts | 61 +++++++------- .../versions/getLatestCollectionVersion.ts | 8 +- packages/payload/src/versions/saveVersion.ts | 12 +-- 4 files changed, 89 insertions(+), 74 deletions(-) diff --git a/packages/payload/src/collections/operations/utilities/update.ts b/packages/payload/src/collections/operations/utilities/update.ts index d896967f753..0456340e1fe 100644 --- a/packages/payload/src/collections/operations/utilities/update.ts +++ b/packages/payload/src/collections/operations/utilities/update.ts @@ -2,6 +2,7 @@ import type { DeepPartial } from 'ts-essentials' import type { Args } from '../../../fields/hooks/beforeChange/index.js' import type { + JsonObject, Payload, PayloadRequest, PopulateType, @@ -12,6 +13,7 @@ import type { DataFromCollectionSlug, SanitizedCollectionConfig, SelectFromCollectionSlug, + TypeWithID, } from '../../config/types.js' import { ensureUsernameOrEmail } from '../../../auth/ensureUsernameOrEmail.js' @@ -82,7 +84,7 @@ export const updateDocument = async < config, data, depth, - docWithLocales: originalDocWithLocales, + docWithLocales, draftArg, fallbackLocale, filesToUpload, @@ -130,7 +132,7 @@ export const updateDocument = async < collection: collectionConfig, context: req.context, depth: 0, - doc: deepCopyObjectSimple(originalDocWithLocales), + doc: deepCopyObjectSimple(docWithLocales), draft: draftArg, fallbackLocale: id ? null : fallbackLocale, global: null, @@ -158,7 +160,7 @@ export const updateDocument = async < await deleteAssociatedFiles({ collectionConfig, config, - doc: originalDocWithLocales, + doc: docWithLocales, files: filesToUpload, overrideDelete: false, req, @@ -228,6 +230,9 @@ export const updateDocument = async < // beforeChange - Fields // ///////////////////////////////////// + let result: JsonObject & TypeWithID + let snapshotResult: (JsonObject & TypeWithID) | undefined + const beforeChangeArgs: Omit>, 'docWithLocales'> = { id, collection: collectionConfig, @@ -246,48 +251,47 @@ export const updateDocument = async < Boolean(data?.deletedAt), } - let snapshotDocWithLocales - let docWithLocales = originalDocWithLocales + // /////////////////////////////////////////// + // Handle locale specific publish / unpublish + // /////////////////////////////////////////// - /** - * Locale-Specific Snapshot Logic - * - * Both `publishSpecificLocale` and `unpublishSpecificLocale` require snapshots - */ if (collectionConfig.versions && (publishSpecificLocale || unpublishSpecificLocale)) { - snapshotDocWithLocales = await beforeChange({ + // snapshotResult will contain all localized data (draft and published) + snapshotResult = await beforeChange({ ...beforeChangeArgs, - docWithLocales: originalDocWithLocales, + docWithLocales, }) - const lastPublished = await getLatestCollectionVersion({ - id, - config: collectionConfig, - payload, - published: true, - query: { - collection: collectionConfig.slug, - locale, - req, - where: combineQueries({ id: { equals: id } }, accessResults), - }, - req, + // result will contain only published localized data + result = await beforeChange({ + ...beforeChangeArgs, + data: unpublishSpecificLocale ? { id } : beforeChangeArgs.data, + docWithLocales: + (await getLatestCollectionVersion>({ + id, + config: collectionConfig, + payload, + published: true, + query: { + collection: collectionConfig.slug, + locale, + req, + where: combineQueries({ id: { equals: id } }, accessResults), + }, + req, + })) || {}, + skipValidation: unpublishSpecificLocale ? true : beforeChangeArgs.skipValidation, }) - docWithLocales = lastPublished ? lastPublished : {} - } - - let result = await beforeChange({ - ...beforeChangeArgs, - data: unpublishSpecificLocale ? { id } : { ...data, id }, - docWithLocales, - skipValidation: unpublishSpecificLocale ? true : beforeChangeArgs.skipValidation, - }) - - if (unpublishSpecificLocale && snapshotDocWithLocales) { - if (Object.keys(result).length <= 1 && result.id) { - result = snapshotDocWithLocales + if (unpublishSpecificLocale && snapshotResult && Object.keys(result).length <= 1 && result.id) { + result = snapshotResult } + } else { + // result will contain all localized data (draft and published) + result = await beforeChange({ + ...beforeChangeArgs, + docWithLocales, + }) } // ///////////////////////////////////// @@ -315,6 +319,8 @@ export const updateDocument = async < if (!shouldSaveDraft) { // Ensure updatedAt date is always updated dataToUpdate.updatedAt = new Date().toISOString() + + // Publishing - save main collection document result = await req.payload.db.updateOne({ id, collection: collectionConfig.slug, @@ -339,7 +345,7 @@ export const updateDocument = async < payload, publishSpecificLocale, req, - snapshot: snapshotDocWithLocales, + snapshot: snapshotResult!, unpublishSpecificLocale, }) } diff --git a/packages/payload/src/globals/operations/update.ts b/packages/payload/src/globals/operations/update.ts index 5f9e47c0874..b1a38a96be7 100644 --- a/packages/payload/src/globals/operations/update.ts +++ b/packages/payload/src/globals/operations/update.ts @@ -1,6 +1,6 @@ import type { DeepPartial } from 'ts-essentials' -import type { GlobalSlug, JsonObject } from '../../index.js' +import type { GlobalSlug, JsonObject, TypeWithID } from '../../index.js' import type { Operation, PayloadRequest, @@ -224,6 +224,8 @@ export const updateOperation = async < // ///////////////////////////////////// // beforeChange - Fields // ///////////////////////////////////// + let result: JsonObject + let snapshotResult: JsonObject | undefined const beforeChangeArgs = { collection: null, @@ -238,43 +240,42 @@ export const updateOperation = async < shouldSaveDraft && globalConfig.versions.drafts && !globalConfig.versions.drafts.validate, } - let snapshotDocWithLocales - let docWithLocales = globalJSON + // /////////////////////////////////////////// + // Handle locale specific publish / unpublish + // /////////////////////////////////////////// - /** - * Locale-Specific Snapshot Logic - * - * Both `publishSpecificLocale` and `unpublishSpecificLocale` require snapshots - */ if (globalConfig.versions && (publishSpecificLocale || unpublishSpecificLocale)) { - snapshotDocWithLocales = await beforeChange({ + // snapshotResult will contain all localized data (draft and published) + snapshotResult = await beforeChange({ ...beforeChangeArgs, docWithLocales: globalJSON, }) - const lastPublished = await getLatestGlobalVersion({ - slug, - config: globalConfig, - payload, - published: true, - req, - where: query, + // result will contain only published localized data + result = await beforeChange({ + ...beforeChangeArgs, + data: unpublishSpecificLocale ? {} : beforeChangeArgs.data, + docWithLocales: + (await getLatestGlobalVersion({ + slug, + config: globalConfig, + payload, + published: true, + req, + where: query, + })) || {}, + skipValidation: unpublishSpecificLocale ? true : beforeChangeArgs.skipValidation, }) - docWithLocales = lastPublished ? lastPublished : {} - } - - let result = await beforeChange({ - ...beforeChangeArgs, - data: unpublishSpecificLocale ? {} : data, - docWithLocales, - skipValidation: unpublishSpecificLocale ? true : beforeChangeArgs.skipValidation, - }) - - if (unpublishSpecificLocale && snapshotDocWithLocales) { - if (Object.keys(result).length === 0) { - result = snapshotDocWithLocales + if (unpublishSpecificLocale && snapshotResult && Object.keys(result).length === 0) { + result = snapshotResult } + } else { + // result will contain all localized data (draft and published) + result = await beforeChange({ + ...beforeChangeArgs, + docWithLocales: globalJSON, + }) } // ///////////////////////////////////// @@ -327,7 +328,7 @@ export const updateOperation = async < publishSpecificLocale, req, select, - snapshot: snapshotDocWithLocales, + snapshot: snapshotResult, unpublishSpecificLocale, }) diff --git a/packages/payload/src/versions/getLatestCollectionVersion.ts b/packages/payload/src/versions/getLatestCollectionVersion.ts index 811f2a6c7a3..d9e446699a5 100644 --- a/packages/payload/src/versions/getLatestCollectionVersion.ts +++ b/packages/payload/src/versions/getLatestCollectionVersion.ts @@ -1,6 +1,6 @@ import type { SanitizedCollectionConfig, TypeWithID } from '../collections/config/types.js' import type { FindOneArgs } from '../database/types.js' -import type { Payload, PayloadRequest, Where } from '../types/index.js' +import type { Payload, PayloadRequest } from '../types/index.js' import type { TypeWithVersion } from './types.js' import { combineQueries } from '../database/combineQueries.js' @@ -15,6 +15,12 @@ type Args = { req?: PayloadRequest } +/** + * Returns document with localized fields + * + * - If versions are enabled: from the versions collection + * - If versions are disabled: from the main collection + */ export const getLatestCollectionVersion = async ({ id, config, diff --git a/packages/payload/src/versions/saveVersion.ts b/packages/payload/src/versions/saveVersion.ts index 1727c2e73cc..c49c4cb755f 100644 --- a/packages/payload/src/versions/saveVersion.ts +++ b/packages/payload/src/versions/saveVersion.ts @@ -22,8 +22,8 @@ type Args = { req?: PayloadRequest select?: SelectType /** - * If present, this is the document state before the update operation was applied. - * The data should be in localized format for localized fields. + * If present, this is the latest document which should have + * all **draft and published** data. */ snapshot?: any unpublishSpecificLocale?: string @@ -41,7 +41,7 @@ export const saveVersion = async ({ publishSpecificLocale, req, select, - snapshot: snapshotDocWithLocales, + snapshot, unpublishSpecificLocale, }: Args): Promise => { let result: TypeWithID | undefined @@ -158,8 +158,10 @@ export const saveVersion = async ({ // ///////////////////////////////////// // Locale-Specific Snapshot Logic // ///////////////////////////////////// - if (snapshotDocWithLocales) { - const snapshotData = deepCopyObjectSimple(snapshotDocWithLocales) + if (snapshot) { + // inserts a snapshot version after the published version is created above + // this contains all localized data (draft and published) + const snapshotData = deepCopyObjectSimple(snapshot) if (snapshotData._id) { delete snapshotData._id } From 41a4c022050c6ede3c641ed042ad9d094a376e9a Mon Sep 17 00:00:00 2001 From: Jarrod Flesch Date: Fri, 17 Oct 2025 12:48:16 -0400 Subject: [PATCH 12/24] rm snapshot query constraints for getVersion find ops --- packages/next/src/views/Document/getVersions.ts | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/packages/next/src/views/Document/getVersions.ts b/packages/next/src/views/Document/getVersions.ts index be0a722000b..2d3f001ed81 100644 --- a/packages/next/src/views/Document/getVersions.ts +++ b/packages/next/src/views/Document/getVersions.ts @@ -143,11 +143,6 @@ export const getVersions = async ({ equals: id, }, }, - { - snapshot: { - not_equals: true, - }, - }, ], }, extractAccessFromPermission(docPermissions.readVersions), @@ -251,11 +246,6 @@ export const getVersions = async ({ autosave: true, }, user, - where: { - snapshot: { - not_equals: true, - }, - }, }) if ( From 5369140b1bb1120797b71d4dbb628302f8ff047c Mon Sep 17 00:00:00 2001 From: Jarrod Flesch Date: Fri, 17 Oct 2025 13:04:58 -0400 Subject: [PATCH 13/24] fix globals --- .../payload/src/globals/operations/update.ts | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/packages/payload/src/globals/operations/update.ts b/packages/payload/src/globals/operations/update.ts index b1a38a96be7..5958a5dcdcd 100644 --- a/packages/payload/src/globals/operations/update.ts +++ b/packages/payload/src/globals/operations/update.ts @@ -254,16 +254,18 @@ export const updateOperation = async < // result will contain only published localized data result = await beforeChange({ ...beforeChangeArgs, - data: unpublishSpecificLocale ? {} : beforeChangeArgs.data, + data: unpublishSpecificLocale ? {} : data, docWithLocales: - (await getLatestGlobalVersion({ - slug, - config: globalConfig, - payload, - published: true, - req, - where: query, - })) || {}, + ( + await getLatestGlobalVersion({ + slug, + config: globalConfig, + payload, + published: true, + req, + where: query, + }) + )?.global || {}, skipValidation: unpublishSpecificLocale ? true : beforeChangeArgs.skipValidation, }) From 8eb33ac363faa912a0b8318e37cc9a264053e42a Mon Sep 17 00:00:00 2001 From: Jarrod Flesch Date: Fri, 17 Oct 2025 13:29:08 -0400 Subject: [PATCH 14/24] rm snapshot from non versions query --- packages/next/src/views/Document/getVersions.ts | 5 ----- packages/payload/src/globals/operations/update.ts | 10 ++++++++++ 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/packages/next/src/views/Document/getVersions.ts b/packages/next/src/views/Document/getVersions.ts index 2d3f001ed81..cc73dacf81f 100644 --- a/packages/next/src/views/Document/getVersions.ts +++ b/packages/next/src/views/Document/getVersions.ts @@ -205,11 +205,6 @@ export const getVersions = async ({ equals: id, }, }, - { - snapshot: { - not_equals: true, - }, - }, ], }, extractAccessFromPermission(docPermissions.readVersions), diff --git a/packages/payload/src/globals/operations/update.ts b/packages/payload/src/globals/operations/update.ts index 5958a5dcdcd..a10b0375cc2 100644 --- a/packages/payload/src/globals/operations/update.ts +++ b/packages/payload/src/globals/operations/update.ts @@ -245,6 +245,16 @@ export const updateOperation = async < // /////////////////////////////////////////// if (globalConfig.versions && (publishSpecificLocale || unpublishSpecificLocale)) { + /** + * 1. take snapshot of full localized data + * 2. run beforeChange twice + * a. once with all data (for snapshot) + * b. once with only published data (for result) + * 3. saveVersions is called later in this file + * a. normal version is created with published data + * b. snapshot is created with full localized data + */ + // snapshotResult will contain all localized data (draft and published) snapshotResult = await beforeChange({ ...beforeChangeArgs, From a694bd6f709dfcd3a3a281627f5a9400082ce397 Mon Sep 17 00:00:00 2001 From: Jarrod Flesch Date: Fri, 17 Oct 2025 14:55:51 -0400 Subject: [PATCH 15/24] improve validate search params --- .../queryValidation/validateSearchParams.ts | 36 ++++++++----------- 1 file changed, 15 insertions(+), 21 deletions(-) diff --git a/packages/payload/src/database/queryValidation/validateSearchParams.ts b/packages/payload/src/database/queryValidation/validateSearchParams.ts index 42e1d86b8e7..20d19b97827 100644 --- a/packages/payload/src/database/queryValidation/validateSearchParams.ts +++ b/packages/payload/src/database/queryValidation/validateSearchParams.ts @@ -1,3 +1,4 @@ +import type { FieldsPermissions } from '../../auth/types.js' import type { SanitizedCollectionConfig } from '../../collections/config/types.js' import type { FlattenedField } from '../../fields/config/types.js' import type { SanitizedGlobalConfig } from '../../globals/config/types.js' @@ -157,36 +158,29 @@ export async function validateSearchParam({ const entitySlug = collectionSlug || globalConfig!.slug const segments = fieldPath.split('.') - let fieldAccess: any - - if (versionFields) { - fieldAccess = policies[entityType]![entitySlug]!.fields - - if ( - segments[0] === 'parent' || + if ( + versionFields && + (segments[0] === 'parent' || segments[0] === 'version' || segments[0] === 'snapshot' || - segments[0] === 'latest' - ) { - segments.shift() - } - } else { - fieldAccess = policies[entityType]![entitySlug]!.fields + segments[0] === 'latest') + ) { + segments.shift() } + let fieldAccess: FieldsPermissions = policies[entityType]![entitySlug]!.fields if (segments.length) { - segments.forEach((segment) => { + for (const segment of segments) { if (fieldAccess[segment]) { + if (fieldAccess[segment].read.permission === false) { + errors.push({ path: fieldPath }) + break + } + if ('fields' in fieldAccess[segment]) { - fieldAccess = fieldAccess[segment].fields - } else { - fieldAccess = fieldAccess[segment] + fieldAccess = fieldAccess[segment].fields! } } - }) - - if (!fieldAccess?.read?.permission) { - errors.push({ path: fieldPath }) } } } From 2deb94ea1b7fd95b464f3434287dd113a19a59a1 Mon Sep 17 00:00:00 2001 From: Jarrod Flesch Date: Fri, 17 Oct 2025 15:57:24 -0400 Subject: [PATCH 16/24] improve version field query validation --- .../queryValidation/validateSearchParams.ts | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/packages/payload/src/database/queryValidation/validateSearchParams.ts b/packages/payload/src/database/queryValidation/validateSearchParams.ts index 20d19b97827..4b9d0479efc 100644 --- a/packages/payload/src/database/queryValidation/validateSearchParams.ts +++ b/packages/payload/src/database/queryValidation/validateSearchParams.ts @@ -158,13 +158,18 @@ export async function validateSearchParam({ const entitySlug = collectionSlug || globalConfig!.slug const segments = fieldPath.split('.') - if ( - versionFields && - (segments[0] === 'parent' || - segments[0] === 'version' || - segments[0] === 'snapshot' || - segments[0] === 'latest') - ) { + if (versionFields && segments.length === 0 && segments[0]) { + if (['latest', 'parent'].includes(segments[0])) { + return + } + if (req.payload.config.localization) { + if (segments[0] === 'snapshot') { + return + } + } + } + + if (versionFields && segments[0] === 'version') { segments.shift() } From 609efc19448ee66cbda4a2d79698e569197116dc Mon Sep 17 00:00:00 2001 From: Jarrod Flesch Date: Fri, 17 Oct 2025 15:57:45 -0400 Subject: [PATCH 17/24] fix snapshot query constraint scope --- .../next/src/views/Document/getVersions.ts | 28 ++++++++++++------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/packages/next/src/views/Document/getVersions.ts b/packages/next/src/views/Document/getVersions.ts index cc73dacf81f..ab167a78219 100644 --- a/packages/next/src/views/Document/getVersions.ts +++ b/packages/next/src/views/Document/getVersions.ts @@ -170,11 +170,15 @@ export const getVersions = async ({ equals: id, }, }, - { - snapshot: { - not_equals: true, - }, - }, + ...(payload.config.localization + ? [ + { + snapshot: { + not_equals: true, + }, + }, + ] + : []), { 'version._status': { equals: 'draft', @@ -265,11 +269,15 @@ export const getVersions = async ({ equals: 'draft', }, }, - { - snapshot: { - not_equals: true, - }, - }, + ...(payload.config.localization + ? [ + { + snapshot: { + not_equals: true, + }, + }, + ] + : []), { updatedAt: { greater_than: publishedDoc.updatedAt, From f109d77ff0589996ba5959db7fa1b176bc27548a Mon Sep 17 00:00:00 2001 From: Jarrod Flesch Date: Fri, 17 Oct 2025 17:01:15 -0400 Subject: [PATCH 18/24] only use snapshots when localization is on --- .../payload/src/collections/operations/utilities/update.ts | 6 +++++- packages/payload/src/globals/operations/update.ts | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/packages/payload/src/collections/operations/utilities/update.ts b/packages/payload/src/collections/operations/utilities/update.ts index 0456340e1fe..206300079a3 100644 --- a/packages/payload/src/collections/operations/utilities/update.ts +++ b/packages/payload/src/collections/operations/utilities/update.ts @@ -255,7 +255,11 @@ export const updateDocument = async < // Handle locale specific publish / unpublish // /////////////////////////////////////////// - if (collectionConfig.versions && (publishSpecificLocale || unpublishSpecificLocale)) { + if ( + config.localization && + collectionConfig.versions && + (publishSpecificLocale || unpublishSpecificLocale) + ) { // snapshotResult will contain all localized data (draft and published) snapshotResult = await beforeChange({ ...beforeChangeArgs, diff --git a/packages/payload/src/globals/operations/update.ts b/packages/payload/src/globals/operations/update.ts index a10b0375cc2..bd5b9ffe444 100644 --- a/packages/payload/src/globals/operations/update.ts +++ b/packages/payload/src/globals/operations/update.ts @@ -244,7 +244,11 @@ export const updateOperation = async < // Handle locale specific publish / unpublish // /////////////////////////////////////////// - if (globalConfig.versions && (publishSpecificLocale || unpublishSpecificLocale)) { + if ( + payload.config.localization && + globalConfig.versions && + (publishSpecificLocale || unpublishSpecificLocale) + ) { /** * 1. take snapshot of full localized data * 2. run beforeChange twice From 96a4e5b87bd2442e1399497d6e36e2e8598fc2e6 Mon Sep 17 00:00:00 2001 From: Jarrod Flesch Date: Wed, 22 Oct 2025 10:38:51 -0400 Subject: [PATCH 19/24] correct translations on publish locale buttons --- .../ui/src/elements/PublishButton/index.tsx | 17 ++++++++++++++--- .../ui/src/elements/UnpublishButton/index.tsx | 2 +- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/packages/ui/src/elements/PublishButton/index.tsx b/packages/ui/src/elements/PublishButton/index.tsx index adef44943e9..e5df7145bae 100644 --- a/packages/ui/src/elements/PublishButton/index.tsx +++ b/packages/ui/src/elements/PublishButton/index.tsx @@ -49,7 +49,7 @@ export function PublishButton({ label: labelProp }: PublishButtonClientProps) { serverURL, } = config - const { t } = useTranslation() + const { i18n, t } = useTranslation() const label = labelProp || t('version:publishChanges') const entityConfig = React.useMemo(() => { @@ -190,7 +190,18 @@ export function PublishButton({ label: labelProp }: PublishButtonClientProps) { setMostRecentVersionIsAutosaved(false) } }, - [api, collectionSlug, globalSlug, id, serverURL, setHasPublishedDoc, submit, uploadStatus, setUnpublishedVersionCount, setMostRecentVersionIsAutosaved], + [ + api, + collectionSlug, + globalSlug, + id, + serverURL, + setHasPublishedDoc, + submit, + uploadStatus, + setUnpublishedVersionCount, + setMostRecentVersionIsAutosaved, + ], ) const publishAll = @@ -206,7 +217,7 @@ export function PublishButton({ label: labelProp }: PublishButtonClientProps) { activeLocale && (typeof activeLocale.label === 'string' ? activeLocale.label - : (activeLocale.label?.[localeCode] ?? undefined)) + : (activeLocale.label?.[i18n.language] ?? undefined)) const defaultPublish = publishAll ? publish : () => publishSpecificLocale(activeLocale.code) const defaultLabel = publishAll ? label : t('version:publishIn', { locale: activeLocaleLabel }) diff --git a/packages/ui/src/elements/UnpublishButton/index.tsx b/packages/ui/src/elements/UnpublishButton/index.tsx index 3cb52c86db1..54c76db838e 100644 --- a/packages/ui/src/elements/UnpublishButton/index.tsx +++ b/packages/ui/src/elements/UnpublishButton/index.tsx @@ -167,7 +167,7 @@ export function UnpublishButton() { activeLocale && (typeof activeLocale.label === 'string' ? activeLocale.label - : (activeLocale.label?.[localeCode] ?? undefined)) + : (activeLocale.label?.[i18n.language] ?? undefined)) return ( From 89785e581906b18f7d06b5b31f42e374c9d09e74 Mon Sep 17 00:00:00 2001 From: Jarrod Flesch Date: Wed, 22 Oct 2025 12:36:12 -0400 Subject: [PATCH 20/24] determine if doc has localized fields before render --- packages/next/src/views/Account/index.tsx | 4 ++++ packages/next/src/views/Document/index.tsx | 5 +++- packages/payload/src/exports/shared.ts | 9 +++---- .../utilities/traverseForLocalizedFields.ts | 4 ++-- .../BulkUpload/AddingFilesView/index.tsx | 3 ++- packages/ui/src/elements/Button/index.scss | 4 ++-- .../ui/src/elements/PublishButton/index.tsx | 11 ++------- .../ui/src/elements/UnpublishButton/index.tsx | 24 +++---------------- .../ui/src/providers/DocumentInfo/index.tsx | 3 +++ .../ui/src/providers/DocumentInfo/types.ts | 2 ++ 10 files changed, 29 insertions(+), 40 deletions(-) rename packages/{ui => payload}/src/utilities/traverseForLocalizedFields.ts (85%) diff --git a/packages/next/src/views/Account/index.tsx b/packages/next/src/views/Account/index.tsx index 7bb0ab89a6d..26af8b09a91 100644 --- a/packages/next/src/views/Account/index.tsx +++ b/packages/next/src/views/Account/index.tsx @@ -4,6 +4,7 @@ import { DocumentInfoProvider, EditDepthProvider, HydrateAuthProvider } from '@p import { RenderServerComponent } from '@payloadcms/ui/elements/RenderServerComponent' import { buildFormState } from '@payloadcms/ui/utilities/buildFormState' import { notFound } from 'next/navigation.js' +import { traverseForLocalizedFields } from 'payload/shared' import React from 'react' import { DocumentHeader } from '../../elements/DocumentHeader/index.js' @@ -120,6 +121,9 @@ export async function AccountView({ initPageResult, params, searchParams }: Admi collectionSlug={userSlug} currentEditor={currentEditor} docPermissions={docPermissions} + hasLocalizedFields={ + config.localization && traverseForLocalizedFields(collectionConfig.fields) + } hasPublishedDoc={hasPublishedDoc} hasPublishPermission={hasPublishPermission} hasSavePermission={hasSavePermission} diff --git a/packages/next/src/views/Document/index.tsx b/packages/next/src/views/Document/index.tsx index 0cd1d56e1ee..e8be82fe6a4 100644 --- a/packages/next/src/views/Document/index.tsx +++ b/packages/next/src/views/Document/index.tsx @@ -22,7 +22,7 @@ import { isEditing as getIsEditing } from '@payloadcms/ui/shared' import { buildFormState } from '@payloadcms/ui/utilities/buildFormState' import { notFound, redirect } from 'next/navigation.js' import { logError } from 'payload' -import { formatAdminURL } from 'payload/shared' +import { formatAdminURL, traverseForLocalizedFields } from 'payload/shared' import React from 'react' import type { GenerateEditViewMetadata } from './getMetaBySegment.js' @@ -370,6 +370,9 @@ export const renderDocument = async ({ disableActions={disableActions ?? false} docPermissions={docPermissions} globalSlug={globalConfig?.slug} + hasLocalizedFields={ + config.localization && traverseForLocalizedFields(collectionConfig.fields) + } hasPublishedDoc={hasPublishedDoc} hasPublishPermission={hasPublishPermission} hasSavePermission={hasSavePermission} diff --git a/packages/payload/src/exports/shared.ts b/packages/payload/src/exports/shared.ts index 89f1e439cd5..548ce24a503 100644 --- a/packages/payload/src/exports/shared.ts +++ b/packages/payload/src/exports/shared.ts @@ -60,32 +60,31 @@ export { formatFilesize } from '../uploads/formatFilesize.js' export { isImage } from '../uploads/isImage.js' export { appendUploadSelectFields } from '../utilities/appendUploadSelectFields.js' export { combineWhereConstraints } from '../utilities/combineWhereConstraints.js' - export { deepCopyObject, deepCopyObjectComplex, deepCopyObjectSimple, deepCopyObjectSimpleWithoutReactComponents, } from '../utilities/deepCopyObject.js' + export { deepMerge, deepMergeWithCombinedArrays, deepMergeWithReactComponents, deepMergeWithSourceArrays, } from '../utilities/deepMerge.js' - export { extractID } from '../utilities/extractID.js' export { flattenAllFields } from '../utilities/flattenAllFields.js' + export { flattenTopLevelFields } from '../utilities/flattenTopLevelFields.js' export { formatAdminURL } from '../utilities/formatAdminURL.js' export { formatLabels, toWords } from '../utilities/formatLabels.js' - export { getBestFitFromSizes } from '../utilities/getBestFitFromSizes.js' + export { getDataByPath } from '../utilities/getDataByPath.js' export { getFieldPermissions } from '../utilities/getFieldPermissions.js' export { getSafeRedirect } from '../utilities/getSafeRedirect.js' - export { getSelectMode } from '../utilities/getSelectMode.js' export { getSiblingData } from '../utilities/getSiblingData.js' @@ -126,6 +125,8 @@ export { export { transformWhereQuery } from '../utilities/transformWhereQuery.js' +export { traverseForLocalizedFields } from '../utilities/traverseForLocalizedFields.js' + export { unflatten } from '../utilities/unflatten.js' export { validateMimeType } from '../utilities/validateMimeType.js' export { validateWhereQuery } from '../utilities/validateWhereQuery.js' diff --git a/packages/ui/src/utilities/traverseForLocalizedFields.ts b/packages/payload/src/utilities/traverseForLocalizedFields.ts similarity index 85% rename from packages/ui/src/utilities/traverseForLocalizedFields.ts rename to packages/payload/src/utilities/traverseForLocalizedFields.ts index 2b801b5bedc..e35dd28ff85 100644 --- a/packages/ui/src/utilities/traverseForLocalizedFields.ts +++ b/packages/payload/src/utilities/traverseForLocalizedFields.ts @@ -1,6 +1,6 @@ -import type { ClientField } from 'payload' +import type { ClientField, Field } from '../fields/config/types.js' -export const traverseForLocalizedFields = (fields: ClientField[]): boolean => { +export const traverseForLocalizedFields = (fields: (ClientField | Field)[]): boolean => { for (const field of fields) { if ('localized' in field && field.localized) { return true diff --git a/packages/ui/src/elements/BulkUpload/AddingFilesView/index.tsx b/packages/ui/src/elements/BulkUpload/AddingFilesView/index.tsx index 20a1952aca4..7bfd3dbfe7f 100644 --- a/packages/ui/src/elements/BulkUpload/AddingFilesView/index.tsx +++ b/packages/ui/src/elements/BulkUpload/AddingFilesView/index.tsx @@ -2,7 +2,7 @@ import { useModal } from '@faceless-ui/modal' import { getTranslation } from '@payloadcms/translations' -import { reduceFieldsToValues } from 'payload/shared' +import { reduceFieldsToValues, traverseForLocalizedFields } from 'payload/shared' import React from 'react' import { useAuth } from '../../../providers/Auth/index.js' @@ -54,6 +54,7 @@ export function AddingFilesView() { collectionSlug={collectionSlug} currentEditor={user} docPermissions={docPermissions} + hasLocalizedFields={traverseForLocalizedFields(collectionConfig.fields)} hasPublishedDoc={false} hasPublishPermission={hasPublishPermission} hasSavePermission={hasSavePermission} diff --git a/packages/ui/src/elements/Button/index.scss b/packages/ui/src/elements/Button/index.scss index e8f574dd2f4..999fd6d35d7 100644 --- a/packages/ui/src/elements/Button/index.scss +++ b/packages/ui/src/elements/Button/index.scss @@ -27,8 +27,8 @@ --hover-color: var(--color); &.btn--disabled { - --bg-color: var(--theme-elevation-200); - --color: var(--theme-elevation-800); + --bg-color: var(--theme-elevation-100); + --color: var(--theme-elevation-400); --hover-bg: var(--bg-color); --hover-color: var(--color); } diff --git a/packages/ui/src/elements/PublishButton/index.tsx b/packages/ui/src/elements/PublishButton/index.tsx index e5df7145bae..daa08b79eb0 100644 --- a/packages/ui/src/elements/PublishButton/index.tsx +++ b/packages/ui/src/elements/PublishButton/index.tsx @@ -4,7 +4,7 @@ import type { PublishButtonClientProps } from 'payload' import { useModal } from '@faceless-ui/modal' import * as qs from 'qs-esm' -import React, { useCallback, useEffect, useState } from 'react' +import React, { useCallback } from 'react' import { useForm, useFormModified } from '../../forms/Form/context.js' import { FormSubmit } from '../../forms/Submit/index.js' @@ -15,7 +15,6 @@ import { useEditDepth } from '../../providers/EditDepth/index.js' import { useLocale } from '../../providers/Locale/index.js' import { useOperation } from '../../providers/Operation/index.js' import { useTranslation } from '../../providers/Translation/index.js' -import { traverseForLocalizedFields } from '../../utilities/traverseForLocalizedFields.js' import { PopupList } from '../Popup/index.js' import { ScheduleDrawer } from './ScheduleDrawer/index.js' @@ -25,6 +24,7 @@ export function PublishButton({ label: labelProp }: PublishButtonClientProps) { collectionSlug, docConfig, globalSlug, + hasLocalizedFields, hasPublishedDoc, hasPublishPermission, setHasPublishedDoc, @@ -87,13 +87,6 @@ export function PublishButton({ label: labelProp }: PublishButtonClientProps) { (hasAutosave || !modified), ) - const [hasLocalizedFields, setHasLocalizedFields] = useState(false) - - useEffect(() => { - const hasLocalizedField = traverseForLocalizedFields(entityConfig?.fields) - setHasLocalizedFields(hasLocalizedField) - }, [entityConfig?.fields]) - const canPublishSpecificLocale = localization && hasLocalizedFields && hasPublishPermission const operation = useOperation() diff --git a/packages/ui/src/elements/UnpublishButton/index.tsx b/packages/ui/src/elements/UnpublishButton/index.tsx index 54c76db838e..7c1782bcd95 100644 --- a/packages/ui/src/elements/UnpublishButton/index.tsx +++ b/packages/ui/src/elements/UnpublishButton/index.tsx @@ -1,8 +1,7 @@ 'use client' import { useModal } from '@faceless-ui/modal' -import * as qs from 'qs-esm' -import React, { useCallback, useEffect, useState } from 'react' +import React, { useCallback, useState } from 'react' import { toast } from 'sonner' import { useForm } from '../../forms/Form/context.js' @@ -14,7 +13,6 @@ import { useEditDepth } from '../../providers/EditDepth/index.js' import { useLocale } from '../../providers/Locale/index.js' import { useTranslation } from '../../providers/Translation/index.js' import { requests } from '../../utilities/api.js' -import { traverseForLocalizedFields } from '../../utilities/traverseForLocalizedFields.js' import { ConfirmationModal } from '../ConfirmationModal/index.js' import { PopupList } from '../Popup/index.js' export function UnpublishButton() { @@ -24,6 +22,7 @@ export function UnpublishButton() { data: dataFromProps, docConfig, globalSlug, + hasLocalizedFields, hasPublishedDoc, incrementVersionCount, setHasPublishedDoc, @@ -32,7 +31,7 @@ export function UnpublishButton() { } = useDocumentInfo() const { toggleModal } = useModal() - const { config, getEntityConfig } = useConfig() + const { config } = useConfig() const { reset: resetForm } = useForm() const editDepth = useEditDepth() const { code: localeCode } = useLocale() @@ -48,23 +47,6 @@ export function UnpublishButton() { const { i18n, t } = useTranslation() - const entityConfig = React.useMemo(() => { - if (collectionSlug) { - return getEntityConfig({ collectionSlug }) - } - - if (globalSlug) { - return getEntityConfig({ globalSlug }) - } - }, [collectionSlug, globalSlug, getEntityConfig]) - - const [hasLocalizedFields, setHasLocalizedFields] = useState(false) - - useEffect(() => { - const hasLocalizedField = traverseForLocalizedFields(entityConfig?.fields) - setHasLocalizedFields(hasLocalizedField) - }, [entityConfig?.fields]) - const unpublish = useCallback( (unpublishSpecificLocale?: boolean) => { ;(async () => { diff --git a/packages/ui/src/providers/DocumentInfo/index.tsx b/packages/ui/src/providers/DocumentInfo/index.tsx index 3031a199a5f..b9c7522cc9c 100644 --- a/packages/ui/src/providers/DocumentInfo/index.tsx +++ b/packages/ui/src/providers/DocumentInfo/index.tsx @@ -34,6 +34,7 @@ const DocumentInfo: React.FC< currentEditor: currentEditorFromProps, docPermissions: docPermissionsFromProps, globalSlug, + hasLocalizedFields: hasLocalizedFieldsFromProps, hasPublishedDoc: hasPublishedDocFromProps, hasPublishPermission: hasPublishPermissionFromProps, hasSavePermission: hasSavePermissionFromProps, @@ -116,6 +117,7 @@ const DocumentInfo: React.FC< const [uploadStatus, setUploadStatus] = useControllableState<'failed' | 'idle' | 'uploading'>( 'idle', ) + const [hasLocalizedFields, setHasLocalizedFields] = useState(hasLocalizedFieldsFromProps) const documentLockState = useRef<{ hasShownLockedModal: boolean @@ -363,6 +365,7 @@ const DocumentInfo: React.FC< documentLockState, getDocPermissions, getDocPreferences, + hasLocalizedFields, hasPublishedDoc, hasPublishPermission, hasSavePermission, diff --git a/packages/ui/src/providers/DocumentInfo/types.ts b/packages/ui/src/providers/DocumentInfo/types.ts index cccfe085bd6..4d18e8230f7 100644 --- a/packages/ui/src/providers/DocumentInfo/types.ts +++ b/packages/ui/src/providers/DocumentInfo/types.ts @@ -29,6 +29,7 @@ export type DocumentInfoProps = { readonly disableLeaveWithoutSaving?: boolean readonly docPermissions?: SanitizedDocumentPermissions readonly globalSlug?: SanitizedGlobalConfig['slug'] + readonly hasLocalizedFields: boolean readonly hasPublishedDoc: boolean readonly hasPublishPermission?: boolean readonly hasSavePermission?: boolean @@ -61,6 +62,7 @@ export type DocumentInfoContext = { } | null> getDocPermissions: GetDocPermissions getDocPreferences: () => Promise + hasLocalizedFields: boolean incrementVersionCount: () => void isInitializing: boolean preferencesKey?: string From 9fbbe444408a792b36ccf0f1a8ac55de6148cf0b Mon Sep 17 00:00:00 2001 From: Jarrod Flesch Date: Wed, 22 Oct 2025 13:10:34 -0400 Subject: [PATCH 21/24] account for block references --- packages/next/src/views/Account/index.tsx | 3 +- packages/next/src/views/Document/index.tsx | 3 +- .../utilities/traverseForLocalizedFields.ts | 37 ++++++++++++++++--- .../BulkUpload/AddingFilesView/index.tsx | 7 +++- .../ui/src/providers/DocumentInfo/types.ts | 2 +- 5 files changed, 42 insertions(+), 10 deletions(-) diff --git a/packages/next/src/views/Account/index.tsx b/packages/next/src/views/Account/index.tsx index 26af8b09a91..36f833bf151 100644 --- a/packages/next/src/views/Account/index.tsx +++ b/packages/next/src/views/Account/index.tsx @@ -122,7 +122,8 @@ export async function AccountView({ initPageResult, params, searchParams }: Admi currentEditor={currentEditor} docPermissions={docPermissions} hasLocalizedFields={ - config.localization && traverseForLocalizedFields(collectionConfig.fields) + config.localization && + traverseForLocalizedFields({ config, fields: collectionConfig.fields }) } hasPublishedDoc={hasPublishedDoc} hasPublishPermission={hasPublishPermission} diff --git a/packages/next/src/views/Document/index.tsx b/packages/next/src/views/Document/index.tsx index e8be82fe6a4..abee9e45f55 100644 --- a/packages/next/src/views/Document/index.tsx +++ b/packages/next/src/views/Document/index.tsx @@ -371,7 +371,8 @@ export const renderDocument = async ({ docPermissions={docPermissions} globalSlug={globalConfig?.slug} hasLocalizedFields={ - config.localization && traverseForLocalizedFields(collectionConfig.fields) + config.localization && + traverseForLocalizedFields({ config, fields: collectionConfig.fields }) } hasPublishedDoc={hasPublishedDoc} hasPublishPermission={hasPublishPermission} diff --git a/packages/payload/src/utilities/traverseForLocalizedFields.ts b/packages/payload/src/utilities/traverseForLocalizedFields.ts index e35dd28ff85..996cad9846c 100644 --- a/packages/payload/src/utilities/traverseForLocalizedFields.ts +++ b/packages/payload/src/utilities/traverseForLocalizedFields.ts @@ -1,6 +1,14 @@ -import type { ClientField, Field } from '../fields/config/types.js' +import type { ClientConfig } from '../config/client.js' +import type { SanitizedConfig } from '../config/types.js' +import type { Block, ClientBlock, ClientField, Field } from '../fields/config/types.js' -export const traverseForLocalizedFields = (fields: (ClientField | Field)[]): boolean => { +export const traverseForLocalizedFields = ({ + config, + fields, +}: { + config: ClientConfig | SanitizedConfig + fields: (ClientField | Field)[] +}): boolean => { for (const field of fields) { if ('localized' in field && field.localized) { return true @@ -11,15 +19,30 @@ export const traverseForLocalizedFields = (fields: (ClientField | Field)[]): boo case 'collapsible': case 'group': case 'row': - if (field.fields && traverseForLocalizedFields(field.fields)) { + if (field.fields && traverseForLocalizedFields({ config, fields: field.fields })) { return true } break case 'blocks': + if ('blockReferences' in field && field.blockReferences) { + for (const blockReference of field.blockReferences) { + let block: Block | ClientBlock | null = null + if (typeof blockReference === 'string') { + block = config.blocks?.find((each) => each.slug === blockReference) ?? null + } else { + block = blockReference + } + + if (block && traverseForLocalizedFields({ config, fields: block.fields })) { + return true + } + } + } + if (field.blocks) { for (const block of field.blocks) { - if (block.fields && traverseForLocalizedFields(block.fields)) { + if (block.fields && traverseForLocalizedFields({ config, fields: block.fields })) { return true } } @@ -32,7 +55,11 @@ export const traverseForLocalizedFields = (fields: (ClientField | Field)[]): boo if ('localized' in tab && tab.localized) { return true } - if ('fields' in tab && tab.fields && traverseForLocalizedFields(tab.fields)) { + if ( + 'fields' in tab && + tab.fields && + traverseForLocalizedFields({ config, fields: tab.fields }) + ) { return true } } diff --git a/packages/ui/src/elements/BulkUpload/AddingFilesView/index.tsx b/packages/ui/src/elements/BulkUpload/AddingFilesView/index.tsx index 7bfd3dbfe7f..6f8eba5a889 100644 --- a/packages/ui/src/elements/BulkUpload/AddingFilesView/index.tsx +++ b/packages/ui/src/elements/BulkUpload/AddingFilesView/index.tsx @@ -33,7 +33,7 @@ export function AddingFilesView() { updateUploadEdits, } = useFormsManager() const activeForm = forms[activeIndex] - const { getEntityConfig } = useConfig() + const { config, getEntityConfig } = useConfig() const { i18n } = useTranslation() const { user } = useAuth() const { openModal } = useModal() @@ -54,7 +54,10 @@ export function AddingFilesView() { collectionSlug={collectionSlug} currentEditor={user} docPermissions={docPermissions} - hasLocalizedFields={traverseForLocalizedFields(collectionConfig.fields)} + hasLocalizedFields={ + config.localization && + traverseForLocalizedFields({ config, fields: collectionConfig.fields }) + } hasPublishedDoc={false} hasPublishPermission={hasPublishPermission} hasSavePermission={hasSavePermission} diff --git a/packages/ui/src/providers/DocumentInfo/types.ts b/packages/ui/src/providers/DocumentInfo/types.ts index 4d18e8230f7..0279a95734a 100644 --- a/packages/ui/src/providers/DocumentInfo/types.ts +++ b/packages/ui/src/providers/DocumentInfo/types.ts @@ -29,7 +29,7 @@ export type DocumentInfoProps = { readonly disableLeaveWithoutSaving?: boolean readonly docPermissions?: SanitizedDocumentPermissions readonly globalSlug?: SanitizedGlobalConfig['slug'] - readonly hasLocalizedFields: boolean + readonly hasLocalizedFields?: boolean readonly hasPublishedDoc: boolean readonly hasPublishPermission?: boolean readonly hasSavePermission?: boolean From 8e245bdc593883be1ff6632ff9b61be0120857be Mon Sep 17 00:00:00 2001 From: Jarrod Flesch Date: Wed, 22 Oct 2025 14:12:22 -0400 Subject: [PATCH 22/24] cleanup unpublish button --- .../ui/src/elements/UnpublishButton/index.tsx | 34 ++++++++----------- 1 file changed, 15 insertions(+), 19 deletions(-) diff --git a/packages/ui/src/elements/UnpublishButton/index.tsx b/packages/ui/src/elements/UnpublishButton/index.tsx index 7c1782bcd95..c81bba28f27 100644 --- a/packages/ui/src/elements/UnpublishButton/index.tsx +++ b/packages/ui/src/elements/UnpublishButton/index.tsx @@ -1,15 +1,14 @@ 'use client' import { useModal } from '@faceless-ui/modal' +import * as qs from 'qs-esm' import React, { useCallback, useState } from 'react' import { toast } from 'sonner' import { useForm } from '../../forms/Form/context.js' import { FormSubmit } from '../../forms/Submit/index.js' -import { useHotkey } from '../../hooks/useHotkey.js' import { useConfig } from '../../providers/Config/index.js' import { useDocumentInfo } from '../../providers/DocumentInfo/index.js' -import { useEditDepth } from '../../providers/EditDepth/index.js' import { useLocale } from '../../providers/Locale/index.js' import { useTranslation } from '../../providers/Translation/index.js' import { requests } from '../../utilities/api.js' @@ -20,7 +19,6 @@ export function UnpublishButton() { id, collectionSlug, data: dataFromProps, - docConfig, globalSlug, hasLocalizedFields, hasPublishedDoc, @@ -33,7 +31,6 @@ export function UnpublishButton() { const { config } = useConfig() const { reset: resetForm } = useForm() - const editDepth = useEditDepth() const { code: localeCode } = useLocale() const [unpublishSpecificLocale, setUnpublishSpecificLocale] = useState(false) @@ -53,23 +50,31 @@ export function UnpublishButton() { let url let method - const body = unpublishSpecificLocale ? {} : { _status: 'draft' } - const params = - unpublishSpecificLocale && localeCode ? `&unpublishSpecificLocale=${localeCode}` : '' + const queryString = qs.stringify( + { + depth: '0', + 'fallback-locale': 'null', + locale: localeCode, + ...(unpublishSpecificLocale && localeCode + ? { unpublishSpecificLocale: localeCode } + : {}), + }, + { addQueryPrefix: true }, + ) if (collectionSlug) { - url = `${serverURL}${api}/${collectionSlug}/${id}?locale=${localeCode}&fallback-locale=null&depth=0${params}` + url = `${serverURL}${api}/${collectionSlug}/${id}${queryString}` method = 'patch' } if (globalSlug) { - url = `${serverURL}${api}/globals/${globalSlug}?locale=${localeCode}&fallback-locale=null&depth=0${params}` + url = `${serverURL}${api}/globals/${globalSlug}${queryString}` method = 'post' } try { const res = await requests[method](url, { - body: JSON.stringify(body), + body: JSON.stringify(unpublishSpecificLocale ? {} : { _status: 'draft' }), headers: { 'Accept-Language': i18n.language, 'Content-Type': 'application/json', @@ -126,15 +131,6 @@ export function UnpublishButton() { ], ) - useHotkey({ cmdCtrlKey: true, editDepth, keyCodes: ['s'] }, (e) => { - e.preventDefault() - e.stopPropagation() - - if (unpublish && docConfig.versions?.drafts && docConfig.versions?.drafts?.autosave) { - unpublish(false) - } - }) - const canUnpublish = hasPublishedDoc const canUnpublishCurrentLocale = hasLocalizedFields && canUnpublish From beb711ff99b7283e15d9d7cf61f21b14b066ca59 Mon Sep 17 00:00:00 2001 From: Jarrod Flesch Date: Wed, 22 Oct 2025 15:59:07 -0400 Subject: [PATCH 23/24] fix globals not rendering --- packages/next/src/views/Document/index.tsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/next/src/views/Document/index.tsx b/packages/next/src/views/Document/index.tsx index 6091b854fca..aff696725b0 100644 --- a/packages/next/src/views/Document/index.tsx +++ b/packages/next/src/views/Document/index.tsx @@ -372,7 +372,10 @@ export const renderDocument = async ({ globalSlug={globalConfig?.slug} hasLocalizedFields={ config.localization && - traverseForLocalizedFields({ config, fields: collectionConfig.fields }) + traverseForLocalizedFields({ + config, + fields: globalConfig?.fields || collectionConfig?.fields, + }) } hasPublishedDoc={hasPublishedDoc} hasPublishPermission={hasPublishPermission} From b132d2c64aaabcb8069f7f1378e9d0fa624f6296 Mon Sep 17 00:00:00 2001 From: Jarrod Flesch Date: Thu, 23 Oct 2025 09:07:03 -0400 Subject: [PATCH 24/24] adjust locale label rendering --- .../ui/src/elements/PublishButton/index.tsx | 27 +++++++------------ .../ui/src/elements/UnpublishButton/index.tsx | 20 +++----------- 2 files changed, 13 insertions(+), 34 deletions(-) diff --git a/packages/ui/src/elements/PublishButton/index.tsx b/packages/ui/src/elements/PublishButton/index.tsx index daa08b79eb0..936429861d0 100644 --- a/packages/ui/src/elements/PublishButton/index.tsx +++ b/packages/ui/src/elements/PublishButton/index.tsx @@ -3,6 +3,7 @@ import type { PublishButtonClientProps } from 'payload' import { useModal } from '@faceless-ui/modal' +import { getTranslation } from '@payloadcms/translations' import * as qs from 'qs-esm' import React, { useCallback } from 'react' @@ -38,7 +39,8 @@ export function PublishButton({ label: labelProp }: PublishButtonClientProps) { const { submit } = useForm() const modified = useFormModified() const editDepth = useEditDepth() - const { code: localeCode } = useLocale() + const { code: localeCode, label: localeLabel } = useLocale() + const { i18n, t } = useTranslation() const { isModalOpen, toggleModal } = useModal() const drawerSlug = `schedule-publish-${id}` @@ -49,7 +51,6 @@ export function PublishButton({ label: labelProp }: PublishButtonClientProps) { serverURL, } = config - const { i18n, t } = useTranslation() const label = labelProp || t('version:publishChanges') const entityConfig = React.useMemo(() => { @@ -200,24 +201,14 @@ export function PublishButton({ label: labelProp }: PublishButtonClientProps) { const publishAll = !localization || (localization && localization.defaultLocalePublishOption !== 'active') - const activeLocale = - localization && - localization?.locales.find((locale) => - typeof locale === 'string' ? locale === localeCode : locale.code === localeCode, - ) - - const activeLocaleLabel = - activeLocale && - (typeof activeLocale.label === 'string' - ? activeLocale.label - : (activeLocale.label?.[i18n.language] ?? undefined)) - - const defaultPublish = publishAll ? publish : () => publishSpecificLocale(activeLocale.code) - const defaultLabel = publishAll ? label : t('version:publishIn', { locale: activeLocaleLabel }) + const defaultPublish = publishAll ? publish : () => publishSpecificLocale(localeCode) + const defaultLabel = publishAll + ? label + : t('version:publishIn', { locale: getTranslation(localeLabel, i18n) }) - const secondaryPublish = publishAll ? () => publishSpecificLocale(activeLocale.code) : publish + const secondaryPublish = publishAll ? () => publishSpecificLocale(localeCode) : publish const secondaryLabel = publishAll - ? t('version:publishIn', { locale: activeLocaleLabel }) + ? t('version:publishIn', { locale: getTranslation(localeLabel, i18n) }) : t('version:publishAllLocales') if (!hasPublishPermission) { diff --git a/packages/ui/src/elements/UnpublishButton/index.tsx b/packages/ui/src/elements/UnpublishButton/index.tsx index c81bba28f27..4f522611b6f 100644 --- a/packages/ui/src/elements/UnpublishButton/index.tsx +++ b/packages/ui/src/elements/UnpublishButton/index.tsx @@ -1,6 +1,7 @@ 'use client' import { useModal } from '@faceless-ui/modal' +import { getTranslation } from '@payloadcms/translations' import * as qs from 'qs-esm' import React, { useCallback, useState } from 'react' import { toast } from 'sonner' @@ -31,13 +32,12 @@ export function UnpublishButton() { const { config } = useConfig() const { reset: resetForm } = useForm() - const { code: localeCode } = useLocale() + const { code: localeCode, label: localeLabel } = useLocale() const [unpublishSpecificLocale, setUnpublishSpecificLocale] = useState(false) const unPublishModalSlug = `confirm-un-publish-${id}` const { - localization, routes: { api }, serverURL, } = config @@ -135,18 +135,6 @@ export function UnpublishButton() { const canUnpublishCurrentLocale = hasLocalizedFields && canUnpublish - const activeLocale = - localization && - localization?.locales.find((locale) => - typeof locale === 'string' ? locale === localeCode : locale.code === localeCode, - ) - - const activeLocaleLabel = - activeLocale && - (typeof activeLocale.label === 'string' - ? activeLocale.label - : (activeLocale.label?.[i18n.language] ?? undefined)) - return ( {canUnpublish && ( @@ -171,7 +159,7 @@ export function UnpublishButton() { close() }} > - {t('version:unpublishIn', { locale: activeLocaleLabel })} + {t('version:unpublishIn', { locale: getTranslation(localeLabel, i18n) })} ) @@ -183,7 +171,7 @@ export function UnpublishButton() {