@strapi/i18n 0.0.0-next.8414b837972392b1d362ae53b86b5da1eb2ad05c → 0.0.0-next.926e9af9369b89a571145e3c8fa1ce6bfd6cc0ab

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 (80) hide show
  1. package/dist/_chunks/{SettingsPage-BAx9nmep.mjs → SettingsPage-B-KzAqT3.mjs} +2 -2
  2. package/dist/_chunks/{SettingsPage-BAx9nmep.mjs.map → SettingsPage-B-KzAqT3.mjs.map} +1 -1
  3. package/dist/_chunks/{SettingsPage-BTgjb2KS.js → SettingsPage-hyOi94O9.js} +2 -2
  4. package/dist/_chunks/{SettingsPage-BTgjb2KS.js.map → SettingsPage-hyOi94O9.js.map} +1 -1
  5. package/dist/_chunks/{de-DtWiGdHl.js → de-BOhNX_-5.js} +1 -2
  6. package/dist/_chunks/de-BOhNX_-5.js.map +1 -0
  7. package/dist/_chunks/{de-9eCAqqrB.mjs → de-D80IRBP9.mjs} +1 -2
  8. package/dist/_chunks/de-D80IRBP9.mjs.map +1 -0
  9. package/dist/_chunks/{dk-2qBjxt-P.mjs → dk-CJ6Zzz78.mjs} +1 -2
  10. package/dist/_chunks/dk-CJ6Zzz78.mjs.map +1 -0
  11. package/dist/_chunks/{dk-D8C-casx.js → dk-cjXm0p3m.js} +1 -2
  12. package/dist/_chunks/dk-cjXm0p3m.js.map +1 -0
  13. package/dist/_chunks/{en-DlXfy6Gy.mjs → en-BTyF7WVW.mjs} +1 -2
  14. package/dist/_chunks/en-BTyF7WVW.mjs.map +1 -0
  15. package/dist/_chunks/{en-BKBz3tro.js → en-UlC0jh2t.js} +1 -2
  16. package/dist/_chunks/en-UlC0jh2t.js.map +1 -0
  17. package/dist/_chunks/{es-DlmMVaBG.mjs → es-V8WnPN7w.mjs} +1 -2
  18. package/dist/_chunks/es-V8WnPN7w.mjs.map +1 -0
  19. package/dist/_chunks/{es-DS-XFGSw.js → es-hr9b_HLp.js} +1 -2
  20. package/dist/_chunks/es-hr9b_HLp.js.map +1 -0
  21. package/dist/_chunks/{fr-BTjekDpq.js → fr-BFmBbE0H.js} +1 -2
  22. package/dist/_chunks/fr-BFmBbE0H.js.map +1 -0
  23. package/dist/_chunks/{fr-3S6ke71d.mjs → fr-F94noFiV.mjs} +1 -2
  24. package/dist/_chunks/fr-F94noFiV.mjs.map +1 -0
  25. package/dist/_chunks/{index-B0NijiBB.mjs → index-BcYj5jo9.mjs} +23 -57
  26. package/dist/_chunks/index-BcYj5jo9.mjs.map +1 -0
  27. package/dist/_chunks/{index-3yyF237r.js → index-C8NzsAKp.js} +23 -57
  28. package/dist/_chunks/index-C8NzsAKp.js.map +1 -0
  29. package/dist/_chunks/{ko-DmcGUBQ3.js → ko-C40pNQ9b.js} +1 -2
  30. package/dist/_chunks/ko-C40pNQ9b.js.map +1 -0
  31. package/dist/_chunks/{ko-qTjQ8IMw.mjs → ko-CF-P3Car.mjs} +1 -2
  32. package/dist/_chunks/ko-CF-P3Car.mjs.map +1 -0
  33. package/dist/_chunks/{pl-B67TSHqT.mjs → pl-Dxr9RUmD.mjs} +1 -2
  34. package/dist/_chunks/pl-Dxr9RUmD.mjs.map +1 -0
  35. package/dist/_chunks/{pl-Cn5RYonZ.js → pl-JtWBy-JQ.js} +1 -2
  36. package/dist/_chunks/pl-JtWBy-JQ.js.map +1 -0
  37. package/dist/_chunks/{ru-hagMa57T.mjs → ru-B-4sVwXN.mjs} +1 -2
  38. package/dist/_chunks/ru-B-4sVwXN.mjs.map +1 -0
  39. package/dist/_chunks/{ru-BMBgVL3s.js → ru-COSWt3Nu.js} +1 -2
  40. package/dist/_chunks/ru-COSWt3Nu.js.map +1 -0
  41. package/dist/_chunks/{tr-CarUU76c.js → tr-BVj1O5ch.js} +1 -2
  42. package/dist/_chunks/tr-BVj1O5ch.js.map +1 -0
  43. package/dist/_chunks/{tr-Dw_jmkG-.mjs → tr-Ccu6Yj11.mjs} +1 -2
  44. package/dist/_chunks/tr-Ccu6Yj11.mjs.map +1 -0
  45. package/dist/_chunks/{zh-57YM4amO.mjs → zh-BIz395Ms.mjs} +1 -2
  46. package/dist/_chunks/zh-BIz395Ms.mjs.map +1 -0
  47. package/dist/_chunks/{zh-Hans-Dyc-aR-h.mjs → zh-Hans-Bfo6_TCM.mjs} +1 -2
  48. package/dist/_chunks/zh-Hans-Bfo6_TCM.mjs.map +1 -0
  49. package/dist/_chunks/{zh-Hans-DSHIXAa3.js → zh-Hans-DIEm_EMC.js} +1 -2
  50. package/dist/_chunks/zh-Hans-DIEm_EMC.js.map +1 -0
  51. package/dist/_chunks/{zh-CukOviB0.js → zh-wkBPBkhc.js} +1 -2
  52. package/dist/_chunks/zh-wkBPBkhc.js.map +1 -0
  53. package/dist/admin/index.js +1 -1
  54. package/dist/admin/index.mjs +1 -1
  55. package/dist/admin/src/components/LocaleListCell.d.ts +4 -4
  56. package/package.json +7 -8
  57. package/dist/_chunks/de-9eCAqqrB.mjs.map +0 -1
  58. package/dist/_chunks/de-DtWiGdHl.js.map +0 -1
  59. package/dist/_chunks/dk-2qBjxt-P.mjs.map +0 -1
  60. package/dist/_chunks/dk-D8C-casx.js.map +0 -1
  61. package/dist/_chunks/en-BKBz3tro.js.map +0 -1
  62. package/dist/_chunks/en-DlXfy6Gy.mjs.map +0 -1
  63. package/dist/_chunks/es-DS-XFGSw.js.map +0 -1
  64. package/dist/_chunks/es-DlmMVaBG.mjs.map +0 -1
  65. package/dist/_chunks/fr-3S6ke71d.mjs.map +0 -1
  66. package/dist/_chunks/fr-BTjekDpq.js.map +0 -1
  67. package/dist/_chunks/index-3yyF237r.js.map +0 -1
  68. package/dist/_chunks/index-B0NijiBB.mjs.map +0 -1
  69. package/dist/_chunks/ko-DmcGUBQ3.js.map +0 -1
  70. package/dist/_chunks/ko-qTjQ8IMw.mjs.map +0 -1
  71. package/dist/_chunks/pl-B67TSHqT.mjs.map +0 -1
  72. package/dist/_chunks/pl-Cn5RYonZ.js.map +0 -1
  73. package/dist/_chunks/ru-BMBgVL3s.js.map +0 -1
  74. package/dist/_chunks/ru-hagMa57T.mjs.map +0 -1
  75. package/dist/_chunks/tr-CarUU76c.js.map +0 -1
  76. package/dist/_chunks/tr-Dw_jmkG-.mjs.map +0 -1
  77. package/dist/_chunks/zh-57YM4amO.mjs.map +0 -1
  78. package/dist/_chunks/zh-CukOviB0.js.map +0 -1
  79. package/dist/_chunks/zh-Hans-DSHIXAa3.js.map +0 -1
  80. package/dist/_chunks/zh-Hans-Dyc-aR-h.mjs.map +0 -1
@@ -605,7 +605,7 @@ const LocalePickerAction = ({
605
605
  const currentLocale = Array.isArray(locales) ? locales.find((locale) => locale.code === currentDesiredLocale) : void 0;
606
606
  const allCurrentLocales = [
607
607
  { status: getDocumentStatus(document, meta), locale: currentLocale?.code },
608
- ...meta?.availableLocales ?? []
608
+ ...document?.localizations ?? []
609
609
  ];
610
610
  if (!hasI18n || !Array.isArray(locales) || locales.length === 0) {
611
611
  return null;
@@ -824,13 +824,13 @@ const DeleteLocaleAction = ({
824
824
  };
825
825
  };
826
826
  const BulkLocaleAction = ({
827
- document: baseDocument,
827
+ document,
828
828
  documentId,
829
829
  model,
830
830
  collectionType,
831
831
  action
832
832
  }) => {
833
- const baseLocale = baseDocument?.locale ?? null;
833
+ const locale = document?.locale ?? null;
834
834
  const [{ query: query$1 }] = strapiAdmin.useQueryParams();
835
835
  const params = React__namespace.useMemo(() => strapiAdmin$1.buildValidParams(query$1), [query$1]);
836
836
  const isOnPublishedTab = query$1.status === "published";
@@ -841,22 +841,18 @@ const BulkLocaleAction = ({
841
841
  const [selectedRows, setSelectedRows] = React__namespace.useState([]);
842
842
  const [isDraftRelationConfirmationOpen, setIsDraftRelationConfirmationOpen] = React__namespace.useState(false);
843
843
  const { publishMany: publishManyAction, unpublishMany: unpublishManyAction } = strapiAdmin$1.unstable_useDocumentActions();
844
- const {
845
- document,
846
- meta: documentMeta,
847
- schema,
848
- validate
849
- } = strapiAdmin$1.unstable_useDocument(
844
+ const { schema, validate } = strapiAdmin$1.unstable_useDocument(
850
845
  {
851
846
  model,
852
847
  collectionType,
853
848
  documentId,
854
849
  params: {
855
- locale: baseLocale
850
+ locale
856
851
  }
857
852
  },
858
853
  {
859
- skip: !hasI18n || !baseLocale
854
+ // No need to fetch the document, the data is already available in the `document` prop
855
+ skip: true
860
856
  }
861
857
  );
862
858
  const { data: localesMetadata = [] } = useGetLocalesQuery(hasI18n ? void 0 : query.skipToken);
@@ -884,18 +880,19 @@ const BulkLocaleAction = ({
884
880
  }
885
881
  ];
886
882
  const [rows, validationErrors] = React__namespace.useMemo(() => {
887
- if (!document || !documentMeta?.availableLocales) {
883
+ if (!document) {
888
884
  return [[], {}];
889
885
  }
890
- const rowsFromMeta = documentMeta?.availableLocales.map((doc) => {
891
- const { locale, status } = doc;
892
- return { locale, status };
886
+ const localizations = document.localizations ?? [];
887
+ const locales = localizations.map((doc) => {
888
+ const { locale: locale2, status } = doc;
889
+ return { locale: locale2, status };
893
890
  });
894
- rowsFromMeta.unshift({
891
+ locales.unshift({
895
892
  locale: document.locale,
896
893
  status: document.status
897
894
  });
898
- const allDocuments = [document, ...documentMeta?.availableLocales ?? []];
895
+ const allDocuments = [document, ...localizations];
899
896
  const errors = allDocuments.reduce((errs, document2) => {
900
897
  if (!document2) {
901
898
  return errs;
@@ -906,8 +903,8 @@ const BulkLocaleAction = ({
906
903
  }
907
904
  return errs;
908
905
  }, {});
909
- return [rowsFromMeta, errors];
910
- }, [document, documentMeta?.availableLocales, validate]);
906
+ return [locales, errors];
907
+ }, [document, validate]);
911
908
  const isBulkPublish = action === "bulk-publish";
912
909
  const localesForAction = selectedRows.reduce((acc, selectedRow) => {
913
910
  const isValidLocale = (
@@ -1017,7 +1014,7 @@ const BulkLocaleAction = ({
1017
1014
  }
1018
1015
  };
1019
1016
  }
1020
- const hasPermission = selectedRows.map(({ locale }) => locale).every((locale) => canPublish.includes(locale));
1017
+ const hasPermission = selectedRows.map(({ locale: locale2 }) => locale2).every((locale2) => canPublish.includes(locale2));
1021
1018
  return {
1022
1019
  label: formatMessage({
1023
1020
  id: getTranslation(`CMEditViewBulkLocale.${isBulkPublish ? "publish" : "unpublish"}-title`),
@@ -1260,29 +1257,16 @@ const Span = styledComponents.styled(designSystem.Flex)`
1260
1257
  }
1261
1258
  }
1262
1259
  `;
1263
- const LocaleListCell = ({
1264
- documentId,
1265
- locale: currentLocale,
1266
- collectionType,
1267
- model
1268
- }) => {
1269
- const { meta, isLoading } = strapiAdmin$1.unstable_useDocument({
1270
- documentId,
1271
- collectionType,
1272
- model,
1273
- params: {
1274
- locale: currentLocale
1275
- }
1276
- });
1260
+ const LocaleListCell = ({ locale: currentLocale, localizations }) => {
1277
1261
  const { locale: language } = reactIntl.useIntl();
1278
1262
  const { data: locales = [] } = useGetLocalesQuery();
1279
1263
  const formatter = designSystem.useCollator(language, {
1280
1264
  sensitivity: "base"
1281
1265
  });
1282
- if (!Array.isArray(locales) || isLoading) {
1266
+ if (!Array.isArray(locales) || !localizations) {
1283
1267
  return null;
1284
1268
  }
1285
- const availableLocales = meta?.availableLocales.map((doc) => doc.locale) ?? [];
1269
+ const availableLocales = localizations.map((loc) => loc.locale);
1286
1270
  const localesForDocument = locales.reduce((acc, locale) => {
1287
1271
  const createdLocale = [currentLocale, ...availableLocales].find((loc) => {
1288
1272
  return loc === locale.code;
@@ -1499,7 +1483,7 @@ const index = {
1499
1483
  },
1500
1484
  id: "internationalization",
1501
1485
  to: "internationalization",
1502
- Component: () => Promise.resolve().then(() => require("./SettingsPage-BTgjb2KS.js")).then((mod) => ({ default: mod.ProtectedSettingsPage })),
1486
+ Component: () => Promise.resolve().then(() => require("./SettingsPage-hyOi94O9.js")).then((mod) => ({ default: mod.ProtectedSettingsPage })),
1503
1487
  permissions: PERMISSIONS.accessMain
1504
1488
  });
1505
1489
  const contentManager = app.getPlugin("content-manager");
@@ -1561,24 +1545,6 @@ const index = {
1561
1545
  }
1562
1546
  });
1563
1547
  ctbFormsAPI.extendFields(LOCALIZED_FIELDS, {
1564
- validator: (args) => ({
1565
- i18n: yup__namespace.object().shape({
1566
- localized: yup__namespace.bool().test({
1567
- name: "ensure-unique-localization",
1568
- message: getTranslation("plugin.schema.i18n.ensure-unique-localization"),
1569
- test(value) {
1570
- if (value === void 0 || value) {
1571
- return true;
1572
- }
1573
- const unique = get__default.default(args, ["3", "modifiedData", "unique"], null);
1574
- if (unique && !value) {
1575
- return false;
1576
- }
1577
- return true;
1578
- }
1579
- })
1580
- })
1581
- }),
1582
1548
  form: {
1583
1549
  advanced({ contentTypeSchema, forTarget, type, step }) {
1584
1550
  if (forTarget !== "contentType") {
@@ -1617,7 +1583,7 @@ const index = {
1617
1583
  async registerTrads({ locales }) {
1618
1584
  const importedTrads = await Promise.all(
1619
1585
  locales.map((locale) => {
1620
- return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/de.json": () => Promise.resolve().then(() => require("./de-DtWiGdHl.js")), "./translations/dk.json": () => Promise.resolve().then(() => require("./dk-D8C-casx.js")), "./translations/en.json": () => Promise.resolve().then(() => require("./en-BKBz3tro.js")), "./translations/es.json": () => Promise.resolve().then(() => require("./es-DS-XFGSw.js")), "./translations/fr.json": () => Promise.resolve().then(() => require("./fr-BTjekDpq.js")), "./translations/ko.json": () => Promise.resolve().then(() => require("./ko-DmcGUBQ3.js")), "./translations/pl.json": () => Promise.resolve().then(() => require("./pl-Cn5RYonZ.js")), "./translations/ru.json": () => Promise.resolve().then(() => require("./ru-BMBgVL3s.js")), "./translations/tr.json": () => Promise.resolve().then(() => require("./tr-CarUU76c.js")), "./translations/zh-Hans.json": () => Promise.resolve().then(() => require("./zh-Hans-DSHIXAa3.js")), "./translations/zh.json": () => Promise.resolve().then(() => require("./zh-CukOviB0.js")) }), `./translations/${locale}.json`, 3).then(({ default: data }) => {
1586
+ return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/de.json": () => Promise.resolve().then(() => require("./de-BOhNX_-5.js")), "./translations/dk.json": () => Promise.resolve().then(() => require("./dk-cjXm0p3m.js")), "./translations/en.json": () => Promise.resolve().then(() => require("./en-UlC0jh2t.js")), "./translations/es.json": () => Promise.resolve().then(() => require("./es-hr9b_HLp.js")), "./translations/fr.json": () => Promise.resolve().then(() => require("./fr-BFmBbE0H.js")), "./translations/ko.json": () => Promise.resolve().then(() => require("./ko-C40pNQ9b.js")), "./translations/pl.json": () => Promise.resolve().then(() => require("./pl-JtWBy-JQ.js")), "./translations/ru.json": () => Promise.resolve().then(() => require("./ru-COSWt3Nu.js")), "./translations/tr.json": () => Promise.resolve().then(() => require("./tr-BVj1O5ch.js")), "./translations/zh-Hans.json": () => Promise.resolve().then(() => require("./zh-Hans-DIEm_EMC.js")), "./translations/zh.json": () => Promise.resolve().then(() => require("./zh-wkBPBkhc.js")) }), `./translations/${locale}.json`, 3).then(({ default: data }) => {
1621
1587
  return {
1622
1588
  data: prefixPluginTranslations(data, pluginId),
1623
1589
  locale
@@ -1641,4 +1607,4 @@ exports.useDeleteLocaleMutation = useDeleteLocaleMutation;
1641
1607
  exports.useGetDefaultLocalesQuery = useGetDefaultLocalesQuery;
1642
1608
  exports.useGetLocalesQuery = useGetLocalesQuery;
1643
1609
  exports.useUpdateLocaleMutation = useUpdateLocaleMutation;
1644
- //# sourceMappingURL=index-3yyF237r.js.map
1610
+ //# sourceMappingURL=index-C8NzsAKp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-C8NzsAKp.js","sources":["../../admin/src/pluginId.ts","../../admin/src/utils/getTranslation.ts","../../admin/src/components/CheckboxConfirmation.tsx","../../admin/src/utils/fields.ts","../../admin/src/utils/strings.ts","../../admin/src/hooks/useI18n.ts","../../admin/src/services/api.ts","../../admin/src/services/locales.ts","../../admin/src/services/relations.ts","../../admin/src/utils/clean.ts","../../admin/src/components/BulkLocaleActionModal.tsx","../../admin/src/components/CMHeaderActions.tsx","../../admin/src/components/CMListViewModalsAdditionalInformation.tsx","../../admin/src/components/LocalePicker.tsx","../../admin/src/constants.ts","../../admin/src/contentManagerHooks/editView.tsx","../../admin/src/components/LocaleListCell.tsx","../../admin/src/contentManagerHooks/listView.tsx","../../admin/src/contentReleasesHooks/releaseDetailsView.ts","../../admin/src/middlewares/extendCTBAttributeInitialData.ts","../../admin/src/middlewares/extendCTBInitialData.ts","../../admin/src/middlewares/rbac-middleware.ts","../../admin/src/utils/prefixPluginTranslations.ts","../../admin/src/utils/schemas.ts","../../admin/src/index.ts"],"sourcesContent":["export const pluginId = 'i18n';\n","import { pluginId } from '../pluginId';\n\nconst getTranslation = (id: string) => `${pluginId}.${id}`;\n\nexport { getTranslation };\n","import * as React from 'react';\n\nimport { Button, Checkbox, Dialog, Field, Flex, Typography } from '@strapi/design-system';\nimport { WarningCircle } from '@strapi/icons';\nimport { MessageDescriptor, useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { getTranslation } from '../utils/getTranslation';\n\nconst TextAlignTypography = styled(Typography)`\n text-align: center;\n`;\n\ninterface IntlMessage extends MessageDescriptor {\n values: object;\n}\n\ninterface CheckboxConfirmationProps {\n description: IntlMessage;\n intlLabel: IntlMessage;\n isCreating?: boolean;\n name: string;\n onChange: (event: { target: { name: string; value: boolean; type: string } }) => void;\n value: boolean;\n}\n\nconst CheckboxConfirmation = ({\n description,\n isCreating = false,\n intlLabel,\n name,\n onChange,\n value,\n}: CheckboxConfirmationProps) => {\n const { formatMessage } = useIntl();\n const [isOpen, setIsOpen] = React.useState(false);\n\n const handleChange = (value: boolean) => {\n if (isCreating || value) {\n return onChange({ target: { name, value, type: 'checkbox' } });\n }\n\n if (!value) {\n return setIsOpen(true);\n }\n\n return null;\n };\n\n const handleConfirm = () => {\n onChange({ target: { name, value: false, type: 'checkbox' } });\n };\n\n const label = intlLabel.id\n ? formatMessage(\n { id: intlLabel.id, defaultMessage: intlLabel.defaultMessage },\n { ...intlLabel.values }\n )\n : name;\n\n const hint = description\n ? formatMessage(\n { id: description.id, defaultMessage: description.defaultMessage },\n { ...description.values }\n )\n : '';\n\n return (\n <Dialog.Root open={isOpen} onOpenChange={setIsOpen}>\n <Field.Root hint={hint} name={name}>\n <Checkbox onCheckedChange={handleChange} checked={value}>\n {label}\n </Checkbox>\n <Field.Hint />\n </Field.Root>\n <Dialog.Content>\n <Dialog.Header>\n {formatMessage({\n id: getTranslation('CheckboxConfirmation.Modal.title'),\n defaultMessage: 'Disable localization',\n })}\n </Dialog.Header>\n <Dialog.Body icon={<WarningCircle />}>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={2}>\n <Flex justifyContent=\"center\">\n <TextAlignTypography>\n {formatMessage({\n id: getTranslation('CheckboxConfirmation.Modal.content'),\n defaultMessage:\n 'Disabling localization will engender the deletion of all your content but the one associated to your default locale (if existing).',\n })}\n </TextAlignTypography>\n </Flex>\n <Flex justifyContent=\"center\">\n <Typography fontWeight=\"semiBold\">\n {formatMessage({\n id: getTranslation('CheckboxConfirmation.Modal.body'),\n defaultMessage: 'Do you want to disable it?',\n })}\n </Typography>\n </Flex>\n </Flex>\n </Dialog.Body>\n <Dialog.Footer>\n <Dialog.Cancel>\n <Button variant=\"tertiary\">\n {formatMessage({\n id: 'components.popUpWarning.button.cancel',\n defaultMessage: 'No, cancel',\n })}\n </Button>\n </Dialog.Cancel>\n <Dialog.Action>\n <Button variant=\"danger-light\" onClick={handleConfirm}>\n {formatMessage({\n id: getTranslation('CheckboxConfirmation.Modal.button-confirm'),\n defaultMessage: 'Yes, disable',\n })}\n </Button>\n </Dialog.Action>\n </Dialog.Footer>\n </Dialog.Content>\n </Dialog.Root>\n );\n};\n\nexport { CheckboxConfirmation };\n","const LOCALIZED_FIELDS = [\n 'biginteger',\n 'boolean',\n 'component',\n 'date',\n 'datetime',\n 'decimal',\n 'dynamiczone',\n 'email',\n 'enumeration',\n 'float',\n 'integer',\n 'json',\n 'media',\n 'number',\n 'password',\n 'richtext',\n 'blocks',\n 'string',\n 'text',\n 'time',\n];\n\nconst doesPluginOptionsHaveI18nLocalized = (\n opts?: object\n): opts is { i18n: { localized: boolean } } =>\n typeof opts === 'object' &&\n opts !== null &&\n 'i18n' in opts &&\n typeof opts.i18n === 'object' &&\n opts.i18n !== null &&\n 'localized' in opts.i18n &&\n typeof opts.i18n.localized === 'boolean';\n\nexport { LOCALIZED_FIELDS, doesPluginOptionsHaveI18nLocalized };\n","const capitalize = (str: string) => str.charAt(0).toUpperCase() + str.slice(1);\n\nexport { capitalize };\n","import * as React from 'react';\n\nimport { useAuth } from '@strapi/admin/strapi-admin';\nimport { unstable_useDocument as useDocument } from '@strapi/content-manager/strapi-admin';\nimport { useParams } from 'react-router-dom';\n\nimport { doesPluginOptionsHaveI18nLocalized } from '../utils/fields';\nimport { capitalize } from '../utils/strings';\n\ntype UseI18n = () => {\n hasI18n: boolean;\n canCreate: string[];\n canRead: string[];\n canUpdate: string[];\n canDelete: string[];\n canPublish: string[];\n};\n\n/**\n * @alpha\n * @description This hook is used to get the i18n status of a content type.\n * Also returns the CRUDP permission locale properties for the content type\n * so we know which locales the user can perform actions on.\n */\nconst useI18n: UseI18n = () => {\n // Extract the params from the URL to pass to our useDocument hook\n const params = useParams<{ collectionType: string; slug: string; model: string }>();\n\n const userPermissions = useAuth('useI18n', (state) => state.permissions);\n const actions = React.useMemo(() => {\n const permissions = userPermissions.filter((permission) => permission.subject === params.slug);\n\n return permissions.reduce<Omit<ReturnType<UseI18n>, 'hasI18n'>>(\n (acc, permission) => {\n const [actionShorthand] = permission.action.split('.').slice(-1);\n\n return {\n ...acc,\n [`can${capitalize(actionShorthand)}`]: permission.properties?.locales ?? [],\n };\n },\n { canCreate: [], canRead: [], canUpdate: [], canDelete: [], canPublish: [] }\n );\n }, [params.slug, userPermissions]);\n\n // TODO: use specific hook to get schema only\n const { schema } = useDocument(\n {\n // We can non-null assert these because below we skip the query if they are not present\n collectionType: params.collectionType!,\n model: params.slug!,\n },\n {\n skip: true,\n }\n );\n\n if (doesPluginOptionsHaveI18nLocalized(schema?.pluginOptions)) {\n return {\n hasI18n: schema.pluginOptions.i18n.localized,\n ...actions,\n };\n }\n\n return {\n hasI18n: false,\n ...actions,\n };\n};\n\nexport { useI18n };\n","import { adminApi } from '@strapi/admin/strapi-admin';\n\nconst i18nApi = adminApi.enhanceEndpoints({\n addTagTypes: ['Locale'],\n});\n\nexport { i18nApi };\n","import { i18nApi } from './api';\n\nimport type { GetISOLocales } from '../../../shared/contracts/iso-locales';\nimport type {\n GetLocales,\n CreateLocale,\n DeleteLocale,\n UpdateLocale,\n} from '../../../shared/contracts/locales';\n\nconst localesApi = i18nApi.injectEndpoints({\n endpoints: (builder) => ({\n createLocale: builder.mutation<CreateLocale.Response, CreateLocale.Request['body']>({\n query: (data) => ({\n url: '/i18n/locales',\n method: 'POST',\n data,\n }),\n invalidatesTags: [{ type: 'Locale', id: 'LIST' }],\n }),\n deleteLocale: builder.mutation<DeleteLocale.Response, DeleteLocale.Params['id']>({\n query: (id) => ({\n url: `/i18n/locales/${id}`,\n method: 'DELETE',\n }),\n invalidatesTags: (result, error, id) => [{ type: 'Locale', id }],\n }),\n getLocales: builder.query<GetLocales.Response, void>({\n query: () => '/i18n/locales',\n providesTags: (res) => [\n { type: 'Locale', id: 'LIST' },\n ...(Array.isArray(res)\n ? res.map((locale) => ({\n type: 'Locale' as const,\n id: locale.id,\n }))\n : []),\n ],\n }),\n getDefaultLocales: builder.query<GetISOLocales.Response, void>({\n query: () => '/i18n/iso-locales',\n }),\n updateLocale: builder.mutation<\n UpdateLocale.Response,\n UpdateLocale.Request['body'] & UpdateLocale.Params\n >({\n query: ({ id, ...data }) => ({\n url: `/i18n/locales/${id}`,\n method: 'PUT',\n data,\n }),\n invalidatesTags: (result, error, { id }) => [{ type: 'Locale', id }],\n }),\n }),\n});\n\nconst {\n useCreateLocaleMutation,\n useDeleteLocaleMutation,\n useGetLocalesQuery,\n useGetDefaultLocalesQuery,\n useUpdateLocaleMutation,\n} = localesApi;\n\nexport {\n useCreateLocaleMutation,\n useDeleteLocaleMutation,\n useGetLocalesQuery,\n useGetDefaultLocalesQuery,\n useUpdateLocaleMutation,\n};\n","import { i18nApi } from './api';\n\nimport type { CountManyEntriesDraftRelations } from '../../../shared/contracts/content-manager';\n\nconst relationsApi = i18nApi.injectEndpoints({\n overrideExisting: true,\n endpoints: (builder) => ({\n getManyDraftRelationCount: builder.query<\n CountManyEntriesDraftRelations.Response['data'],\n CountManyEntriesDraftRelations.Request['query'] & {\n model: string;\n }\n >({\n query: ({ model, ...params }) => ({\n url: `/content-manager/collection-types/${model}/actions/countManyEntriesDraftRelations`,\n method: 'GET',\n config: {\n params,\n },\n }),\n transformResponse: (response: CountManyEntriesDraftRelations.Response) => response.data,\n }),\n }),\n});\n\nconst { useGetManyDraftRelationCountQuery } = relationsApi;\n\nexport { useGetManyDraftRelationCountQuery };\n","import type { Schema } from '@strapi/types';\n\ntype Data = Record<keyof Schema.ContentType['attributes'], any>;\n\nconst cleanData = (\n data: Data,\n schema: Schema.ContentType,\n components: Record<string, Schema.Component>\n) => {\n const cleanedData = removeFields(data, [\n 'createdAt',\n 'createdBy',\n 'updatedAt',\n 'updatedBy',\n 'id',\n 'documentId',\n 'publishedAt',\n 'strapi_stage',\n 'strapi_assignee',\n 'locale',\n 'status',\n ]);\n\n const cleanedDataWithoutPasswordAndRelation = recursiveRemoveFieldTypes(\n cleanedData,\n schema,\n components,\n ['relation', 'password']\n );\n\n return cleanedDataWithoutPasswordAndRelation;\n};\n\nconst removeFields = (data: Data, fields: Array<keyof Schema.ContentType['attributes']>) => {\n return Object.keys(data).reduce((acc, current) => {\n if (fields.includes(current)) {\n return acc;\n }\n acc[current] = data[current];\n return acc;\n }, {} as Data);\n};\n\nconst recursiveRemoveFieldTypes = (\n data: Data,\n schema: Schema.Schema,\n components: Record<string, Schema.Component>,\n fields: Array<keyof Schema.ContentType['attributes']>\n) => {\n return Object.keys(data).reduce((acc, current) => {\n const attribute = schema.attributes[current] ?? { type: undefined };\n\n if (fields.includes(attribute.type)) {\n return acc;\n }\n\n if (attribute.type === 'dynamiczone') {\n acc[current] = data[current].map((componentValue: any, index: number) => {\n const { id: _, ...rest } = recursiveRemoveFieldTypes(\n componentValue,\n components[componentValue.__component],\n components,\n fields\n );\n\n return {\n ...rest,\n __temp_key__: index + 1,\n };\n });\n } else if (attribute.type === 'component') {\n const { repeatable, component } = attribute;\n\n if (repeatable) {\n acc[current] = (data[current] ?? []).map((compoData: any, index: number) => {\n const { id: _, ...rest } = recursiveRemoveFieldTypes(\n compoData,\n components[component],\n components,\n fields\n );\n\n return {\n ...rest,\n __temp_key__: index + 1,\n };\n });\n } else {\n const { id: _, ...rest } = recursiveRemoveFieldTypes(\n data[current] ?? {},\n components[component],\n components,\n fields\n );\n\n acc[current] = rest;\n }\n } else {\n acc[current] = data[current];\n }\n\n return acc;\n }, {} as any);\n};\n\nexport { cleanData };\n","import * as React from 'react';\n\nimport { FormErrors, Table, useTable } from '@strapi/admin/strapi-admin';\nimport { Box, Typography, IconButton, Flex, Tooltip, Status, Modal } from '@strapi/design-system';\nimport { Pencil, CheckCircle, CrossCircle, ArrowsCounterClockwise } from '@strapi/icons';\nimport { Modules } from '@strapi/types';\nimport { stringify } from 'qs';\nimport { type MessageDescriptor, useIntl, PrimitiveType } from 'react-intl';\nimport { Link } from 'react-router-dom';\n\nimport { Locale } from '../../../shared/contracts/locales';\nimport { getTranslation } from '../utils/getTranslation';\nimport { capitalize } from '../utils/strings';\n\nimport { LocaleStatus } from './CMHeaderActions';\n\ntype Status = Modules.Documents.Params.PublicationStatus.Kind | 'modified';\n\n/* -------------------------------------------------------------------------------------------------\n * EntryValidationText\n * -----------------------------------------------------------------------------------------------*/\n\ninterface EntryValidationTextProps {\n status: Status;\n validationErrors: FormErrors[string] | null;\n action: 'bulk-publish' | 'bulk-unpublish';\n}\n\ninterface TranslationMessage extends MessageDescriptor {\n values?: Record<string, PrimitiveType>;\n}\n\nconst isErrorMessageDescriptor = (object?: string | object): object is TranslationMessage => {\n return (\n typeof object === 'object' && object !== null && 'id' in object && 'defaultMessage' in object\n );\n};\n\nconst EntryValidationText = ({\n status = 'draft',\n validationErrors,\n action,\n}: EntryValidationTextProps) => {\n const { formatMessage } = useIntl();\n\n /**\n * TODO: Should this be extracted an made into a factory to recursively get\n * error messages??\n */\n const getErrorStr = (key: string, value?: FormErrors[string]): string => {\n if (typeof value === 'string') {\n return `${key}: ${value}`;\n } else if (isErrorMessageDescriptor(value)) {\n return `${key}: ${formatMessage(value)}`;\n } else if (Array.isArray(value)) {\n return value.map((v) => getErrorStr(key, v)).join(' ');\n } else if (typeof value === 'object' && !Array.isArray(value)) {\n return Object.entries(value)\n .map(([k, v]) => getErrorStr(k, v))\n .join(' ');\n } else {\n /**\n * unlikely to happen, but we need to return something\n */\n return '';\n }\n };\n\n if (validationErrors) {\n const validationErrorsMessages = Object.entries(validationErrors)\n .map(([key, value]) => {\n return getErrorStr(key, value);\n })\n .join(' ');\n\n return (\n <Flex gap={2}>\n <CrossCircle fill=\"danger600\" />\n <Tooltip label={validationErrorsMessages}>\n <Typography\n maxWidth={'30rem'}\n textColor=\"danger600\"\n variant=\"omega\"\n fontWeight=\"semiBold\"\n ellipsis\n >\n {validationErrorsMessages}\n </Typography>\n </Tooltip>\n </Flex>\n );\n }\n\n const getStatusMessage = () => {\n if (action === 'bulk-publish') {\n if (status === 'published') {\n return {\n icon: <CheckCircle fill=\"success600\" />,\n text: formatMessage({\n id: 'content-manager.bulk-publish.already-published',\n defaultMessage: 'Already Published',\n }),\n textColor: 'success600',\n fontWeight: 'bold',\n };\n } else if (status === 'modified') {\n return {\n icon: <ArrowsCounterClockwise fill=\"alternative600\" />,\n text: formatMessage({\n id: 'app.utils.ready-to-publish-changes',\n defaultMessage: 'Ready to publish changes',\n }),\n };\n } else {\n return {\n icon: <CheckCircle fill=\"success600\" />,\n text: formatMessage({\n id: 'app.utils.ready-to-publish',\n defaultMessage: 'Ready to publish',\n }),\n };\n }\n } else {\n if (status === 'draft') {\n return {\n icon: <CheckCircle fill=\"success600\" />,\n text: formatMessage({\n id: 'content-manager.bulk-unpublish.already-unpublished',\n defaultMessage: 'Already Unpublished',\n }),\n textColor: 'success600',\n fontWeight: 'bold',\n };\n } else {\n return {\n icon: <CheckCircle fill=\"success600\" />,\n text: formatMessage({\n id: 'app.utils.ready-to-unpublish-changes',\n defaultMessage: 'Ready to unpublish',\n }),\n textColor: 'success600',\n fontWeight: 'bold',\n };\n }\n }\n };\n\n const { icon, text, textColor = 'success600', fontWeight = 'normal' } = getStatusMessage();\n\n return (\n <Flex gap={2}>\n {icon}\n <Typography textColor={textColor} fontWeight={fontWeight}>\n {text}\n </Typography>\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * BoldChunk\n * -----------------------------------------------------------------------------------------------*/\n\nconst BoldChunk = (chunks: React.ReactNode) => <Typography fontWeight=\"bold\">{chunks}</Typography>;\n\n/* -------------------------------------------------------------------------------------------------\n * BulkLocaleActionModal\n * -----------------------------------------------------------------------------------------------*/\n\ninterface BulkLocaleActionModalProps {\n rows: LocaleStatus[];\n headers: {\n label: string;\n name: string;\n }[];\n localesMetadata: Locale[];\n validationErrors?: FormErrors;\n action: 'bulk-publish' | 'bulk-unpublish';\n}\n\nconst BulkLocaleActionModal = ({\n headers,\n rows,\n localesMetadata,\n validationErrors = {},\n action,\n}: BulkLocaleActionModalProps) => {\n const { formatMessage } = useIntl();\n\n const selectedRows = useTable<LocaleStatus[]>(\n 'BulkLocaleActionModal',\n (state) => state.selectedRows\n );\n\n const getFormattedCountMessage = () => {\n const currentStatusByLocale = rows.reduce<Record<string, string>>((acc, { locale, status }) => {\n acc[locale] = status;\n return acc;\n }, {});\n const localesWithErrors = Object.keys(validationErrors);\n\n const publishedCount = selectedRows.filter(\n ({ locale }) => currentStatusByLocale[locale] === 'published'\n ).length;\n\n const draftCount = selectedRows.filter(\n ({ locale }) =>\n (currentStatusByLocale[locale] === 'draft' ||\n currentStatusByLocale[locale] === 'modified') &&\n !localesWithErrors.includes(locale)\n ).length;\n\n const withErrorsCount = localesWithErrors.length;\n const messageId =\n action === 'bulk-publish'\n ? 'content-manager.containers.list.selectedEntriesModal.selectedCount.publish'\n : 'content-manager.containers.list.selectedEntriesModal.selectedCount.unpublish';\n\n const defaultMessage =\n action === 'bulk-publish'\n ? '<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.'\n : '<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.';\n\n return formatMessage(\n {\n id: messageId,\n defaultMessage,\n },\n {\n withErrorsCount,\n draftCount,\n publishedCount,\n b: BoldChunk,\n }\n );\n };\n\n return (\n <Modal.Body>\n <Typography>{getFormattedCountMessage()}</Typography>\n <Box marginTop={5}>\n <Table.Content>\n <Table.Head>\n <Table.HeaderCheckboxCell />\n {headers.map((head) => (\n <Table.HeaderCell key={head.name} {...head} />\n ))}\n </Table.Head>\n <Table.Body>\n {rows.map(({ locale, status }, index) => {\n const error = validationErrors?.[locale] ?? null;\n\n const statusVariant =\n status === 'draft' ? 'primary' : status === 'published' ? 'success' : 'alternative';\n\n return (\n <Table.Row key={index}>\n <Table.CheckboxCell id={locale} aria-label={`Select ${locale}`} />\n <Table.Cell>\n <Typography variant=\"sigma\" textColor=\"neutral600\">\n {Array.isArray(localesMetadata)\n ? localesMetadata.find((localeEntry) => localeEntry.code === locale)?.name\n : locale}\n </Typography>\n </Table.Cell>\n <Table.Cell>\n <Box display=\"flex\">\n <Status\n display=\"flex\"\n paddingLeft=\"6px\"\n paddingRight=\"6px\"\n paddingTop=\"2px\"\n paddingBottom=\"2px\"\n size={'S'}\n variant={statusVariant}\n >\n <Typography tag=\"span\" variant=\"pi\" fontWeight=\"bold\">\n {capitalize(status)}\n </Typography>\n </Status>\n </Box>\n </Table.Cell>\n <Table.Cell>\n <EntryValidationText validationErrors={error} status={status} action={action} />\n </Table.Cell>\n <Table.Cell>\n <IconButton\n tag={Link}\n to={{\n search: stringify({ plugins: { i18n: { locale } } }),\n }}\n label={formatMessage(\n {\n id: getTranslation('Settings.list.actions.edit'),\n defaultMessage: 'Edit {name} locale',\n },\n {\n name: locale,\n }\n )}\n variant=\"ghost\"\n >\n <Pencil />\n </IconButton>\n </Table.Cell>\n </Table.Row>\n );\n })}\n </Table.Body>\n </Table.Content>\n </Box>\n </Modal.Body>\n );\n};\n\nexport { BulkLocaleActionModal };\nexport type { BulkLocaleActionModalProps };\n","import * as React from 'react';\n\nimport { skipToken } from '@reduxjs/toolkit/query';\nimport {\n useNotification,\n useQueryParams,\n Table,\n useAPIErrorHandler,\n FormErrors,\n useForm,\n} from '@strapi/admin/strapi-admin';\nimport {\n type DocumentActionComponent,\n type DocumentActionProps,\n unstable_useDocument as useDocument,\n unstable_useDocumentActions as useDocumentActions,\n buildValidParams,\n HeaderActionProps,\n} from '@strapi/content-manager/strapi-admin';\nimport {\n Flex,\n Status,\n Typography,\n Button,\n Modal,\n Field,\n SingleSelect,\n SingleSelectOption,\n Dialog,\n type StatusVariant,\n} from '@strapi/design-system';\nimport { WarningCircle, ListPlus, Trash, Download, Cross, Plus } from '@strapi/icons';\nimport { Modules } from '@strapi/types';\nimport { useIntl } from 'react-intl';\nimport { useNavigate } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { useI18n } from '../hooks/useI18n';\nimport { useGetLocalesQuery } from '../services/locales';\nimport { useGetManyDraftRelationCountQuery } from '../services/relations';\nimport { cleanData } from '../utils/clean';\nimport { getTranslation } from '../utils/getTranslation';\nimport { capitalize } from '../utils/strings';\n\nimport { BulkLocaleActionModal } from './BulkLocaleActionModal';\n\nimport type { Locale } from '../../../shared/contracts/locales';\nimport type { I18nBaseQuery } from '../types';\n\n/* -------------------------------------------------------------------------------------------------\n * LocalePickerAction\n * -----------------------------------------------------------------------------------------------*/\n\ninterface LocaleOptionProps {\n isDraftAndPublishEnabled: boolean;\n locale: Locale;\n status: 'draft' | 'published' | 'modified';\n entryExists: boolean;\n}\n\nconst statusVariants: Record<LocaleOptionProps['status'], StatusVariant> = {\n draft: 'secondary',\n published: 'success',\n modified: 'alternative',\n};\n\nconst LocaleOption = ({\n isDraftAndPublishEnabled,\n locale,\n status,\n entryExists,\n}: LocaleOptionProps) => {\n const { formatMessage } = useIntl();\n\n if (!entryExists) {\n return formatMessage(\n {\n id: getTranslation('CMEditViewLocalePicker.locale.create'),\n defaultMessage: 'Create <bold>{locale}</bold> locale',\n },\n {\n bold: (locale: React.ReactNode) => <b>{locale}</b>,\n locale: locale.name,\n }\n );\n }\n\n return (\n <Flex width=\"100%\" gap={1} justifyContent=\"space-between\">\n <Typography>{locale.name}</Typography>\n {isDraftAndPublishEnabled ? (\n <Status\n display=\"flex\"\n paddingLeft=\"6px\"\n paddingRight=\"6px\"\n paddingTop=\"2px\"\n paddingBottom=\"2px\"\n size=\"S\"\n variant={statusVariants[status]}\n >\n <Typography tag=\"span\" variant=\"pi\" fontWeight=\"bold\">\n {capitalize(status)}\n </Typography>\n </Status>\n ) : null}\n </Flex>\n );\n};\n\nconst LocalePickerAction = ({\n document,\n meta,\n model,\n collectionType,\n documentId,\n}: HeaderActionProps) => {\n const { formatMessage } = useIntl();\n const [{ query }, setQuery] = useQueryParams<I18nBaseQuery>();\n const { hasI18n, canCreate, canRead } = useI18n();\n const { data: locales = [] } = useGetLocalesQuery();\n const currentDesiredLocale = query.plugins?.i18n?.locale;\n const { schema } = useDocument({\n model,\n collectionType,\n documentId,\n params: { locale: currentDesiredLocale },\n });\n\n const handleSelect = React.useCallback(\n (value: string) => {\n setQuery({\n plugins: {\n ...query.plugins,\n i18n: {\n locale: value,\n },\n },\n });\n },\n [query.plugins, setQuery]\n );\n\n React.useEffect(() => {\n if (!Array.isArray(locales) || !hasI18n) {\n return;\n }\n /**\n * Handle the case where the current locale query param doesn't exist\n * in the list of available locales, so we redirect to the default locale.\n */\n const doesLocaleExist = locales.find((loc) => loc.code === currentDesiredLocale);\n const defaultLocale = locales.find((locale) => locale.isDefault);\n if (!doesLocaleExist && defaultLocale?.code) {\n handleSelect(defaultLocale.code);\n }\n }, [handleSelect, hasI18n, locales, currentDesiredLocale]);\n\n const currentLocale = Array.isArray(locales)\n ? locales.find((locale) => locale.code === currentDesiredLocale)\n : undefined;\n\n const allCurrentLocales = [\n { status: getDocumentStatus(document, meta), locale: currentLocale?.code },\n ...(document?.localizations ?? []),\n ];\n\n if (!hasI18n || !Array.isArray(locales) || locales.length === 0) {\n return null;\n }\n\n const displayedLocales = locales.filter((locale) => {\n /**\n * If you can read we allow you to see the locale exists\n * otherwise the locale is hidden.\n */\n return canRead.includes(locale.code);\n });\n\n return {\n label: formatMessage({\n id: getTranslation('Settings.locales.modal.locales.label'),\n defaultMessage: 'Locales',\n }),\n options: displayedLocales.map((locale) => {\n const entryWithLocaleExists = allCurrentLocales.some((doc) => doc.locale === locale.code);\n\n const currentLocaleDoc = allCurrentLocales.find((doc) =>\n 'locale' in doc ? doc.locale === locale.code : false\n );\n\n const permissionsToCheck = currentLocaleDoc ? canRead : canCreate;\n\n return {\n disabled: !permissionsToCheck.includes(locale.code),\n value: locale.code,\n label: (\n <LocaleOption\n isDraftAndPublishEnabled={!!schema?.options?.draftAndPublish}\n locale={locale}\n status={currentLocaleDoc?.status}\n entryExists={entryWithLocaleExists}\n />\n ),\n startIcon: !entryWithLocaleExists ? <Plus /> : null,\n };\n }),\n customizeContent: () => currentLocale?.name,\n onSelect: handleSelect,\n value: currentLocale,\n };\n};\n\ntype UseDocument = typeof useDocument;\n\nconst getDocumentStatus = (\n document: ReturnType<UseDocument>['document'],\n meta: ReturnType<UseDocument>['meta']\n): 'draft' | 'published' | 'modified' => {\n const docStatus = document?.status;\n const statuses = meta?.availableStatus ?? [];\n\n /**\n * Creating an entry\n */\n if (!docStatus) {\n return 'draft';\n }\n\n /**\n * We're viewing a draft, but the document could have a published version\n */\n if (docStatus === 'draft' && statuses.find((doc) => doc.publishedAt !== null)) {\n return 'published';\n }\n\n return docStatus;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * FillFromAnotherLocaleAction\n * -----------------------------------------------------------------------------------------------*/\n\nconst FillFromAnotherLocaleAction = ({\n documentId,\n meta,\n model,\n collectionType,\n}: HeaderActionProps) => {\n const { formatMessage } = useIntl();\n const [{ query }] = useQueryParams<I18nBaseQuery>();\n const { hasI18n } = useI18n();\n const currentDesiredLocale = query.plugins?.i18n?.locale;\n const [localeSelected, setLocaleSelected] = React.useState<string | null>(null);\n const setValues = useForm('FillFromAnotherLocale', (state) => state.setValues);\n\n const { getDocument } = useDocumentActions();\n const { schema, components } = useDocument({\n model,\n documentId,\n collectionType,\n params: { locale: currentDesiredLocale },\n });\n const { data: locales = [] } = useGetLocalesQuery();\n\n const availableLocales = Array.isArray(locales)\n ? locales.filter((locale) => meta?.availableLocales.some((l) => l.locale === locale.code))\n : [];\n\n const fillFromLocale = (onClose: () => void) => async () => {\n const response = await getDocument({\n collectionType,\n model,\n documentId,\n params: { locale: localeSelected },\n });\n if (!response || !schema) {\n return;\n }\n\n const { data } = response;\n\n const cleanedData = cleanData(data, schema, components);\n\n setValues(cleanedData);\n\n onClose();\n };\n\n if (!hasI18n) {\n return null;\n }\n\n return {\n type: 'icon',\n icon: <Download />,\n disabled: availableLocales.length === 0,\n label: formatMessage({\n id: getTranslation('CMEditViewCopyLocale.copy-text'),\n defaultMessage: 'Fill in from another locale',\n }),\n dialog: {\n type: 'dialog',\n title: formatMessage({\n id: getTranslation('CMEditViewCopyLocale.dialog.title'),\n defaultMessage: 'Confirmation',\n }),\n content: ({ onClose }: { onClose: () => void }) => (\n <>\n <Dialog.Body>\n <Flex direction=\"column\" gap={3}>\n <WarningCircle width=\"24px\" height=\"24px\" fill=\"danger600\" />\n <Typography textAlign=\"center\">\n {formatMessage({\n id: getTranslation('CMEditViewCopyLocale.dialog.body'),\n defaultMessage:\n 'Your current content will be erased and filled by the content of the selected locale:',\n })}\n </Typography>\n <Field.Root width=\"100%\">\n <Field.Label>\n {formatMessage({\n id: getTranslation('CMEditViewCopyLocale.dialog.field.label'),\n defaultMessage: 'Locale',\n })}\n </Field.Label>\n <SingleSelect\n value={localeSelected}\n placeholder={formatMessage({\n id: getTranslation('CMEditViewCopyLocale.dialog.field.placeholder'),\n defaultMessage: 'Select one locale...',\n })}\n // @ts-expect-error – the DS will handle numbers, but we're not allowing the API.\n onChange={(value) => setLocaleSelected(value)}\n >\n {availableLocales.map((locale) => (\n <SingleSelectOption key={locale.code} value={locale.code}>\n {locale.name}\n </SingleSelectOption>\n ))}\n </SingleSelect>\n </Field.Root>\n </Flex>\n </Dialog.Body>\n <Dialog.Footer>\n <Flex gap={2} width=\"100%\">\n <Button flex=\"auto\" variant=\"tertiary\" onClick={onClose}>\n {formatMessage({\n id: getTranslation('CMEditViewCopyLocale.cancel-text'),\n defaultMessage: 'No, cancel',\n })}\n </Button>\n <Button flex=\"auto\" variant=\"success\" onClick={fillFromLocale(onClose)}>\n {formatMessage({\n id: getTranslation('CMEditViewCopyLocale.submit-text'),\n defaultMessage: 'Yes, fill in',\n })}\n </Button>\n </Flex>\n </Dialog.Footer>\n </>\n ),\n },\n };\n};\n\n/* -------------------------------------------------------------------------------------------------\n * DeleteLocaleAction\n * -----------------------------------------------------------------------------------------------*/\n\nconst DeleteLocaleAction: DocumentActionComponent = ({\n document,\n documentId,\n model,\n collectionType,\n}) => {\n const { formatMessage } = useIntl();\n const navigate = useNavigate();\n const { toggleNotification } = useNotification();\n const { delete: deleteAction } = useDocumentActions();\n const { hasI18n, canDelete } = useI18n();\n\n // Get the current locale object, using the URL instead of document so it works while creating\n const [{ query }] = useQueryParams<I18nBaseQuery>();\n const { data: locales = [] } = useGetLocalesQuery();\n const currentDesiredLocale = query.plugins?.i18n?.locale;\n const locale = !('error' in locales) && locales.find((loc) => loc.code === currentDesiredLocale);\n\n if (!hasI18n) {\n return null;\n }\n\n return {\n disabled:\n (document?.locale && !canDelete.includes(document.locale)) || !document || !document.id,\n position: ['header', 'table-row'],\n label: formatMessage(\n {\n id: getTranslation('actions.delete.label'),\n defaultMessage: 'Delete entry ({locale})',\n },\n { locale: locale && locale.name }\n ),\n icon: <StyledTrash />,\n variant: 'danger',\n dialog: {\n type: 'dialog',\n title: formatMessage({\n id: getTranslation('actions.delete.dialog.title'),\n defaultMessage: 'Confirmation',\n }),\n content: (\n <Flex direction=\"column\" gap={2}>\n <WarningCircle width=\"24px\" height=\"24px\" fill=\"danger600\" />\n <Typography tag=\"p\" variant=\"omega\" textAlign=\"center\">\n {formatMessage({\n id: getTranslation('actions.delete.dialog.body'),\n defaultMessage: 'Are you sure?',\n })}\n </Typography>\n </Flex>\n ),\n onConfirm: async () => {\n const unableToDelete =\n // We are unable to delete a collection type without a document ID\n // & unable to delete generally if there is no document locale\n (collectionType !== 'single-types' && !documentId) || !document?.locale;\n\n if (unableToDelete) {\n console.error(\n \"You're trying to delete a document without an id or locale, this is likely a bug with Strapi. Please open an issue.\"\n );\n\n toggleNotification({\n message: formatMessage({\n id: getTranslation('actions.delete.error'),\n defaultMessage: 'An error occurred while trying to delete the document locale.',\n }),\n type: 'danger',\n });\n\n return;\n }\n\n const res = await deleteAction({\n documentId,\n model,\n collectionType,\n params: { locale: document.locale },\n });\n\n if (!('error' in res)) {\n navigate({ pathname: `../${collectionType}/${model}` }, { replace: true });\n }\n },\n },\n };\n};\n\nexport type LocaleStatus = {\n locale: string;\n status: Modules.Documents.Params.PublicationStatus.Kind | 'modified';\n};\n\ninterface ExtendedDocumentActionProps extends DocumentActionProps {\n action?: 'bulk-publish' | 'bulk-unpublish';\n}\n\n/* -------------------------------------------------------------------------------------------------\n * BulkLocaleAction\n *\n * This component is used to handle bulk publish and unpublish actions on locales.\n * -----------------------------------------------------------------------------------------------*/\n\nconst BulkLocaleAction: DocumentActionComponent = ({\n document,\n documentId,\n model,\n collectionType,\n action,\n}: ExtendedDocumentActionProps) => {\n const locale = document?.locale ?? null;\n const [{ query }] = useQueryParams<{ status: 'draft' | 'published' }>();\n\n const params = React.useMemo(() => buildValidParams(query), [query]);\n const isOnPublishedTab = query.status === 'published';\n\n const { formatMessage } = useIntl();\n const { hasI18n, canPublish } = useI18n();\n const { toggleNotification } = useNotification();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n\n const [selectedRows, setSelectedRows] = React.useState<any[]>([]);\n const [isDraftRelationConfirmationOpen, setIsDraftRelationConfirmationOpen] =\n React.useState<boolean>(false);\n\n const { publishMany: publishManyAction, unpublishMany: unpublishManyAction } =\n useDocumentActions();\n\n const { schema, validate } = useDocument(\n {\n model,\n collectionType,\n documentId,\n params: {\n locale,\n },\n },\n {\n // No need to fetch the document, the data is already available in the `document` prop\n skip: true,\n }\n );\n\n const { data: localesMetadata = [] } = useGetLocalesQuery(hasI18n ? undefined : skipToken);\n\n const headers = [\n {\n label: formatMessage({\n id: 'global.name',\n defaultMessage: 'Name',\n }),\n name: 'name',\n },\n {\n label: formatMessage({\n id: getTranslation('CMEditViewBulkLocale.status'),\n defaultMessage: 'Status',\n }),\n name: 'status',\n },\n {\n label: formatMessage({\n id: getTranslation('CMEditViewBulkLocale.publication-status'),\n defaultMessage: 'Publication Status',\n }),\n name: 'publication-status',\n },\n ];\n\n // Extract the rows for the bulk locale publish modal and any validation\n // errors per locale\n const [rows, validationErrors] = React.useMemo(() => {\n if (!document) {\n return [[], {}];\n }\n\n const localizations = document.localizations ?? [];\n\n // Build the rows for the bulk locale publish modal by combining the current\n // document with all the available locales from the document meta\n const locales: LocaleStatus[] = localizations.map((doc: any) => {\n const { locale, status } = doc;\n return { locale, status };\n });\n\n // Add the current document locale\n locales.unshift({\n locale: document.locale,\n status: document.status,\n });\n\n // Build the validation errors for each locale.\n const allDocuments = [document, ...localizations];\n const errors = allDocuments.reduce<FormErrors>((errs, document) => {\n if (!document) {\n return errs;\n }\n\n // Validate each locale entry via the useDocument validate function and store any errors in a dictionary\n const validation = validate(document as Modules.Documents.AnyDocument);\n if (validation !== null) {\n errs[document.locale] = validation;\n }\n return errs;\n }, {});\n\n return [locales, errors];\n }, [document, validate]);\n\n const isBulkPublish = action === 'bulk-publish';\n const localesForAction = selectedRows.reduce((acc: string[], selectedRow: LocaleStatus) => {\n const isValidLocale =\n // Validation errors are irrelevant if we are trying to unpublish\n !isBulkPublish || !Object.keys(validationErrors).includes(selectedRow.locale);\n\n const shouldAddLocale = isBulkPublish\n ? selectedRow.status !== 'published' && isValidLocale\n : selectedRow.status !== 'draft' && isValidLocale;\n\n if (shouldAddLocale) {\n acc.push(selectedRow.locale);\n }\n\n return acc;\n }, []);\n\n // TODO skipping this for now as there is a bug with the draft relation count that will be worked on separately\n // see https://www.notion.so/strapi/Count-draft-relations-56901b492efb45ab90d42fe975b32bd8?pvs=4\n const enableDraftRelationsCount = false;\n const {\n data: draftRelationsCount = 0,\n isLoading: isDraftRelationsLoading,\n error: isDraftRelationsError,\n } = useGetManyDraftRelationCountQuery(\n {\n model,\n documentIds: [documentId!],\n locale: localesForAction,\n },\n {\n skip: !enableDraftRelationsCount || !documentId || localesForAction.length === 0,\n }\n );\n\n React.useEffect(() => {\n if (isDraftRelationsError) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(isDraftRelationsError),\n });\n }\n }, [isDraftRelationsError, toggleNotification, formatAPIError]);\n\n if (!schema?.options?.draftAndPublish) {\n return null;\n }\n\n if (!hasI18n) {\n return null;\n }\n\n if (!documentId) {\n return null;\n }\n\n // This document action can be enabled given that draft and publish and i18n are\n // enabled and we can publish the current locale.\n\n const publish = async () => {\n await publishManyAction({\n model,\n documentIds: [documentId],\n params: {\n ...params,\n locale: localesForAction,\n },\n });\n\n setSelectedRows([]);\n };\n\n const unpublish = async () => {\n await unpublishManyAction({\n model,\n documentIds: [documentId],\n params: {\n ...params,\n locale: localesForAction,\n },\n });\n\n setSelectedRows([]);\n };\n\n const handleAction = async () => {\n if (draftRelationsCount > 0) {\n setIsDraftRelationConfirmationOpen(true);\n } else if (isBulkPublish) {\n await publish();\n } else {\n await unpublish();\n }\n };\n\n if (isDraftRelationConfirmationOpen) {\n return {\n label: formatMessage({\n id: 'app.components.ConfirmDialog.title',\n defaultMessage: 'Confirmation',\n }),\n variant: 'danger',\n dialog: {\n onCancel: () => {\n setIsDraftRelationConfirmationOpen(false);\n },\n onConfirm: async () => {\n await publish();\n\n setIsDraftRelationConfirmationOpen(false);\n },\n type: 'dialog',\n title: formatMessage({\n id: getTranslation('actions.publish.dialog.title'),\n defaultMessage: 'Confirmation',\n }),\n content: (\n <Flex direction=\"column\" alignItems=\"center\" gap={2}>\n <WarningCircle width=\"2.4rem\" height=\"2.4rem\" fill=\"danger600\" />\n <Typography textAlign=\"center\">\n {formatMessage({\n id: getTranslation('CMEditViewBulkLocale.draft-relation-warning'),\n defaultMessage:\n 'Some locales are related to draft entries. Publishing them could leave broken links in your app.',\n })}\n </Typography>\n <Typography textAlign=\"center\">\n {formatMessage({\n id: getTranslation('CMEditViewBulkLocale.continue-confirmation'),\n defaultMessage: 'Are you sure you want to continue?',\n })}\n </Typography>\n </Flex>\n ),\n },\n };\n }\n\n const hasPermission = selectedRows\n .map(({ locale }) => locale)\n .every((locale) => canPublish.includes(locale));\n\n return {\n label: formatMessage({\n id: getTranslation(`CMEditViewBulkLocale.${isBulkPublish ? 'publish' : 'unpublish'}-title`),\n defaultMessage: `${isBulkPublish ? 'Publish' : 'Unpublish'} Multiple Locales`,\n }),\n variant: isBulkPublish ? 'secondary' : 'danger',\n icon: isBulkPublish ? <ListPlus /> : <Cross />,\n disabled: isOnPublishedTab || canPublish.length === 0,\n position: ['panel'],\n dialog: {\n type: 'modal',\n title: formatMessage({\n id: getTranslation(`CMEditViewBulkLocale.${isBulkPublish ? 'publish' : 'unpublish'}-title`),\n defaultMessage: `${isBulkPublish ? 'Publish' : 'Unpublish'} Multiple Locales`,\n }),\n content: () => {\n return (\n <Table.Root\n headers={headers}\n rows={rows.map((row) => ({\n ...row,\n id: row.locale,\n }))}\n selectedRows={selectedRows}\n onSelectedRowsChange={(tableSelectedRows) => setSelectedRows(tableSelectedRows)}\n >\n <BulkLocaleActionModal\n validationErrors={validationErrors}\n headers={headers}\n rows={rows}\n localesMetadata={localesMetadata as Locale[]}\n action={action ?? 'bulk-publish'}\n />\n </Table.Root>\n );\n },\n footer: () => (\n <Modal.Footer justifyContent=\"flex-end\">\n <Button\n loading={isDraftRelationsLoading}\n disabled={!hasPermission || localesForAction.length === 0}\n variant=\"default\"\n onClick={handleAction}\n >\n {formatMessage({\n id: isBulkPublish ? 'app.utils.publish' : 'app.utils.unpublish',\n defaultMessage: isBulkPublish ? 'Publish' : 'Unpublish',\n })}\n </Button>\n </Modal.Footer>\n ),\n },\n };\n};\n\n/* -------------------------------------------------------------------------------------------------\n * BulkLocalePublishAction\n * -----------------------------------------------------------------------------------------------*/\nconst BulkLocalePublishAction: DocumentActionComponent = (props: ExtendedDocumentActionProps) => {\n return BulkLocaleAction({ action: 'bulk-publish', ...props });\n};\n\n/* -------------------------------------------------------------------------------------------------\n * BulkLocaleUnpublishAction\n * -----------------------------------------------------------------------------------------------*/\nconst BulkLocaleUnpublishAction: DocumentActionComponent = (props: ExtendedDocumentActionProps) => {\n return BulkLocaleAction({ action: 'bulk-unpublish', ...props });\n};\n\n/**\n * Because the icon system is completely broken, we have to do\n * this to remove the fill from the cog.\n */\nconst StyledTrash = styled(Trash)`\n path {\n fill: currentColor;\n }\n`;\n\nexport {\n BulkLocalePublishAction,\n BulkLocaleUnpublishAction,\n DeleteLocaleAction,\n LocalePickerAction,\n FillFromAnotherLocaleAction,\n};\n","import * as React from 'react';\n\nimport { Typography } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { useI18n } from '../hooks/useI18n';\nimport { getTranslation } from '../utils/getTranslation';\n\nconst Emphasis = (chunks: React.ReactNode) => {\n return (\n <Typography fontWeight=\"semiBold\" textColor=\"danger500\">\n {chunks}\n </Typography>\n );\n};\n\nconst DeleteModalAdditionalInfo = () => {\n const { hasI18n } = useI18n();\n const { formatMessage } = useIntl();\n\n if (!hasI18n) {\n return null;\n }\n\n return (\n <Typography textColor=\"danger500\">\n {formatMessage(\n {\n id: getTranslation('Settings.list.actions.deleteAdditionalInfos'),\n defaultMessage:\n 'This will delete the active locale versions <em>(from Internationalization)</em>',\n },\n {\n em: Emphasis,\n }\n )}\n </Typography>\n );\n};\n\nconst PublishModalAdditionalInfo = () => {\n const { hasI18n } = useI18n();\n const { formatMessage } = useIntl();\n\n if (!hasI18n) {\n return null;\n }\n\n return (\n <Typography textColor=\"danger500\">\n {formatMessage(\n {\n id: getTranslation('Settings.list.actions.publishAdditionalInfos'),\n defaultMessage:\n 'This will publish the active locale versions <em>(from Internationalization)</em>',\n },\n {\n em: Emphasis,\n }\n )}\n </Typography>\n );\n};\n\nconst UnpublishModalAdditionalInfo = () => {\n const { hasI18n } = useI18n();\n const { formatMessage } = useIntl();\n\n if (!hasI18n) {\n return null;\n }\n\n return (\n <Typography textColor=\"danger500\">\n {formatMessage(\n {\n id: getTranslation('Settings.list.actions.unpublishAdditionalInfos'),\n defaultMessage:\n 'This will unpublish the active locale versions <em>(from Internationalization)</em>',\n },\n {\n em: Emphasis,\n }\n )}\n </Typography>\n );\n};\n\nexport { DeleteModalAdditionalInfo, PublishModalAdditionalInfo, UnpublishModalAdditionalInfo };\n","import * as React from 'react';\n\nimport { useQueryParams } from '@strapi/admin/strapi-admin';\nimport { SingleSelect, SingleSelectOption } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { useI18n } from '../hooks/useI18n';\nimport { useGetLocalesQuery } from '../services/locales';\nimport { getTranslation } from '../utils/getTranslation';\n\nimport type { I18nBaseQuery } from '../types';\n\ninterface Query extends I18nBaseQuery {\n page?: number;\n}\n\nconst LocalePicker = () => {\n const { formatMessage } = useIntl();\n const [{ query }, setQuery] = useQueryParams<Query>();\n\n const { hasI18n, canRead, canCreate } = useI18n();\n const { data: locales = [] } = useGetLocalesQuery(undefined, {\n skip: !hasI18n,\n });\n\n const handleChange = React.useCallback(\n (code: string, replace = false) => {\n setQuery(\n {\n page: 1,\n plugins: { ...query.plugins, i18n: { locale: code } },\n },\n 'push',\n replace\n );\n },\n [query.plugins, setQuery]\n );\n\n React.useEffect(() => {\n if (!Array.isArray(locales) || !hasI18n) {\n return;\n }\n /**\n * Handle the case where the current locale query param doesn't exist\n * in the list of available locales, so we redirect to the default locale.\n */\n const currentDesiredLocale = query.plugins?.i18n?.locale;\n const doesLocaleExist = locales.find((loc) => loc.code === currentDesiredLocale);\n const defaultLocale = locales.find((locale) => locale.isDefault);\n if (!doesLocaleExist && defaultLocale?.code) {\n handleChange(defaultLocale.code, true);\n }\n }, [hasI18n, handleChange, locales, query.plugins?.i18n?.locale]);\n\n if (!hasI18n || !Array.isArray(locales) || locales.length === 0) {\n return null;\n }\n\n const displayedLocales = locales.filter((locale) => {\n /**\n * If you can create or read we allow you to see the locale exists\n * this is because in the ListView, you may be able to create a new entry\n * in a locale you can't read.\n */\n return canCreate.includes(locale.code) || canRead.includes(locale.code);\n });\n\n return (\n <SingleSelect\n size=\"S\"\n aria-label={formatMessage({\n id: getTranslation('actions.select-locale'),\n defaultMessage: 'Select locale',\n })}\n value={query.plugins?.i18n?.locale || locales.find((locale) => locale.isDefault)?.code}\n // @ts-expect-error – This can be removed in V2 of the DS.\n onChange={handleChange}\n >\n {displayedLocales.map((locale) => (\n <SingleSelectOption key={locale.id} value={locale.code}>\n {locale.name}\n </SingleSelectOption>\n ))}\n </SingleSelect>\n );\n};\n\nexport { LocalePicker };\n","export const PERMISSIONS = {\n accessMain: [{ action: 'plugin::i18n.locale.read', subject: null }],\n create: [{ action: 'plugin::i18n.locale.create', subject: null }],\n delete: [{ action: 'plugin::i18n.locale.delete', subject: null }],\n update: [{ action: 'plugin::i18n.locale.update', subject: null }],\n read: [{ action: 'plugin::i18n.locale.read', subject: null }],\n};\n","/* eslint-disable check-file/filename-naming-convention */\nimport * as React from 'react';\n\nimport { Flex, VisuallyHidden } from '@strapi/design-system';\nimport { Earth, EarthStriked } from '@strapi/icons';\nimport { MessageDescriptor, useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { getTranslation } from '../utils/getTranslation';\n\nimport type { EditFieldLayout, EditLayout } from '@strapi/content-manager/strapi-admin';\n\ninterface MutateEditViewArgs {\n layout: EditLayout;\n}\n\nconst mutateEditViewHook = ({ layout }: MutateEditViewArgs): MutateEditViewArgs => {\n // If i18n isn't explicitly enabled on the content type, then no field can be localized\n if (\n !('i18n' in layout.options) ||\n (typeof layout.options.i18n === 'object' &&\n layout.options.i18n !== null &&\n 'localized' in layout.options.i18n &&\n !layout.options.i18n.localized)\n ) {\n return { layout };\n }\n\n const components = Object.entries(layout.components).reduce<EditLayout['components']>(\n (acc, [key, componentLayout]) => {\n return {\n ...acc,\n [key]: {\n ...componentLayout,\n layout: componentLayout.layout.map((row) => row.map(addLabelActionToField)),\n },\n };\n },\n {}\n );\n\n return {\n layout: {\n ...layout,\n components,\n layout: layout.layout.map((panel) => panel.map((row) => row.map(addLabelActionToField))),\n },\n } satisfies Pick<MutateEditViewArgs, 'layout'>;\n};\n\nconst addLabelActionToField = (field: EditFieldLayout) => {\n const isFieldLocalized = doesFieldHaveI18nPluginOpt(field.attribute.pluginOptions)\n ? field.attribute.pluginOptions.i18n.localized\n : true || ['uid', 'relation'].includes(field.attribute.type);\n\n const labelActionProps = {\n title: {\n id: isFieldLocalized\n ? getTranslation('Field.localized')\n : getTranslation('Field.not-localized'),\n defaultMessage: isFieldLocalized\n ? 'This value is unique for the selected locale'\n : 'This value is the same across all locales',\n },\n icon: isFieldLocalized ? <Earth /> : <EarthStriked />,\n };\n\n return {\n ...field,\n labelAction: <LabelAction {...labelActionProps} />,\n };\n};\n\nconst doesFieldHaveI18nPluginOpt = (\n pluginOpts?: object\n): pluginOpts is { i18n: { localized: boolean } } => {\n if (!pluginOpts) {\n return false;\n }\n\n return (\n 'i18n' in pluginOpts &&\n typeof pluginOpts.i18n === 'object' &&\n pluginOpts.i18n !== null &&\n 'localized' in pluginOpts.i18n\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * LabelAction\n * -----------------------------------------------------------------------------------------------*/\n\ninterface LabelActionProps {\n title: MessageDescriptor;\n icon: React.ReactNode;\n}\n\nconst LabelAction = ({ title, icon }: LabelActionProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <Span tag=\"span\">\n <VisuallyHidden tag=\"span\">{formatMessage(title)}</VisuallyHidden>\n {React.cloneElement(icon as React.ReactElement, {\n 'aria-hidden': true,\n focusable: false, // See: https://allyjs.io/tutorials/focusing-in-svg.html#making-svg-elements-focusable\n })}\n </Span>\n );\n};\n\nconst Span = styled(Flex)`\n svg {\n width: 12px;\n height: 12px;\n\n fill: ${({ theme }) => theme.colors.neutral500};\n\n path {\n fill: ${({ theme }) => theme.colors.neutral500};\n }\n }\n`;\n\nexport { mutateEditViewHook };\n","import { Box, Flex, Popover, Typography, useCollator, Button } from '@strapi/design-system';\nimport { CaretDown } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { Locale } from '../../../shared/contracts/locales';\nimport { useGetLocalesQuery } from '../services/locales';\n\ninterface LocaleListCellProps {\n localizations: { locale: string }[];\n locale: string;\n}\n\nconst LocaleListCell = ({ locale: currentLocale, localizations }: LocaleListCellProps) => {\n const { locale: language } = useIntl();\n const { data: locales = [] } = useGetLocalesQuery();\n const formatter = useCollator(language, {\n sensitivity: 'base',\n });\n\n if (!Array.isArray(locales) || !localizations) {\n return null;\n }\n\n const availableLocales = localizations.map((loc) => loc.locale);\n\n const localesForDocument = locales\n .reduce<Locale[]>((acc, locale) => {\n const createdLocale = [currentLocale, ...availableLocales].find((loc) => {\n return loc === locale.code;\n });\n\n if (createdLocale) {\n acc.push(locale);\n }\n\n return acc;\n }, [])\n .map((locale) => {\n if (locale.isDefault) {\n return `${locale.name} (default)`;\n }\n\n return locale.name;\n })\n .toSorted((a, b) => formatter.compare(a, b));\n\n return (\n <Popover.Root>\n <Popover.Trigger>\n <Button variant=\"ghost\" type=\"button\" onClick={(e) => e.stopPropagation()}>\n <Flex minWidth=\"100%\" alignItems=\"center\" justifyContent=\"center\" fontWeight=\"regular\">\n <Typography textColor=\"neutral800\" ellipsis marginRight={2}>\n {localesForDocument.join(', ')}\n </Typography>\n <Flex>\n <CaretDown width=\"1.2rem\" height=\"1.2rem\" />\n </Flex>\n </Flex>\n </Button>\n </Popover.Trigger>\n <Popover.Content sideOffset={16}>\n <ul>\n {localesForDocument.map((name) => (\n <Box key={name} padding={3} tag=\"li\">\n <Typography>{name}</Typography>\n </Box>\n ))}\n </ul>\n </Popover.Content>\n </Popover.Root>\n );\n};\n\nexport { LocaleListCell };\nexport type { LocaleListCellProps };\n","/* eslint-disable check-file/filename-naming-convention */\nimport { LocaleListCell } from '../components/LocaleListCell';\nimport { doesPluginOptionsHaveI18nLocalized } from '../utils/fields';\nimport { getTranslation } from '../utils/getTranslation';\n\nimport type { ListFieldLayout, ListLayout } from '@strapi/content-manager/strapi-admin';\n\n/* -------------------------------------------------------------------------------------------------\n * addColumnToTableHook\n * -----------------------------------------------------------------------------------------------*/\ninterface AddColumnToTableHookArgs {\n layout: ListLayout;\n displayedHeaders: ListFieldLayout[];\n}\n\nconst addColumnToTableHook = ({ displayedHeaders, layout }: AddColumnToTableHookArgs) => {\n const { options } = layout;\n\n const isFieldLocalized = doesPluginOptionsHaveI18nLocalized(options)\n ? options.i18n.localized\n : false;\n\n if (!isFieldLocalized) {\n return { displayedHeaders, layout };\n }\n\n return {\n displayedHeaders: [\n ...displayedHeaders,\n {\n attribute: { type: 'string' },\n label: {\n id: getTranslation('list-view.table.header.label'),\n defaultMessage: 'Available in',\n },\n searchable: false,\n sortable: false,\n name: 'locales',\n // @ts-expect-error – ID is seen as number | string; this will change when we move the type over.\n cellFormatter: (props, _header, meta) => <LocaleListCell {...props} {...meta} />,\n },\n ],\n layout,\n };\n};\n\nexport { addColumnToTableHook };\n","import { Schema } from '@strapi/types';\n/* -------------------------------------------------------------------------------------------------\n * addLocaleToReleasesHook\n * -----------------------------------------------------------------------------------------------*/\ninterface AddLocaleToReleasesHookArgs {\n displayedHeaders: {\n key: string;\n fieldSchema: Schema.Attribute.Kind | 'custom';\n metadatas: {\n label: { id: string; defaultMessage: string };\n searchable: boolean;\n sortable: boolean;\n };\n name: string;\n }[];\n hasI18nEnabled: boolean;\n}\n\nconst addLocaleToReleasesHook = ({ displayedHeaders = [] }: AddLocaleToReleasesHookArgs) => {\n return {\n displayedHeaders: [\n ...displayedHeaders,\n {\n label: {\n id: 'content-releases.page.ReleaseDetails.table.header.label.locale',\n defaultMessage: 'locale',\n },\n name: 'locale',\n },\n ],\n hasI18nEnabled: true,\n };\n};\n\nexport { addLocaleToReleasesHook };\n","import get from 'lodash/get';\n\nimport type { Middleware } from '@reduxjs/toolkit';\nimport type { Store } from '@strapi/admin/strapi-admin';\n\nconst extendCTBAttributeInitialDataMiddleware: () => Middleware<\n object,\n ReturnType<Store['getState']>\n> = () => {\n return ({ getState }) =>\n (next) =>\n (action) => {\n const enhanceAction = () => {\n // the block here is to catch the error when trying to access the state\n // of the ctb when the plugin is not mounted\n try {\n const store = getState();\n\n const hasi18nEnabled = get(\n store,\n [\n 'content-type-builder_dataManagerProvider',\n 'modifiedData',\n 'contentType',\n 'schema',\n 'pluginOptions',\n 'i18n',\n 'localized',\n ],\n false\n );\n\n if (hasi18nEnabled) {\n const pluginOptions = action.options\n ? { ...action.options.pluginOptions, i18n: { localized: true } }\n : { i18n: { localized: true } };\n\n return next({\n ...action,\n options: {\n pluginOptions,\n },\n });\n }\n\n return next(action);\n } catch (err) {\n return next(action);\n }\n };\n\n if (\n action.type === 'ContentTypeBuilder/FormModal/SET_ATTRIBUTE_DATA_SCHEMA' &&\n action.forTarget === 'contentType' &&\n !['relation', 'component'].includes(action.attributeType) &&\n !action.isEditing\n ) {\n return enhanceAction();\n }\n\n if (\n action.type === 'ContentTypeBuilder/FormModal/SET_CUSTOM_FIELD_DATA_SCHEMA' &&\n action.forTarget === 'contentType' &&\n !action.isEditing\n ) {\n return enhanceAction();\n }\n\n if (\n (action.type ===\n 'ContentTypeBuilder/FormModal/RESET_PROPS_AND_SET_FORM_FOR_ADDING_AN_EXISTING_COMPO' ||\n action.type === 'ContentTypeBuilder/FormModal/RESET_PROPS_AND_SAVE_CURRENT_DATA') &&\n action.forTarget === 'contentType'\n ) {\n return enhanceAction();\n }\n\n return next(action);\n };\n};\n\nexport { extendCTBAttributeInitialDataMiddleware };\n","import type { Middleware } from '@reduxjs/toolkit';\nimport type { Store } from '@strapi/admin/strapi-admin';\n\nconst extendCTBInitialDataMiddleware: () => Middleware<\n object,\n ReturnType<Store['getState']>\n> = () => {\n return () => (next) => (action) => {\n if (\n action.type === 'ContentTypeBuilder/FormModal/SET_DATA_TO_EDIT' &&\n action.modalType === 'contentType'\n ) {\n const i18n = { localized: false };\n\n const pluginOptions = action.data.pluginOptions\n ? { ...action.data.pluginOptions, i18n }\n : { i18n };\n\n const data = { ...action.data, pluginOptions };\n\n if (action.actionType === 'create') {\n return next({ ...action, data });\n }\n\n // Override the action if the pluginOption config does not contain i18n\n // In this case we need to set the proper initialData shape\n if (!action.data.pluginOptions?.i18n?.localized) {\n return next({ ...action, data });\n }\n }\n\n // action is not the one we want to override\n return next(action);\n };\n};\n\nexport { extendCTBInitialDataMiddleware };\n","/* eslint-disable check-file/filename-naming-convention */\nimport * as qs from 'qs';\nimport { matchPath } from 'react-router-dom';\n\nimport type { RBACMiddleware } from '@strapi/admin/strapi-admin';\n\nconst localeMiddleware: RBACMiddleware = (ctx) => (next) => (permissions) => {\n const match = matchPath('/content-manager/:collectionType/:model?/:id', ctx.pathname);\n\n if (!match) {\n return next(permissions);\n }\n\n const search = qs.parse(ctx.search);\n\n if (typeof search !== 'object') {\n return next(permissions);\n }\n\n if (!('plugins' in search && typeof search.plugins === 'object')) {\n return next(permissions);\n }\n\n if (\n !(\n 'i18n' in search.plugins &&\n typeof search.plugins.i18n === 'object' &&\n !Array.isArray(search.plugins.i18n)\n )\n ) {\n return next(permissions);\n }\n\n const { locale } = search.plugins.i18n;\n\n if (typeof locale !== 'string') {\n return next(permissions);\n }\n\n const revisedPermissions = permissions.filter(\n (permission) =>\n !permission.properties?.locales || permission.properties.locales.includes(locale)\n );\n\n return next(revisedPermissions);\n};\n\nexport { localeMiddleware };\n","type TradOptions = Record<string, string>;\n\nconst prefixPluginTranslations = (trad: TradOptions, pluginId: string): TradOptions => {\n if (!pluginId) {\n throw new TypeError(\"pluginId can't be empty\");\n }\n return Object.keys(trad).reduce((acc, current) => {\n acc[`${pluginId}.${current}`] = trad[current];\n return acc;\n }, {} as TradOptions);\n};\n\nexport { prefixPluginTranslations };\n","import omit from 'lodash/omit';\n\nimport { LOCALIZED_FIELDS, doesPluginOptionsHaveI18nLocalized } from './fields';\n\nimport type { Schema } from '@strapi/types';\n\n/* -------------------------------------------------------------------------------------------------\n * mutateCTBContentTypeSchema\n * -----------------------------------------------------------------------------------------------*/\n\nconst mutateCTBContentTypeSchema = (\n nextSchema: Schema.ContentType,\n prevSchema?: {\n apiID?: string;\n schema?: Schema.ContentType;\n uid?: string;\n }\n) => {\n // Don't perform mutations components\n if (!doesPluginOptionsHaveI18nLocalized(nextSchema.pluginOptions)) {\n return nextSchema;\n }\n\n const isNextSchemaLocalized = nextSchema.pluginOptions.i18n.localized;\n const isPrevSchemaLocalized = doesPluginOptionsHaveI18nLocalized(\n prevSchema?.schema?.pluginOptions\n )\n ? prevSchema?.schema?.pluginOptions.i18n.localized\n : false;\n\n // No need to perform modification on the schema, if the i18n feature was not changed\n // at the ct level\n if (isNextSchemaLocalized && isPrevSchemaLocalized) {\n return nextSchema;\n }\n\n if (isNextSchemaLocalized) {\n const attributes = addLocalisationToFields(nextSchema.attributes);\n\n return { ...nextSchema, attributes };\n }\n\n // Remove the i18n object from the pluginOptions\n if (!isNextSchemaLocalized) {\n const pluginOptions = omit(nextSchema.pluginOptions, 'i18n');\n const attributes = disableAttributesLocalisation(nextSchema.attributes);\n\n return { ...nextSchema, pluginOptions, attributes };\n }\n\n return nextSchema;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * addLocalisationToFields\n * -----------------------------------------------------------------------------------------------*/\n\nconst addLocalisationToFields = (attributes: Schema.ContentType['attributes']) =>\n Object.keys(attributes).reduce<Schema.ContentType['attributes']>((acc, current) => {\n const currentAttribute = attributes[current];\n\n if (LOCALIZED_FIELDS.includes(currentAttribute.type)) {\n const i18n = { localized: true };\n\n const pluginOptions = currentAttribute.pluginOptions\n ? { ...currentAttribute.pluginOptions, i18n }\n : { i18n };\n\n acc[current] = { ...currentAttribute, pluginOptions };\n\n return acc;\n }\n\n acc[current] = currentAttribute;\n\n return acc;\n }, {});\n\n/* -------------------------------------------------------------------------------------------------\n * disableAttributesLocalisation\n * -----------------------------------------------------------------------------------------------*/\n\ntype OmitByPath<T extends object, K extends string[]> = Pick<T, Exclude<keyof T, K[number]>>;\n\nconst disableAttributesLocalisation = (attributes: Schema.ContentType['attributes']) =>\n Object.keys(attributes).reduce<\n Record<string, OmitByPath<Schema.ContentType['attributes'][string], ['pluginOptions', 'i18n']>>\n >((acc, current) => {\n acc[current] = omit(attributes[current], 'pluginOptions.i18n');\n\n return acc;\n }, {});\n\nexport { mutateCTBContentTypeSchema };\n","import get from 'lodash/get';\nimport * as yup from 'yup';\n\nimport { CheckboxConfirmation } from './components/CheckboxConfirmation';\nimport {\n BulkLocalePublishAction,\n BulkLocaleUnpublishAction,\n DeleteLocaleAction,\n LocalePickerAction,\n FillFromAnotherLocaleAction,\n} from './components/CMHeaderActions';\nimport {\n DeleteModalAdditionalInfo,\n PublishModalAdditionalInfo,\n UnpublishModalAdditionalInfo,\n} from './components/CMListViewModalsAdditionalInformation';\nimport { LocalePicker } from './components/LocalePicker';\nimport { PERMISSIONS } from './constants';\nimport { mutateEditViewHook } from './contentManagerHooks/editView';\nimport { addColumnToTableHook } from './contentManagerHooks/listView';\nimport { addLocaleToReleasesHook } from './contentReleasesHooks/releaseDetailsView';\nimport { extendCTBAttributeInitialDataMiddleware } from './middlewares/extendCTBAttributeInitialData';\nimport { extendCTBInitialDataMiddleware } from './middlewares/extendCTBInitialData';\nimport { localeMiddleware } from './middlewares/rbac-middleware';\nimport { pluginId } from './pluginId';\nimport { i18nApi } from './services/api';\nimport { LOCALIZED_FIELDS } from './utils/fields';\nimport { getTranslation } from './utils/getTranslation';\nimport { prefixPluginTranslations } from './utils/prefixPluginTranslations';\nimport { mutateCTBContentTypeSchema } from './utils/schemas';\n\nimport type { DocumentActionComponent } from '@strapi/content-manager/strapi-admin';\n\n// eslint-disable-next-line import/no-default-export\nexport default {\n register(app: any) {\n app.addMiddlewares([extendCTBAttributeInitialDataMiddleware, extendCTBInitialDataMiddleware]);\n app.addMiddlewares([() => i18nApi.middleware]);\n app.addReducers({\n [i18nApi.reducerPath]: i18nApi.reducer,\n });\n app.addRBACMiddleware([localeMiddleware]);\n app.registerPlugin({\n id: pluginId,\n name: pluginId,\n });\n },\n bootstrap(app: any) {\n // // Hook that adds a column into the CM's LV table\n app.registerHook('Admin/CM/pages/ListView/inject-column-in-table', addColumnToTableHook);\n app.registerHook('Admin/CM/pages/EditView/mutate-edit-view-layout', mutateEditViewHook);\n // Hooks that checks if the locale is present in the release\n app.registerHook(\n 'ContentReleases/pages/ReleaseDetails/add-locale-in-releases',\n addLocaleToReleasesHook\n );\n\n // Add the settings link\n app.addSettingsLink('global', {\n intlLabel: {\n id: getTranslation('plugin.name'),\n defaultMessage: 'Internationalization',\n },\n id: 'internationalization',\n to: 'internationalization',\n Component: () =>\n import('./pages/SettingsPage').then((mod) => ({ default: mod.ProtectedSettingsPage })),\n permissions: PERMISSIONS.accessMain,\n });\n\n const contentManager = app.getPlugin('content-manager');\n\n contentManager.apis.addDocumentHeaderAction([LocalePickerAction, FillFromAnotherLocaleAction]);\n contentManager.apis.addDocumentAction((actions: DocumentActionComponent[]) => {\n const indexOfDeleteAction = actions.findIndex((action) => action.type === 'delete');\n actions.splice(indexOfDeleteAction, 0, DeleteLocaleAction);\n return actions;\n });\n\n contentManager.apis.addDocumentAction((actions: DocumentActionComponent[]) => {\n // When enabled the bulk locale publish action should be the first action\n // in 'More Document Actions' and therefore the third action in the array\n actions.splice(2, 0, BulkLocalePublishAction);\n actions.splice(5, 0, BulkLocaleUnpublishAction);\n return actions;\n });\n\n contentManager.injectComponent('listView', 'actions', {\n name: 'i18n-locale-filter',\n Component: LocalePicker,\n });\n\n contentManager.injectComponent('listView', 'publishModalAdditionalInfos', {\n name: 'i18n-publish-bullets-in-modal',\n Component: PublishModalAdditionalInfo,\n });\n\n contentManager.injectComponent('listView', 'unpublishModalAdditionalInfos', {\n name: 'i18n-unpublish-bullets-in-modal',\n Component: UnpublishModalAdditionalInfo,\n });\n\n contentManager.injectComponent('listView', 'deleteModalAdditionalInfos', {\n name: 'i18n-delete-bullets-in-modal',\n Component: DeleteModalAdditionalInfo,\n });\n\n const ctbPlugin = app.getPlugin('content-type-builder');\n\n if (ctbPlugin) {\n const ctbFormsAPI = ctbPlugin.apis.forms;\n ctbFormsAPI.addContentTypeSchemaMutation(mutateCTBContentTypeSchema);\n ctbFormsAPI.components.add({ id: 'checkboxConfirmation', component: CheckboxConfirmation });\n\n ctbFormsAPI.extendContentType({\n validator: () => ({\n i18n: yup.object().shape({\n localized: yup.bool(),\n }),\n }),\n form: {\n advanced() {\n return [\n {\n name: 'pluginOptions.i18n.localized',\n description: {\n id: getTranslation('plugin.schema.i18n.localized.description-content-type'),\n defaultMessage: 'Allows translating an entry into different languages',\n },\n type: 'checkboxConfirmation',\n intlLabel: {\n id: getTranslation('plugin.schema.i18n.localized.label-content-type'),\n defaultMessage: 'Localization',\n },\n },\n ];\n },\n },\n });\n\n ctbFormsAPI.extendFields(LOCALIZED_FIELDS, {\n form: {\n advanced({ contentTypeSchema, forTarget, type, step }: any) {\n if (forTarget !== 'contentType') {\n return [];\n }\n\n const hasI18nEnabled = get(\n contentTypeSchema,\n ['schema', 'pluginOptions', 'i18n', 'localized'],\n false\n );\n\n if (!hasI18nEnabled) {\n return [];\n }\n\n if (type === 'component' && step === '1') {\n return [];\n }\n\n return [\n {\n name: 'pluginOptions.i18n.localized',\n description: {\n id: getTranslation('plugin.schema.i18n.localized.description-field'),\n defaultMessage: 'The field can have different values in each locale',\n },\n type: 'checkbox',\n intlLabel: {\n id: getTranslation('plugin.schema.i18n.localized.label-field'),\n defaultMessage: 'Enable localization for this field',\n },\n },\n ];\n },\n },\n });\n }\n },\n async registerTrads({ locales }: { locales: string[] }) {\n const importedTrads = await Promise.all(\n locales.map((locale) => {\n return import(`./translations/${locale}.json`)\n .then(({ default: data }) => {\n return {\n data: prefixPluginTranslations(data, pluginId),\n locale,\n };\n })\n .catch(() => {\n return {\n data: {},\n locale,\n };\n });\n })\n );\n\n return Promise.resolve(importedTrads);\n },\n};\n"],"names":["styled","Typography","useIntl","React","value","Dialog","jsxs","Field","jsx","Checkbox","WarningCircle","Flex","Button","useParams","useAuth","useDocument","adminApi","index","CrossCircle","Tooltip","CheckCircle","ArrowsCounterClockwise","useTable","Modal","Box","Table","Status","IconButton","Link","stringify","Pencil","locale","query","useQueryParams","Plus","useForm","useDocumentActions","Download","Fragment","SingleSelect","SingleSelectOption","useNavigate","useNotification","buildValidParams","useAPIErrorHandler","skipToken","document","ListPlus","Cross","Trash","Earth","EarthStriked","VisuallyHidden","useCollator","Popover","CaretDown","get","matchPath","qs","pluginId","omit","yup"],"mappings":"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"}
@@ -55,11 +55,10 @@ const ko = {
55
55
  "plugin.description.long": "이 플러그인을 사용하면 어드민 패널과 API에서 서로 다른 언어로 된 컨텐츠를 만들고, 읽고, 업데이트할 수 있습니다.",
56
56
  "plugin.description.short": "이 플러그인을 사용하면 어드민 패널과 API에서 서로 다른 언어로 된 컨텐츠를 만들고, 읽고, 업데이트할 수 있습니다.",
57
57
  "plugin.name": "국제화",
58
- "plugin.schema.i18n.ensure-unique-localization": "유니크 필드는 지역화(localized)되어야 합니다.",
59
58
  "plugin.schema.i18n.localized.description-content-type": "로케일별로 콘텐츠를 저장할 수 있습니다.",
60
59
  "plugin.schema.i18n.localized.description-field": "필드는 각 로케일에서 서로 다른 값을 가질 수 있습니다.",
61
60
  "plugin.schema.i18n.localized.label-content-type": "이 콘텐츠 타입의 지역화(localization) 켜기",
62
61
  "plugin.schema.i18n.localized.label-field": "이 필드의 지역화(localization) 켜기"
63
62
  };
64
63
  exports.default = ko;
65
- //# sourceMappingURL=ko-DmcGUBQ3.js.map
64
+ //# sourceMappingURL=ko-C40pNQ9b.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ko-C40pNQ9b.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -53,7 +53,6 @@ const ko = {
53
53
  "plugin.description.long": "이 플러그인을 사용하면 어드민 패널과 API에서 서로 다른 언어로 된 컨텐츠를 만들고, 읽고, 업데이트할 수 있습니다.",
54
54
  "plugin.description.short": "이 플러그인을 사용하면 어드민 패널과 API에서 서로 다른 언어로 된 컨텐츠를 만들고, 읽고, 업데이트할 수 있습니다.",
55
55
  "plugin.name": "국제화",
56
- "plugin.schema.i18n.ensure-unique-localization": "유니크 필드는 지역화(localized)되어야 합니다.",
57
56
  "plugin.schema.i18n.localized.description-content-type": "로케일별로 콘텐츠를 저장할 수 있습니다.",
58
57
  "plugin.schema.i18n.localized.description-field": "필드는 각 로케일에서 서로 다른 값을 가질 수 있습니다.",
59
58
  "plugin.schema.i18n.localized.label-content-type": "이 콘텐츠 타입의 지역화(localization) 켜기",
@@ -62,4 +61,4 @@ const ko = {
62
61
  export {
63
62
  ko as default
64
63
  };
65
- //# sourceMappingURL=ko-qTjQ8IMw.mjs.map
64
+ //# sourceMappingURL=ko-CF-P3Car.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ko-CF-P3Car.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -54,7 +54,6 @@ const pl = {
54
54
  "plugin.description.long": "Ten plugin umożliwia tworzenie, czytanie i aktualizowanie treści w różnych językach, zarówno z poziomu panelu admina jak i z API.",
55
55
  "plugin.description.short": "Ten plugin umożliwia tworzenie, czytanie i aktualizowanie treści w różnych językach, zarówno z poziomu panelu admina jak i z API.",
56
56
  "plugin.name": "Internationalization",
57
- "plugin.schema.i18n.ensure-unique-localization": "Unikalne pola muszą zostać zlokalizowane",
58
57
  "plugin.schema.i18n.localized.description-content-type": "Pozwala mieć treść w różnych ustawieniach regionalnych",
59
58
  "plugin.schema.i18n.localized.description-field": "To pole może mieć różne wartości w zależności od różnych ustawień regionalnych",
60
59
  "plugin.schema.i18n.localized.label-content-type": "Włącz lokalizację dla tego typu treści",
@@ -63,4 +62,4 @@ const pl = {
63
62
  export {
64
63
  pl as default
65
64
  };
66
- //# sourceMappingURL=pl-B67TSHqT.mjs.map
65
+ //# sourceMappingURL=pl-Dxr9RUmD.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pl-Dxr9RUmD.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -56,11 +56,10 @@ const pl = {
56
56
  "plugin.description.long": "Ten plugin umożliwia tworzenie, czytanie i aktualizowanie treści w różnych językach, zarówno z poziomu panelu admina jak i z API.",
57
57
  "plugin.description.short": "Ten plugin umożliwia tworzenie, czytanie i aktualizowanie treści w różnych językach, zarówno z poziomu panelu admina jak i z API.",
58
58
  "plugin.name": "Internationalization",
59
- "plugin.schema.i18n.ensure-unique-localization": "Unikalne pola muszą zostać zlokalizowane",
60
59
  "plugin.schema.i18n.localized.description-content-type": "Pozwala mieć treść w różnych ustawieniach regionalnych",
61
60
  "plugin.schema.i18n.localized.description-field": "To pole może mieć różne wartości w zależności od różnych ustawień regionalnych",
62
61
  "plugin.schema.i18n.localized.label-content-type": "Włącz lokalizację dla tego typu treści",
63
62
  "plugin.schema.i18n.localized.label-field": "Włącz lokalizację dla tego pola"
64
63
  };
65
64
  exports.default = pl;
66
- //# sourceMappingURL=pl-Cn5RYonZ.js.map
65
+ //# sourceMappingURL=pl-JtWBy-JQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pl-JtWBy-JQ.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -56,7 +56,6 @@ const ru = {
56
56
  "plugin.description.long": "Этот плагин позволяет создавать, читать и обновлять контент (словом, производить всевозможные действия с контентом) на разных языках, как из панели администратора, так и через API.",
57
57
  "plugin.description.short": "Этот плагин позволяет создавать, читать и обновлять контент на разных языках, как из панели администратора, так и через API.",
58
58
  "plugin.name": "Интернационализация",
59
- "plugin.schema.i18n.ensure-unique-localization": "Уникальные поля должны быть переведены",
60
59
  "plugin.schema.i18n.localized.description-content-type": "Позволяет перевести запись на разные языки",
61
60
  "plugin.schema.i18n.localized.description-field": "Поле может иметь разные значения на каждом языке",
62
61
  "plugin.schema.i18n.localized.label-content-type": "Интернационализация",
@@ -65,4 +64,4 @@ const ru = {
65
64
  export {
66
65
  ru as default
67
66
  };
68
- //# sourceMappingURL=ru-hagMa57T.mjs.map
67
+ //# sourceMappingURL=ru-B-4sVwXN.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ru-B-4sVwXN.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -58,11 +58,10 @@ const ru = {
58
58
  "plugin.description.long": "Этот плагин позволяет создавать, читать и обновлять контент (словом, производить всевозможные действия с контентом) на разных языках, как из панели администратора, так и через API.",
59
59
  "plugin.description.short": "Этот плагин позволяет создавать, читать и обновлять контент на разных языках, как из панели администратора, так и через API.",
60
60
  "plugin.name": "Интернационализация",
61
- "plugin.schema.i18n.ensure-unique-localization": "Уникальные поля должны быть переведены",
62
61
  "plugin.schema.i18n.localized.description-content-type": "Позволяет перевести запись на разные языки",
63
62
  "plugin.schema.i18n.localized.description-field": "Поле может иметь разные значения на каждом языке",
64
63
  "plugin.schema.i18n.localized.label-content-type": "Интернационализация",
65
64
  "plugin.schema.i18n.localized.label-field": "Включить перевод для этого поля"
66
65
  };
67
66
  exports.default = ru;
68
- //# sourceMappingURL=ru-BMBgVL3s.js.map
67
+ //# sourceMappingURL=ru-COSWt3Nu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ru-COSWt3Nu.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -56,11 +56,10 @@ const tr = {
56
56
  "plugin.description.long": "Bu eklenti, hem Yönetim paneli hem de API üzerinden, farklı dillerdeki içeriği oluşturma, okuma ve güncelleme imkanı sağlar.",
57
57
  "plugin.description.short": "Bu eklenti, hem Yönetim paneli hem de API üzerinden, farklı dillerdeki içeriği oluşturma, okuma ve güncelleme imkanı sağlar.",
58
58
  "plugin.name": "Uluslararasılaştırma",
59
- "plugin.schema.i18n.ensure-unique-localization": "Benzersiz alanlar yerelleştirilmelidir",
60
59
  "plugin.schema.i18n.localized.description-content-type": "İçerikleri yerelleştirebilmenize imkan tanır",
61
60
  "plugin.schema.i18n.localized.description-field": "Bu alan farklı yerel ayarlarda farklı değer alabilir",
62
61
  "plugin.schema.i18n.localized.label-content-type": "Bu İçerik-Tipi için yerelleştirmeyi etkinleştir",
63
62
  "plugin.schema.i18n.localized.label-field": "Bu Alan için yerelleştirmeyi etkinleştir"
64
63
  };
65
64
  exports.default = tr;
66
- //# sourceMappingURL=tr-CarUU76c.js.map
65
+ //# sourceMappingURL=tr-BVj1O5ch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tr-BVj1O5ch.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}