@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/resolvers/copy.d.ts
CHANGED
|
@@ -1,3 +1,21 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import { PayloadRequest } from "payload";
|
|
2
|
+
type TranslateResolverArgs = {
|
|
3
|
+
/** Locale to translate from */
|
|
4
|
+
localeFrom: string;
|
|
5
|
+
/** Locale to translate to */
|
|
6
|
+
localeTo: string;
|
|
7
|
+
req: PayloadRequest;
|
|
8
|
+
texts: string[];
|
|
9
|
+
};
|
|
10
|
+
type TranslateResolverResponse = {
|
|
11
|
+
success: false;
|
|
12
|
+
} | {
|
|
13
|
+
success: true;
|
|
14
|
+
translatedTexts: string[];
|
|
15
|
+
};
|
|
16
|
+
type TranslateResolver = {
|
|
17
|
+
key: string;
|
|
18
|
+
resolve: (args: TranslateResolverArgs) => Promise<TranslateResolverResponse> | TranslateResolverResponse;
|
|
19
|
+
};
|
|
20
|
+
declare const copyResolver: () => TranslateResolver;
|
|
21
|
+
export { copyResolver as default, copyResolver };
|
package/dist/resolvers/copy.js
CHANGED
|
@@ -1,14 +1,20 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
}
|
|
1
|
+
// src/resolvers/copy.ts
|
|
2
|
+
var copyResolver = () => {
|
|
3
|
+
return {
|
|
4
|
+
key: "copy",
|
|
5
|
+
resolve: (args) => {
|
|
6
|
+
const { texts } = args;
|
|
7
|
+
return {
|
|
8
|
+
success: true,
|
|
9
|
+
translatedTexts: texts
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
};
|
|
12
13
|
};
|
|
13
14
|
|
|
14
|
-
|
|
15
|
+
// src/exports/resolvers/copy.ts
|
|
16
|
+
var copy_default = copyResolver;
|
|
17
|
+
export {
|
|
18
|
+
copy_default as default,
|
|
19
|
+
copyResolver
|
|
20
|
+
};
|
|
@@ -1,11 +1,29 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
};
|
|
10
|
-
|
|
11
|
-
|
|
1
|
+
import { PayloadRequest } from "payload";
|
|
2
|
+
type TranslateResolverArgs = {
|
|
3
|
+
/** Locale to translate from */
|
|
4
|
+
localeFrom: string;
|
|
5
|
+
/** Locale to translate to */
|
|
6
|
+
localeTo: string;
|
|
7
|
+
req: PayloadRequest;
|
|
8
|
+
texts: string[];
|
|
9
|
+
};
|
|
10
|
+
type TranslateResolverResponse = {
|
|
11
|
+
success: false;
|
|
12
|
+
} | {
|
|
13
|
+
success: true;
|
|
14
|
+
translatedTexts: string[];
|
|
15
|
+
};
|
|
16
|
+
type TranslateResolver = {
|
|
17
|
+
key: string;
|
|
18
|
+
resolve: (args: TranslateResolverArgs) => Promise<TranslateResolverResponse> | TranslateResolverResponse;
|
|
19
|
+
};
|
|
20
|
+
type GoogleResolverConfig = {
|
|
21
|
+
apiKey: string;
|
|
22
|
+
/**
|
|
23
|
+
* How many texts to include into 1 request
|
|
24
|
+
* @default 100
|
|
25
|
+
*/
|
|
26
|
+
chunkLength?: number;
|
|
27
|
+
};
|
|
28
|
+
declare const googleResolver: ({ apiKey, chunkLength }: GoogleResolverConfig) => TranslateResolver;
|
|
29
|
+
export { googleResolver, googleResolver as default, GoogleResolverConfig };
|
package/dist/resolvers/google.js
CHANGED
|
@@ -1,47 +1,61 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
// src/utils/chunkArray.ts
|
|
2
|
+
var chunkArray = (array, length) => {
|
|
3
|
+
return Array.from({ length: Math.ceil(array.length / length) }, (_, i) => array.slice(i * length, i * length + length));
|
|
4
4
|
};
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
5
|
+
|
|
6
|
+
// src/resolvers/google.ts
|
|
7
|
+
var localeToCountryCodeMapper = {
|
|
8
|
+
ua: "uk"
|
|
9
|
+
};
|
|
10
|
+
var mapLocale = (incoming) => (incoming in localeToCountryCodeMapper) ? localeToCountryCodeMapper[incoming] : incoming;
|
|
11
|
+
var googleResolver = ({
|
|
12
|
+
apiKey,
|
|
13
|
+
chunkLength = 100
|
|
14
|
+
}) => {
|
|
15
|
+
return {
|
|
16
|
+
key: "google",
|
|
17
|
+
resolve: async (args) => {
|
|
18
|
+
const { localeFrom, localeTo, req, texts } = args;
|
|
19
|
+
const apiUrl = `https://translation.googleapis.com/language/translate/v2?key=${apiKey}`;
|
|
20
|
+
const responses = await Promise.all(chunkArray(texts, chunkLength).map((q) => fetch(apiUrl, {
|
|
21
|
+
body: JSON.stringify({
|
|
22
|
+
q,
|
|
23
|
+
source: mapLocale(localeFrom),
|
|
24
|
+
target: mapLocale(localeTo)
|
|
25
|
+
}),
|
|
26
|
+
headers: {
|
|
27
|
+
"Content-Type": "application/json"
|
|
28
|
+
},
|
|
29
|
+
method: "POST"
|
|
30
|
+
}).then(async (res) => {
|
|
31
|
+
const data = await res.json();
|
|
32
|
+
if (!res.ok)
|
|
33
|
+
req.payload.logger.info({
|
|
34
|
+
googleResponse: data,
|
|
35
|
+
message: "An error occurred when trying to translate the data using Google API"
|
|
36
|
+
});
|
|
37
|
+
return {
|
|
38
|
+
data,
|
|
39
|
+
success: res.ok
|
|
40
|
+
};
|
|
41
|
+
})));
|
|
42
|
+
if (responses.some((res) => !res.success)) {
|
|
43
|
+
return {
|
|
44
|
+
success: false
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
const translatedTexts = responses.flatMap((chunk) => chunk.data.data.translations).map((translation) => translation.translatedText);
|
|
48
|
+
return {
|
|
49
|
+
success: true,
|
|
50
|
+
translatedTexts
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
};
|
|
45
54
|
};
|
|
46
55
|
|
|
47
|
-
|
|
56
|
+
// src/exports/resolvers/google.ts
|
|
57
|
+
var google_default = googleResolver;
|
|
58
|
+
export {
|
|
59
|
+
googleResolver,
|
|
60
|
+
google_default as default
|
|
61
|
+
};
|
|
@@ -1,16 +1,34 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Custom url for the libre translate instance
|
|
11
|
-
* @default "https://libretranslate.com/translate"
|
|
12
|
-
*/
|
|
13
|
-
url?: string;
|
|
1
|
+
import { PayloadRequest } from "payload";
|
|
2
|
+
type TranslateResolverArgs = {
|
|
3
|
+
/** Locale to translate from */
|
|
4
|
+
localeFrom: string;
|
|
5
|
+
/** Locale to translate to */
|
|
6
|
+
localeTo: string;
|
|
7
|
+
req: PayloadRequest;
|
|
8
|
+
texts: string[];
|
|
14
9
|
};
|
|
15
|
-
|
|
16
|
-
|
|
10
|
+
type TranslateResolverResponse = {
|
|
11
|
+
success: false;
|
|
12
|
+
} | {
|
|
13
|
+
success: true;
|
|
14
|
+
translatedTexts: string[];
|
|
15
|
+
};
|
|
16
|
+
type TranslateResolver = {
|
|
17
|
+
key: string;
|
|
18
|
+
resolve: (args: TranslateResolverArgs) => Promise<TranslateResolverResponse> | TranslateResolverResponse;
|
|
19
|
+
};
|
|
20
|
+
type LibreResolverConfig = {
|
|
21
|
+
apiKey: string;
|
|
22
|
+
/**
|
|
23
|
+
* How many texts to include into 1 request
|
|
24
|
+
* @default 100
|
|
25
|
+
*/
|
|
26
|
+
chunkLength?: number;
|
|
27
|
+
/**
|
|
28
|
+
* Custom url for the libre translate instance
|
|
29
|
+
* @default "https://libretranslate.com/translate"
|
|
30
|
+
*/
|
|
31
|
+
url?: string;
|
|
32
|
+
};
|
|
33
|
+
declare const libreResolver: ({ apiKey, chunkLength, url }: LibreResolverConfig) => TranslateResolver;
|
|
34
|
+
export { libreResolver, libreResolver as default, LibreResolverConfig };
|
|
@@ -1,48 +1,63 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
// src/utils/chunkArray.ts
|
|
2
|
+
var chunkArray = (array, length) => {
|
|
3
|
+
return Array.from({ length: Math.ceil(array.length / length) }, (_, i) => array.slice(i * length, i * length + length));
|
|
4
4
|
};
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
5
|
+
|
|
6
|
+
// src/resolvers/libreTranslate.ts
|
|
7
|
+
var localeToCountryCodeMapper = {
|
|
8
|
+
ua: "uk"
|
|
9
|
+
};
|
|
10
|
+
var mapLocale = (incoming) => (incoming in localeToCountryCodeMapper) ? localeToCountryCodeMapper[incoming] : incoming;
|
|
11
|
+
var libreResolver = ({
|
|
12
|
+
apiKey,
|
|
13
|
+
chunkLength = 100,
|
|
14
|
+
url = "https://libretranslate.com/translate"
|
|
15
|
+
}) => {
|
|
16
|
+
return {
|
|
17
|
+
key: "libre",
|
|
18
|
+
resolve: async (args) => {
|
|
19
|
+
const { localeFrom, localeTo, req, texts } = args;
|
|
20
|
+
const apiUrl = url;
|
|
21
|
+
const responses = await Promise.all(chunkArray(texts, chunkLength).map((q) => fetch(apiUrl, {
|
|
22
|
+
body: JSON.stringify({
|
|
23
|
+
api_key: apiKey,
|
|
24
|
+
q,
|
|
25
|
+
source: mapLocale(localeFrom),
|
|
26
|
+
target: mapLocale(localeTo)
|
|
27
|
+
}),
|
|
28
|
+
headers: {
|
|
29
|
+
"Content-Type": "application/json"
|
|
30
|
+
},
|
|
31
|
+
method: "POST"
|
|
32
|
+
}).then(async (res) => {
|
|
33
|
+
const data = await res.json();
|
|
34
|
+
if (!res.ok)
|
|
35
|
+
req.payload.logger.info({
|
|
36
|
+
libreResponse: data,
|
|
37
|
+
message: "An error occurred when trying to translate the data using LibreTranslate API"
|
|
38
|
+
});
|
|
39
|
+
return {
|
|
40
|
+
data,
|
|
41
|
+
success: res.ok
|
|
42
|
+
};
|
|
43
|
+
})));
|
|
44
|
+
if (responses.some((res) => !res.success)) {
|
|
45
|
+
return {
|
|
46
|
+
success: false
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
const translatedTexts = responses.flatMap((chunk) => chunk.data.translatedText);
|
|
50
|
+
return {
|
|
51
|
+
success: true,
|
|
52
|
+
translatedTexts
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
};
|
|
46
56
|
};
|
|
47
57
|
|
|
48
|
-
|
|
58
|
+
// src/exports/resolvers/libreTranslate.ts
|
|
59
|
+
var libreTranslate_default = libreResolver;
|
|
60
|
+
export {
|
|
61
|
+
libreResolver,
|
|
62
|
+
libreTranslate_default as default
|
|
63
|
+
};
|
|
@@ -1,23 +1,41 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
import { PayloadRequest } from "payload";
|
|
2
|
+
type TranslateResolverArgs = {
|
|
3
|
+
/** Locale to translate from */
|
|
4
|
+
localeFrom: string;
|
|
5
|
+
/** Locale to translate to */
|
|
6
|
+
localeTo: string;
|
|
7
|
+
req: PayloadRequest;
|
|
8
|
+
texts: string[];
|
|
9
|
+
};
|
|
10
|
+
type TranslateResolverResponse = {
|
|
11
|
+
success: false;
|
|
12
|
+
} | {
|
|
13
|
+
success: true;
|
|
14
|
+
translatedTexts: string[];
|
|
15
|
+
};
|
|
16
|
+
type TranslateResolver = {
|
|
17
|
+
key: string;
|
|
18
|
+
resolve: (args: TranslateResolverArgs) => Promise<TranslateResolverResponse> | TranslateResolverResponse;
|
|
19
|
+
};
|
|
20
|
+
type OpenAIMessageExchange = Record<string | number, string>;
|
|
21
|
+
type OpenAIPrompt = (args: {
|
|
22
|
+
localeFrom: string;
|
|
23
|
+
localeTo: string;
|
|
24
|
+
texts: OpenAIMessageExchange;
|
|
7
25
|
}) => string;
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
26
|
+
type OpenAIResolverConfig = {
|
|
27
|
+
apiKey: string;
|
|
28
|
+
baseUrl?: string;
|
|
29
|
+
/**
|
|
30
|
+
* How many texts to include into 1 request
|
|
31
|
+
* @default 100
|
|
32
|
+
*/
|
|
33
|
+
chunkLength?: number;
|
|
34
|
+
/**
|
|
35
|
+
* @default "gpt-3.5-turbo"
|
|
36
|
+
*/
|
|
37
|
+
model?: string;
|
|
38
|
+
prompt?: OpenAIPrompt;
|
|
21
39
|
};
|
|
22
|
-
|
|
23
|
-
|
|
40
|
+
declare const openAIResolver: ({ apiKey, baseUrl, chunkLength, model, prompt }: OpenAIResolverConfig) => TranslateResolver;
|
|
41
|
+
export { openAIResolver, openAIResolver as default, OpenAIResolverConfig, OpenAIPrompt, OpenAIMessageExchange };
|
package/dist/resolvers/openAI.js
CHANGED
|
@@ -1,6 +1,11 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
// src/utils/chunkArray.ts
|
|
2
|
+
var chunkArray = (array, length) => {
|
|
3
|
+
return Array.from({ length: Math.ceil(array.length / length) }, (_, i) => array.slice(i * length, i * length + length));
|
|
4
|
+
};
|
|
5
|
+
|
|
6
|
+
// src/resolvers/openAI.ts
|
|
7
|
+
var defaultPrompt = ({ localeFrom, localeTo, texts }) => {
|
|
8
|
+
return `You are a machine translation service. Your task is to translate values in a strict JSON of key value pairs from ${localeFrom} to ${localeTo}.
|
|
4
9
|
|
|
5
10
|
**INSTRUCTIONS:**
|
|
6
11
|
1. **Translate each value**.
|
|
@@ -17,104 +22,111 @@ const defaultPrompt = ({ localeFrom, localeTo, texts })=>{
|
|
|
17
22
|
**INPUT JSON TO TRANSLATE:**
|
|
18
23
|
${JSON.stringify(texts)}`;
|
|
19
24
|
};
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
model
|
|
44
|
-
}),
|
|
45
|
-
headers: {
|
|
46
|
-
Authorization: `Bearer ${apiKey}`,
|
|
47
|
-
'Content-Type': 'application/json'
|
|
48
|
-
},
|
|
49
|
-
method: 'post'
|
|
50
|
-
}).then(async (res)=>{
|
|
51
|
-
const data = await res.json();
|
|
52
|
-
if (!res.ok) req.payload.logger.info({
|
|
53
|
-
message: 'An error occurred when trying to translate the data using OpenAI API',
|
|
54
|
-
openAIresponse: data
|
|
55
|
-
});
|
|
56
|
-
return {
|
|
57
|
-
data,
|
|
58
|
-
success: res.ok
|
|
59
|
-
};
|
|
60
|
-
});
|
|
61
|
-
}));
|
|
62
|
-
const translated = [];
|
|
63
|
-
for (const { data, success } of response){
|
|
64
|
-
if (!success) return {
|
|
65
|
-
success: false
|
|
66
|
-
};
|
|
67
|
-
const content = data?.choices?.[0]?.message?.content;
|
|
68
|
-
if (!content) {
|
|
69
|
-
req.payload.logger.error('An error occurred when trying to translate the data using OpenAI API - missing content in the response');
|
|
70
|
-
return {
|
|
71
|
-
success: false
|
|
72
|
-
};
|
|
73
|
-
}
|
|
74
|
-
const translatedStructuredTexts = JSON.parse(content);
|
|
75
|
-
const translatedChunk = Object.values(translatedStructuredTexts);
|
|
76
|
-
if (!Array.isArray(translatedChunk)) {
|
|
77
|
-
req.payload.logger.error({
|
|
78
|
-
data: translatedChunk,
|
|
79
|
-
fullContent: content,
|
|
80
|
-
message: 'An error occurred when trying to translate the data using OpenAI API - parsed content is not an array'
|
|
81
|
-
});
|
|
82
|
-
return {
|
|
83
|
-
success: false
|
|
84
|
-
};
|
|
85
|
-
}
|
|
86
|
-
for (const text of translatedChunk){
|
|
87
|
-
if (text && typeof text !== 'string') {
|
|
88
|
-
req.payload.logger.error({
|
|
89
|
-
chunkData: translatedChunk,
|
|
90
|
-
data: text,
|
|
91
|
-
fullContent: content,
|
|
92
|
-
message: 'An error occurred when trying to translate the data using OpenAI API - parsed content is not a string'
|
|
93
|
-
});
|
|
94
|
-
return {
|
|
95
|
-
success: false
|
|
96
|
-
};
|
|
97
|
-
}
|
|
98
|
-
translated.push(text);
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
return {
|
|
102
|
-
success: true,
|
|
103
|
-
translatedTexts: translated
|
|
104
|
-
};
|
|
105
|
-
} catch (e) {
|
|
106
|
-
if (e instanceof Error) {
|
|
107
|
-
req.payload.logger.info({
|
|
108
|
-
message: 'An error occurred when trying to translate the data using OpenAI API',
|
|
109
|
-
originalErr: e.message
|
|
110
|
-
});
|
|
25
|
+
var openAIResolver = ({
|
|
26
|
+
apiKey,
|
|
27
|
+
baseUrl,
|
|
28
|
+
chunkLength = 100,
|
|
29
|
+
model = "gpt-3.5-turbo",
|
|
30
|
+
prompt = defaultPrompt
|
|
31
|
+
}) => {
|
|
32
|
+
return {
|
|
33
|
+
key: "openai",
|
|
34
|
+
resolve: async ({ localeFrom, localeTo, req, texts }) => {
|
|
35
|
+
const apiUrl = `${baseUrl || "https://api.openai.com"}/v1/chat/completions`;
|
|
36
|
+
try {
|
|
37
|
+
const response = await Promise.all(chunkArray(texts, chunkLength).map((texts2) => {
|
|
38
|
+
const structuredTexts = texts2.reduce((acc, curr, index) => {
|
|
39
|
+
acc[index + 1] = curr;
|
|
40
|
+
return acc;
|
|
41
|
+
}, {});
|
|
42
|
+
return fetch(apiUrl, {
|
|
43
|
+
body: JSON.stringify({
|
|
44
|
+
messages: [
|
|
45
|
+
{
|
|
46
|
+
content: prompt({ localeFrom, localeTo, texts: structuredTexts }),
|
|
47
|
+
role: "user"
|
|
111
48
|
}
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
49
|
+
],
|
|
50
|
+
model
|
|
51
|
+
}),
|
|
52
|
+
headers: {
|
|
53
|
+
Authorization: `Bearer ${apiKey}`,
|
|
54
|
+
"Content-Type": "application/json"
|
|
55
|
+
},
|
|
56
|
+
method: "post"
|
|
57
|
+
}).then(async (res) => {
|
|
58
|
+
const data = await res.json();
|
|
59
|
+
if (!res.ok)
|
|
60
|
+
req.payload.logger.info({
|
|
61
|
+
message: "An error occurred when trying to translate the data using OpenAI API",
|
|
62
|
+
openAIresponse: data
|
|
63
|
+
});
|
|
64
|
+
return {
|
|
65
|
+
data,
|
|
66
|
+
success: res.ok
|
|
67
|
+
};
|
|
68
|
+
});
|
|
69
|
+
}));
|
|
70
|
+
const translated = [];
|
|
71
|
+
for (const { data, success } of response) {
|
|
72
|
+
if (!success)
|
|
73
|
+
return {
|
|
74
|
+
success: false
|
|
75
|
+
};
|
|
76
|
+
const content = data?.choices?.[0]?.message?.content;
|
|
77
|
+
if (!content) {
|
|
78
|
+
req.payload.logger.error("An error occurred when trying to translate the data using OpenAI API - missing content in the response");
|
|
79
|
+
return {
|
|
80
|
+
success: false
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
const translatedStructuredTexts = JSON.parse(content);
|
|
84
|
+
const translatedChunk = Object.values(translatedStructuredTexts);
|
|
85
|
+
if (!Array.isArray(translatedChunk)) {
|
|
86
|
+
req.payload.logger.error({
|
|
87
|
+
data: translatedChunk,
|
|
88
|
+
fullContent: content,
|
|
89
|
+
message: "An error occurred when trying to translate the data using OpenAI API - parsed content is not an array"
|
|
90
|
+
});
|
|
91
|
+
return {
|
|
92
|
+
success: false
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
for (const text of translatedChunk) {
|
|
96
|
+
if (text && typeof text !== "string") {
|
|
97
|
+
req.payload.logger.error({
|
|
98
|
+
chunkData: translatedChunk,
|
|
99
|
+
data: text,
|
|
100
|
+
fullContent: content,
|
|
101
|
+
message: "An error occurred when trying to translate the data using OpenAI API - parsed content is not a string"
|
|
102
|
+
});
|
|
103
|
+
return {
|
|
104
|
+
success: false
|
|
105
|
+
};
|
|
115
106
|
}
|
|
107
|
+
translated.push(text);
|
|
108
|
+
}
|
|
116
109
|
}
|
|
117
|
-
|
|
110
|
+
return {
|
|
111
|
+
success: true,
|
|
112
|
+
translatedTexts: translated
|
|
113
|
+
};
|
|
114
|
+
} catch (e) {
|
|
115
|
+
if (e instanceof Error) {
|
|
116
|
+
req.payload.logger.info({
|
|
117
|
+
message: "An error occurred when trying to translate the data using OpenAI API",
|
|
118
|
+
originalErr: e.message
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
return { success: false };
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
};
|
|
118
125
|
};
|
|
119
126
|
|
|
120
|
-
|
|
127
|
+
// src/exports/resolvers/openAI.ts
|
|
128
|
+
var openAI_default = openAIResolver;
|
|
129
|
+
export {
|
|
130
|
+
openAIResolver,
|
|
131
|
+
openAI_default as default
|
|
132
|
+
};
|