@strapi/i18n 5.0.0-beta.7 → 5.0.0-beta.9

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 (28) hide show
  1. package/dist/_chunks/{SettingsPage-CB5yd4O3.mjs → SettingsPage-BWlXRGN7.mjs} +9 -6
  2. package/dist/_chunks/SettingsPage-BWlXRGN7.mjs.map +1 -0
  3. package/dist/_chunks/{SettingsPage-BvzzUueI.js → SettingsPage-DjWupAff.js} +11 -8
  4. package/dist/_chunks/SettingsPage-DjWupAff.js.map +1 -0
  5. package/dist/_chunks/{en-CnrTsjWS.mjs → en-18tWw4P6.mjs} +4 -1
  6. package/dist/_chunks/en-18tWw4P6.mjs.map +1 -0
  7. package/dist/_chunks/{en-BuBc6LKZ.js → en-Kv6y9zPQ.js} +4 -1
  8. package/dist/_chunks/en-Kv6y9zPQ.js.map +1 -0
  9. package/dist/_chunks/{index-DRjoX_5r.js → index-D--YX2ZY.js} +403 -77
  10. package/dist/_chunks/index-D--YX2ZY.js.map +1 -0
  11. package/dist/_chunks/{index-aiqKWFfV.mjs → index-DVTdCB4M.mjs} +410 -83
  12. package/dist/_chunks/index-DVTdCB4M.mjs.map +1 -0
  13. package/dist/admin/index.js +1 -1
  14. package/dist/admin/index.mjs +2 -2
  15. package/dist/admin/src/components/BulkLocaleActionModal.d.ts +15 -0
  16. package/dist/admin/src/components/CMHeaderActions.d.ts +7 -1
  17. package/dist/admin/src/services/api.d.ts +2 -3
  18. package/dist/admin/src/services/locales.d.ts +1 -1
  19. package/dist/admin/src/services/relations.d.ts +7 -0
  20. package/dist/admin/src/utils/baseQuery.d.ts +3 -17
  21. package/dist/shared/contracts/content-manager.d.ts +20 -1
  22. package/package.json +13 -13
  23. package/dist/_chunks/SettingsPage-BvzzUueI.js.map +0 -1
  24. package/dist/_chunks/SettingsPage-CB5yd4O3.mjs.map +0 -1
  25. package/dist/_chunks/en-BuBc6LKZ.js.map +0 -1
  26. package/dist/_chunks/en-CnrTsjWS.mjs.map +0 -1
  27. package/dist/_chunks/index-DRjoX_5r.js.map +0 -1
  28. package/dist/_chunks/index-aiqKWFfV.mjs.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"SettingsPage-CB5yd4O3.mjs","sources":["../../admin/src/components/CreateLocale.tsx","../../admin/src/components/DeleteLocale.tsx","../../admin/src/components/EditLocale.tsx","../../admin/src/components/LocaleTable.tsx","../../admin/src/pages/SettingsPage.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n Form,\n type InputProps,\n InputRenderer,\n useField,\n type FormHelpers,\n useForm,\n useAPIErrorHandler,\n useNotification,\n useAuth,\n} from '@strapi/admin/strapi-admin';\nimport {\n Box,\n Button,\n ButtonProps,\n Divider,\n Field,\n Flex,\n Grid,\n GridItem,\n ModalBody,\n ModalFooter,\n ModalHeader,\n ModalLayout,\n SingleSelect,\n SingleSelectOption,\n Tab,\n TabGroup,\n TabPanel,\n TabPanels,\n Tabs,\n Typography,\n} from '@strapi/design-system';\nimport { Check, Plus } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport * as yup from 'yup';\n\nimport { CreateLocale } from '../../../shared/contracts/locales';\nimport { useCreateLocaleMutation, useGetDefaultLocalesQuery } from '../services/locales';\nimport { isBaseQueryError } from '../utils/baseQuery';\nimport { getTranslation } from '../utils/getTranslation';\n\n/* -------------------------------------------------------------------------------------------------\n * CreateLocale\n * -----------------------------------------------------------------------------------------------*/\n\ninterface CreateLocaleProps extends Pick<ButtonProps, 'disabled' | 'variant'> {}\n\nconst CreateLocale = ({ disabled, variant = 'default' }: CreateLocaleProps) => {\n const { formatMessage } = useIntl();\n const [visible, setVisible] = React.useState(false);\n\n return (\n <>\n <Button\n variant={variant}\n disabled={disabled}\n startIcon={<Plus />}\n onClick={() => setVisible(true)}\n size=\"S\"\n >\n {formatMessage({\n id: getTranslation('Settings.list.actions.add'),\n defaultMessage: 'Add new locale',\n })}\n </Button>\n {visible ? <CreateModal onClose={() => setVisible(false)} /> : null}\n </>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * CreateModal\n * -----------------------------------------------------------------------------------------------*/\n\nconst LOCALE_SCHEMA = yup.object().shape({\n code: yup.string().required({\n id: 'Settings.locales.modal.create.code.error',\n defaultMessage: 'Please select a locale',\n }),\n name: yup\n .string()\n .max(50, {\n id: 'Settings.locales.modal.create.name.error.min',\n defaultMessage: 'The locale display name can only be less than 50 characters.',\n })\n .required({\n id: 'Settings.locales.modal.create.name.error.required',\n defaultMessage: 'Please give the locale a display name',\n }),\n isDefault: yup.boolean(),\n});\n\ntype FormValues = CreateLocale.Request['body'];\n\nconst initialFormValues = {\n code: '',\n name: '',\n isDefault: false,\n} satisfies FormValues;\n\ntype ModalCreateProps = {\n onClose: () => void;\n};\n\nconst CreateModal = ({ onClose }: ModalCreateProps) => {\n const { toggleNotification } = useNotification();\n const {\n _unstableFormatAPIError: formatAPIError,\n _unstableFormatValidationErrors: formatValidationErrors,\n } = useAPIErrorHandler();\n const [createLocale] = useCreateLocaleMutation();\n const { formatMessage } = useIntl();\n const refetchPermissions = useAuth('CreateModal', (state) => state.refetchPermissions);\n\n const handleSubmit = async (values: FormValues, helpers: FormHelpers<FormValues>) => {\n try {\n const res = await createLocale(values);\n\n if ('error' in res) {\n if (isBaseQueryError(res.error) && res.error.name === 'ValidationError') {\n helpers.setErrors(formatValidationErrors(res.error));\n } else {\n toggleNotification({ type: 'danger', message: formatAPIError(res.error) });\n }\n\n return;\n }\n\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: getTranslation('Settings.locales.modal.create.success'),\n defaultMessage: 'Created locale',\n }),\n });\n\n refetchPermissions();\n onClose();\n } catch (err) {\n toggleNotification({\n type: 'danger',\n message: formatMessage({\n id: 'notification.error',\n defaultMessage: 'An error occurred, please try again',\n }),\n });\n }\n };\n\n const titleId = React.useId();\n\n return (\n <ModalLayout onClose={onClose} labelledBy={titleId}>\n <Form\n method=\"POST\"\n initialValues={initialFormValues}\n validationSchema={LOCALE_SCHEMA}\n onSubmit={handleSubmit}\n >\n <ModalHeader>\n <Typography fontWeight=\"bold\" textColor=\"neutral800\" tag=\"h2\" id={titleId}>\n {formatMessage({\n id: getTranslation('Settings.list.actions.add'),\n defaultMessage: 'Add new locale',\n })}\n </Typography>\n </ModalHeader>\n <ModalBody>\n <TabGroup\n label={formatMessage({\n id: getTranslation('Settings.locales.modal.title'),\n defaultMessage: 'Configurations',\n })}\n variant=\"simple\"\n >\n <Flex justifyContent=\"space-between\">\n <Typography tag=\"h2\" variant=\"beta\">\n {formatMessage({\n id: getTranslation('Settings.locales.modal.title'),\n defaultMessage: 'Configuration',\n })}\n </Typography>\n <Tabs>\n <Tab>\n {formatMessage({\n id: getTranslation('Settings.locales.modal.base'),\n defaultMessage: 'Basic settings',\n })}\n </Tab>\n <Tab>\n {formatMessage({\n id: getTranslation('Settings.locales.modal.advanced'),\n defaultMessage: 'Advanced settings',\n })}\n </Tab>\n </Tabs>\n </Flex>\n\n <Divider />\n\n <Box paddingTop={7} paddingBottom={7}>\n <TabPanels>\n <TabPanel>\n <BaseForm />\n </TabPanel>\n <TabPanel>\n <AdvancedForm />\n </TabPanel>\n </TabPanels>\n </Box>\n </TabGroup>\n </ModalBody>\n <ModalFooter\n startActions={\n <Button variant=\"tertiary\" onClick={onClose}>\n {formatMessage({ id: 'app.components.Button.cancel', defaultMessage: 'Cancel' })}\n </Button>\n }\n endActions={<SubmitButton />}\n />\n </Form>\n </ModalLayout>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * SubmitButton\n * -----------------------------------------------------------------------------------------------*/\n\nconst SubmitButton = () => {\n const { formatMessage } = useIntl();\n const isSubmitting = useForm('SubmitButton', (state) => state.isSubmitting);\n const modified = useForm('SubmitButton', (state) => state.modified);\n\n return (\n <Button type=\"submit\" startIcon={<Check />} disabled={isSubmitting || !modified}>\n {formatMessage({ id: 'global.save', defaultMessage: 'Save' })}\n </Button>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * BaseForm\n * -----------------------------------------------------------------------------------------------*/\n\ninterface BaseFormProps {\n mode?: 'create' | 'edit';\n}\n\nconst BaseForm = ({ mode = 'create' }: BaseFormProps) => {\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n\n const { data: defaultLocales, error } = useGetDefaultLocalesQuery();\n\n React.useEffect(() => {\n if (error) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(error),\n });\n }\n }, [error, formatAPIError, toggleNotification]);\n\n if (!Array.isArray(defaultLocales)) {\n return null;\n }\n\n const options = defaultLocales.map((locale) => ({\n label: locale.name,\n value: locale.code,\n }));\n\n const translatedForm = [\n {\n disabled: mode !== 'create',\n label: {\n id: getTranslation('Settings.locales.modal.create.code.label'),\n defaultMessage: 'Locales',\n },\n name: 'code',\n options,\n placeholder: {\n id: 'components.placeholder.select',\n defaultMessage: 'Select',\n },\n required: true,\n size: 6,\n type: 'enumeration' as const,\n },\n {\n hint: {\n id: getTranslation('Settings.locales.modal.create.name.label.description'),\n defaultMessage: 'Locale will be displayed under that name in the administration panel',\n },\n label: {\n id: getTranslation('Settings.locales.modal.create.name.label'),\n defaultMessage: 'Locale display name',\n },\n name: 'name',\n required: true,\n size: 6,\n type: 'string' as const,\n },\n ].map((field) => ({\n ...field,\n hint: field.hint ? formatMessage(field.hint) : undefined,\n label: formatMessage(field.label),\n placeholder: field.placeholder ? formatMessage(field.placeholder) : undefined,\n }));\n\n return (\n <Grid gap={4}>\n {translatedForm.map(({ size, ...field }) => (\n <GridItem key={field.name} col={size}>\n <FormRenderer {...field} />\n </GridItem>\n ))}\n </Grid>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AdvancedForm\n * -----------------------------------------------------------------------------------------------*/\n\ntype AdvancedFormProps = {\n isDefaultLocale?: boolean;\n};\n\nconst AdvancedForm = ({ isDefaultLocale }: AdvancedFormProps) => {\n const { formatMessage } = useIntl();\n\n const form = [\n {\n disabled: isDefaultLocale,\n hint: {\n id: getTranslation('Settings.locales.modal.advanced.setAsDefault.hint'),\n defaultMessage: 'One default locale is required, change it by selecting another one',\n },\n label: {\n id: getTranslation('Settings.locales.modal.advanced.setAsDefault'),\n defaultMessage: 'Set as default locale',\n },\n name: 'isDefault',\n size: 6,\n type: 'boolean' as const,\n },\n ].map((field) => ({\n ...field,\n hint: field.hint ? formatMessage(field.hint) : undefined,\n label: formatMessage(field.label),\n })) satisfies InputProps[];\n\n return (\n <Grid gap={4}>\n {form.map(({ size, ...field }) => (\n <GridItem key={field.name} col={size}>\n <FormRenderer {...field} />\n </GridItem>\n ))}\n </Grid>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * FormRenderer\n * -----------------------------------------------------------------------------------------------*/\n\nconst FormRenderer = (field: InputProps) => {\n switch (field.type) {\n /**\n * This will override the default input renderer\n * choice for `enumeration`.\n */\n case 'enumeration':\n return <EnumerationInput {...field} />;\n default:\n return <InputRenderer {...field} />;\n }\n};\n\nconst EnumerationInput = ({\n disabled,\n hint,\n label,\n name,\n options,\n placeholder,\n required,\n}: Extract<InputProps, { type: 'enumeration' }>) => {\n const { value, error, onChange } = useField(name);\n const { data: defaultLocales = [] } = useGetDefaultLocalesQuery();\n\n const handleChange = (value: string) => {\n if (Array.isArray(defaultLocales)) {\n // We know it exists because the options are created from the list of default locales\n const locale = defaultLocales.find((locale) => locale.code === value)!;\n\n onChange(name, value);\n // This lets us automatically fill the name field with the locale name\n onChange('name', locale.name);\n } else {\n onChange(name, value);\n }\n };\n\n return (\n <Field.Root error={error} hint={hint} name={name} required={required}>\n <Field.Label>{label}</Field.Label>\n <SingleSelect\n disabled={disabled}\n // @ts-expect-error – This will dissapear when the DS removes support for numbers to be returned by SingleSelect.\n onChange={handleChange}\n placeholder={placeholder}\n value={value}\n >\n {options.map((option) => (\n <SingleSelectOption value={option.value} key={option.value}>\n {option.label}\n </SingleSelectOption>\n ))}\n </SingleSelect>\n <Field.Error />\n <Field.Hint />\n </Field.Root>\n );\n};\n\nexport { CreateLocale, BaseForm, AdvancedForm, SubmitButton, LOCALE_SCHEMA };\n","import * as React from 'react';\n\nimport { ConfirmDialog, useAPIErrorHandler, useNotification } from '@strapi/admin/strapi-admin';\nimport { IconButton } from '@strapi/design-system';\nimport { Trash } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { useDeleteLocaleMutation } from '../services/locales';\nimport { getTranslation } from '../utils/getTranslation';\n\nimport type { Locale } from '../../../shared/contracts/locales';\n\n/* -------------------------------------------------------------------------------------------------\n * DeleteLocale\n * -----------------------------------------------------------------------------------------------*/\n\ninterface DeleteLocaleProps extends Locale {}\n\nconst DeleteLocale = ({ id, name }: DeleteLocaleProps) => {\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n\n const [visible, setVisible] = React.useState(false);\n\n const [deleteLocale] = useDeleteLocaleMutation();\n const handleConfirm = async () => {\n try {\n const res = await deleteLocale(id);\n\n if ('error' in res) {\n toggleNotification({ type: 'danger', message: formatAPIError(res.error) });\n\n return;\n }\n\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: getTranslation('Settings.locales.modal.delete.success'),\n defaultMessage: 'Deleted locale',\n }),\n });\n } catch (err) {\n toggleNotification({\n type: 'danger',\n message: formatMessage({\n id: 'notification.error',\n defaultMessage: 'An error occurred, please try again',\n }),\n });\n }\n };\n\n return (\n <>\n <IconButton\n onClick={() => setVisible(true)}\n label={formatMessage(\n {\n id: getTranslation('Settings.list.actions.delete'),\n defaultMessage: 'Delete {name} locale',\n },\n {\n name,\n }\n )}\n icon={<Trash />}\n borderWidth={0}\n />\n <ConfirmDialog onConfirm={handleConfirm} onClose={() => setVisible(false)} isOpen={visible} />\n </>\n );\n};\n\nexport { DeleteLocale };\n","import * as React from 'react';\n\nimport {\n useNotification,\n useAPIErrorHandler,\n Form,\n FormHelpers,\n useAuth,\n} from '@strapi/admin/strapi-admin';\nimport {\n Box,\n Button,\n Divider,\n Flex,\n IconButton,\n ModalBody,\n ModalFooter,\n ModalHeader,\n ModalLayout,\n ModalLayoutProps,\n Tab,\n TabGroup,\n TabPanel,\n TabPanels,\n Tabs,\n Typography,\n} from '@strapi/design-system';\nimport { Pencil } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { Locale, UpdateLocale } from '../../../shared/contracts/locales';\nimport { useUpdateLocaleMutation } from '../services/locales';\nimport { isBaseQueryError } from '../utils/baseQuery';\nimport { getTranslation } from '../utils/getTranslation';\n\nimport { AdvancedForm, BaseForm, LOCALE_SCHEMA, SubmitButton } from './CreateLocale';\n\n/* -------------------------------------------------------------------------------------------------\n * EditLocale\n * -----------------------------------------------------------------------------------------------*/\n\ninterface EditLocaleProps extends Omit<EditModalProps, 'onClose'> {}\n\nconst EditLocale = (props: EditLocaleProps) => {\n const { formatMessage } = useIntl();\n const [visible, setVisible] = React.useState(false);\n\n return (\n <>\n <IconButton\n onClick={() => setVisible(true)}\n label={formatMessage(\n {\n id: getTranslation('Settings.list.actions.edit'),\n defaultMessage: 'Edit {name} locale',\n },\n {\n name: props.name,\n }\n )}\n icon={<Pencil />}\n borderWidth={0}\n />\n {visible ? <EditModal {...props} onClose={() => setVisible(false)} /> : null}\n </>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * EditModal\n * -----------------------------------------------------------------------------------------------*/\n\ninterface EditModalProps\n extends Pick<ModalLayoutProps, 'onClose'>,\n Pick<Locale, 'id' | 'isDefault' | 'name' | 'code'> {}\n\ntype FormValues = UpdateLocale.Request['body'] & { code: string };\n\n/**\n * @internal\n * @description Exported to be used when someone clicks on a table row.\n */\nconst EditModal = ({ id, code, isDefault, name, onClose }: EditModalProps) => {\n const { toggleNotification } = useNotification();\n const {\n _unstableFormatAPIError: formatAPIError,\n _unstableFormatValidationErrors: formatValidationErrors,\n } = useAPIErrorHandler();\n const refetchPermissions = useAuth('EditModal', (state) => state.refetchPermissions);\n const { formatMessage } = useIntl();\n const titleId = React.useId();\n\n const [updateLocale] = useUpdateLocaleMutation();\n const handleSubmit = async (\n { code: _code, ...data }: FormValues,\n helpers: FormHelpers<FormValues>\n ) => {\n try {\n /**\n * We don't need to send the code, because the\n * code can never be changed.\n */\n const res = await updateLocale({\n id,\n ...data,\n });\n\n if ('error' in res) {\n if (isBaseQueryError(res.error) && res.error.name === 'ValidationError') {\n helpers.setErrors(formatValidationErrors(res.error));\n } else {\n toggleNotification({ type: 'danger', message: formatAPIError(res.error) });\n }\n\n return;\n }\n\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: getTranslation('Settings.locales.modal.edit.success'),\n defaultMessage: 'Updated locale',\n }),\n });\n\n refetchPermissions();\n onClose();\n } catch (err) {\n toggleNotification({\n type: 'danger',\n message: formatMessage({\n id: 'notification.error',\n defaultMessage: 'An error occurred, please try again',\n }),\n });\n }\n };\n\n return (\n <ModalLayout onClose={onClose} labelledBy={titleId}>\n <Form\n method=\"PUT\"\n onSubmit={handleSubmit}\n initialValues={{\n code,\n name,\n isDefault,\n }}\n validationSchema={LOCALE_SCHEMA}\n >\n <ModalHeader>\n <Typography fontWeight=\"bold\" textColor=\"neutral800\" tag=\"h2\" id={titleId}>\n {formatMessage({\n id: getTranslation('Settings.list.actions.edit'),\n defaultMessage: 'Edit a locale',\n })}\n </Typography>\n </ModalHeader>\n <ModalBody>\n <TabGroup\n label={formatMessage({\n id: getTranslation('Settings.locales.modal.title'),\n defaultMessage: 'Configurations',\n })}\n variant=\"simple\"\n >\n <Flex justifyContent=\"space-between\">\n <Typography tag=\"h2\" variant=\"beta\">\n {formatMessage({\n id: getTranslation('Settings.locales.modal.title'),\n defaultMessage: 'Configuration',\n })}\n </Typography>\n <Tabs>\n <Tab>\n {formatMessage({\n id: getTranslation('Settings.locales.modal.base'),\n defaultMessage: 'Basic settings',\n })}\n </Tab>\n <Tab>\n {formatMessage({\n id: getTranslation('Settings.locales.modal.advanced'),\n defaultMessage: 'Advanced settings',\n })}\n </Tab>\n </Tabs>\n </Flex>\n\n <Divider />\n\n <Box paddingTop={7} paddingBottom={7}>\n <TabPanels>\n <TabPanel>\n <BaseForm mode=\"edit\" />\n </TabPanel>\n <TabPanel>\n <AdvancedForm isDefaultLocale={isDefault} />\n </TabPanel>\n </TabPanels>\n </Box>\n </TabGroup>\n </ModalBody>\n <ModalFooter\n startActions={\n <Button variant=\"tertiary\" onClick={onClose}>\n {formatMessage({ id: 'app.components.Button.cancel', defaultMessage: 'Cancel' })}\n </Button>\n }\n endActions={<SubmitButton />}\n />\n </Form>\n </ModalLayout>\n );\n};\n\nexport { EditLocale, EditModal };\n","import * as React from 'react';\n\nimport {\n Flex,\n Table,\n Tbody,\n Td,\n Th,\n Thead,\n Tr,\n Typography,\n VisuallyHidden,\n} from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { getTranslation } from '../utils/getTranslation';\n\nimport { DeleteLocale } from './DeleteLocale';\nimport { EditLocale, EditModal } from './EditLocale';\n\nimport type { Locale } from '../../../shared/contracts/locales';\n\n/* -------------------------------------------------------------------------------------------------\n * LocaleTable\n * -----------------------------------------------------------------------------------------------*/\n\ntype LocaleTableProps = {\n locales?: Locale[];\n canDelete?: boolean;\n canUpdate?: boolean;\n onDeleteLocale?: (locale: Locale) => void;\n onEditLocale?: (locale: Locale) => void;\n};\n\nconst LocaleTable = ({ locales = [], canDelete, canUpdate }: LocaleTableProps) => {\n const [editLocaleId, setEditLocaleId] = React.useState<Locale['id']>();\n const { formatMessage } = useIntl();\n\n const handleClick = (localeId: Locale['id']) => () => {\n if (canUpdate) {\n setEditLocaleId(localeId);\n }\n };\n\n return (\n <Table colCount={4} rowCount={locales.length + 1}>\n <Thead>\n <Tr>\n <Th>\n <Typography variant=\"sigma\" textColor=\"neutral600\">\n {formatMessage({\n id: getTranslation('Settings.locales.row.id'),\n defaultMessage: 'ID',\n })}\n </Typography>\n </Th>\n <Th>\n <Typography variant=\"sigma\" textColor=\"neutral600\">\n {formatMessage({\n id: getTranslation('Settings.locales.row.displayName'),\n defaultMessage: 'Display name',\n })}\n </Typography>\n </Th>\n <Th>\n <Typography variant=\"sigma\" textColor=\"neutral600\">\n {formatMessage({\n id: getTranslation('Settings.locales.row.default-locale'),\n defaultMessage: 'Default locale',\n })}\n </Typography>\n </Th>\n <Th>\n <VisuallyHidden>Actions</VisuallyHidden>\n </Th>\n </Tr>\n </Thead>\n <Tbody>\n {locales.map((locale) => (\n <React.Fragment key={locale.id}>\n <Tr\n onClick={handleClick(locale.id)}\n style={{ cursor: canUpdate ? 'pointer' : 'default' }}\n >\n <Td>\n <Typography textColor=\"neutral800\">{locale.id}</Typography>\n </Td>\n <Td>\n <Typography textColor=\"neutral800\">{locale.name}</Typography>\n </Td>\n <Td>\n <Typography textColor=\"neutral800\">\n {locale.isDefault\n ? formatMessage({\n id: getTranslation('Settings.locales.default'),\n defaultMessage: 'Default',\n })\n : null}\n </Typography>\n </Td>\n <Td>\n <Flex gap={1} justifyContent=\"flex-end\" onClick={(e) => e.stopPropagation()}>\n {canUpdate && <EditLocale {...locale} />}\n {canDelete && !locale.isDefault && <DeleteLocale {...locale} />}\n </Flex>\n </Td>\n </Tr>\n {editLocaleId === locale.id ? (\n <EditModal {...locale} onClose={() => setEditLocaleId(undefined)} />\n ) : null}\n </React.Fragment>\n ))}\n </Tbody>\n </Table>\n );\n};\n\nexport { LocaleTable };\nexport type { LocaleTableProps };\n","import * as React from 'react';\n\nimport {\n Page,\n useAPIErrorHandler,\n useNotification,\n useRBAC,\n Layouts,\n} from '@strapi/admin/strapi-admin';\nimport { EmptyStateLayout } from '@strapi/design-system';\nimport { EmptyDocuments } from '@strapi/icons/symbols';\nimport { useIntl } from 'react-intl';\n\nimport { CreateLocale } from '../components/CreateLocale';\nimport { LocaleTable } from '../components/LocaleTable';\nimport { PERMISSIONS } from '../constants';\nimport { useGetLocalesQuery } from '../services/locales';\nimport { getTranslation } from '../utils/getTranslation';\n\nconst SettingsPage = () => {\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n const { data: locales, isLoading: isLoadingLocales, error } = useGetLocalesQuery();\n const {\n isLoading: isLoadingRBAC,\n allowedActions: { canUpdate, canCreate, canDelete },\n } = useRBAC(PERMISSIONS);\n\n React.useEffect(() => {\n if (error) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(error),\n });\n }\n }, [error, formatAPIError, toggleNotification]);\n\n const isLoading = isLoadingLocales || isLoadingRBAC;\n\n if (isLoading) {\n return <Page.Loading />;\n }\n\n if (error || !Array.isArray(locales)) {\n return <Page.Error />;\n }\n\n return (\n <Page.Main tabIndex={-1}>\n <Layouts.Header\n primaryAction={<CreateLocale disabled={!canCreate} />}\n title={formatMessage({\n id: getTranslation('plugin.name'),\n defaultMessage: 'Internationalization',\n })}\n subtitle={formatMessage({\n id: getTranslation('Settings.list.description'),\n defaultMessage: 'Configure the settings',\n })}\n />\n <Layouts.Content>\n {locales.length > 0 ? (\n <LocaleTable locales={locales} canDelete={canDelete} canUpdate={canUpdate} />\n ) : (\n <EmptyStateLayout\n icon={<EmptyDocuments width={undefined} height={undefined} />}\n content={formatMessage({\n id: getTranslation('Settings.list.empty.title'),\n defaultMessage: 'There are no locales',\n })}\n action={<CreateLocale disabled={!canCreate} variant=\"secondary\" />}\n />\n )}\n </Layouts.Content>\n </Page.Main>\n );\n};\n\nconst ProtectedSettingsPage = () => {\n return (\n <Page.Protect permissions={PERMISSIONS.read}>\n <SettingsPage />\n </Page.Protect>\n );\n};\n\nexport { ProtectedSettingsPage, SettingsPage };\n"],"names":["value","locale"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"en-BuBc6LKZ.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"en-CnrTsjWS.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-DRjoX_5r.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/utils/baseQuery.ts","../../admin/src/services/api.ts","../../admin/src/services/locales.ts","../../admin/src/components/CMHeaderActions.tsx","../../admin/src/components/CMListViewModalsAdditionalInformation.tsx","../../admin/src/components/Initializer.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 {\n Button,\n Checkbox,\n Dialog,\n DialogBody,\n DialogFooter,\n Field,\n Flex,\n Typography,\n} 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 setIsOpen(false);\n };\n\n const handleToggle = () => setIsOpen((prev) => !prev);\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 <>\n <Field.Root hint={hint} name={name}>\n <Checkbox onValueChange={handleChange} value={value} type=\"checkbox\">\n {label}\n </Checkbox>\n <Field.Hint />\n </Field.Root>\n {isOpen && (\n <Dialog onClose={handleToggle} title=\"Confirmation\" isOpen={isOpen}>\n <DialogBody icon={<WarningCircle />}>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={2}>\n <Flex justifyContent=\"center\">\n <TextAlignTypography id=\"confirm-description\">\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\" id=\"confirm-description\">\n {formatMessage({\n id: getTranslation('CheckboxConfirmation.Modal.body'),\n defaultMessage: 'Do you want to disable it?',\n })}\n </Typography>\n </Flex>\n </Flex>\n </DialogBody>\n <DialogFooter\n startAction={\n <Button onClick={handleToggle} variant=\"tertiary\">\n {formatMessage({\n id: 'components.popUpWarning.button.cancel',\n defaultMessage: 'No, cancel',\n })}\n </Button>\n }\n endAction={\n <Button variant=\"danger-light\" onClick={handleConfirm}>\n {formatMessage({\n id: getTranslation('CheckboxConfirmation.Modal.button-confirm'),\n defaultMessage: 'Yes, disable',\n })}\n </Button>\n }\n />\n </Dialog>\n )}\n </>\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 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: !params.slug || !params.collectionType,\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 { SerializedError } from '@reduxjs/toolkit';\nimport { BaseQueryFn } from '@reduxjs/toolkit/query';\nimport {\n getFetchClient,\n isFetchError,\n type ApiError,\n type FetchOptions,\n} from '@strapi/admin/strapi-admin';\n\nexport interface QueryArguments {\n url: string;\n method?: string;\n data?: unknown;\n config?: FetchOptions;\n}\n\nexport interface UnknownApiError {\n name: 'UnknownError';\n message: string;\n details?: unknown;\n status?: number;\n}\n\nexport type BaseQueryError = ApiError | UnknownApiError | SerializedError;\n\nconst fetchBaseQuery =\n (): BaseQueryFn<string | QueryArguments, unknown, BaseQueryError> =>\n async (query, { signal }) => {\n try {\n const { get, post, del, put } = getFetchClient();\n\n if (typeof query === 'string') {\n const result = await get(query, { signal });\n return { data: result.data };\n } else {\n const { url, method = 'GET', data, config } = query;\n\n if (method === 'POST') {\n const result = await post(url, data, {\n ...config,\n signal,\n });\n return { data: result.data };\n }\n\n if (method === 'DELETE') {\n const result = await del(url, {\n ...config,\n signal,\n });\n return { data: result.data };\n }\n\n if (method === 'PUT') {\n const result = await put(url, data, {\n ...config,\n signal,\n });\n return { data: result.data };\n }\n\n /**\n * Default is GET.\n */\n const result = await get(url, {\n ...config,\n signal,\n });\n return { data: result.data };\n }\n } catch (err) {\n /**\n * Handle error of type FetchError\n *\n * This format mimics what we want from an FetchError which is what the\n * rest of the app works with, except this format is \"serializable\" since\n * it goes into the redux store.\n *\n * NOTE – passing the whole response will highlight this \"serializability\" issue.\n */\n\n if (isFetchError(err)) {\n if (\n typeof err.response?.data === 'object' &&\n err.response?.data !== null &&\n 'error' in err.response?.data\n ) {\n /**\n * This will most likely be ApiError\n */\n return { data: undefined, error: err.response?.data.error };\n } else {\n return {\n data: undefined,\n error: {\n name: 'UnknownError',\n message: 'There was an unknown error response from the API',\n details: err.response,\n status: err.status,\n } as UnknownApiError,\n };\n }\n }\n\n const error = err as Error;\n return {\n data: undefined,\n error: {\n name: error.name,\n message: error.message,\n stack: error.stack,\n } satisfies SerializedError,\n };\n }\n };\n\nconst isBaseQueryError = (error: BaseQueryError): error is ApiError | UnknownApiError => {\n return error.name !== undefined;\n};\n\nexport { fetchBaseQuery, isBaseQueryError };\n","import { createApi } from '@reduxjs/toolkit/query/react';\n\nimport { fetchBaseQuery, type UnknownApiError } from '../utils/baseQuery';\n\nconst i18nApi = createApi({\n reducerPath: 'i18nApi',\n baseQuery: fetchBaseQuery(),\n tagTypes: ['Locale'],\n endpoints: () => ({}),\n});\n\nexport { i18nApi, type UnknownApiError };\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 * as React from 'react';\n\nimport { useNotification, useQueryParams } from '@strapi/admin/strapi-admin';\nimport {\n type HeaderActionComponent,\n unstable_useDocument as useDocument,\n unstable_useDocumentActions as useDocumentActions,\n type DocumentActionComponent,\n} from '@strapi/content-manager/strapi-admin';\nimport { Flex, Status, Typography } from '@strapi/design-system';\nimport { Trash, WarningCircle } from '@strapi/icons';\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 { getTranslation } from '../utils/getTranslation';\nimport { capitalize } from '../utils/strings';\n\nimport type { I18nBaseQuery } from '../types';\n\n/* -------------------------------------------------------------------------------------------------\n * LocalePickerAction\n * -----------------------------------------------------------------------------------------------*/\n\nconst LocalePickerAction: HeaderActionComponent = ({\n document,\n meta,\n model,\n collectionType,\n documentId,\n}) => {\n const { formatMessage } = useIntl();\n const [{ query }, setQuery] = useQueryParams<I18nBaseQuery>();\n const { hasI18n, canCreate, canRead } = useI18n();\n const { data: locales = [] } = useGetLocalesQuery();\n const { schema } = useDocument({ model, collectionType, documentId });\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 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 handleSelect(defaultLocale.code);\n }\n }, [handleSelect, hasI18n, locales, query.plugins?.i18n?.locale]);\n\n if (!hasI18n || !Array.isArray(locales) || locales.length === 0) {\n return null;\n }\n\n const currentLocale = query.plugins?.i18n?.locale || locales.find((loc) => loc.isDefault)?.code;\n\n const allCurrentLocales = [\n { status: getDocumentStatus(document, meta), locale: currentLocale },\n ...(meta?.availableLocales ?? []),\n ];\n\n return {\n label: formatMessage({\n id: getTranslation('Settings.locales.modal.locales.label'),\n defaultMessage: 'Locales',\n }),\n options: locales.map((locale) => {\n const currentLocaleDoc = allCurrentLocales.find((doc) =>\n 'locale' in doc ? doc.locale === locale.code : false\n );\n const status = currentLocaleDoc?.status ?? 'draft';\n\n const permissionsToCheck = currentLocaleDoc ? canCreate : canRead;\n\n const statusVariant =\n status === 'draft' ? 'primary' : status === 'published' ? 'success' : 'alternative';\n\n return {\n disabled: !permissionsToCheck.includes(locale.code),\n value: locale.code,\n label: locale.name,\n startIcon: schema?.options?.draftAndPublish ? (\n <Status\n display=\"flex\"\n paddingLeft=\"6px\"\n paddingRight=\"6px\"\n paddingTop=\"2px\"\n paddingBottom=\"2px\"\n showBullet={false}\n size={'S'}\n variant={statusVariant}\n >\n <Typography tag=\"span\" variant=\"pi\" fontWeight=\"bold\">\n {capitalize(status)}\n </Typography>\n </Status>\n ) : null,\n };\n }),\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 * 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 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 id: getTranslation('actions.delete.label'),\n defaultMessage: 'Delete locale',\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 if (!documentId || !document?.locale) {\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\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 { DeleteLocaleAction, LocalePickerAction };\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 { pluginId } from '../pluginId';\n\ntype InitializerProps = {\n setPlugin: (plugin: string) => void;\n};\n\nconst Initializer = ({ setPlugin }: InitializerProps) => {\n const setPluginRef = React.useRef(setPlugin);\n\n React.useEffect(() => {\n setPluginRef.current(pluginId);\n }, []);\n\n return null;\n};\n\nexport { Initializer };\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 (\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 * as React from 'react';\n\nimport { unstable_useDocument as useDocument } from '@strapi/content-manager/strapi-admin';\nimport { Box, Flex, Popover, Typography, useCollator } from '@strapi/design-system';\nimport { CaretDown } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { Locale } from '../../../shared/contracts/locales';\nimport { useGetLocalesQuery } from '../services/locales';\n\ninterface LocaleListCellProps {\n documentId: string;\n collectionType: string;\n locale: string;\n model: string;\n}\n\nconst LocaleListCell = ({\n documentId,\n locale: currentLocale,\n collectionType,\n model,\n}: LocaleListCellProps) => {\n const { meta, isLoading } = useDocument({\n documentId,\n collectionType,\n model,\n params: {\n locale: currentLocale,\n },\n });\n\n const { locale: language } = useIntl();\n const [visible, setVisible] = React.useState(false);\n const buttonRef = React.useRef<HTMLButtonElement>(null);\n const { data: locales = [] } = useGetLocalesQuery();\n const handleTogglePopover: React.MouseEventHandler<HTMLButtonElement> = (e) => {\n e.stopPropagation();\n setVisible((prev) => !prev);\n };\n const formatter = useCollator(language, {\n sensitivity: 'base',\n });\n\n if (!Array.isArray(locales) || isLoading) {\n return null;\n }\n\n const availableLocales = meta?.availableLocales.map((doc) => doc.locale) ?? [];\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 <Button type=\"button\" onClick={handleTogglePopover} ref={buttonRef}>\n <ActionWrapper\n minWidth=\"100%\"\n alignItems=\"center\"\n justifyContent=\"center\"\n height=\"3.2rem\"\n width=\"3.2rem\"\n >\n <Typography textColor=\"neutral800\" ellipsis>\n {localesForDocument.join(', ')}\n </Typography>\n <Flex>\n <CaretDown />\n </Flex>\n </ActionWrapper>\n {visible && (\n <Popover\n onDismiss={() => setVisible(false)}\n source={buttonRef as React.MutableRefObject<HTMLElement>}\n spacing={16}\n centered\n >\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>\n )}\n </Button>\n );\n};\n\nconst Button = styled.button`\n width: 100%;\n\n svg {\n > g,\n path {\n fill: ${({ theme }) => theme.colors.neutral500};\n }\n }\n &:hover {\n svg {\n > g,\n path {\n fill: ${({ theme }) => theme.colors.neutral600};\n }\n }\n }\n &:active {\n svg {\n > g,\n path {\n fill: ${({ theme }) => theme.colors.neutral400};\n }\n }\n }\n`;\n\nconst ActionWrapper = styled(Flex)`\n svg {\n height: 0.4rem;\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 // TODO: Fix when migrating to v5\n // ...displayedHeaders,\n {\n key: '__locale__',\n fieldSchema: { type: 'string' },\n metadatas: {\n label: {\n id: 'content-releases.page.ReleaseDetails.table.header.label.locale',\n defaultMessage: 'locale',\n },\n searchable: false,\n sortable: false,\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 { DeleteLocaleAction, LocalePickerAction } from './components/CMHeaderActions';\nimport {\n DeleteModalAdditionalInfo,\n PublishModalAdditionalInfo,\n UnpublishModalAdditionalInfo,\n} from './components/CMListViewModalsAdditionalInformation';\nimport { Initializer } from './components/Initializer';\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 initializer: Initializer,\n isReady: false,\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]);\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.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 validator: (args: any) => ({\n i18n: yup.object().shape({\n localized: yup.bool().test({\n name: 'ensure-unique-localization',\n message: getTranslation('plugin.schema.i18n.ensure-unique-localization'),\n test(value) {\n if (value === undefined || value) {\n return true;\n }\n\n const unique = get(args, ['3', 'modifiedData', 'unique'], null);\n\n // Unique fields must be localized\n if (unique && !value) {\n return false;\n }\n\n return true;\n },\n }),\n }),\n }),\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","jsxs","Fragment","Field","jsx","Checkbox","Dialog","DialogBody","WarningCircle","Flex","DialogFooter","Button","useParams","useAuth","useDocument","get","getFetchClient","result","isFetchError","createApi","useQueryParams","Status","useNavigate","useNotification","useDocumentActions","Trash","SingleSelect","SingleSelectOption","Earth","EarthStriked","VisuallyHidden","useCollator","CaretDown","Popover","Box","matchPath","qs","pluginId","omit","yup"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-aiqKWFfV.mjs","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/utils/baseQuery.ts","../../admin/src/services/api.ts","../../admin/src/services/locales.ts","../../admin/src/components/CMHeaderActions.tsx","../../admin/src/components/CMListViewModalsAdditionalInformation.tsx","../../admin/src/components/Initializer.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 {\n Button,\n Checkbox,\n Dialog,\n DialogBody,\n DialogFooter,\n Field,\n Flex,\n Typography,\n} 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 setIsOpen(false);\n };\n\n const handleToggle = () => setIsOpen((prev) => !prev);\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 <>\n <Field.Root hint={hint} name={name}>\n <Checkbox onValueChange={handleChange} value={value} type=\"checkbox\">\n {label}\n </Checkbox>\n <Field.Hint />\n </Field.Root>\n {isOpen && (\n <Dialog onClose={handleToggle} title=\"Confirmation\" isOpen={isOpen}>\n <DialogBody icon={<WarningCircle />}>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={2}>\n <Flex justifyContent=\"center\">\n <TextAlignTypography id=\"confirm-description\">\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\" id=\"confirm-description\">\n {formatMessage({\n id: getTranslation('CheckboxConfirmation.Modal.body'),\n defaultMessage: 'Do you want to disable it?',\n })}\n </Typography>\n </Flex>\n </Flex>\n </DialogBody>\n <DialogFooter\n startAction={\n <Button onClick={handleToggle} variant=\"tertiary\">\n {formatMessage({\n id: 'components.popUpWarning.button.cancel',\n defaultMessage: 'No, cancel',\n })}\n </Button>\n }\n endAction={\n <Button variant=\"danger-light\" onClick={handleConfirm}>\n {formatMessage({\n id: getTranslation('CheckboxConfirmation.Modal.button-confirm'),\n defaultMessage: 'Yes, disable',\n })}\n </Button>\n }\n />\n </Dialog>\n )}\n </>\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 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: !params.slug || !params.collectionType,\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 { SerializedError } from '@reduxjs/toolkit';\nimport { BaseQueryFn } from '@reduxjs/toolkit/query';\nimport {\n getFetchClient,\n isFetchError,\n type ApiError,\n type FetchOptions,\n} from '@strapi/admin/strapi-admin';\n\nexport interface QueryArguments {\n url: string;\n method?: string;\n data?: unknown;\n config?: FetchOptions;\n}\n\nexport interface UnknownApiError {\n name: 'UnknownError';\n message: string;\n details?: unknown;\n status?: number;\n}\n\nexport type BaseQueryError = ApiError | UnknownApiError | SerializedError;\n\nconst fetchBaseQuery =\n (): BaseQueryFn<string | QueryArguments, unknown, BaseQueryError> =>\n async (query, { signal }) => {\n try {\n const { get, post, del, put } = getFetchClient();\n\n if (typeof query === 'string') {\n const result = await get(query, { signal });\n return { data: result.data };\n } else {\n const { url, method = 'GET', data, config } = query;\n\n if (method === 'POST') {\n const result = await post(url, data, {\n ...config,\n signal,\n });\n return { data: result.data };\n }\n\n if (method === 'DELETE') {\n const result = await del(url, {\n ...config,\n signal,\n });\n return { data: result.data };\n }\n\n if (method === 'PUT') {\n const result = await put(url, data, {\n ...config,\n signal,\n });\n return { data: result.data };\n }\n\n /**\n * Default is GET.\n */\n const result = await get(url, {\n ...config,\n signal,\n });\n return { data: result.data };\n }\n } catch (err) {\n /**\n * Handle error of type FetchError\n *\n * This format mimics what we want from an FetchError which is what the\n * rest of the app works with, except this format is \"serializable\" since\n * it goes into the redux store.\n *\n * NOTE – passing the whole response will highlight this \"serializability\" issue.\n */\n\n if (isFetchError(err)) {\n if (\n typeof err.response?.data === 'object' &&\n err.response?.data !== null &&\n 'error' in err.response?.data\n ) {\n /**\n * This will most likely be ApiError\n */\n return { data: undefined, error: err.response?.data.error };\n } else {\n return {\n data: undefined,\n error: {\n name: 'UnknownError',\n message: 'There was an unknown error response from the API',\n details: err.response,\n status: err.status,\n } as UnknownApiError,\n };\n }\n }\n\n const error = err as Error;\n return {\n data: undefined,\n error: {\n name: error.name,\n message: error.message,\n stack: error.stack,\n } satisfies SerializedError,\n };\n }\n };\n\nconst isBaseQueryError = (error: BaseQueryError): error is ApiError | UnknownApiError => {\n return error.name !== undefined;\n};\n\nexport { fetchBaseQuery, isBaseQueryError };\n","import { createApi } from '@reduxjs/toolkit/query/react';\n\nimport { fetchBaseQuery, type UnknownApiError } from '../utils/baseQuery';\n\nconst i18nApi = createApi({\n reducerPath: 'i18nApi',\n baseQuery: fetchBaseQuery(),\n tagTypes: ['Locale'],\n endpoints: () => ({}),\n});\n\nexport { i18nApi, type UnknownApiError };\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 * as React from 'react';\n\nimport { useNotification, useQueryParams } from '@strapi/admin/strapi-admin';\nimport {\n type HeaderActionComponent,\n unstable_useDocument as useDocument,\n unstable_useDocumentActions as useDocumentActions,\n type DocumentActionComponent,\n} from '@strapi/content-manager/strapi-admin';\nimport { Flex, Status, Typography } from '@strapi/design-system';\nimport { Trash, WarningCircle } from '@strapi/icons';\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 { getTranslation } from '../utils/getTranslation';\nimport { capitalize } from '../utils/strings';\n\nimport type { I18nBaseQuery } from '../types';\n\n/* -------------------------------------------------------------------------------------------------\n * LocalePickerAction\n * -----------------------------------------------------------------------------------------------*/\n\nconst LocalePickerAction: HeaderActionComponent = ({\n document,\n meta,\n model,\n collectionType,\n documentId,\n}) => {\n const { formatMessage } = useIntl();\n const [{ query }, setQuery] = useQueryParams<I18nBaseQuery>();\n const { hasI18n, canCreate, canRead } = useI18n();\n const { data: locales = [] } = useGetLocalesQuery();\n const { schema } = useDocument({ model, collectionType, documentId });\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 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 handleSelect(defaultLocale.code);\n }\n }, [handleSelect, hasI18n, locales, query.plugins?.i18n?.locale]);\n\n if (!hasI18n || !Array.isArray(locales) || locales.length === 0) {\n return null;\n }\n\n const currentLocale = query.plugins?.i18n?.locale || locales.find((loc) => loc.isDefault)?.code;\n\n const allCurrentLocales = [\n { status: getDocumentStatus(document, meta), locale: currentLocale },\n ...(meta?.availableLocales ?? []),\n ];\n\n return {\n label: formatMessage({\n id: getTranslation('Settings.locales.modal.locales.label'),\n defaultMessage: 'Locales',\n }),\n options: locales.map((locale) => {\n const currentLocaleDoc = allCurrentLocales.find((doc) =>\n 'locale' in doc ? doc.locale === locale.code : false\n );\n const status = currentLocaleDoc?.status ?? 'draft';\n\n const permissionsToCheck = currentLocaleDoc ? canCreate : canRead;\n\n const statusVariant =\n status === 'draft' ? 'primary' : status === 'published' ? 'success' : 'alternative';\n\n return {\n disabled: !permissionsToCheck.includes(locale.code),\n value: locale.code,\n label: locale.name,\n startIcon: schema?.options?.draftAndPublish ? (\n <Status\n display=\"flex\"\n paddingLeft=\"6px\"\n paddingRight=\"6px\"\n paddingTop=\"2px\"\n paddingBottom=\"2px\"\n showBullet={false}\n size={'S'}\n variant={statusVariant}\n >\n <Typography tag=\"span\" variant=\"pi\" fontWeight=\"bold\">\n {capitalize(status)}\n </Typography>\n </Status>\n ) : null,\n };\n }),\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 * 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 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 id: getTranslation('actions.delete.label'),\n defaultMessage: 'Delete locale',\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 if (!documentId || !document?.locale) {\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\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 { DeleteLocaleAction, LocalePickerAction };\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 { pluginId } from '../pluginId';\n\ntype InitializerProps = {\n setPlugin: (plugin: string) => void;\n};\n\nconst Initializer = ({ setPlugin }: InitializerProps) => {\n const setPluginRef = React.useRef(setPlugin);\n\n React.useEffect(() => {\n setPluginRef.current(pluginId);\n }, []);\n\n return null;\n};\n\nexport { Initializer };\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 (\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 * as React from 'react';\n\nimport { unstable_useDocument as useDocument } from '@strapi/content-manager/strapi-admin';\nimport { Box, Flex, Popover, Typography, useCollator } from '@strapi/design-system';\nimport { CaretDown } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { Locale } from '../../../shared/contracts/locales';\nimport { useGetLocalesQuery } from '../services/locales';\n\ninterface LocaleListCellProps {\n documentId: string;\n collectionType: string;\n locale: string;\n model: string;\n}\n\nconst LocaleListCell = ({\n documentId,\n locale: currentLocale,\n collectionType,\n model,\n}: LocaleListCellProps) => {\n const { meta, isLoading } = useDocument({\n documentId,\n collectionType,\n model,\n params: {\n locale: currentLocale,\n },\n });\n\n const { locale: language } = useIntl();\n const [visible, setVisible] = React.useState(false);\n const buttonRef = React.useRef<HTMLButtonElement>(null);\n const { data: locales = [] } = useGetLocalesQuery();\n const handleTogglePopover: React.MouseEventHandler<HTMLButtonElement> = (e) => {\n e.stopPropagation();\n setVisible((prev) => !prev);\n };\n const formatter = useCollator(language, {\n sensitivity: 'base',\n });\n\n if (!Array.isArray(locales) || isLoading) {\n return null;\n }\n\n const availableLocales = meta?.availableLocales.map((doc) => doc.locale) ?? [];\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 <Button type=\"button\" onClick={handleTogglePopover} ref={buttonRef}>\n <ActionWrapper\n minWidth=\"100%\"\n alignItems=\"center\"\n justifyContent=\"center\"\n height=\"3.2rem\"\n width=\"3.2rem\"\n >\n <Typography textColor=\"neutral800\" ellipsis>\n {localesForDocument.join(', ')}\n </Typography>\n <Flex>\n <CaretDown />\n </Flex>\n </ActionWrapper>\n {visible && (\n <Popover\n onDismiss={() => setVisible(false)}\n source={buttonRef as React.MutableRefObject<HTMLElement>}\n spacing={16}\n centered\n >\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>\n )}\n </Button>\n );\n};\n\nconst Button = styled.button`\n width: 100%;\n\n svg {\n > g,\n path {\n fill: ${({ theme }) => theme.colors.neutral500};\n }\n }\n &:hover {\n svg {\n > g,\n path {\n fill: ${({ theme }) => theme.colors.neutral600};\n }\n }\n }\n &:active {\n svg {\n > g,\n path {\n fill: ${({ theme }) => theme.colors.neutral400};\n }\n }\n }\n`;\n\nconst ActionWrapper = styled(Flex)`\n svg {\n height: 0.4rem;\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 // TODO: Fix when migrating to v5\n // ...displayedHeaders,\n {\n key: '__locale__',\n fieldSchema: { type: 'string' },\n metadatas: {\n label: {\n id: 'content-releases.page.ReleaseDetails.table.header.label.locale',\n defaultMessage: 'locale',\n },\n searchable: false,\n sortable: false,\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 { DeleteLocaleAction, LocalePickerAction } from './components/CMHeaderActions';\nimport {\n DeleteModalAdditionalInfo,\n PublishModalAdditionalInfo,\n UnpublishModalAdditionalInfo,\n} from './components/CMListViewModalsAdditionalInformation';\nimport { Initializer } from './components/Initializer';\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 initializer: Initializer,\n isReady: false,\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]);\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.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 validator: (args: any) => ({\n i18n: yup.object().shape({\n localized: yup.bool().test({\n name: 'ensure-unique-localization',\n message: getTranslation('plugin.schema.i18n.ensure-unique-localization'),\n test(value) {\n if (value === undefined || value) {\n return true;\n }\n\n const unique = get(args, ['3', 'modifiedData', 'unique'], null);\n\n // Unique fields must be localized\n if (unique && !value) {\n return false;\n }\n\n return true;\n },\n }),\n }),\n }),\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":["value","Button","useDocument","get","result","useDocumentActions","pluginId"],"mappings":"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"}