@justanarthur/payload-plugin-translator 1.3.19 → 1.3.21
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/client.d.ts +6 -0
- package/dist/client.js +320 -0
- package/dist/index.d.ts +102 -11
- package/dist/index.js +1294 -80
- package/dist/jobs.d.ts +195 -0
- package/dist/jobs.js +824 -0
- package/dist/resolvers/copy.d.ts +21 -3
- package/dist/resolvers/copy.js +18 -12
- package/dist/resolvers/google.d.ts +29 -11
- package/dist/resolvers/google.js +58 -44
- package/dist/resolvers/libreTranslate.d.ts +33 -15
- package/dist/resolvers/libreTranslate.js +60 -45
- package/dist/resolvers/openAI.d.ts +39 -21
- package/dist/resolvers/openAI.js +111 -99
- package/dist/resolvers/types.d.ts +16 -16
- package/dist/resolvers/types.js +0 -3
- package/dist/{client/components/CustomButton/styles.scss → styles-jt3fm5fh.scss} +5 -5
- package/dist/{client/components/TranslatorModal/styles.scss → styles-vs6m7h55.scss} +76 -76
- package/dist/types.d.ts +70 -22
- package/dist/types.js +0 -3
- package/package.json +87 -64
- package/README.md +0 -215
- package/dist/client/api/index.d.ts +0 -8
- package/dist/client/api/index.d.ts.map +0 -1
- package/dist/client/api/index.js +0 -28
- package/dist/client/api/index.js.map +0 -1
- package/dist/client/components/CustomButton/CustomButtonWithTranslator.d.ts +0 -5
- package/dist/client/components/CustomButton/CustomButtonWithTranslator.d.ts.map +0 -1
- package/dist/client/components/CustomButton/CustomButtonWithTranslator.js +0 -28
- package/dist/client/components/CustomButton/CustomButtonWithTranslator.js.map +0 -1
- package/dist/client/components/CustomButton/index.d.ts +0 -3
- package/dist/client/components/CustomButton/index.d.ts.map +0 -1
- package/dist/client/components/CustomButton/index.js +0 -10
- package/dist/client/components/CustomButton/index.js.map +0 -1
- package/dist/client/components/LocaleLabel/LocaleLabel.d.ts +0 -5
- package/dist/client/components/LocaleLabel/LocaleLabel.d.ts.map +0 -1
- package/dist/client/components/LocaleLabel/LocaleLabel.js +0 -28
- package/dist/client/components/LocaleLabel/LocaleLabel.js.map +0 -1
- package/dist/client/components/LocaleLabel/index.d.ts +0 -2
- package/dist/client/components/LocaleLabel/index.d.ts.map +0 -1
- package/dist/client/components/LocaleLabel/index.js +0 -3
- package/dist/client/components/LocaleLabel/index.js.map +0 -1
- package/dist/client/components/ResolverButton/ResolverButton.d.ts +0 -5
- package/dist/client/components/ResolverButton/ResolverButton.d.ts.map +0 -1
- package/dist/client/components/ResolverButton/ResolverButton.js +0 -16
- package/dist/client/components/ResolverButton/ResolverButton.js.map +0 -1
- package/dist/client/components/ResolverButton/index.d.ts +0 -2
- package/dist/client/components/ResolverButton/index.d.ts.map +0 -1
- package/dist/client/components/ResolverButton/index.js +0 -3
- package/dist/client/components/ResolverButton/index.js.map +0 -1
- package/dist/client/components/TranslatorModal/Content.d.ts +0 -2
- package/dist/client/components/TranslatorModal/Content.d.ts.map +0 -1
- package/dist/client/components/TranslatorModal/Content.js +0 -60
- package/dist/client/components/TranslatorModal/Content.js.map +0 -1
- package/dist/client/components/TranslatorModal/TranslatorModal.d.ts +0 -3
- package/dist/client/components/TranslatorModal/TranslatorModal.d.ts.map +0 -1
- package/dist/client/components/TranslatorModal/TranslatorModal.js +0 -26
- package/dist/client/components/TranslatorModal/TranslatorModal.js.map +0 -1
- package/dist/client/components/TranslatorModal/index.d.ts +0 -2
- package/dist/client/components/TranslatorModal/index.d.ts.map +0 -1
- package/dist/client/components/TranslatorModal/index.js +0 -3
- package/dist/client/components/TranslatorModal/index.js.map +0 -1
- package/dist/client/providers/Translator/TranslatorProvider.d.ts +0 -5
- package/dist/client/providers/Translator/TranslatorProvider.d.ts.map +0 -1
- package/dist/client/providers/Translator/TranslatorProvider.js +0 -109
- package/dist/client/providers/Translator/TranslatorProvider.js.map +0 -1
- package/dist/client/providers/Translator/context.d.ts +0 -21
- package/dist/client/providers/Translator/context.d.ts.map +0 -1
- package/dist/client/providers/Translator/context.js +0 -9
- package/dist/client/providers/Translator/context.js.map +0 -1
- package/dist/exports/client.d.ts +0 -2
- package/dist/exports/client.d.ts.map +0 -1
- package/dist/exports/client.js +0 -3
- package/dist/exports/client.js.map +0 -1
- package/dist/i18n-translations.d.ts +0 -87
- package/dist/i18n-translations.d.ts.map +0 -1
- package/dist/i18n-translations.js +0 -88
- package/dist/i18n-translations.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/resolvers/copy.d.ts.map +0 -1
- package/dist/resolvers/copy.js.map +0 -1
- package/dist/resolvers/google.d.ts.map +0 -1
- package/dist/resolvers/google.js.map +0 -1
- package/dist/resolvers/libreTranslate.d.ts.map +0 -1
- package/dist/resolvers/libreTranslate.js.map +0 -1
- package/dist/resolvers/openAI.d.ts.map +0 -1
- package/dist/resolvers/openAI.js.map +0 -1
- package/dist/resolvers/types.d.ts.map +0 -1
- package/dist/resolvers/types.js.map +0 -1
- package/dist/translate/endpoint.d.ts +0 -3
- package/dist/translate/endpoint.d.ts.map +0 -1
- package/dist/translate/endpoint.js +0 -23
- package/dist/translate/endpoint.js.map +0 -1
- package/dist/translate/findEntityWithConfig.d.ts +0 -16
- package/dist/translate/findEntityWithConfig.d.ts.map +0 -1
- package/dist/translate/findEntityWithConfig.js +0 -34
- package/dist/translate/findEntityWithConfig.js.map +0 -1
- package/dist/translate/operation.d.ts +0 -9
- package/dist/translate/operation.d.ts.map +0 -1
- package/dist/translate/operation.js +0 -78
- package/dist/translate/operation.js.map +0 -1
- package/dist/translate/traverseFields.d.ts +0 -17
- package/dist/translate/traverseFields.d.ts.map +0 -1
- package/dist/translate/traverseFields.js +0 -233
- package/dist/translate/traverseFields.js.map +0 -1
- package/dist/translate/traverseRichText.d.ts +0 -10
- package/dist/translate/traverseRichText.d.ts.map +0 -1
- package/dist/translate/traverseRichText.js +0 -24
- package/dist/translate/traverseRichText.js.map +0 -1
- package/dist/translate/types.d.ts +0 -27
- package/dist/translate/types.d.ts.map +0 -1
- package/dist/translate/types.js +0 -3
- package/dist/translate/types.js.map +0 -1
- package/dist/translate/updateEntity.d.ts +0 -14
- package/dist/translate/updateEntity.d.ts.map +0 -1
- package/dist/translate/updateEntity.js +0 -26
- package/dist/translate/updateEntity.js.map +0 -1
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js.map +0 -1
- package/dist/utils/chunkArray.d.ts +0 -2
- package/dist/utils/chunkArray.d.ts.map +0 -1
- package/dist/utils/chunkArray.js +0 -7
- package/dist/utils/chunkArray.js.map +0 -1
- package/dist/utils/isEmpty.d.ts +0 -2
- package/dist/utils/isEmpty.d.ts.map +0 -1
- package/dist/utils/isEmpty.js +0 -8
- package/dist/utils/isEmpty.js.map +0 -1
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { JSX as JSX_1kxb } from "react/jsx-runtime";
|
|
2
|
+
type Element_12xgc = JSX_1kxb["Element"];
|
|
3
|
+
declare const CustomButtonWithTranslator: ({ type }: {
|
|
4
|
+
type: "publish" | "save";
|
|
5
|
+
}) => Element_12xgc;
|
|
6
|
+
export { CustomButtonWithTranslator as default, CustomButtonWithTranslator };
|
package/dist/client.js
ADDED
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
// src/client/components/CustomButton/CustomButtonWithTranslator.tsx
|
|
3
|
+
import { PublishButton, SaveButton, useConfig as useConfig2, useDocumentInfo as useDocumentInfo2 } from "@payloadcms/ui";
|
|
4
|
+
|
|
5
|
+
// src/client/providers/Translator/TranslatorProvider.tsx
|
|
6
|
+
import {
|
|
7
|
+
toast,
|
|
8
|
+
useAllFormFields,
|
|
9
|
+
useConfig,
|
|
10
|
+
useDocumentInfo,
|
|
11
|
+
useForm,
|
|
12
|
+
useLocale,
|
|
13
|
+
useModal,
|
|
14
|
+
useServerFunctions,
|
|
15
|
+
useTranslation
|
|
16
|
+
} from "@payloadcms/ui";
|
|
17
|
+
import { reduceFieldsToValues } from "payload/shared";
|
|
18
|
+
import { useEffect, useMemo, useState } from "react";
|
|
19
|
+
|
|
20
|
+
// src/client/api/index.ts
|
|
21
|
+
var createClient = ({ api, serverURL }) => {
|
|
22
|
+
const translate = async (args) => {
|
|
23
|
+
try {
|
|
24
|
+
const response = await fetch(`${serverURL}${api}/translator/translate`, {
|
|
25
|
+
body: JSON.stringify(args),
|
|
26
|
+
credentials: "include",
|
|
27
|
+
headers: {
|
|
28
|
+
"Content-Type": "application/json"
|
|
29
|
+
},
|
|
30
|
+
method: "POST"
|
|
31
|
+
});
|
|
32
|
+
if (!response.ok)
|
|
33
|
+
return { success: false };
|
|
34
|
+
return response.json();
|
|
35
|
+
} catch (e) {
|
|
36
|
+
if (e instanceof Error)
|
|
37
|
+
console.error(e.message);
|
|
38
|
+
return { success: false };
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
return {
|
|
42
|
+
translate
|
|
43
|
+
};
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
// src/client/providers/Translator/context.ts
|
|
47
|
+
import { createContext, useContext } from "react";
|
|
48
|
+
var TranslatorContext = createContext(null);
|
|
49
|
+
var useTranslator = () => {
|
|
50
|
+
const context = useContext(TranslatorContext);
|
|
51
|
+
if (context === null)
|
|
52
|
+
throw new Error("useTranslator must be used within TranslatorProvider");
|
|
53
|
+
return context;
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
// src/client/providers/Translator/TranslatorProvider.tsx
|
|
57
|
+
import { jsxDEV } from "react/jsx-dev-runtime";
|
|
58
|
+
var modalSlug = "translator-modal";
|
|
59
|
+
var TranslatorProvider = ({ children }) => {
|
|
60
|
+
const [resolver, setResolver] = useState(null);
|
|
61
|
+
const [data, dispatch] = useAllFormFields();
|
|
62
|
+
const { getFormState } = useServerFunctions();
|
|
63
|
+
const { collectionSlug, getDocPreferences, globalSlug, id } = useDocumentInfo();
|
|
64
|
+
const { setModified } = useForm();
|
|
65
|
+
const modal = useModal();
|
|
66
|
+
const { t } = useTranslation();
|
|
67
|
+
const resolverT = (key) => {
|
|
68
|
+
if (!resolver)
|
|
69
|
+
return "";
|
|
70
|
+
return t(`plugin-translator:resolver_${resolver}_${key}`);
|
|
71
|
+
};
|
|
72
|
+
const locale = useLocale();
|
|
73
|
+
const {
|
|
74
|
+
config: {
|
|
75
|
+
admin: { custom },
|
|
76
|
+
localization,
|
|
77
|
+
routes: { api },
|
|
78
|
+
serverURL
|
|
79
|
+
}
|
|
80
|
+
} = useConfig();
|
|
81
|
+
const apiClient = createClient({ api, serverURL });
|
|
82
|
+
const resolverConfig = useMemo(() => {
|
|
83
|
+
if (!resolver)
|
|
84
|
+
return null;
|
|
85
|
+
const resolvers = custom?.translator?.resolvers || undefined;
|
|
86
|
+
if (!resolvers)
|
|
87
|
+
return null;
|
|
88
|
+
const resolverConfig2 = resolvers.find((each) => each.key === resolver);
|
|
89
|
+
return resolverConfig2 ?? null;
|
|
90
|
+
}, [custom, resolver]);
|
|
91
|
+
if (!localization)
|
|
92
|
+
throw new Error("Localization config is not provided and PluginTranslator is used");
|
|
93
|
+
const localesOptions = localization.locales.filter((each) => each.code !== locale.code);
|
|
94
|
+
const [localeToTranslateFrom, setLocaleToTranslateFrom] = useState("");
|
|
95
|
+
useEffect(() => {
|
|
96
|
+
const defaultFromOptions = localesOptions.find((each) => localization.defaultLocale === each.code);
|
|
97
|
+
if (defaultFromOptions)
|
|
98
|
+
setLocaleToTranslateFrom(defaultFromOptions.code);
|
|
99
|
+
setLocaleToTranslateFrom(localesOptions[0].code);
|
|
100
|
+
}, [locale, localesOptions, localization.defaultLocale]);
|
|
101
|
+
const closeTranslator = () => modal.closeModal(modalSlug);
|
|
102
|
+
const submit = async ({ emptyOnly }) => {
|
|
103
|
+
if (!resolver)
|
|
104
|
+
return;
|
|
105
|
+
const args = {
|
|
106
|
+
collectionSlug,
|
|
107
|
+
data: reduceFieldsToValues(data, true),
|
|
108
|
+
emptyOnly,
|
|
109
|
+
globalSlug,
|
|
110
|
+
id: id === null ? undefined : id,
|
|
111
|
+
locale: locale.code,
|
|
112
|
+
localeFrom: localeToTranslateFrom,
|
|
113
|
+
resolver
|
|
114
|
+
};
|
|
115
|
+
const result = await apiClient.translate(args);
|
|
116
|
+
if (!result.success) {
|
|
117
|
+
toast.error(resolverT("errorMessage"));
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
const { state } = await getFormState({
|
|
121
|
+
collectionSlug,
|
|
122
|
+
data: result.translatedData,
|
|
123
|
+
docPermissions: {
|
|
124
|
+
fields: true,
|
|
125
|
+
update: true
|
|
126
|
+
},
|
|
127
|
+
docPreferences: await getDocPreferences(),
|
|
128
|
+
globalSlug,
|
|
129
|
+
locale: locale.code,
|
|
130
|
+
operation: "update",
|
|
131
|
+
renderAllFields: true,
|
|
132
|
+
schemaPath: collectionSlug || globalSlug || ""
|
|
133
|
+
});
|
|
134
|
+
if (state) {
|
|
135
|
+
dispatch({
|
|
136
|
+
state,
|
|
137
|
+
type: "REPLACE_STATE"
|
|
138
|
+
});
|
|
139
|
+
setModified(true);
|
|
140
|
+
toast.success(resolverT("successMessage"));
|
|
141
|
+
}
|
|
142
|
+
closeTranslator();
|
|
143
|
+
};
|
|
144
|
+
return /* @__PURE__ */ jsxDEV(TranslatorContext.Provider, {
|
|
145
|
+
value: {
|
|
146
|
+
closeTranslator,
|
|
147
|
+
localeToTranslateFrom,
|
|
148
|
+
localesOptions,
|
|
149
|
+
modalSlug,
|
|
150
|
+
openTranslator: ({ resolverKey }) => {
|
|
151
|
+
setResolver(resolverKey);
|
|
152
|
+
modal.openModal(modalSlug);
|
|
153
|
+
},
|
|
154
|
+
resolver: resolverConfig,
|
|
155
|
+
resolverT,
|
|
156
|
+
setLocaleToTranslateFrom,
|
|
157
|
+
submit
|
|
158
|
+
},
|
|
159
|
+
children
|
|
160
|
+
}, undefined, false, undefined, this);
|
|
161
|
+
};
|
|
162
|
+
|
|
163
|
+
// src/client/components/ResolverButton/ResolverButton.tsx
|
|
164
|
+
import { Button, useTranslation as useTranslation2 } from "@payloadcms/ui";
|
|
165
|
+
import { jsxDEV as jsxDEV2 } from "react/jsx-dev-runtime";
|
|
166
|
+
var ResolverButton = ({
|
|
167
|
+
resolver: { key: resolverKey }
|
|
168
|
+
}) => {
|
|
169
|
+
const { openTranslator } = useTranslator();
|
|
170
|
+
const { t } = useTranslation2();
|
|
171
|
+
const handleClick = () => openTranslator({ resolverKey });
|
|
172
|
+
return /* @__PURE__ */ jsxDEV2(Button, {
|
|
173
|
+
onClick: handleClick,
|
|
174
|
+
children: t(`plugin-translator:resolver_${resolverKey}_buttonLabel`)
|
|
175
|
+
}, undefined, false, undefined, this);
|
|
176
|
+
};
|
|
177
|
+
// src/client/components/TranslatorModal/TranslatorModal.tsx
|
|
178
|
+
import { Modal } from "@payloadcms/ui";
|
|
179
|
+
|
|
180
|
+
// src/client/components/TranslatorModal/Content.tsx
|
|
181
|
+
import { getTranslation as getTranslation2 } from "@payloadcms/translations";
|
|
182
|
+
import { Button as Button2, Popup, PopupList, useTranslation as useTranslation4 } from "@payloadcms/ui";
|
|
183
|
+
|
|
184
|
+
// src/client/components/LocaleLabel/LocaleLabel.tsx
|
|
185
|
+
import { getTranslation } from "@payloadcms/translations";
|
|
186
|
+
import { ChevronIcon, useTranslation as useTranslation3 } from "@payloadcms/ui";
|
|
187
|
+
import { jsxDEV as jsxDEV3 } from "react/jsx-dev-runtime";
|
|
188
|
+
var baseClass = "localizer-button";
|
|
189
|
+
var LocaleLabel = ({ locale }) => {
|
|
190
|
+
const { i18n, t } = useTranslation3();
|
|
191
|
+
return /* @__PURE__ */ jsxDEV3("div", {
|
|
192
|
+
"aria-label": t("general:locale"),
|
|
193
|
+
className: baseClass,
|
|
194
|
+
children: [
|
|
195
|
+
/* @__PURE__ */ jsxDEV3("div", {
|
|
196
|
+
className: `${baseClass}__label`,
|
|
197
|
+
children: `${t("general:locale")}:`
|
|
198
|
+
}, undefined, false, undefined, this),
|
|
199
|
+
" ",
|
|
200
|
+
/* @__PURE__ */ jsxDEV3("span", {
|
|
201
|
+
className: `${baseClass}__current-label`,
|
|
202
|
+
children: `${getTranslation(locale.label, i18n)}`
|
|
203
|
+
}, undefined, false, undefined, this),
|
|
204
|
+
" ",
|
|
205
|
+
/* @__PURE__ */ jsxDEV3(ChevronIcon, {
|
|
206
|
+
className: `${baseClass}__chevron`
|
|
207
|
+
}, undefined, false, undefined, this)
|
|
208
|
+
]
|
|
209
|
+
}, undefined, true, undefined, this);
|
|
210
|
+
};
|
|
211
|
+
// src/client/components/TranslatorModal/Content.tsx
|
|
212
|
+
import { jsxDEV as jsxDEV4 } from "react/jsx-dev-runtime";
|
|
213
|
+
var Content = () => {
|
|
214
|
+
const {
|
|
215
|
+
localeToTranslateFrom: localeCodeToTranslateFrom,
|
|
216
|
+
localesOptions,
|
|
217
|
+
resolverT,
|
|
218
|
+
setLocaleToTranslateFrom,
|
|
219
|
+
submit
|
|
220
|
+
} = useTranslator();
|
|
221
|
+
const { i18n } = useTranslation4();
|
|
222
|
+
const localeToTranslateFrom = localesOptions.find((each) => each.code === localeCodeToTranslateFrom);
|
|
223
|
+
return /* @__PURE__ */ jsxDEV4("div", {
|
|
224
|
+
className: "translator__content",
|
|
225
|
+
children: [
|
|
226
|
+
/* @__PURE__ */ jsxDEV4("h2", {
|
|
227
|
+
children: resolverT("modalTitle")
|
|
228
|
+
}, undefined, false, undefined, this),
|
|
229
|
+
localeToTranslateFrom && /* @__PURE__ */ jsxDEV4(Popup, {
|
|
230
|
+
button: /* @__PURE__ */ jsxDEV4(LocaleLabel, {
|
|
231
|
+
locale: localeToTranslateFrom
|
|
232
|
+
}, undefined, false, undefined, this),
|
|
233
|
+
horizontalAlign: "center",
|
|
234
|
+
render: ({ close }) => /* @__PURE__ */ jsxDEV4(PopupList.ButtonGroup, {
|
|
235
|
+
children: localesOptions.map((option) => {
|
|
236
|
+
const label = getTranslation2(option.label, i18n);
|
|
237
|
+
return /* @__PURE__ */ jsxDEV4(PopupList.Button, {
|
|
238
|
+
active: option.code === localeCodeToTranslateFrom,
|
|
239
|
+
onClick: () => {
|
|
240
|
+
setLocaleToTranslateFrom(option.code);
|
|
241
|
+
close();
|
|
242
|
+
},
|
|
243
|
+
children: [
|
|
244
|
+
label,
|
|
245
|
+
label !== option.code && ` (${option.code})`
|
|
246
|
+
]
|
|
247
|
+
}, option.code, true, undefined, this);
|
|
248
|
+
})
|
|
249
|
+
}, undefined, false, undefined, this),
|
|
250
|
+
verticalAlign: "bottom"
|
|
251
|
+
}, undefined, false, undefined, this),
|
|
252
|
+
/* @__PURE__ */ jsxDEV4("div", {
|
|
253
|
+
className: "translator__buttons",
|
|
254
|
+
children: [
|
|
255
|
+
/* @__PURE__ */ jsxDEV4(Button2, {
|
|
256
|
+
onClick: () => submit({ emptyOnly: false }),
|
|
257
|
+
children: resolverT("submitButtonLabelFull")
|
|
258
|
+
}, undefined, false, undefined, this),
|
|
259
|
+
/* @__PURE__ */ jsxDEV4(Button2, {
|
|
260
|
+
onClick: () => submit({ emptyOnly: true }),
|
|
261
|
+
children: resolverT("submitButtonLabelEmpty")
|
|
262
|
+
}, undefined, false, undefined, this)
|
|
263
|
+
]
|
|
264
|
+
}, undefined, true, undefined, this)
|
|
265
|
+
]
|
|
266
|
+
}, undefined, true, undefined, this);
|
|
267
|
+
};
|
|
268
|
+
|
|
269
|
+
// src/client/components/TranslatorModal/TranslatorModal.tsx
|
|
270
|
+
import { jsxDEV as jsxDEV5 } from "react/jsx-dev-runtime";
|
|
271
|
+
var TranslatorModal = () => {
|
|
272
|
+
const { closeTranslator, modalSlug: modalSlug2, resolver } = useTranslator();
|
|
273
|
+
if (!resolver)
|
|
274
|
+
return;
|
|
275
|
+
return /* @__PURE__ */ jsxDEV5(Modal, {
|
|
276
|
+
className: "translator__modal",
|
|
277
|
+
slug: modalSlug2,
|
|
278
|
+
children: /* @__PURE__ */ jsxDEV5("div", {
|
|
279
|
+
className: "translator__wrapper",
|
|
280
|
+
children: [
|
|
281
|
+
/* @__PURE__ */ jsxDEV5("button", {
|
|
282
|
+
"aria-label": "Close",
|
|
283
|
+
className: "translator__close",
|
|
284
|
+
onClick: closeTranslator
|
|
285
|
+
}, undefined, false, undefined, this),
|
|
286
|
+
/* @__PURE__ */ jsxDEV5(Content, {}, undefined, false, undefined, this)
|
|
287
|
+
]
|
|
288
|
+
}, undefined, true, undefined, this)
|
|
289
|
+
}, undefined, false, undefined, this);
|
|
290
|
+
};
|
|
291
|
+
// src/client/components/CustomButton/CustomButtonWithTranslator.tsx
|
|
292
|
+
import { jsxDEV as jsxDEV6 } from "react/jsx-dev-runtime";
|
|
293
|
+
|
|
294
|
+
var CustomButtonWithTranslator = ({ type }) => {
|
|
295
|
+
const { config } = useConfig2();
|
|
296
|
+
const DefaultButton = type === "publish" ? PublishButton : SaveButton;
|
|
297
|
+
const { globalSlug, id } = useDocumentInfo2();
|
|
298
|
+
const resolvers = config.admin?.custom?.translator?.resolvers ?? [];
|
|
299
|
+
if (!id && !globalSlug)
|
|
300
|
+
return /* @__PURE__ */ jsxDEV6(DefaultButton, {}, undefined, false, undefined, this);
|
|
301
|
+
return /* @__PURE__ */ jsxDEV6(TranslatorProvider, {
|
|
302
|
+
children: /* @__PURE__ */ jsxDEV6("div", {
|
|
303
|
+
className: "translator__custom-save-button",
|
|
304
|
+
children: [
|
|
305
|
+
/* @__PURE__ */ jsxDEV6(TranslatorModal, {}, undefined, false, undefined, this),
|
|
306
|
+
resolvers.map((resolver) => /* @__PURE__ */ jsxDEV6(ResolverButton, {
|
|
307
|
+
resolver
|
|
308
|
+
}, resolver.key, false, undefined, this)),
|
|
309
|
+
/* @__PURE__ */ jsxDEV6(DefaultButton, {}, undefined, false, undefined, this)
|
|
310
|
+
]
|
|
311
|
+
}, undefined, true, undefined, this)
|
|
312
|
+
}, undefined, false, undefined, this);
|
|
313
|
+
};
|
|
314
|
+
|
|
315
|
+
// src/exports/client.ts
|
|
316
|
+
var client_default = CustomButtonWithTranslator;
|
|
317
|
+
export {
|
|
318
|
+
client_default as default,
|
|
319
|
+
CustomButtonWithTranslator
|
|
320
|
+
};
|
package/dist/index.d.ts
CHANGED
|
@@ -1,11 +1,102 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
1
|
+
import { Payload, PayloadRequest as PayloadRequest2 } from "payload";
|
|
2
|
+
import { TypeWithID } from "payload";
|
|
3
|
+
type Doc = Record<string, unknown> & TypeWithID;
|
|
4
|
+
type TranslateArgs = {
|
|
5
|
+
collectionSlug?: string;
|
|
6
|
+
data?: Record<string, any>;
|
|
7
|
+
emptyOnly?: boolean;
|
|
8
|
+
globalSlug?: string;
|
|
9
|
+
id?: number | string;
|
|
10
|
+
/** active locale */
|
|
11
|
+
locale: string;
|
|
12
|
+
localeFrom: string;
|
|
13
|
+
overrideAccess?: boolean;
|
|
14
|
+
resolver: string;
|
|
15
|
+
update?: boolean;
|
|
16
|
+
};
|
|
17
|
+
type TranslateResult = {
|
|
18
|
+
success: false;
|
|
19
|
+
} | {
|
|
20
|
+
success: true;
|
|
21
|
+
translatedData: Record<string, any>;
|
|
22
|
+
dataFrom: Doc;
|
|
23
|
+
};
|
|
24
|
+
type TranslateOperationArgs = ({
|
|
25
|
+
payload: Payload;
|
|
26
|
+
} | {
|
|
27
|
+
req: PayloadRequest2;
|
|
28
|
+
}) & TranslateArgs;
|
|
29
|
+
declare const translateOperation: (args: TranslateOperationArgs) => Promise<TranslateResult>;
|
|
30
|
+
import { Plugin } from "payload";
|
|
31
|
+
import { CollectionSlug, GlobalSlug } from "payload";
|
|
32
|
+
import { PayloadRequest as PayloadRequest3 } from "payload";
|
|
33
|
+
type TranslateResolverArgs = {
|
|
34
|
+
/** Locale to translate from */
|
|
35
|
+
localeFrom: string;
|
|
36
|
+
/** Locale to translate to */
|
|
37
|
+
localeTo: string;
|
|
38
|
+
req: PayloadRequest3;
|
|
39
|
+
texts: string[];
|
|
40
|
+
};
|
|
41
|
+
type TranslateResolverResponse = {
|
|
42
|
+
success: false;
|
|
43
|
+
} | {
|
|
44
|
+
success: true;
|
|
45
|
+
translatedTexts: string[];
|
|
46
|
+
};
|
|
47
|
+
type TranslateResolver = {
|
|
48
|
+
key: string;
|
|
49
|
+
resolve: (args: TranslateResolverArgs) => Promise<TranslateResolverResponse> | TranslateResolverResponse;
|
|
50
|
+
};
|
|
51
|
+
type TranslatorConfig = {
|
|
52
|
+
/**
|
|
53
|
+
* Collections with the enabled translator in the admin UI
|
|
54
|
+
*/
|
|
55
|
+
collections: CollectionSlug[];
|
|
56
|
+
/**
|
|
57
|
+
* Disable the plugin
|
|
58
|
+
*/
|
|
59
|
+
disabled?: boolean;
|
|
60
|
+
/**
|
|
61
|
+
* Globals with the enabled translator in the admin UI
|
|
62
|
+
*/
|
|
63
|
+
globals: GlobalSlug[];
|
|
64
|
+
/**
|
|
65
|
+
* Add resolvers that you want to include, examples on how to write your own in ./plugin/src/resolvers
|
|
66
|
+
*/
|
|
67
|
+
resolvers: TranslateResolver[];
|
|
68
|
+
/**
|
|
69
|
+
* Auto-translate every save in the default locale to the other
|
|
70
|
+
* configured locales via Payload's job queue.
|
|
71
|
+
*
|
|
72
|
+
* When `true`, the plugin:
|
|
73
|
+
* - registers `createTranslateTask()` and `createTranslateWorkflow()`
|
|
74
|
+
* in `config.jobs` (idempotent — skips if a task/workflow with
|
|
75
|
+
* the same slug is already registered, so host-customized
|
|
76
|
+
* factories survive),
|
|
77
|
+
* - prepends `createAutoTranslateCollectionHook` /
|
|
78
|
+
* `createAutoTranslateGlobalHook` to each collection/global
|
|
79
|
+
* listed in `collections` / `globals`.
|
|
80
|
+
*
|
|
81
|
+
* Default: `false`. Public factories stay exported for hosts that
|
|
82
|
+
* need per-entity control.
|
|
83
|
+
*/
|
|
84
|
+
autoTranslate?: boolean;
|
|
85
|
+
/**
|
|
86
|
+
* Advanced traversal options. Mirrors the options accepted by the
|
|
87
|
+
* internal field walker — keep in sync if you need the latest shape.
|
|
88
|
+
*/
|
|
89
|
+
_options?: {
|
|
90
|
+
/**
|
|
91
|
+
* Hook invoked while walking each rich-text node. Lets you append
|
|
92
|
+
* extra text segments to be translated (e.g. custom lexical nodes).
|
|
93
|
+
*/
|
|
94
|
+
additionalTraverseRichText?: (args: {
|
|
95
|
+
onText: (siblingData: Record<string, unknown>, attribute?: string) => void;
|
|
96
|
+
root: Record<string, unknown>;
|
|
97
|
+
siblingData?: Record<string, unknown>;
|
|
98
|
+
}) => void;
|
|
99
|
+
};
|
|
100
|
+
};
|
|
101
|
+
declare const translator: (pluginConfig: TranslatorConfig) => Plugin;
|
|
102
|
+
export { translator, translateOperation, translator as default, TranslateResolverResponse, TranslateResolverArgs, TranslateResolver };
|