@strapi/i18n 0.0.0-experimental.d53e940834bf72ddc725f1d2fd36dac9abec30cb → 0.0.0-experimental.d65615a2b9130dd742d3c396674457d7971da928

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/LICENSE +18 -3
  2. package/dist/_chunks/{SettingsPage-w9zz705o.mjs → SettingsPage-Ce-YIA4X.mjs} +8 -8
  3. package/dist/_chunks/SettingsPage-Ce-YIA4X.mjs.map +1 -0
  4. package/dist/_chunks/{SettingsPage-CxZ9qSb_.js → SettingsPage-nhDLojjb.js} +8 -8
  5. package/dist/_chunks/SettingsPage-nhDLojjb.js.map +1 -0
  6. package/dist/_chunks/{en-CM6Pjfyv.mjs → en-BYRZFDBV.mjs} +9 -2
  7. package/dist/_chunks/en-BYRZFDBV.mjs.map +1 -0
  8. package/dist/_chunks/{en-BsOU9o5z.js → en-Dk9At9_Z.js} +9 -2
  9. package/dist/_chunks/en-Dk9At9_Z.js.map +1 -0
  10. package/dist/_chunks/{index-CLtneDAv.js → index-DAbvvXN9.js} +416 -181
  11. package/dist/_chunks/index-DAbvvXN9.js.map +1 -0
  12. package/dist/_chunks/{index-jbI6Njjb.mjs → index-Dy4uJV-2.mjs} +412 -177
  13. package/dist/_chunks/index-Dy4uJV-2.mjs.map +1 -0
  14. package/dist/admin/index.js +1 -1
  15. package/dist/admin/index.mjs +1 -1
  16. package/dist/admin/src/components/BulkLocaleActionModal.d.ts +2 -1
  17. package/dist/admin/src/components/CMHeaderActions.d.ts +29 -3
  18. package/dist/admin/src/components/CreateLocale.d.ts +6 -6
  19. package/dist/admin/src/contentReleasesHooks/releaseDetailsView.d.ts +9 -5
  20. package/dist/admin/src/utils/clean.d.ts +4 -0
  21. package/dist/admin/src/utils/schemas.d.ts +1 -0
  22. package/dist/server/index.js +397 -487
  23. package/dist/server/index.js.map +1 -1
  24. package/dist/server/index.mjs +398 -488
  25. package/dist/server/index.mjs.map +1 -1
  26. package/dist/server/src/bootstrap.d.ts +1 -4
  27. package/dist/server/src/bootstrap.d.ts.map +1 -1
  28. package/dist/server/src/index.d.ts +15 -13
  29. package/dist/server/src/index.d.ts.map +1 -1
  30. package/dist/server/src/register.d.ts.map +1 -1
  31. package/dist/server/src/services/index.d.ts +14 -10
  32. package/dist/server/src/services/index.d.ts.map +1 -1
  33. package/dist/server/src/services/permissions/actions.d.ts +14 -2
  34. package/dist/server/src/services/permissions/actions.d.ts.map +1 -1
  35. package/dist/server/src/services/permissions.d.ts +14 -2
  36. package/dist/server/src/services/permissions.d.ts.map +1 -1
  37. package/dist/server/src/utils/index.d.ts +0 -2
  38. package/dist/server/src/utils/index.d.ts.map +1 -1
  39. package/package.json +9 -9
  40. package/dist/_chunks/SettingsPage-CxZ9qSb_.js.map +0 -1
  41. package/dist/_chunks/SettingsPage-w9zz705o.mjs.map +0 -1
  42. package/dist/_chunks/en-BsOU9o5z.js.map +0 -1
  43. package/dist/_chunks/en-CM6Pjfyv.mjs.map +0 -1
  44. package/dist/_chunks/index-CLtneDAv.js.map +0 -1
  45. package/dist/_chunks/index-jbI6Njjb.mjs.map +0 -1
  46. package/dist/admin/src/components/Initializer.d.ts +0 -5
  47. package/dist/server/src/migrations/content-type/disable/index.d.ts +0 -3
  48. package/dist/server/src/migrations/content-type/disable/index.d.ts.map +0 -1
  49. package/dist/server/src/migrations/content-type/enable/index.d.ts +0 -3
  50. package/dist/server/src/migrations/content-type/enable/index.d.ts.map +0 -1
  51. package/dist/server/src/services/entity-service-decorator.d.ts +0 -29
  52. package/dist/server/src/services/entity-service-decorator.d.ts.map +0 -1
  53. package/strapi-server.js +0 -3
@@ -1,12 +1,13 @@
1
1
  import get from "lodash/get";
2
2
  import * as yup from "yup";
3
- import { jsxs, jsx } from "react/jsx-runtime";
3
+ import { jsxs, jsx, Fragment } from "react/jsx-runtime";
4
4
  import * as React from "react";
5
- import { Typography, Dialog, Field, Checkbox, Flex, Button as Button$1, Box, Status, IconButton, Tooltip, SingleSelect, SingleSelectOption, VisuallyHidden, useCollator, Popover } from "@strapi/design-system";
6
- import { WarningCircle, Pencil, CrossCircle, CheckCircle, ArrowsCounterClockwise, Trash, ListPlus, Earth, EarthStriked, CaretDown } from "@strapi/icons";
5
+ import { Typography, Dialog, Field, Checkbox, Flex, Button, Modal, Box, Status, IconButton, Tooltip, SingleSelect, SingleSelectOption, VisuallyHidden, useCollator, Popover } from "@strapi/design-system";
6
+ import { WarningCircle, Pencil, CrossCircle, CheckCircle, ArrowsCounterClockwise, Trash, Plus, Download, ListPlus, Cross, Earth, EarthStriked, CaretDown } from "@strapi/icons";
7
7
  import { useIntl } from "react-intl";
8
8
  import { styled } from "styled-components";
9
- import { useAuth, adminApi, useTable, Table, useQueryParams, useNotification, useAPIErrorHandler } from "@strapi/admin/strapi-admin";
9
+ import { skipToken } from "@reduxjs/toolkit/query";
10
+ import { useAuth, adminApi, useTable, Table, useQueryParams, useForm, useNotification, useAPIErrorHandler } from "@strapi/admin/strapi-admin";
10
11
  import { unstable_useDocument, unstable_useDocumentActions, buildValidParams } from "@strapi/content-manager/strapi-admin";
11
12
  import { useParams, Link, useNavigate, matchPath } from "react-router-dom";
12
13
  import * as qs from "qs";
@@ -77,11 +78,11 @@ const CheckboxConfirmation = ({
77
78
  }) }) })
78
79
  ] }) }),
79
80
  /* @__PURE__ */ jsxs(Dialog.Footer, { children: [
80
- /* @__PURE__ */ jsx(Dialog.Cancel, { children: /* @__PURE__ */ jsx(Button$1, { variant: "tertiary", children: formatMessage({
81
+ /* @__PURE__ */ jsx(Dialog.Cancel, { children: /* @__PURE__ */ jsx(Button, { variant: "tertiary", children: formatMessage({
81
82
  id: "components.popUpWarning.button.cancel",
82
83
  defaultMessage: "No, cancel"
83
84
  }) }) }),
84
- /* @__PURE__ */ jsx(Dialog.Action, { children: /* @__PURE__ */ jsx(Button$1, { variant: "danger-light", onClick: handleConfirm, children: formatMessage({
85
+ /* @__PURE__ */ jsx(Dialog.Action, { children: /* @__PURE__ */ jsx(Button, { variant: "danger-light", onClick: handleConfirm, children: formatMessage({
85
86
  id: getTranslation("CheckboxConfirmation.Modal.button-confirm"),
86
87
  defaultMessage: "Yes, disable"
87
88
  }) }) })
@@ -136,7 +137,7 @@ const useI18n = () => {
136
137
  model: params.slug
137
138
  },
138
139
  {
139
- skip: !params.slug || !params.collectionType
140
+ skip: true
140
141
  }
141
142
  );
142
143
  if (doesPluginOptionsHaveI18nLocalized(schema?.pluginOptions)) {
@@ -216,10 +217,94 @@ const relationsApi = i18nApi.injectEndpoints({
216
217
  })
217
218
  });
218
219
  const { useGetManyDraftRelationCountQuery } = relationsApi;
220
+ const cleanData = (data, schema, components) => {
221
+ const cleanedData = removeFields(data, [
222
+ "createdAt",
223
+ "createdBy",
224
+ "updatedAt",
225
+ "updatedBy",
226
+ "id",
227
+ "documentId",
228
+ "publishedAt",
229
+ "strapi_stage",
230
+ "strapi_assignee",
231
+ "locale",
232
+ "status"
233
+ ]);
234
+ const cleanedDataWithoutPasswordAndRelation = recursiveRemoveFieldTypes(
235
+ cleanedData,
236
+ schema,
237
+ components,
238
+ ["relation", "password"]
239
+ );
240
+ return cleanedDataWithoutPasswordAndRelation;
241
+ };
242
+ const removeFields = (data, fields) => {
243
+ return Object.keys(data).reduce((acc, current) => {
244
+ if (fields.includes(current)) {
245
+ return acc;
246
+ }
247
+ acc[current] = data[current];
248
+ return acc;
249
+ }, {});
250
+ };
251
+ const recursiveRemoveFieldTypes = (data, schema, components, fields) => {
252
+ return Object.keys(data).reduce((acc, current) => {
253
+ const attribute = schema.attributes[current] ?? { type: void 0 };
254
+ if (fields.includes(attribute.type)) {
255
+ return acc;
256
+ }
257
+ if (attribute.type === "dynamiczone") {
258
+ acc[current] = data[current].map((componentValue, index2) => {
259
+ const { id: _, ...rest } = recursiveRemoveFieldTypes(
260
+ componentValue,
261
+ components[componentValue.__component],
262
+ components,
263
+ fields
264
+ );
265
+ return {
266
+ ...rest,
267
+ __temp_key__: index2 + 1
268
+ };
269
+ });
270
+ } else if (attribute.type === "component") {
271
+ const { repeatable, component } = attribute;
272
+ if (repeatable) {
273
+ acc[current] = (data[current] ?? []).map((compoData, index2) => {
274
+ const { id: _, ...rest } = recursiveRemoveFieldTypes(
275
+ compoData,
276
+ components[component],
277
+ components,
278
+ fields
279
+ );
280
+ return {
281
+ ...rest,
282
+ __temp_key__: index2 + 1
283
+ };
284
+ });
285
+ } else {
286
+ const { id: _, ...rest } = recursiveRemoveFieldTypes(
287
+ data[current] ?? {},
288
+ components[component],
289
+ components,
290
+ fields
291
+ );
292
+ acc[current] = rest;
293
+ }
294
+ } else {
295
+ acc[current] = data[current];
296
+ }
297
+ return acc;
298
+ }, {});
299
+ };
219
300
  const isErrorMessageDescriptor = (object) => {
220
301
  return typeof object === "object" && object !== null && "id" in object && "defaultMessage" in object;
221
302
  };
222
- const EntryValidationText = ({ status = "draft", validationErrors }) => {
303
+ const EntryValidationText = ({
304
+ status = "draft",
305
+ validationErrors,
306
+ action
307
+ }) => {
223
308
  const { formatMessage } = useIntl();
224
309
  const getErrorStr = (key, value) => {
225
310
  if (typeof value === "string") {
@@ -253,30 +338,63 @@ const EntryValidationText = ({ status = "draft", validationErrors }) => {
253
338
  ) })
254
339
  ] });
255
340
  }
256
- if (status === "published") {
257
- return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
258
- /* @__PURE__ */ jsx(CheckCircle, { fill: "success600" }),
259
- /* @__PURE__ */ jsx(Typography, { textColor: "success600", fontWeight: "bold", children: formatMessage({
260
- id: "content-manager.bulk-publish.already-published",
261
- defaultMessage: "Already Published"
262
- }) })
263
- ] });
264
- }
265
- if (status === "modified") {
266
- return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
267
- /* @__PURE__ */ jsx(ArrowsCounterClockwise, { fill: "alternative600" }),
268
- /* @__PURE__ */ jsx(Typography, { children: formatMessage({
269
- id: "app.utils.ready-to-publish-changes",
270
- defaultMessage: "Ready to publish changes"
271
- }) })
272
- ] });
273
- }
341
+ const getStatusMessage = () => {
342
+ if (action === "bulk-publish") {
343
+ if (status === "published") {
344
+ return {
345
+ icon: /* @__PURE__ */ jsx(CheckCircle, { fill: "success600" }),
346
+ text: formatMessage({
347
+ id: "content-manager.bulk-publish.already-published",
348
+ defaultMessage: "Already Published"
349
+ }),
350
+ textColor: "success600",
351
+ fontWeight: "bold"
352
+ };
353
+ } else if (status === "modified") {
354
+ return {
355
+ icon: /* @__PURE__ */ jsx(ArrowsCounterClockwise, { fill: "alternative600" }),
356
+ text: formatMessage({
357
+ id: "app.utils.ready-to-publish-changes",
358
+ defaultMessage: "Ready to publish changes"
359
+ })
360
+ };
361
+ } else {
362
+ return {
363
+ icon: /* @__PURE__ */ jsx(CheckCircle, { fill: "success600" }),
364
+ text: formatMessage({
365
+ id: "app.utils.ready-to-publish",
366
+ defaultMessage: "Ready to publish"
367
+ })
368
+ };
369
+ }
370
+ } else {
371
+ if (status === "draft") {
372
+ return {
373
+ icon: /* @__PURE__ */ jsx(CheckCircle, { fill: "success600" }),
374
+ text: formatMessage({
375
+ id: "content-manager.bulk-unpublish.already-unpublished",
376
+ defaultMessage: "Already Unpublished"
377
+ }),
378
+ textColor: "success600",
379
+ fontWeight: "bold"
380
+ };
381
+ } else {
382
+ return {
383
+ icon: /* @__PURE__ */ jsx(CheckCircle, { fill: "success600" }),
384
+ text: formatMessage({
385
+ id: "app.utils.ready-to-unpublish-changes",
386
+ defaultMessage: "Ready to unpublish"
387
+ }),
388
+ textColor: "success600",
389
+ fontWeight: "bold"
390
+ };
391
+ }
392
+ }
393
+ };
394
+ const { icon, text, textColor = "success600", fontWeight = "normal" } = getStatusMessage();
274
395
  return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
275
- /* @__PURE__ */ jsx(CheckCircle, { fill: "success600" }),
276
- /* @__PURE__ */ jsx(Typography, { children: formatMessage({
277
- id: "app.utils.ready-to-publish",
278
- defaultMessage: "Ready to publish"
279
- }) })
396
+ icon,
397
+ /* @__PURE__ */ jsx(Typography, { textColor, fontWeight, children: text })
280
398
  ] });
281
399
  };
282
400
  const BoldChunk = (chunks) => /* @__PURE__ */ jsx(Typography, { fontWeight: "bold", children: chunks });
@@ -284,7 +402,8 @@ const BulkLocaleActionModal = ({
284
402
  headers,
285
403
  rows,
286
404
  localesMetadata,
287
- validationErrors = {}
405
+ validationErrors = {},
406
+ action
288
407
  }) => {
289
408
  const { formatMessage } = useIntl();
290
409
  const selectedRows = useTable(
@@ -297,27 +416,29 @@ const BulkLocaleActionModal = ({
297
416
  return acc;
298
417
  }, {});
299
418
  const localesWithErrors = Object.keys(validationErrors);
300
- const alreadyPublishedCount = selectedRows.filter(
419
+ const publishedCount = selectedRows.filter(
301
420
  ({ locale }) => currentStatusByLocale[locale] === "published"
302
421
  ).length;
303
- const readyToPublishCount = selectedRows.filter(
422
+ const draftCount = selectedRows.filter(
304
423
  ({ locale }) => (currentStatusByLocale[locale] === "draft" || currentStatusByLocale[locale] === "modified") && !localesWithErrors.includes(locale)
305
424
  ).length;
306
425
  const withErrorsCount = localesWithErrors.length;
426
+ const messageId = action === "bulk-publish" ? "content-manager.containers.list.selectedEntriesModal.selectedCount.publish" : "content-manager.containers.list.selectedEntriesModal.selectedCount.unpublish";
427
+ const defaultMessage = action === "bulk-publish" ? "<b>{publishedCount}</b> {publishedCount, plural, =0 {entries} one {entry} other {entries}} already published. <b>{draftCount}</b> {draftCount, plural, =0 {entries} one {entry} other {entries}} ready to publish. <b>{withErrorsCount}</b> {withErrorsCount, plural, =0 {entries} one {entry} other {entries}} waiting for action." : "<b>{draftCount}</b> {draftCount, plural, =0 {entries} one {entry} other {entries}} already unpublished. <b>{publishedCount}</b> {publishedCount, plural, =0 {entries} one {entry} other {entries}} ready to unpublish.";
307
428
  return formatMessage(
308
429
  {
309
- id: "content-manager.containers.list.selectedEntriesModal.selectedCount",
310
- defaultMessage: "<b>{alreadyPublishedCount}</b> {alreadyPublishedCount, plural, =0 {entries} one {entry} other {entries}} already published. <b>{readyToPublishCount}</b> {readyToPublishCount, plural, =0 {entries} one {entry} other {entries}} ready to publish. <b>{withErrorsCount}</b> {withErrorsCount, plural, =0 {entries} one {entry} other {entries}} waiting for action."
430
+ id: messageId,
431
+ defaultMessage
311
432
  },
312
433
  {
313
434
  withErrorsCount,
314
- readyToPublishCount,
315
- alreadyPublishedCount,
435
+ draftCount,
436
+ publishedCount,
316
437
  b: BoldChunk
317
438
  }
318
439
  );
319
440
  };
320
- return /* @__PURE__ */ jsxs(React.Fragment, { children: [
441
+ return /* @__PURE__ */ jsxs(Modal.Body, { children: [
321
442
  /* @__PURE__ */ jsx(Typography, { children: getFormattedCountMessage() }),
322
443
  /* @__PURE__ */ jsx(Box, { marginTop: 5, children: /* @__PURE__ */ jsxs(Table.Content, { children: [
323
444
  /* @__PURE__ */ jsxs(Table.Head, { children: [
@@ -344,7 +465,7 @@ const BulkLocaleActionModal = ({
344
465
  children: /* @__PURE__ */ jsx(Typography, { tag: "span", variant: "pi", fontWeight: "bold", children: capitalize(status) })
345
466
  }
346
467
  ) }) }),
347
- /* @__PURE__ */ jsx(Table.Cell, { children: /* @__PURE__ */ jsx(EntryValidationText, { validationErrors: error, status }) }),
468
+ /* @__PURE__ */ jsx(Table.Cell, { children: /* @__PURE__ */ jsx(EntryValidationText, { validationErrors: error, status, action }) }),
348
469
  /* @__PURE__ */ jsx(Table.Cell, { children: /* @__PURE__ */ jsx(
349
470
  IconButton,
350
471
  {
@@ -361,7 +482,7 @@ const BulkLocaleActionModal = ({
361
482
  name: locale
362
483
  }
363
484
  ),
364
- borderWidth: 0,
485
+ variant: "ghost",
365
486
  children: /* @__PURE__ */ jsx(Pencil, {})
366
487
  }
367
488
  ) })
@@ -370,6 +491,48 @@ const BulkLocaleActionModal = ({
370
491
  ] }) })
371
492
  ] });
372
493
  };
494
+ const statusVariants = {
495
+ draft: "secondary",
496
+ published: "success",
497
+ modified: "alternative"
498
+ };
499
+ const LocaleOption = ({
500
+ isDraftAndPublishEnabled,
501
+ locale,
502
+ status,
503
+ entryExists
504
+ }) => {
505
+ const { formatMessage } = useIntl();
506
+ if (!entryExists) {
507
+ return formatMessage(
508
+ {
509
+ id: getTranslation("CMEditViewLocalePicker.locale.create"),
510
+ defaultMessage: "Create <bold>{locale}</bold> locale"
511
+ },
512
+ {
513
+ bold: (locale2) => /* @__PURE__ */ jsx("b", { children: locale2 }),
514
+ locale: locale.name
515
+ }
516
+ );
517
+ }
518
+ return /* @__PURE__ */ jsxs(Flex, { width: "100%", gap: 1, justifyContent: "space-between", children: [
519
+ /* @__PURE__ */ jsx(Typography, { children: locale.name }),
520
+ isDraftAndPublishEnabled ? /* @__PURE__ */ jsx(
521
+ Status,
522
+ {
523
+ display: "flex",
524
+ paddingLeft: "6px",
525
+ paddingRight: "6px",
526
+ paddingTop: "2px",
527
+ paddingBottom: "2px",
528
+ showBullet: false,
529
+ size: "S",
530
+ variant: statusVariants[status],
531
+ children: /* @__PURE__ */ jsx(Typography, { tag: "span", variant: "pi", fontWeight: "bold", children: capitalize(status) })
532
+ }
533
+ ) : null
534
+ ] });
535
+ };
373
536
  const LocalePickerAction = ({
374
537
  document,
375
538
  meta,
@@ -381,7 +544,13 @@ const LocalePickerAction = ({
381
544
  const [{ query }, setQuery] = useQueryParams();
382
545
  const { hasI18n, canCreate, canRead } = useI18n();
383
546
  const { data: locales = [] } = useGetLocalesQuery();
384
- const { schema } = unstable_useDocument({ model, collectionType, documentId });
547
+ const currentDesiredLocale = query.plugins?.i18n?.locale;
548
+ const { schema } = unstable_useDocument({
549
+ model,
550
+ collectionType,
551
+ documentId,
552
+ params: { locale: currentDesiredLocale }
553
+ });
385
554
  const handleSelect = React.useCallback(
386
555
  (value) => {
387
556
  setQuery({
@@ -399,53 +568,47 @@ const LocalePickerAction = ({
399
568
  if (!Array.isArray(locales) || !hasI18n) {
400
569
  return;
401
570
  }
402
- const currentDesiredLocale = query.plugins?.i18n?.locale;
403
571
  const doesLocaleExist = locales.find((loc) => loc.code === currentDesiredLocale);
404
572
  const defaultLocale = locales.find((locale) => locale.isDefault);
405
573
  if (!doesLocaleExist && defaultLocale?.code) {
406
574
  handleSelect(defaultLocale.code);
407
575
  }
408
- }, [handleSelect, hasI18n, locales, query.plugins?.i18n?.locale]);
409
- if (!hasI18n || !Array.isArray(locales) || locales.length === 0) {
410
- return null;
411
- }
412
- const currentLocale = query.plugins?.i18n?.locale || locales.find((loc) => loc.isDefault)?.code;
576
+ }, [handleSelect, hasI18n, locales, currentDesiredLocale]);
577
+ const currentLocale = Array.isArray(locales) ? locales.find((locale) => locale.code === currentDesiredLocale) : void 0;
413
578
  const allCurrentLocales = [
414
- { status: getDocumentStatus(document, meta), locale: currentLocale },
579
+ { status: getDocumentStatus(document, meta), locale: currentLocale?.code },
415
580
  ...meta?.availableLocales ?? []
416
581
  ];
582
+ if (!hasI18n || !Array.isArray(locales) || locales.length === 0) {
583
+ return null;
584
+ }
417
585
  return {
418
586
  label: formatMessage({
419
587
  id: getTranslation("Settings.locales.modal.locales.label"),
420
588
  defaultMessage: "Locales"
421
589
  }),
422
590
  options: locales.map((locale) => {
591
+ const entryWithLocaleExists = allCurrentLocales.some((doc) => doc.locale === locale.code);
423
592
  const currentLocaleDoc = allCurrentLocales.find(
424
593
  (doc) => "locale" in doc ? doc.locale === locale.code : false
425
594
  );
426
- const status = currentLocaleDoc?.status ?? "draft";
427
- const permissionsToCheck = currentLocaleDoc ? canCreate : canRead;
428
- const statusVariant = status === "draft" ? "primary" : status === "published" ? "success" : "alternative";
595
+ const permissionsToCheck = currentLocaleDoc ? canRead : canCreate;
429
596
  return {
430
597
  disabled: !permissionsToCheck.includes(locale.code),
431
598
  value: locale.code,
432
- label: locale.name,
433
- startIcon: schema?.options?.draftAndPublish ? /* @__PURE__ */ jsx(
434
- Status,
599
+ label: /* @__PURE__ */ jsx(
600
+ LocaleOption,
435
601
  {
436
- display: "flex",
437
- paddingLeft: "6px",
438
- paddingRight: "6px",
439
- paddingTop: "2px",
440
- paddingBottom: "2px",
441
- showBullet: false,
442
- size: "S",
443
- variant: statusVariant,
444
- children: /* @__PURE__ */ jsx(Typography, { tag: "span", variant: "pi", fontWeight: "bold", children: capitalize(status) })
602
+ isDraftAndPublishEnabled: !!schema?.options?.draftAndPublish,
603
+ locale,
604
+ status: currentLocaleDoc?.status,
605
+ entryExists: entryWithLocaleExists
445
606
  }
446
- ) : null
607
+ ),
608
+ startIcon: !entryWithLocaleExists ? /* @__PURE__ */ jsx(Plus, {}) : null
447
609
  };
448
610
  }),
611
+ customizeContent: () => currentLocale?.name,
449
612
  onSelect: handleSelect,
450
613
  value: currentLocale
451
614
  };
@@ -461,6 +624,95 @@ const getDocumentStatus = (document, meta) => {
461
624
  }
462
625
  return docStatus;
463
626
  };
627
+ const FillFromAnotherLocaleAction = ({
628
+ documentId,
629
+ meta,
630
+ model,
631
+ collectionType
632
+ }) => {
633
+ const { formatMessage } = useIntl();
634
+ const [{ query }] = useQueryParams();
635
+ const currentDesiredLocale = query.plugins?.i18n?.locale;
636
+ const [localeSelected, setLocaleSelected] = React.useState(null);
637
+ const setValues = useForm("FillFromAnotherLocale", (state) => state.setValues);
638
+ const { getDocument } = unstable_useDocumentActions();
639
+ const { schema, components } = unstable_useDocument({
640
+ model,
641
+ documentId,
642
+ collectionType,
643
+ params: { locale: currentDesiredLocale }
644
+ });
645
+ const { data: locales = [] } = useGetLocalesQuery();
646
+ const availableLocales = Array.isArray(locales) ? locales.filter((locale) => meta?.availableLocales.some((l) => l.locale === locale.code)) : [];
647
+ const fillFromLocale = (onClose) => async () => {
648
+ const response = await getDocument({
649
+ collectionType,
650
+ model,
651
+ documentId,
652
+ params: { locale: localeSelected }
653
+ });
654
+ if (!response || !schema) {
655
+ return;
656
+ }
657
+ const { data } = response;
658
+ const cleanedData = cleanData(data, schema, components);
659
+ setValues(cleanedData);
660
+ onClose();
661
+ };
662
+ return {
663
+ type: "icon",
664
+ icon: /* @__PURE__ */ jsx(Download, {}),
665
+ disabled: availableLocales.length === 0,
666
+ label: formatMessage({
667
+ id: getTranslation("CMEditViewCopyLocale.copy-text"),
668
+ defaultMessage: "Fill in from another locale"
669
+ }),
670
+ dialog: {
671
+ type: "dialog",
672
+ title: formatMessage({
673
+ id: getTranslation("CMEditViewCopyLocale.dialog.title"),
674
+ defaultMessage: "Confirmation"
675
+ }),
676
+ content: ({ onClose }) => /* @__PURE__ */ jsxs(Fragment, { children: [
677
+ /* @__PURE__ */ jsx(Dialog.Body, { children: /* @__PURE__ */ jsxs(Flex, { direction: "column", gap: 3, children: [
678
+ /* @__PURE__ */ jsx(WarningCircle, { width: "24px", height: "24px", fill: "danger600" }),
679
+ /* @__PURE__ */ jsx(Typography, { textAlign: "center", children: formatMessage({
680
+ id: getTranslation("CMEditViewCopyLocale.dialog.body"),
681
+ defaultMessage: "Your current content will be erased and filled by the content of the selected locale:"
682
+ }) }),
683
+ /* @__PURE__ */ jsxs(Field.Root, { width: "100%", children: [
684
+ /* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
685
+ id: getTranslation("CMEditViewCopyLocale.dialog.field.label"),
686
+ defaultMessage: "Locale"
687
+ }) }),
688
+ /* @__PURE__ */ jsx(
689
+ SingleSelect,
690
+ {
691
+ value: localeSelected,
692
+ placeholder: formatMessage({
693
+ id: getTranslation("CMEditViewCopyLocale.dialog.field.placeholder"),
694
+ defaultMessage: "Select one locale..."
695
+ }),
696
+ onChange: (value) => setLocaleSelected(value),
697
+ children: availableLocales.map((locale) => /* @__PURE__ */ jsx(SingleSelectOption, { value: locale.code, children: locale.name }, locale.code))
698
+ }
699
+ )
700
+ ] })
701
+ ] }) }),
702
+ /* @__PURE__ */ jsx(Dialog.Footer, { children: /* @__PURE__ */ jsxs(Flex, { gap: 2, width: "100%", children: [
703
+ /* @__PURE__ */ jsx(Button, { flex: "auto", variant: "tertiary", onClick: onClose, children: formatMessage({
704
+ id: getTranslation("CMEditViewCopyLocale.cancel-text"),
705
+ defaultMessage: "No, cancel"
706
+ }) }),
707
+ /* @__PURE__ */ jsx(Button, { flex: "auto", variant: "success", onClick: fillFromLocale(onClose), children: formatMessage({
708
+ id: getTranslation("CMEditViewCopyLocale.submit-text"),
709
+ defaultMessage: "Yes, fill in"
710
+ }) })
711
+ ] }) })
712
+ ] })
713
+ }
714
+ };
715
+ };
464
716
  const DeleteLocaleAction = ({
465
717
  document,
466
718
  documentId,
@@ -472,16 +724,23 @@ const DeleteLocaleAction = ({
472
724
  const { toggleNotification } = useNotification();
473
725
  const { delete: deleteAction } = unstable_useDocumentActions();
474
726
  const { hasI18n, canDelete } = useI18n();
727
+ const [{ query }] = useQueryParams();
728
+ const { data: locales = [] } = useGetLocalesQuery();
729
+ const currentDesiredLocale = query.plugins?.i18n?.locale;
730
+ const locale = !("error" in locales) && locales.find((loc) => loc.code === currentDesiredLocale);
475
731
  if (!hasI18n) {
476
732
  return null;
477
733
  }
478
734
  return {
479
735
  disabled: document?.locale && !canDelete.includes(document.locale) || !document || !document.id,
480
736
  position: ["header", "table-row"],
481
- label: formatMessage({
482
- id: getTranslation("actions.delete.label"),
483
- defaultMessage: "Delete locale"
484
- }),
737
+ label: formatMessage(
738
+ {
739
+ id: getTranslation("actions.delete.label"),
740
+ defaultMessage: "Delete entry ({locale})"
741
+ },
742
+ { locale: locale && locale.name }
743
+ ),
485
744
  icon: /* @__PURE__ */ jsx(StyledTrash, {}),
486
745
  variant: "danger",
487
746
  dialog: {
@@ -498,7 +757,12 @@ const DeleteLocaleAction = ({
498
757
  }) })
499
758
  ] }),
500
759
  onConfirm: async () => {
501
- if (!documentId || !document?.locale) {
760
+ const unableToDelete = (
761
+ // We are unable to delete a collection type without a document ID
762
+ // & unable to delete generally if there is no document locale
763
+ collectionType !== "single-types" && !documentId || !document?.locale
764
+ );
765
+ if (unableToDelete) {
502
766
  console.error(
503
767
  "You're trying to delete a document without an id or locale, this is likely a bug with Strapi. Please open an issue."
504
768
  );
@@ -524,37 +788,43 @@ const DeleteLocaleAction = ({
524
788
  }
525
789
  };
526
790
  };
527
- const BulkLocalePublishAction = ({
791
+ const BulkLocaleAction = ({
528
792
  document: baseDocument,
529
793
  documentId,
530
794
  model,
531
- collectionType
795
+ collectionType,
796
+ action
532
797
  }) => {
533
798
  const baseLocale = baseDocument?.locale ?? null;
534
799
  const [{ query }] = useQueryParams();
535
800
  const params = React.useMemo(() => buildValidParams(query), [query]);
536
- const isPublishedTab = query.status === "published";
801
+ const isOnPublishedTab = query.status === "published";
537
802
  const { formatMessage } = useIntl();
538
803
  const { hasI18n, canPublish } = useI18n();
539
804
  const { toggleNotification } = useNotification();
540
805
  const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();
541
806
  const [selectedRows, setSelectedRows] = React.useState([]);
542
807
  const [isDraftRelationConfirmationOpen, setIsDraftRelationConfirmationOpen] = React.useState(false);
543
- const { publishMany: publishManyAction } = unstable_useDocumentActions();
808
+ const { publishMany: publishManyAction, unpublishMany: unpublishManyAction } = unstable_useDocumentActions();
544
809
  const {
545
810
  document,
546
811
  meta: documentMeta,
547
812
  schema,
548
813
  validate
549
- } = unstable_useDocument({
550
- model,
551
- collectionType,
552
- documentId,
553
- params: {
554
- locale: baseLocale
814
+ } = unstable_useDocument(
815
+ {
816
+ model,
817
+ collectionType,
818
+ documentId,
819
+ params: {
820
+ locale: baseLocale
821
+ }
822
+ },
823
+ {
824
+ skip: !hasI18n || !baseLocale
555
825
  }
556
- });
557
- const { data: localesMetadata = [] } = useGetLocalesQuery();
826
+ );
827
+ const { data: localesMetadata = [] } = useGetLocalesQuery(hasI18n ? void 0 : skipToken);
558
828
  const headers = [
559
829
  {
560
830
  label: formatMessage({
@@ -603,12 +873,19 @@ const BulkLocalePublishAction = ({
603
873
  }, {});
604
874
  return [rowsFromMeta, errors];
605
875
  }, [document, documentMeta?.availableLocales, validate]);
606
- const localesToPublish = selectedRows.reduce((acc, selectedRow) => {
607
- if (selectedRow.status !== "published" && !Object.keys(validationErrors).includes(selectedRow.locale)) {
876
+ const isBulkPublish = action === "bulk-publish";
877
+ const localesForAction = selectedRows.reduce((acc, selectedRow) => {
878
+ const isValidLocale = (
879
+ // Validation errors are irrelevant if we are trying to unpublish
880
+ !isBulkPublish || !Object.keys(validationErrors).includes(selectedRow.locale)
881
+ );
882
+ const shouldAddLocale = isBulkPublish ? selectedRow.status !== "published" && isValidLocale : selectedRow.status !== "draft" && isValidLocale;
883
+ if (shouldAddLocale) {
608
884
  acc.push(selectedRow.locale);
609
885
  }
610
886
  return acc;
611
887
  }, []);
888
+ const enableDraftRelationsCount = false;
612
889
  const {
613
890
  data: draftRelationsCount = 0,
614
891
  isLoading: isDraftRelationsLoading,
@@ -617,10 +894,10 @@ const BulkLocalePublishAction = ({
617
894
  {
618
895
  model,
619
896
  documentIds: [documentId],
620
- locale: localesToPublish
897
+ locale: localesForAction
621
898
  },
622
899
  {
623
- skip: !documentId || localesToPublish.length === 0
900
+ skip: !enableDraftRelationsCount
624
901
  }
625
902
  );
626
903
  React.useEffect(() => {
@@ -646,7 +923,18 @@ const BulkLocalePublishAction = ({
646
923
  documentIds: [documentId],
647
924
  params: {
648
925
  ...params,
649
- locale: localesToPublish
926
+ locale: localesForAction
927
+ }
928
+ });
929
+ setSelectedRows([]);
930
+ };
931
+ const unpublish = async () => {
932
+ await unpublishManyAction({
933
+ model,
934
+ documentIds: [documentId],
935
+ params: {
936
+ ...params,
937
+ locale: localesForAction
650
938
  }
651
939
  });
652
940
  setSelectedRows([]);
@@ -654,14 +942,12 @@ const BulkLocalePublishAction = ({
654
942
  const handleAction = async () => {
655
943
  if (draftRelationsCount > 0) {
656
944
  setIsDraftRelationConfirmationOpen(true);
657
- } else {
945
+ } else if (isBulkPublish) {
658
946
  await publish();
947
+ } else {
948
+ await unpublish();
659
949
  }
660
950
  };
661
- const isUnpublish = document?.status === "published";
662
- if (isUnpublish) {
663
- console.warn(["I18N"], "Bulk locale unpublish modal not implemented");
664
- }
665
951
  if (isDraftRelationConfirmationOpen) {
666
952
  return {
667
953
  label: formatMessage({
@@ -696,20 +982,21 @@ const BulkLocalePublishAction = ({
696
982
  }
697
983
  };
698
984
  }
985
+ const hasPermission = selectedRows.map(({ locale }) => locale).every((locale) => canPublish.includes(locale));
699
986
  return {
700
987
  label: formatMessage({
701
- id: getTranslation("CMEditViewBulkLocale.publish-title"),
702
- defaultMessage: "Publish Multiple Locales"
988
+ id: getTranslation(`CMEditViewBulkLocale.${isBulkPublish ? "publish" : "unpublish"}-title`),
989
+ defaultMessage: `${isBulkPublish ? "Publish" : "Unpublish"} Multiple Locales`
703
990
  }),
704
- icon: /* @__PURE__ */ jsx(ListPlus, {}),
705
- disabled: isPublishedTab || !canPublish,
991
+ variant: isBulkPublish ? "secondary" : "danger",
992
+ icon: isBulkPublish ? /* @__PURE__ */ jsx(ListPlus, {}) : /* @__PURE__ */ jsx(Cross, {}),
993
+ disabled: isOnPublishedTab || canPublish.length === 0,
706
994
  position: ["panel"],
707
- variant: "secondary",
708
995
  dialog: {
709
996
  type: "modal",
710
997
  title: formatMessage({
711
- id: getTranslation("CMEditViewBulkLocale.publish-title"),
712
- defaultMessage: "Publish Multiple Locales"
998
+ id: getTranslation(`CMEditViewBulkLocale.${isBulkPublish ? "publish" : "unpublish"}-title`),
999
+ defaultMessage: `${isBulkPublish ? "Publish" : "Unpublish"} Multiple Locales`
713
1000
  }),
714
1001
  content: () => {
715
1002
  return /* @__PURE__ */ jsx(
@@ -728,28 +1015,35 @@ const BulkLocalePublishAction = ({
728
1015
  validationErrors,
729
1016
  headers,
730
1017
  rows,
731
- localesMetadata
1018
+ localesMetadata,
1019
+ action: action ?? "bulk-publish"
732
1020
  }
733
1021
  )
734
1022
  }
735
1023
  );
736
1024
  },
737
- footer: () => /* @__PURE__ */ jsx(Flex, { justifyContent: "flex-end", children: /* @__PURE__ */ jsx(
738
- Button$1,
1025
+ footer: () => /* @__PURE__ */ jsx(Modal.Footer, { justifyContent: "flex-end", children: /* @__PURE__ */ jsx(
1026
+ Button,
739
1027
  {
740
1028
  loading: isDraftRelationsLoading,
741
- disabled: localesToPublish.length === 0,
1029
+ disabled: !hasPermission || localesForAction.length === 0,
742
1030
  variant: "default",
743
1031
  onClick: handleAction,
744
1032
  children: formatMessage({
745
- id: "app.utils.publish",
746
- defaultMessage: "Publish"
1033
+ id: isBulkPublish ? "app.utils.publish" : "app.utils.unpublish",
1034
+ defaultMessage: isBulkPublish ? "Publish" : "Unpublish"
747
1035
  })
748
1036
  }
749
1037
  ) })
750
1038
  }
751
1039
  };
752
1040
  };
1041
+ const BulkLocalePublishAction = (props) => {
1042
+ return BulkLocaleAction({ action: "bulk-publish", ...props });
1043
+ };
1044
+ const BulkLocaleUnpublishAction = (props) => {
1045
+ return BulkLocaleAction({ action: "bulk-unpublish", ...props });
1046
+ };
753
1047
  const StyledTrash = styled(Trash)`
754
1048
  path {
755
1049
  fill: currentColor;
@@ -806,13 +1100,6 @@ const UnpublishModalAdditionalInfo = () => {
806
1100
  }
807
1101
  ) });
808
1102
  };
809
- const Initializer = ({ setPlugin }) => {
810
- const setPluginRef = React.useRef(setPlugin);
811
- React.useEffect(() => {
812
- setPluginRef.current(pluginId);
813
- }, []);
814
- return null;
815
- };
816
1103
  const LocalePicker = () => {
817
1104
  const { formatMessage } = useIntl();
818
1105
  const [{ query }, setQuery] = useQueryParams();
@@ -976,54 +1263,13 @@ const LocaleListCell = ({
976
1263
  return locale.name;
977
1264
  }).toSorted((a, b) => formatter.compare(a, b));
978
1265
  return /* @__PURE__ */ jsxs(Popover.Root, { children: [
979
- /* @__PURE__ */ jsx(Popover.Trigger, { children: /* @__PURE__ */ jsx(Button, { type: "button", onClick: (e) => e.stopPropagation(), children: /* @__PURE__ */ jsxs(
980
- ActionWrapper,
981
- {
982
- minWidth: "100%",
983
- alignItems: "center",
984
- justifyContent: "center",
985
- height: "3.2rem",
986
- width: "3.2rem",
987
- children: [
988
- /* @__PURE__ */ jsx(Typography, { textColor: "neutral800", ellipsis: true, children: localesForDocument.join(", ") }),
989
- /* @__PURE__ */ jsx(Flex, { children: /* @__PURE__ */ jsx(CaretDown, {}) })
990
- ]
991
- }
992
- ) }) }),
1266
+ /* @__PURE__ */ jsx(Popover.Trigger, { children: /* @__PURE__ */ jsx(Button, { variant: "ghost", type: "button", onClick: (e) => e.stopPropagation(), children: /* @__PURE__ */ jsxs(Flex, { minWidth: "100%", alignItems: "center", justifyContent: "center", fontWeight: "regular", children: [
1267
+ /* @__PURE__ */ jsx(Typography, { textColor: "neutral800", ellipsis: true, marginRight: 2, children: localesForDocument.join(", ") }),
1268
+ /* @__PURE__ */ jsx(Flex, { children: /* @__PURE__ */ jsx(CaretDown, { width: "1.2rem", height: "1.2rem" }) })
1269
+ ] }) }) }),
993
1270
  /* @__PURE__ */ jsx(Popover.Content, { sideOffset: 16, children: /* @__PURE__ */ jsx("ul", { children: localesForDocument.map((name) => /* @__PURE__ */ jsx(Box, { padding: 3, tag: "li", children: /* @__PURE__ */ jsx(Typography, { children: name }) }, name)) }) })
994
1271
  ] });
995
1272
  };
996
- const Button = styled.button`
997
- width: 100%;
998
-
999
- svg {
1000
- > g,
1001
- path {
1002
- fill: ${({ theme }) => theme.colors.neutral500};
1003
- }
1004
- }
1005
- &:hover {
1006
- svg {
1007
- > g,
1008
- path {
1009
- fill: ${({ theme }) => theme.colors.neutral600};
1010
- }
1011
- }
1012
- }
1013
- &:active {
1014
- svg {
1015
- > g,
1016
- path {
1017
- fill: ${({ theme }) => theme.colors.neutral400};
1018
- }
1019
- }
1020
- }
1021
- `;
1022
- const ActionWrapper = styled(Flex)`
1023
- svg {
1024
- height: 0.4rem;
1025
- }
1026
- `;
1027
1273
  const addColumnToTableHook = ({ displayedHeaders, layout }) => {
1028
1274
  const { options } = layout;
1029
1275
  const isFieldLocalized = doesPluginOptionsHaveI18nLocalized(options) ? options.i18n.localized : false;
@@ -1052,18 +1298,11 @@ const addColumnToTableHook = ({ displayedHeaders, layout }) => {
1052
1298
  const addLocaleToReleasesHook = ({ displayedHeaders = [] }) => {
1053
1299
  return {
1054
1300
  displayedHeaders: [
1055
- // TODO: Fix when migrating to v5
1056
- // ...displayedHeaders,
1301
+ ...displayedHeaders,
1057
1302
  {
1058
- key: "__locale__",
1059
- fieldSchema: { type: "string" },
1060
- metadatas: {
1061
- label: {
1062
- id: "content-releases.page.ReleaseDetails.table.header.label.locale",
1063
- defaultMessage: "locale"
1064
- },
1065
- searchable: false,
1066
- sortable: false
1303
+ label: {
1304
+ id: "content-releases.page.ReleaseDetails.table.header.label.locale",
1305
+ defaultMessage: "locale"
1067
1306
  },
1068
1307
  name: "locale"
1069
1308
  }
@@ -1156,9 +1395,6 @@ const localeMiddleware = (ctx) => (next) => (permissions) => {
1156
1395
  return next(revisedPermissions);
1157
1396
  };
1158
1397
  const prefixPluginTranslations = (trad, pluginId2) => {
1159
- if (!pluginId2) {
1160
- throw new TypeError("pluginId can't be empty");
1161
- }
1162
1398
  return Object.keys(trad).reduce((acc, current) => {
1163
1399
  acc[`${pluginId2}.${current}`] = trad[current];
1164
1400
  return acc;
@@ -1211,8 +1447,6 @@ const index = {
1211
1447
  app.addRBACMiddleware([localeMiddleware]);
1212
1448
  app.registerPlugin({
1213
1449
  id: pluginId,
1214
- initializer: Initializer,
1215
- isReady: false,
1216
1450
  name: pluginId
1217
1451
  });
1218
1452
  },
@@ -1230,11 +1464,11 @@ const index = {
1230
1464
  },
1231
1465
  id: "internationalization",
1232
1466
  to: "internationalization",
1233
- Component: () => import("./SettingsPage-w9zz705o.mjs").then((mod) => ({ default: mod.ProtectedSettingsPage })),
1467
+ Component: () => import("./SettingsPage-Ce-YIA4X.mjs").then((mod) => ({ default: mod.ProtectedSettingsPage })),
1234
1468
  permissions: PERMISSIONS.accessMain
1235
1469
  });
1236
1470
  const contentManager = app.getPlugin("content-manager");
1237
- contentManager.apis.addDocumentHeaderAction([LocalePickerAction]);
1471
+ contentManager.apis.addDocumentHeaderAction([LocalePickerAction, FillFromAnotherLocaleAction]);
1238
1472
  contentManager.apis.addDocumentAction((actions) => {
1239
1473
  const indexOfDeleteAction = actions.findIndex((action) => action.type === "delete");
1240
1474
  actions.splice(indexOfDeleteAction, 0, DeleteLocaleAction);
@@ -1242,6 +1476,7 @@ const index = {
1242
1476
  });
1243
1477
  contentManager.apis.addDocumentAction((actions) => {
1244
1478
  actions.splice(2, 0, BulkLocalePublishAction);
1479
+ actions.splice(5, 0, BulkLocaleUnpublishAction);
1245
1480
  return actions;
1246
1481
  });
1247
1482
  contentManager.injectComponent("listView", "actions", {
@@ -1347,7 +1582,7 @@ const index = {
1347
1582
  async registerTrads({ locales }) {
1348
1583
  const importedTrads = await Promise.all(
1349
1584
  locales.map((locale) => {
1350
- return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/de.json": () => import("./de-9eCAqqrB.mjs"), "./translations/dk.json": () => import("./dk-2qBjxt-P.mjs"), "./translations/en.json": () => import("./en-CM6Pjfyv.mjs"), "./translations/es.json": () => import("./es-DlmMVaBG.mjs"), "./translations/fr.json": () => import("./fr-3S6ke71d.mjs"), "./translations/ko.json": () => import("./ko-qTjQ8IMw.mjs"), "./translations/pl.json": () => import("./pl-B67TSHqT.mjs"), "./translations/ru.json": () => import("./ru-hagMa57T.mjs"), "./translations/tr.json": () => import("./tr-Dw_jmkG-.mjs"), "./translations/zh-Hans.json": () => import("./zh-Hans-Dyc-aR-h.mjs"), "./translations/zh.json": () => import("./zh-57YM4amO.mjs") }), `./translations/${locale}.json`).then(({ default: data }) => {
1585
+ return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/de.json": () => import("./de-9eCAqqrB.mjs"), "./translations/dk.json": () => import("./dk-2qBjxt-P.mjs"), "./translations/en.json": () => import("./en-BYRZFDBV.mjs"), "./translations/es.json": () => import("./es-DlmMVaBG.mjs"), "./translations/fr.json": () => import("./fr-3S6ke71d.mjs"), "./translations/ko.json": () => import("./ko-qTjQ8IMw.mjs"), "./translations/pl.json": () => import("./pl-B67TSHqT.mjs"), "./translations/ru.json": () => import("./ru-hagMa57T.mjs"), "./translations/tr.json": () => import("./tr-Dw_jmkG-.mjs"), "./translations/zh-Hans.json": () => import("./zh-Hans-Dyc-aR-h.mjs"), "./translations/zh.json": () => import("./zh-57YM4amO.mjs") }), `./translations/${locale}.json`).then(({ default: data }) => {
1351
1586
  return {
1352
1587
  data: prefixPluginTranslations(data, pluginId),
1353
1588
  locale
@@ -1373,4 +1608,4 @@ export {
1373
1608
  index as i,
1374
1609
  useCreateLocaleMutation as u
1375
1610
  };
1376
- //# sourceMappingURL=index-jbI6Njjb.mjs.map
1611
+ //# sourceMappingURL=index-Dy4uJV-2.mjs.map