@strapi/i18n 0.0.0-next.ce5699024a72ea224891438d5bbe39f904ec6774 → 0.0.0-next.d190a700af70e9360d767221b76cd8e815bd01aa
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.
- package/dist/admin/components/BulkLocaleActionModal.js.map +1 -1
- package/dist/admin/components/BulkLocaleActionModal.mjs.map +1 -1
- package/dist/admin/components/CMHeaderActions.js +252 -5
- package/dist/admin/components/CMHeaderActions.js.map +1 -1
- package/dist/admin/components/CMHeaderActions.mjs +256 -10
- package/dist/admin/components/CMHeaderActions.mjs.map +1 -1
- package/dist/admin/components/CreateLocale.js +3 -4
- package/dist/admin/components/CreateLocale.js.map +1 -1
- package/dist/admin/components/CreateLocale.mjs +4 -5
- package/dist/admin/components/CreateLocale.mjs.map +1 -1
- package/dist/admin/components/EditLocale.js +1 -1
- package/dist/admin/components/EditLocale.js.map +1 -1
- package/dist/admin/components/EditLocale.mjs +1 -1
- package/dist/admin/components/EditLocale.mjs.map +1 -1
- package/dist/admin/components/LocaleListCell.js +65 -45
- package/dist/admin/components/LocaleListCell.js.map +1 -1
- package/dist/admin/components/LocaleListCell.mjs +66 -46
- package/dist/admin/components/LocaleListCell.mjs.map +1 -1
- package/dist/admin/components/LocalePicker.js +18 -11
- package/dist/admin/components/LocalePicker.js.map +1 -1
- package/dist/admin/components/LocalePicker.mjs +19 -12
- package/dist/admin/components/LocalePicker.mjs.map +1 -1
- package/dist/admin/contentManagerHooks/editView.js +6 -3
- package/dist/admin/contentManagerHooks/editView.js.map +1 -1
- package/dist/admin/contentManagerHooks/editView.mjs +7 -4
- package/dist/admin/contentManagerHooks/editView.mjs.map +1 -1
- package/dist/admin/contentManagerHooks/listView.js +2 -1
- package/dist/admin/contentManagerHooks/listView.js.map +1 -1
- package/dist/admin/contentManagerHooks/listView.mjs +2 -1
- package/dist/admin/contentManagerHooks/listView.mjs.map +1 -1
- package/dist/admin/hooks/useAILocalizationJobsPolling.js +110 -0
- package/dist/admin/hooks/useAILocalizationJobsPolling.js.map +1 -0
- package/dist/admin/hooks/useAILocalizationJobsPolling.mjs +89 -0
- package/dist/admin/hooks/useAILocalizationJobsPolling.mjs.map +1 -0
- package/dist/admin/hooks/useI18n.js +4 -4
- package/dist/admin/hooks/useI18n.js.map +1 -1
- package/dist/admin/hooks/useI18n.mjs +4 -4
- package/dist/admin/hooks/useI18n.mjs.map +1 -1
- package/dist/admin/index.js +1 -1
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/index.mjs +2 -2
- package/dist/admin/index.mjs.map +1 -1
- package/dist/admin/middlewares/extendCTBAttributeInitialData.js +34 -24
- package/dist/admin/middlewares/extendCTBAttributeInitialData.js.map +1 -1
- package/dist/admin/middlewares/extendCTBAttributeInitialData.mjs +34 -24
- package/dist/admin/middlewares/extendCTBAttributeInitialData.mjs.map +1 -1
- package/dist/admin/pages/SettingsPage.js +121 -46
- package/dist/admin/pages/SettingsPage.js.map +1 -1
- package/dist/admin/pages/SettingsPage.mjs +124 -30
- package/dist/admin/pages/SettingsPage.mjs.map +1 -1
- package/dist/admin/services/aiLocalizationJobs.js +26 -0
- package/dist/admin/services/aiLocalizationJobs.js.map +1 -0
- package/dist/admin/services/aiLocalizationJobs.mjs +24 -0
- package/dist/admin/services/aiLocalizationJobs.mjs.map +1 -0
- package/dist/admin/services/api.js +4 -1
- package/dist/admin/services/api.js.map +1 -1
- package/dist/admin/services/api.mjs +4 -1
- package/dist/admin/services/api.mjs.map +1 -1
- package/dist/admin/services/locales.js +4 -2
- package/dist/admin/services/locales.js.map +1 -1
- package/dist/admin/services/locales.mjs +4 -2
- package/dist/admin/services/locales.mjs.map +1 -1
- package/dist/admin/services/settings.js +30 -0
- package/dist/admin/services/settings.js.map +1 -0
- package/dist/admin/services/settings.mjs +27 -0
- package/dist/admin/services/settings.mjs.map +1 -0
- package/dist/admin/src/components/CMHeaderActions.d.ts +17 -4
- package/dist/admin/src/components/LocaleListCell.d.ts +2 -1
- package/dist/admin/src/hooks/useAILocalizationJobsPolling.d.ts +9 -0
- package/dist/admin/src/services/aiLocalizationJobs.d.ts +6 -0
- package/dist/admin/src/services/api.d.ts +1 -1
- package/dist/admin/src/services/locales.d.ts +1 -1
- package/dist/admin/src/services/relations.d.ts +1 -1
- package/dist/admin/src/services/settings.d.ts +5 -0
- package/dist/admin/src/utils/schemas.d.ts +642 -16
- package/dist/admin/translations/en.json.js +10 -0
- package/dist/admin/translations/en.json.js.map +1 -1
- package/dist/admin/translations/en.json.mjs +10 -0
- package/dist/admin/translations/en.json.mjs.map +1 -1
- package/dist/admin/utils/clean.js +2 -2
- package/dist/admin/utils/clean.js.map +1 -1
- package/dist/admin/utils/clean.mjs +2 -2
- package/dist/admin/utils/clean.mjs.map +1 -1
- package/dist/admin/utils/fields.js +6 -1
- package/dist/admin/utils/fields.js.map +1 -1
- package/dist/admin/utils/fields.mjs +6 -1
- package/dist/admin/utils/fields.mjs.map +1 -1
- package/dist/admin/utils/getTranslation.js.map +1 -1
- package/dist/admin/utils/getTranslation.mjs.map +1 -1
- package/dist/admin/utils/prefixPluginTranslations.js.map +1 -1
- package/dist/admin/utils/prefixPluginTranslations.mjs.map +1 -1
- package/dist/admin/utils/schemas.js +19 -13
- package/dist/admin/utils/schemas.js.map +1 -1
- package/dist/admin/utils/schemas.mjs +19 -13
- package/dist/admin/utils/schemas.mjs.map +1 -1
- package/dist/server/bootstrap.js +2 -0
- package/dist/server/bootstrap.js.map +1 -1
- package/dist/server/bootstrap.mjs +2 -0
- package/dist/server/bootstrap.mjs.map +1 -1
- package/dist/server/constants/iso-locales.json.js +4 -0
- package/dist/server/constants/iso-locales.json.js.map +1 -1
- package/dist/server/constants/iso-locales.json.mjs +4 -0
- package/dist/server/constants/iso-locales.json.mjs.map +1 -1
- package/dist/server/controllers/ai-localization-jobs.js +47 -0
- package/dist/server/controllers/ai-localization-jobs.js.map +1 -0
- package/dist/server/controllers/ai-localization-jobs.mjs +45 -0
- package/dist/server/controllers/ai-localization-jobs.mjs.map +1 -0
- package/dist/server/controllers/index.js +5 -1
- package/dist/server/controllers/index.js.map +1 -1
- package/dist/server/controllers/index.mjs +5 -1
- package/dist/server/controllers/index.mjs.map +1 -1
- package/dist/server/controllers/settings.js +24 -0
- package/dist/server/controllers/settings.js.map +1 -0
- package/dist/server/controllers/settings.mjs +22 -0
- package/dist/server/controllers/settings.mjs.map +1 -0
- package/dist/server/models/ai-localization-job.js +60 -0
- package/dist/server/models/ai-localization-job.js.map +1 -0
- package/dist/server/models/ai-localization-job.mjs +57 -0
- package/dist/server/models/ai-localization-job.mjs.map +1 -0
- package/dist/server/register.js +3 -1
- package/dist/server/register.js.map +1 -1
- package/dist/server/register.mjs +3 -1
- package/dist/server/register.mjs.map +1 -1
- package/dist/server/routes/admin.js +40 -0
- package/dist/server/routes/admin.js.map +1 -1
- package/dist/server/routes/admin.mjs +40 -0
- package/dist/server/routes/admin.mjs.map +1 -1
- package/dist/server/routes/content-api.js +11 -7
- package/dist/server/routes/content-api.js.map +1 -1
- package/dist/server/routes/content-api.mjs +11 -7
- package/dist/server/routes/content-api.mjs.map +1 -1
- package/dist/server/routes/index.mjs +2 -2
- package/dist/server/routes/validation/locale.js +57 -0
- package/dist/server/routes/validation/locale.js.map +1 -0
- package/dist/server/routes/validation/locale.mjs +36 -0
- package/dist/server/routes/validation/locale.mjs.map +1 -0
- package/dist/server/services/ai-localization-jobs.js +64 -0
- package/dist/server/services/ai-localization-jobs.js.map +1 -0
- package/dist/server/services/ai-localization-jobs.mjs +62 -0
- package/dist/server/services/ai-localization-jobs.mjs.map +1 -0
- package/dist/server/services/ai-localizations.js +268 -0
- package/dist/server/services/ai-localizations.js.map +1 -0
- package/dist/server/services/ai-localizations.mjs +266 -0
- package/dist/server/services/ai-localizations.mjs.map +1 -0
- package/dist/server/services/content-types.js.map +1 -1
- package/dist/server/services/content-types.mjs.map +1 -1
- package/dist/server/services/index.js +7 -1
- package/dist/server/services/index.js.map +1 -1
- package/dist/server/services/index.mjs +7 -1
- package/dist/server/services/index.mjs.map +1 -1
- package/dist/server/services/settings.js +25 -0
- package/dist/server/services/settings.js.map +1 -0
- package/dist/server/services/settings.mjs +23 -0
- package/dist/server/services/settings.mjs.map +1 -0
- package/dist/server/src/bootstrap.d.ts.map +1 -1
- package/dist/server/src/controllers/ai-localization-jobs.d.ts +17 -0
- package/dist/server/src/controllers/ai-localization-jobs.d.ts.map +1 -0
- package/dist/server/src/controllers/index.d.ts +10 -0
- package/dist/server/src/controllers/index.d.ts.map +1 -1
- package/dist/server/src/controllers/settings.d.ts +7 -0
- package/dist/server/src/controllers/settings.d.ts.map +1 -0
- package/dist/server/src/index.d.ts +47 -8
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/models/ai-localization-job.d.ts +5 -0
- package/dist/server/src/models/ai-localization-job.d.ts.map +1 -0
- package/dist/server/src/models/index.d.ts +5 -0
- package/dist/server/src/models/index.d.ts.map +1 -0
- package/dist/server/src/register.d.ts +1 -1
- package/dist/server/src/register.d.ts.map +1 -1
- package/dist/server/src/routes/admin.d.ts.map +1 -1
- package/dist/server/src/routes/content-api.d.ts +5 -8
- package/dist/server/src/routes/content-api.d.ts.map +1 -1
- package/dist/server/src/routes/index.d.ts +3 -7
- package/dist/server/src/routes/index.d.ts.map +1 -1
- package/dist/server/src/routes/validation/index.d.ts +2 -0
- package/dist/server/src/routes/validation/index.d.ts.map +1 -0
- package/dist/server/src/routes/validation/locale.d.ts +41 -0
- package/dist/server/src/routes/validation/locale.d.ts.map +1 -0
- package/dist/server/src/services/ai-localization-jobs.d.ts +26 -0
- package/dist/server/src/services/ai-localization-jobs.d.ts.map +1 -0
- package/dist/server/src/services/ai-localizations.d.ts +18 -0
- package/dist/server/src/services/ai-localizations.d.ts.map +1 -0
- package/dist/server/src/services/index.d.ts +33 -0
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/src/services/settings.d.ts +13 -0
- package/dist/server/src/services/settings.d.ts.map +1 -0
- package/dist/server/src/utils/index.d.ts +7 -1
- package/dist/server/src/utils/index.d.ts.map +1 -1
- package/dist/server/src/validation/settings.d.ts +12 -0
- package/dist/server/src/validation/settings.d.ts.map +1 -0
- package/dist/server/utils/index.js.map +1 -1
- package/dist/server/utils/index.mjs.map +1 -1
- package/dist/server/validation/settings.js +11 -0
- package/dist/server/validation/settings.js.map +1 -0
- package/dist/server/validation/settings.mjs +9 -0
- package/dist/server/validation/settings.mjs.map +1 -0
- package/dist/shared/contracts/ai-localization-jobs.d.ts +27 -0
- package/dist/shared/contracts/ai-localization-jobs.d.ts.map +1 -0
- package/dist/shared/contracts/settings.d.ts +40 -0
- package/dist/shared/contracts/shared.d.ts.map +1 -0
- package/package.json +12 -9
|
@@ -1,16 +1,20 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
2
2
|
import * as React from 'react';
|
|
3
3
|
import { skipToken } from '@reduxjs/toolkit/query';
|
|
4
4
|
import { useQueryParams, useForm, useNotification, useAPIErrorHandler, Table } from '@strapi/admin/strapi-admin';
|
|
5
|
+
import { useAIAvailability } from '@strapi/admin/strapi-admin/ee';
|
|
5
6
|
import { unstable_useDocument, unstable_useDocumentActions, buildValidParams } from '@strapi/content-manager/strapi-admin';
|
|
6
|
-
import {
|
|
7
|
-
import { Trash,
|
|
7
|
+
import { Status, SingleSelectOption, Box, Typography, Flex, Link, Dialog, Field, SingleSelect, Button, Modal } from '@strapi/design-system';
|
|
8
|
+
import { Loader, Trash, Sparkle, Earth, WarningCircle, Plus, ListPlus, Cross } from '@strapi/icons';
|
|
8
9
|
import { useIntl } from 'react-intl';
|
|
9
|
-
import { useNavigate } from 'react-router-dom';
|
|
10
|
+
import { NavLink, useNavigate } from 'react-router-dom';
|
|
10
11
|
import { styled } from 'styled-components';
|
|
12
|
+
import { useAILocalizationJobsPolling } from '../hooks/useAILocalizationJobsPolling.mjs';
|
|
11
13
|
import { useI18n } from '../hooks/useI18n.mjs';
|
|
14
|
+
import { useGetAILocalizationJobsByDocumentQuery } from '../services/aiLocalizationJobs.mjs';
|
|
12
15
|
import { useGetLocalesQuery } from '../services/locales.mjs';
|
|
13
16
|
import { useGetManyDraftRelationCountQuery } from '../services/relations.mjs';
|
|
17
|
+
import { useGetSettingsQuery } from '../services/settings.mjs';
|
|
14
18
|
import { cleanData } from '../utils/clean.mjs';
|
|
15
19
|
import { getTranslation } from '../utils/getTranslation.mjs';
|
|
16
20
|
import { capitalize } from '../utils/strings.mjs';
|
|
@@ -60,6 +64,18 @@ const LocaleOption = ({ isDraftAndPublishEnabled, locale, status, entryExists })
|
|
|
60
64
|
]
|
|
61
65
|
});
|
|
62
66
|
};
|
|
67
|
+
const LocaleOptionStartIcon = ({ entryWithLocaleExists, translationStatus, index })=>{
|
|
68
|
+
const isAiAvailable = useAIAvailability();
|
|
69
|
+
if (!entryWithLocaleExists) {
|
|
70
|
+
return /*#__PURE__*/ jsx(Plus, {});
|
|
71
|
+
}
|
|
72
|
+
if (isAiAvailable && index !== 0 && translationStatus === 'failed') {
|
|
73
|
+
return /*#__PURE__*/ jsx(WarningCircle, {
|
|
74
|
+
fill: "warning600"
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
return null;
|
|
78
|
+
};
|
|
63
79
|
const LocalePickerAction = ({ document, meta, model, collectionType, documentId })=>{
|
|
64
80
|
const { formatMessage } = useIntl();
|
|
65
81
|
const [{ query }, setQuery] = useQueryParams();
|
|
@@ -74,6 +90,14 @@ const LocalePickerAction = ({ document, meta, model, collectionType, documentId
|
|
|
74
90
|
locale: currentDesiredLocale
|
|
75
91
|
}
|
|
76
92
|
});
|
|
93
|
+
const { data: jobData } = useGetAILocalizationJobsByDocumentQuery({
|
|
94
|
+
documentId: documentId,
|
|
95
|
+
model: model,
|
|
96
|
+
collectionType: collectionType
|
|
97
|
+
});
|
|
98
|
+
const { data: settings } = useGetSettingsQuery();
|
|
99
|
+
const isAiAvailable = useAIAvailability();
|
|
100
|
+
const setValues = useForm('LocalePickerAction', (state)=>state.setValues);
|
|
77
101
|
const handleSelect = React.useCallback((value)=>{
|
|
78
102
|
setQuery({
|
|
79
103
|
plugins: {
|
|
@@ -82,11 +106,56 @@ const LocalePickerAction = ({ document, meta, model, collectionType, documentId
|
|
|
82
106
|
locale: value
|
|
83
107
|
}
|
|
84
108
|
}
|
|
85
|
-
});
|
|
109
|
+
}, 'push', true);
|
|
86
110
|
}, [
|
|
87
111
|
query.plugins,
|
|
88
112
|
setQuery
|
|
89
113
|
]);
|
|
114
|
+
const nonTranslatedFields = React.useMemo(()=>{
|
|
115
|
+
if (!schema?.attributes) return [];
|
|
116
|
+
return Object.keys(schema.attributes).filter((field)=>{
|
|
117
|
+
const attribute = schema.attributes[field];
|
|
118
|
+
return attribute?.pluginOptions?.i18n?.localized === false;
|
|
119
|
+
});
|
|
120
|
+
}, [
|
|
121
|
+
schema?.attributes
|
|
122
|
+
]);
|
|
123
|
+
const sourceLocaleData = React.useMemo(()=>{
|
|
124
|
+
if (!Array.isArray(locales) || !meta?.availableLocales) return null;
|
|
125
|
+
const defaultLocale = locales.find((locale)=>locale.isDefault);
|
|
126
|
+
const existingLocales = meta.availableLocales.map((loc)=>loc.locale);
|
|
127
|
+
const sourceLocaleCode = defaultLocale && existingLocales.includes(defaultLocale.code) && defaultLocale.code !== currentDesiredLocale ? defaultLocale.code : existingLocales.find((locale)=>locale !== currentDesiredLocale);
|
|
128
|
+
if (!sourceLocaleCode) return null;
|
|
129
|
+
// Find the document data from availableLocales (now includes non-translatable fields)
|
|
130
|
+
const sourceLocaleDoc = meta.availableLocales.find((loc)=>loc.locale === sourceLocaleCode);
|
|
131
|
+
return sourceLocaleDoc ? {
|
|
132
|
+
locale: sourceLocaleCode,
|
|
133
|
+
data: sourceLocaleDoc
|
|
134
|
+
} : null;
|
|
135
|
+
}, [
|
|
136
|
+
locales,
|
|
137
|
+
meta?.availableLocales,
|
|
138
|
+
currentDesiredLocale
|
|
139
|
+
]);
|
|
140
|
+
/**
|
|
141
|
+
* Prefilling form with non-translatable fields from already existing locale
|
|
142
|
+
*/ React.useEffect(()=>{
|
|
143
|
+
// Only run when creating a new locale (no document ID yet) and when we have non-translatable fields
|
|
144
|
+
if (!document?.id && nonTranslatedFields.length > 0 && sourceLocaleData?.data) {
|
|
145
|
+
const dataToSet = nonTranslatedFields.reduce((acc, field)=>{
|
|
146
|
+
acc[field] = sourceLocaleData.data[field];
|
|
147
|
+
return acc;
|
|
148
|
+
}, {});
|
|
149
|
+
if (Object.keys(dataToSet).length > 0) {
|
|
150
|
+
setValues(dataToSet);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}, [
|
|
154
|
+
document?.id,
|
|
155
|
+
nonTranslatedFields,
|
|
156
|
+
sourceLocaleData?.data,
|
|
157
|
+
setValues
|
|
158
|
+
]);
|
|
90
159
|
React.useEffect(()=>{
|
|
91
160
|
if (!Array.isArray(locales) || !hasI18n) {
|
|
92
161
|
return;
|
|
@@ -106,12 +175,18 @@ const LocalePickerAction = ({ document, meta, model, collectionType, documentId
|
|
|
106
175
|
currentDesiredLocale
|
|
107
176
|
]);
|
|
108
177
|
const currentLocale = Array.isArray(locales) ? locales.find((locale)=>locale.code === currentDesiredLocale) : undefined;
|
|
178
|
+
// Use meta.availableLocales instead of document.localizations
|
|
179
|
+
// meta.availableLocales contains all locales for the document, even when creating new locales
|
|
180
|
+
const availableLocales = meta?.availableLocales ?? [];
|
|
181
|
+
const documentLocalizations = document?.localizations ?? [];
|
|
182
|
+
// Prefer meta.availableLocales as it's more reliable, fallback to document.localizations
|
|
183
|
+
const allLocalizations = availableLocales.length > 0 ? availableLocales : documentLocalizations;
|
|
109
184
|
const allCurrentLocales = [
|
|
110
185
|
{
|
|
111
186
|
status: getDocumentStatus(document, meta),
|
|
112
187
|
locale: currentLocale?.code
|
|
113
188
|
},
|
|
114
|
-
...
|
|
189
|
+
...allLocalizations
|
|
115
190
|
];
|
|
116
191
|
if (!hasI18n || !Array.isArray(locales) || locales.length === 0) {
|
|
117
192
|
return null;
|
|
@@ -122,15 +197,52 @@ const LocalePickerAction = ({ document, meta, model, collectionType, documentId
|
|
|
122
197
|
* otherwise the locale is hidden.
|
|
123
198
|
*/ return canRead.includes(locale.code);
|
|
124
199
|
});
|
|
200
|
+
const localesSortingDefaultFirst = displayedLocales.sort((a, b)=>a.isDefault ? -1 : b.isDefault ? 1 : 0);
|
|
125
201
|
return {
|
|
126
202
|
label: formatMessage({
|
|
127
203
|
id: getTranslation('Settings.locales.modal.locales.label'),
|
|
128
204
|
defaultMessage: 'Locales'
|
|
129
205
|
}),
|
|
130
|
-
options:
|
|
206
|
+
options: localesSortingDefaultFirst.map((locale, index)=>{
|
|
131
207
|
const entryWithLocaleExists = allCurrentLocales.some((doc)=>doc.locale === locale.code);
|
|
132
208
|
const currentLocaleDoc = allCurrentLocales.find((doc)=>'locale' in doc ? doc.locale === locale.code : false);
|
|
133
209
|
const permissionsToCheck = currentLocaleDoc ? canRead : canCreate;
|
|
210
|
+
if (isAiAvailable && settings?.data?.aiLocalizations) {
|
|
211
|
+
return {
|
|
212
|
+
_render: ()=>/*#__PURE__*/ jsxs(React.Fragment, {
|
|
213
|
+
children: [
|
|
214
|
+
/*#__PURE__*/ jsx(SingleSelectOption, {
|
|
215
|
+
disabled: !permissionsToCheck.includes(locale.code),
|
|
216
|
+
startIcon: /*#__PURE__*/ jsx(LocaleOptionStartIcon, {
|
|
217
|
+
entryWithLocaleExists: entryWithLocaleExists,
|
|
218
|
+
translationStatus: jobData?.data?.status,
|
|
219
|
+
index: index
|
|
220
|
+
}),
|
|
221
|
+
value: locale.code,
|
|
222
|
+
children: /*#__PURE__*/ jsx(LocaleOption, {
|
|
223
|
+
isDraftAndPublishEnabled: !!schema?.options?.draftAndPublish,
|
|
224
|
+
locale: locale,
|
|
225
|
+
status: currentLocaleDoc?.status,
|
|
226
|
+
entryExists: entryWithLocaleExists
|
|
227
|
+
})
|
|
228
|
+
}, locale.code),
|
|
229
|
+
localesSortingDefaultFirst.length > 1 && index === 0 && /*#__PURE__*/ jsx(Box, {
|
|
230
|
+
paddingRight: 4,
|
|
231
|
+
paddingLeft: 4,
|
|
232
|
+
paddingTop: 2,
|
|
233
|
+
paddingBottom: 2,
|
|
234
|
+
children: /*#__PURE__*/ jsx(Typography, {
|
|
235
|
+
variant: "sigma",
|
|
236
|
+
children: formatMessage({
|
|
237
|
+
id: getTranslation('CMEditViewLocalePicker.locale.ai-translations'),
|
|
238
|
+
defaultMessage: 'AI Translations'
|
|
239
|
+
})
|
|
240
|
+
})
|
|
241
|
+
})
|
|
242
|
+
]
|
|
243
|
+
}, index)
|
|
244
|
+
};
|
|
245
|
+
}
|
|
134
246
|
return {
|
|
135
247
|
disabled: !permissionsToCheck.includes(locale.code),
|
|
136
248
|
value: locale.code,
|
|
@@ -138,9 +250,12 @@ const LocalePickerAction = ({ document, meta, model, collectionType, documentId
|
|
|
138
250
|
isDraftAndPublishEnabled: !!schema?.options?.draftAndPublish,
|
|
139
251
|
locale: locale,
|
|
140
252
|
status: currentLocaleDoc?.status,
|
|
141
|
-
entryExists: entryWithLocaleExists
|
|
253
|
+
entryExists: entryWithLocaleExists,
|
|
254
|
+
translationStatus: jobData?.data?.status
|
|
142
255
|
}),
|
|
143
|
-
startIcon:
|
|
256
|
+
startIcon: /*#__PURE__*/ jsx(LocaleOptionStartIcon, {
|
|
257
|
+
entryWithLocaleExists: entryWithLocaleExists
|
|
258
|
+
})
|
|
144
259
|
};
|
|
145
260
|
}),
|
|
146
261
|
customizeContent: ()=>currentLocale?.name,
|
|
@@ -163,6 +278,130 @@ const getDocumentStatus = (document, meta)=>{
|
|
|
163
278
|
}
|
|
164
279
|
return docStatus;
|
|
165
280
|
};
|
|
281
|
+
/* -------------------------------------------------------------------------------------------------
|
|
282
|
+
* AISettingsStatusAction
|
|
283
|
+
* -----------------------------------------------------------------------------------------------*/ const AITranslationStatusIcon = styled(Status)`
|
|
284
|
+
display: flex;
|
|
285
|
+
gap: ${({ theme })=>theme.spaces[1]};
|
|
286
|
+
justify-content: center;
|
|
287
|
+
align-items: center;
|
|
288
|
+
height: 100%;
|
|
289
|
+
|
|
290
|
+
// Disabled state
|
|
291
|
+
${({ $isAISettingEnabled, theme })=>!$isAISettingEnabled && `
|
|
292
|
+
background-color: ${theme.colors.neutral150};
|
|
293
|
+
`}
|
|
294
|
+
|
|
295
|
+
svg {
|
|
296
|
+
${({ $isAISettingEnabled, theme })=>!$isAISettingEnabled && `
|
|
297
|
+
fill: ${theme.colors.neutral300};
|
|
298
|
+
`}
|
|
299
|
+
}
|
|
300
|
+
`;
|
|
301
|
+
const SpinningLoader = styled(Loader)`
|
|
302
|
+
@keyframes spin {
|
|
303
|
+
from {
|
|
304
|
+
transform: rotate(0deg);
|
|
305
|
+
}
|
|
306
|
+
to {
|
|
307
|
+
transform: rotate(360deg);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
animation: spin 2s linear infinite;
|
|
312
|
+
`;
|
|
313
|
+
const AITranslationStatusAction = ({ documentId, model, collectionType })=>{
|
|
314
|
+
const { formatMessage } = useIntl();
|
|
315
|
+
const isAIAvailable = useAIAvailability();
|
|
316
|
+
const { data: settings } = useGetSettingsQuery();
|
|
317
|
+
const isAISettingEnabled = settings?.data?.aiLocalizations;
|
|
318
|
+
const { hasI18n } = useI18n();
|
|
319
|
+
// Poll for AI localizations jobs when AI is enabled and we have a documentId
|
|
320
|
+
const { status } = useAILocalizationJobsPolling({
|
|
321
|
+
documentId,
|
|
322
|
+
model,
|
|
323
|
+
collectionType
|
|
324
|
+
});
|
|
325
|
+
const statusVariant = (()=>{
|
|
326
|
+
if (status === 'failed') {
|
|
327
|
+
return 'warning';
|
|
328
|
+
}
|
|
329
|
+
if (isAISettingEnabled) {
|
|
330
|
+
return 'alternative';
|
|
331
|
+
}
|
|
332
|
+
return 'neutral';
|
|
333
|
+
})();
|
|
334
|
+
// Do not display this action when i18n is not available
|
|
335
|
+
if (!hasI18n) {
|
|
336
|
+
return null;
|
|
337
|
+
}
|
|
338
|
+
// Do not display this action when AI is not available
|
|
339
|
+
if (!isAIAvailable) {
|
|
340
|
+
return null;
|
|
341
|
+
}
|
|
342
|
+
return {
|
|
343
|
+
_status: {
|
|
344
|
+
message: /*#__PURE__*/ jsx(Box, {
|
|
345
|
+
height: "100%",
|
|
346
|
+
"aria-label": formatMessage({
|
|
347
|
+
id: getTranslation('CMEditViewAITranslation.status-aria-label'),
|
|
348
|
+
defaultMessage: 'AI Translation Status'
|
|
349
|
+
}),
|
|
350
|
+
children: /*#__PURE__*/ jsx(AITranslationStatusIcon, {
|
|
351
|
+
$isAISettingEnabled: Boolean(isAISettingEnabled),
|
|
352
|
+
variant: statusVariant,
|
|
353
|
+
size: "S",
|
|
354
|
+
children: status === 'processing' ? /*#__PURE__*/ jsx(SpinningLoader, {}) : /*#__PURE__*/ jsx(Sparkle, {})
|
|
355
|
+
})
|
|
356
|
+
}),
|
|
357
|
+
tooltip: /*#__PURE__*/ jsxs(Flex, {
|
|
358
|
+
direction: "column",
|
|
359
|
+
padding: 4,
|
|
360
|
+
alignItems: "flex-start",
|
|
361
|
+
width: "25rem",
|
|
362
|
+
children: [
|
|
363
|
+
/*#__PURE__*/ jsx(Typography, {
|
|
364
|
+
variant: "pi",
|
|
365
|
+
fontWeight: "600",
|
|
366
|
+
children: formatMessage({
|
|
367
|
+
id: getTranslation('CMEditViewAITranslation.status-title'),
|
|
368
|
+
defaultMessage: '{enabled, select, true {AI translation enabled} false {AI translation disabled} other {AI translation disabled}}'
|
|
369
|
+
}, {
|
|
370
|
+
enabled: isAISettingEnabled
|
|
371
|
+
})
|
|
372
|
+
}),
|
|
373
|
+
/*#__PURE__*/ jsx(Typography, {
|
|
374
|
+
variant: "pi",
|
|
375
|
+
paddingTop: 1,
|
|
376
|
+
paddingBottom: 3,
|
|
377
|
+
children: formatMessage({
|
|
378
|
+
id: getTranslation('CMEditViewAITranslation.status-description'),
|
|
379
|
+
defaultMessage: 'Our AI translates content in all locales each time you save a modification in the default locale.'
|
|
380
|
+
})
|
|
381
|
+
}),
|
|
382
|
+
/*#__PURE__*/ jsx(Link, {
|
|
383
|
+
fontSize: "inherit",
|
|
384
|
+
tag: NavLink,
|
|
385
|
+
to: "/settings/internationalization",
|
|
386
|
+
style: {
|
|
387
|
+
alignSelf: 'flex-end'
|
|
388
|
+
},
|
|
389
|
+
children: /*#__PURE__*/ jsx(Typography, {
|
|
390
|
+
variant: "pi",
|
|
391
|
+
textAlign: "right",
|
|
392
|
+
children: formatMessage({
|
|
393
|
+
id: getTranslation('CMEditViewAITranslation.settings-link'),
|
|
394
|
+
defaultMessage: '{enabled, select, true {Disable it in settings} false {Enable it in settings} other {Enable it in settings}}'
|
|
395
|
+
}, {
|
|
396
|
+
enabled: isAISettingEnabled
|
|
397
|
+
})
|
|
398
|
+
})
|
|
399
|
+
})
|
|
400
|
+
]
|
|
401
|
+
})
|
|
402
|
+
}
|
|
403
|
+
};
|
|
404
|
+
};
|
|
166
405
|
/* -------------------------------------------------------------------------------------------------
|
|
167
406
|
* FillFromAnotherLocaleAction
|
|
168
407
|
* -----------------------------------------------------------------------------------------------*/ const FillFromAnotherLocaleAction = ({ documentId, meta, model, collectionType })=>{
|
|
@@ -182,6 +421,9 @@ const getDocumentStatus = (document, meta)=>{
|
|
|
182
421
|
}
|
|
183
422
|
});
|
|
184
423
|
const { data: locales = [] } = useGetLocalesQuery();
|
|
424
|
+
const isAIAvailable = useAIAvailability();
|
|
425
|
+
const { data: settings } = useGetSettingsQuery();
|
|
426
|
+
const isAISettingEnabled = settings?.data?.aiLocalizations;
|
|
185
427
|
const availableLocales = Array.isArray(locales) ? locales.filter((locale)=>meta?.availableLocales.some((l)=>l.locale === locale.code)) : [];
|
|
186
428
|
const fillFromLocale = (onClose)=>async ()=>{
|
|
187
429
|
const response = await getDocument({
|
|
@@ -203,6 +445,10 @@ const getDocumentStatus = (document, meta)=>{
|
|
|
203
445
|
if (!hasI18n) {
|
|
204
446
|
return null;
|
|
205
447
|
}
|
|
448
|
+
// Do not display this action when AI is available and AI translations are enabled
|
|
449
|
+
if (isAIAvailable && isAISettingEnabled) {
|
|
450
|
+
return null;
|
|
451
|
+
}
|
|
206
452
|
return {
|
|
207
453
|
type: 'icon',
|
|
208
454
|
icon: /*#__PURE__*/ jsx(Earth, {}),
|
|
@@ -692,5 +938,5 @@ const getDocumentStatus = (document, meta)=>{
|
|
|
692
938
|
}
|
|
693
939
|
`;
|
|
694
940
|
|
|
695
|
-
export { BulkLocalePublishAction, BulkLocaleUnpublishAction, DeleteLocaleAction, FillFromAnotherLocaleAction, LocalePickerAction };
|
|
941
|
+
export { AITranslationStatusAction, BulkLocalePublishAction, BulkLocaleUnpublishAction, DeleteLocaleAction, FillFromAnotherLocaleAction, LocalePickerAction };
|
|
696
942
|
//# sourceMappingURL=CMHeaderActions.mjs.map
|