@extravirgin/payload-enchants-translator 1.0.7 → 1.1.0
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/README.md +173 -20
- package/dist/client/components/GlossaryControls/index.d.ts +4 -0
- package/dist/client/components/GlossaryControls/index.d.ts.map +1 -0
- package/dist/client/components/GlossaryControls/index.js +43 -0
- package/dist/client/components/GlossaryControls/index.js.map +1 -0
- package/dist/client/providers/Translator/TranslatorProvider.d.ts.map +1 -1
- package/dist/client/providers/Translator/TranslatorProvider.js +2 -1
- package/dist/client/providers/Translator/TranslatorProvider.js.map +1 -1
- package/dist/exports/client.d.ts +1 -0
- package/dist/exports/client.d.ts.map +1 -1
- package/dist/exports/client.js +1 -0
- package/dist/exports/client.js.map +1 -1
- package/dist/glossary.d.ts +17 -0
- package/dist/glossary.d.ts.map +1 -0
- package/dist/glossary.js +52 -0
- package/dist/glossary.js.map +1 -0
- package/dist/glossaryCollection.d.ts +5 -0
- package/dist/glossaryCollection.d.ts.map +1 -0
- package/dist/glossaryCollection.js +114 -0
- package/dist/glossaryCollection.js.map +1 -0
- package/dist/i18n-translations.d.ts +84 -0
- package/dist/i18n-translations.d.ts.map +1 -1
- package/dist/i18n-translations.js +83 -0
- package/dist/i18n-translations.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +54 -8
- package/dist/index.js.map +1 -1
- package/dist/resolvers/deepl.d.ts +12 -0
- package/dist/resolvers/deepl.d.ts.map +1 -0
- package/dist/resolvers/deepl.js +82 -0
- package/dist/resolvers/deepl.js.map +1 -0
- package/dist/resolvers/deeplGlossary.d.ts +19 -0
- package/dist/resolvers/deeplGlossary.d.ts.map +1 -0
- package/dist/resolvers/deeplGlossary.js +117 -0
- package/dist/resolvers/deeplGlossary.js.map +1 -0
- package/dist/resolvers/types.d.ts +3 -0
- package/dist/resolvers/types.d.ts.map +1 -1
- package/dist/resolvers/types.js.map +1 -1
- package/dist/translate/endpoint.d.ts.map +1 -1
- package/dist/translate/endpoint.js +2 -1
- package/dist/translate/endpoint.js.map +1 -1
- package/dist/translate/findEntityWithConfig.d.ts.map +1 -1
- package/dist/translate/findEntityWithConfig.js +4 -3
- package/dist/translate/findEntityWithConfig.js.map +1 -1
- package/dist/translate/operation.d.ts.map +1 -1
- package/dist/translate/operation.js +4 -1
- package/dist/translate/operation.js.map +1 -1
- package/dist/translate/traverseFields.d.ts.map +1 -1
- package/dist/translate/traverseFields.js +13 -0
- package/dist/translate/traverseFields.js.map +1 -1
- package/dist/translate/updateEntity.d.ts.map +1 -1
- package/dist/translate/updateEntity.js +3 -2
- package/dist/translate/updateEntity.js.map +1 -1
- package/dist/types.d.ts +10 -8
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +25 -12
- package/LICENSE +0 -21
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { chunkArray } from '../utils/chunkArray';
|
|
2
|
+
const hasSpecialUnicodeCharacters = (text)=>/[\u0300-\u036f\u0336]/.test(text);
|
|
3
|
+
export const deeplResolver = ({ apiKey, chunkLength = 100, glossary, glossaryId: configuredGlossaryId, sourceLocaleMap = {}, targetLocaleMap = {} })=>{
|
|
4
|
+
if (!Number.isInteger(chunkLength) || chunkLength < 1) {
|
|
5
|
+
throw new Error('DeepL chunkLength must be a positive integer.');
|
|
6
|
+
}
|
|
7
|
+
const glossaryId = configuredGlossaryId?.trim() || undefined;
|
|
8
|
+
if (glossaryId && !glossary) {
|
|
9
|
+
throw new Error('DeepL glossary options require glossary configuration.');
|
|
10
|
+
}
|
|
11
|
+
return {
|
|
12
|
+
...glossary ? {
|
|
13
|
+
glossary: {
|
|
14
|
+
sync: async (req, entry)=>{
|
|
15
|
+
const { DeepLClient } = await import('deepl-node');
|
|
16
|
+
const { syncDeepLGlossary } = await import('./deeplGlossary');
|
|
17
|
+
return syncDeepLGlossary({
|
|
18
|
+
client: new DeepLClient(apiKey, {
|
|
19
|
+
maxRetries: 0,
|
|
20
|
+
minTimeout: 60000
|
|
21
|
+
}),
|
|
22
|
+
entry,
|
|
23
|
+
glossary,
|
|
24
|
+
glossaryId,
|
|
25
|
+
req,
|
|
26
|
+
sourceLocaleMap,
|
|
27
|
+
targetLocaleMap
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
} : {},
|
|
32
|
+
key: 'deepl',
|
|
33
|
+
resolve: async ({ localeFrom, localeTo, req, texts })=>{
|
|
34
|
+
if (!texts.some((text)=>text.trim())) {
|
|
35
|
+
return {
|
|
36
|
+
success: true,
|
|
37
|
+
translatedTexts: texts.map(()=>'')
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
// Optional peer dependency: other resolvers do not load the DeepL SDK.
|
|
41
|
+
const { DeepLClient } = await import('deepl-node');
|
|
42
|
+
const client = new DeepLClient(apiKey);
|
|
43
|
+
const sourceLang = sourceLocaleMap[localeFrom] ?? localeFrom;
|
|
44
|
+
const targetLang = targetLocaleMap[localeTo] ?? localeTo;
|
|
45
|
+
let translationGlossaryId;
|
|
46
|
+
if (glossary && localeFrom === glossary.sourceLocale && glossary.targetLocales.includes(localeTo)) {
|
|
47
|
+
const { getDeepLGlossaryId } = await import('./deeplGlossary');
|
|
48
|
+
translationGlossaryId = await getDeepLGlossaryId({
|
|
49
|
+
glossary,
|
|
50
|
+
glossaryId,
|
|
51
|
+
req,
|
|
52
|
+
sourceLocaleMap,
|
|
53
|
+
targetLocale: localeTo,
|
|
54
|
+
targetLocaleMap
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
const translatedTexts = [];
|
|
58
|
+
for (const batch of chunkArray(texts, chunkLength)){
|
|
59
|
+
const context = batch.filter((text)=>!hasSpecialUnicodeCharacters(text)).join(' ');
|
|
60
|
+
// Settle the batch before returning a result or propagating an error.
|
|
61
|
+
const results = await Promise.allSettled(batch.map((text)=>text.trim() ? client.translateText(text, sourceLang, targetLang, {
|
|
62
|
+
context,
|
|
63
|
+
glossary: translationGlossaryId,
|
|
64
|
+
modelType: hasSpecialUnicodeCharacters(text) ? 'latency_optimized' : 'prefer_quality_optimized',
|
|
65
|
+
tagHandling: 'html'
|
|
66
|
+
}) : Promise.resolve({
|
|
67
|
+
text: ''
|
|
68
|
+
})));
|
|
69
|
+
for (const result of results){
|
|
70
|
+
if (result.status === 'rejected') throw result.reason;
|
|
71
|
+
translatedTexts.push(result.value.text);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return {
|
|
75
|
+
success: true,
|
|
76
|
+
translatedTexts
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
//# sourceMappingURL=deepl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/resolvers/deepl.ts"],"sourcesContent":["import type { SourceLanguageCode, TargetLanguageCode } from 'deepl-node';\n\nimport type { GlossaryConfig } from '../glossary';\nimport { chunkArray } from '../utils/chunkArray';\nimport type { TranslateResolver } from './types';\n\nexport type DeepLResolverConfig = {\n apiKey: string;\n chunkLength?: number;\n glossary?: GlossaryConfig;\n glossaryId?: string;\n sourceLocaleMap?: Record<string, string>;\n targetLocaleMap?: Record<string, string>;\n};\n\nconst hasSpecialUnicodeCharacters = (text: string) => /[\\u0300-\\u036f\\u0336]/.test(text);\n\nexport const deeplResolver = ({\n apiKey,\n chunkLength = 100,\n glossary,\n glossaryId: configuredGlossaryId,\n sourceLocaleMap = {},\n targetLocaleMap = {},\n}: DeepLResolverConfig): TranslateResolver => {\n if (!Number.isInteger(chunkLength) || chunkLength < 1) {\n throw new Error('DeepL chunkLength must be a positive integer.');\n }\n\n const glossaryId = configuredGlossaryId?.trim() || undefined;\n\n if (glossaryId && !glossary) {\n throw new Error('DeepL glossary options require glossary configuration.');\n }\n\n return {\n ...(glossary\n ? {\n glossary: {\n sync: async (req, entry) => {\n const { DeepLClient } = await import('deepl-node');\n\n const { syncDeepLGlossary } = await import('./deeplGlossary');\n\n return syncDeepLGlossary({\n client: new DeepLClient(apiKey, { maxRetries: 0, minTimeout: 60000 }),\n entry,\n glossary,\n glossaryId,\n req,\n sourceLocaleMap,\n targetLocaleMap,\n });\n },\n },\n }\n : {}),\n key: 'deepl',\n resolve: async ({ localeFrom, localeTo, req, texts }) => {\n if (!texts.some((text) => text.trim())) {\n return { success: true, translatedTexts: texts.map(() => '') };\n }\n\n // Optional peer dependency: other resolvers do not load the DeepL SDK.\n const { DeepLClient } = await import('deepl-node');\n\n const client = new DeepLClient(apiKey);\n\n const sourceLang = (sourceLocaleMap[localeFrom] ?? localeFrom) as SourceLanguageCode;\n\n const targetLang = (targetLocaleMap[localeTo] ?? localeTo) as TargetLanguageCode;\n\n let translationGlossaryId: string | undefined;\n\n if (\n glossary &&\n localeFrom === glossary.sourceLocale &&\n glossary.targetLocales.includes(localeTo)\n ) {\n const { getDeepLGlossaryId } = await import('./deeplGlossary');\n\n translationGlossaryId = await getDeepLGlossaryId({\n glossary,\n glossaryId,\n req,\n sourceLocaleMap,\n targetLocale: localeTo,\n targetLocaleMap,\n });\n }\n\n const translatedTexts: string[] = [];\n\n for (const batch of chunkArray(texts, chunkLength)) {\n const context = batch.filter((text) => !hasSpecialUnicodeCharacters(text)).join(' ');\n\n // Settle the batch before returning a result or propagating an error.\n const results = await Promise.allSettled(\n batch.map((text) =>\n text.trim()\n ? client.translateText(text, sourceLang, targetLang, {\n context,\n glossary: translationGlossaryId,\n modelType: hasSpecialUnicodeCharacters(text)\n ? 'latency_optimized'\n : 'prefer_quality_optimized',\n tagHandling: 'html',\n })\n : Promise.resolve({ text: '' }),\n ),\n );\n\n for (const result of results) {\n if (result.status === 'rejected') throw result.reason;\n translatedTexts.push(result.value.text);\n }\n }\n\n return { success: true, translatedTexts };\n },\n };\n};\n"],"names":["chunkArray","hasSpecialUnicodeCharacters","text","test","deeplResolver","apiKey","chunkLength","glossary","glossaryId","configuredGlossaryId","sourceLocaleMap","targetLocaleMap","Number","isInteger","Error","trim","undefined","sync","req","entry","DeepLClient","syncDeepLGlossary","client","maxRetries","minTimeout","key","resolve","localeFrom","localeTo","texts","some","success","translatedTexts","map","sourceLang","targetLang","translationGlossaryId","sourceLocale","targetLocales","includes","getDeepLGlossaryId","targetLocale","batch","context","filter","join","results","Promise","allSettled","translateText","modelType","tagHandling","result","status","reason","push","value"],"mappings":"AAGA,SAASA,UAAU,QAAQ,sBAAsB;AAYjD,MAAMC,8BAA8B,CAACC,OAAiB,wBAAwBC,IAAI,CAACD;AAEnF,OAAO,MAAME,gBAAgB,CAAC,EAC5BC,MAAM,EACNC,cAAc,GAAG,EACjBC,QAAQ,EACRC,YAAYC,oBAAoB,EAChCC,kBAAkB,CAAC,CAAC,EACpBC,kBAAkB,CAAC,CAAC,EACA;IACpB,IAAI,CAACC,OAAOC,SAAS,CAACP,gBAAgBA,cAAc,GAAG;QACrD,MAAM,IAAIQ,MAAM;IAClB;IAEA,MAAMN,aAAaC,sBAAsBM,UAAUC;IAEnD,IAAIR,cAAc,CAACD,UAAU;QAC3B,MAAM,IAAIO,MAAM;IAClB;IAEA,OAAO;QACL,GAAIP,WACA;YACEA,UAAU;gBACRU,MAAM,OAAOC,KAAKC;oBAChB,MAAM,EAAEC,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC;oBAErC,MAAM,EAAEC,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC;oBAE3C,OAAOA,kBAAkB;wBACvBC,QAAQ,IAAIF,YAAYf,QAAQ;4BAAEkB,YAAY;4BAAGC,YAAY;wBAAM;wBACnEL;wBACAZ;wBACAC;wBACAU;wBACAR;wBACAC;oBACF;gBACF;YACF;QACF,IACA,CAAC,CAAC;QACNc,KAAK;QACLC,SAAS,OAAO,EAAEC,UAAU,EAAEC,QAAQ,EAAEV,GAAG,EAAEW,KAAK,EAAE;YAClD,IAAI,CAACA,MAAMC,IAAI,CAAC,CAAC5B,OAASA,KAAKa,IAAI,KAAK;gBACtC,OAAO;oBAAEgB,SAAS;oBAAMC,iBAAiBH,MAAMI,GAAG,CAAC,IAAM;gBAAI;YAC/D;YAEA,uEAAuE;YACvE,MAAM,EAAEb,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC;YAErC,MAAME,SAAS,IAAIF,YAAYf;YAE/B,MAAM6B,aAAcxB,eAAe,CAACiB,WAAW,IAAIA;YAEnD,MAAMQ,aAAcxB,eAAe,CAACiB,SAAS,IAAIA;YAEjD,IAAIQ;YAEJ,IACE7B,YACAoB,eAAepB,SAAS8B,YAAY,IACpC9B,SAAS+B,aAAa,CAACC,QAAQ,CAACX,WAChC;gBACA,MAAM,EAAEY,kBAAkB,EAAE,GAAG,MAAM,MAAM,CAAC;gBAE5CJ,wBAAwB,MAAMI,mBAAmB;oBAC/CjC;oBACAC;oBACAU;oBACAR;oBACA+B,cAAcb;oBACdjB;gBACF;YACF;YAEA,MAAMqB,kBAA4B,EAAE;YAEpC,KAAK,MAAMU,SAAS1C,WAAW6B,OAAOvB,aAAc;gBAClD,MAAMqC,UAAUD,MAAME,MAAM,CAAC,CAAC1C,OAAS,CAACD,4BAA4BC,OAAO2C,IAAI,CAAC;gBAEhF,sEAAsE;gBACtE,MAAMC,UAAU,MAAMC,QAAQC,UAAU,CACtCN,MAAMT,GAAG,CAAC,CAAC/B,OACTA,KAAKa,IAAI,KACLO,OAAO2B,aAAa,CAAC/C,MAAMgC,YAAYC,YAAY;wBACjDQ;wBACApC,UAAU6B;wBACVc,WAAWjD,4BAA4BC,QACnC,sBACA;wBACJiD,aAAa;oBACf,KACAJ,QAAQrB,OAAO,CAAC;wBAAExB,MAAM;oBAAG;gBAInC,KAAK,MAAMkD,UAAUN,QAAS;oBAC5B,IAAIM,OAAOC,MAAM,KAAK,YAAY,MAAMD,OAAOE,MAAM;oBACrDtB,gBAAgBuB,IAAI,CAACH,OAAOI,KAAK,CAACtD,IAAI;gBACxC;YACF;YAEA,OAAO;gBAAE6B,SAAS;gBAAMC;YAAgB;QAC1C;IACF;AACF,EAAE"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { DeepLClient } from 'deepl-node';
|
|
2
|
+
import type { PayloadRequest } from 'payload';
|
|
3
|
+
import type { GlossaryConfig } from '../glossary';
|
|
4
|
+
type Options = {
|
|
5
|
+
glossary: GlossaryConfig;
|
|
6
|
+
glossaryId?: string;
|
|
7
|
+
req: PayloadRequest;
|
|
8
|
+
sourceLocaleMap?: Record<string, string>;
|
|
9
|
+
targetLocaleMap?: Record<string, string>;
|
|
10
|
+
};
|
|
11
|
+
export declare const getDeepLGlossaryId: (options: {
|
|
12
|
+
targetLocale: string;
|
|
13
|
+
} & Options) => Promise<string | undefined>;
|
|
14
|
+
export declare const syncDeepLGlossary: (options: {
|
|
15
|
+
client: DeepLClient;
|
|
16
|
+
entry?: Record<string, string>;
|
|
17
|
+
} & Options) => Promise<void>;
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=deeplGlossary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deeplGlossary.d.ts","sourceRoot":"","sources":["../../src/resolvers/deeplGlossary.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,OAAO,KAAK,EAAkB,cAAc,EAAE,MAAM,SAAS,CAAC;AAG9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAKlD,KAAK,OAAO,GAAG;IACb,QAAQ,EAAE,cAAc,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,cAAc,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC1C,CAAC;AAcF,eAAO,MAAM,kBAAkB,YAAmB;IAAE,YAAY,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,gCAqBnF,CAAC;AAGF,eAAO,MAAM,iBAAiB,YACnB;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GAAG,OAAO,KACzE,OAAO,CAAC,IAAI,CAwFd,CAAC"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { GlossaryEntries } from 'deepl-node';
|
|
2
|
+
import { APIError } from 'payload';
|
|
3
|
+
import { validateGlossaryEntries } from '../glossary';
|
|
4
|
+
import { getGlossaryEntriesSlug } from '../glossaryCollection';
|
|
5
|
+
import { translatorT } from '../i18n-translations';
|
|
6
|
+
const language = (locale)=>locale.toLowerCase().split('-')[0];
|
|
7
|
+
const requireAccess = async ({ glossary, req }, write = false)=>{
|
|
8
|
+
if (await glossary.access.read({
|
|
9
|
+
req
|
|
10
|
+
}) !== true || write && await glossary.access.update({
|
|
11
|
+
req
|
|
12
|
+
}) !== true) {
|
|
13
|
+
throw new APIError(translatorT(req.t, 'glossary_accessDenied'), 403, undefined, true);
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
// An omitted target translation does not require a DeepL dictionary.
|
|
17
|
+
export const getDeepLGlossaryId = async (options)=>{
|
|
18
|
+
await requireAccess(options);
|
|
19
|
+
const { glossary, glossaryId, req, targetLocale } = options;
|
|
20
|
+
const result = await req.payload.find({
|
|
21
|
+
collection: getGlossaryEntriesSlug(glossary),
|
|
22
|
+
depth: 0,
|
|
23
|
+
limit: 1,
|
|
24
|
+
overrideAccess: false,
|
|
25
|
+
req,
|
|
26
|
+
select: {
|
|
27
|
+
[targetLocale]: true
|
|
28
|
+
},
|
|
29
|
+
where: {
|
|
30
|
+
and: [
|
|
31
|
+
{
|
|
32
|
+
[targetLocale]: {
|
|
33
|
+
exists: true
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
[targetLocale]: {
|
|
38
|
+
not_equals: ''
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
]
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
if (!result.docs.length) return undefined;
|
|
45
|
+
if (!glossaryId) throw new APIError(translatorT(req.t, 'glossary_missingID'), 400, undefined, true);
|
|
46
|
+
return glossaryId;
|
|
47
|
+
};
|
|
48
|
+
// Entry saves merge one item. Only the manual action reads and replaces full dictionaries.
|
|
49
|
+
export const syncDeepLGlossary = async (options)=>{
|
|
50
|
+
await requireAccess(options, true);
|
|
51
|
+
const { client, entry, glossary, glossaryId, req } = options;
|
|
52
|
+
if (!glossaryId) throw new APIError(translatorT(req.t, 'glossary_missingID'), 400, undefined, true);
|
|
53
|
+
const sourceLangCode = language(options.sourceLocaleMap?.[glossary.sourceLocale] ?? glossary.sourceLocale);
|
|
54
|
+
const dictionaries = glossary.targetLocales.map((locale)=>({
|
|
55
|
+
entries: new GlossaryEntries(),
|
|
56
|
+
locale,
|
|
57
|
+
sourceLangCode,
|
|
58
|
+
targetLangCode: language(options.targetLocaleMap?.[locale] ?? locale)
|
|
59
|
+
}));
|
|
60
|
+
if (new Set(dictionaries.map((item)=>item.targetLangCode)).size !== dictionaries.length) {
|
|
61
|
+
throw new APIError(translatorT(req.t, 'glossary_distinctLanguages'), 400, undefined, true);
|
|
62
|
+
}
|
|
63
|
+
let bytes = 0;
|
|
64
|
+
const add = (doc)=>{
|
|
65
|
+
const validation = validateGlossaryEntries([
|
|
66
|
+
doc
|
|
67
|
+
], glossary, req.t);
|
|
68
|
+
if (validation !== true) throw new APIError(validation, 400, undefined, true);
|
|
69
|
+
const source = doc[glossary.sourceLocale].trim();
|
|
70
|
+
for (const dictionary of dictionaries){
|
|
71
|
+
const target = doc[dictionary.locale]?.trim();
|
|
72
|
+
if (!target) continue;
|
|
73
|
+
bytes += Buffer.byteLength(`${source}\t${target}\n`, 'utf8');
|
|
74
|
+
if (bytes > 10 * 1024 * 1024) throw new APIError(translatorT(req.t, 'glossary_tooLarge'), 400, undefined, true);
|
|
75
|
+
dictionary.entries.add(source, target);
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
if (entry) {
|
|
79
|
+
add(entry);
|
|
80
|
+
for (const dictionary of dictionaries){
|
|
81
|
+
if (Object.keys(dictionary.entries.entries()).length) {
|
|
82
|
+
await client.updateMultilingualGlossaryDictionary(glossaryId, dictionary);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
for(let page = 1;; page++){
|
|
88
|
+
const result = await req.payload.find({
|
|
89
|
+
collection: getGlossaryEntriesSlug(glossary),
|
|
90
|
+
depth: 0,
|
|
91
|
+
limit: 1000,
|
|
92
|
+
overrideAccess: false,
|
|
93
|
+
page,
|
|
94
|
+
req,
|
|
95
|
+
select: Object.fromEntries([
|
|
96
|
+
glossary.sourceLocale,
|
|
97
|
+
...glossary.targetLocales
|
|
98
|
+
].map((locale)=>[
|
|
99
|
+
locale,
|
|
100
|
+
true
|
|
101
|
+
])),
|
|
102
|
+
sort: 'sourceKey'
|
|
103
|
+
});
|
|
104
|
+
for (const doc of result.docs)add(doc);
|
|
105
|
+
if (!result.hasNextPage) break;
|
|
106
|
+
}
|
|
107
|
+
const remote = await client.getMultilingualGlossary(glossaryId);
|
|
108
|
+
for (const dictionary of dictionaries){
|
|
109
|
+
if (Object.keys(dictionary.entries.entries()).length) {
|
|
110
|
+
await client.replaceMultilingualGlossaryDictionary(glossaryId, dictionary);
|
|
111
|
+
} else if (remote.dictionaries.some((item)=>language(item.sourceLangCode) === sourceLangCode && language(item.targetLangCode) === dictionary.targetLangCode)) {
|
|
112
|
+
await client.deleteMultilingualGlossaryDictionary(glossaryId, sourceLangCode, dictionary.targetLangCode);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
//# sourceMappingURL=deeplGlossary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/resolvers/deeplGlossary.ts"],"sourcesContent":["import type { DeepLClient } from 'deepl-node';\nimport { GlossaryEntries } from 'deepl-node';\nimport type { CollectionSlug, PayloadRequest } from 'payload';\nimport { APIError } from 'payload';\n\nimport type { GlossaryConfig } from '../glossary';\nimport { validateGlossaryEntries } from '../glossary';\nimport { getGlossaryEntriesSlug } from '../glossaryCollection';\nimport { translatorT } from '../i18n-translations';\n\ntype Options = {\n glossary: GlossaryConfig;\n glossaryId?: string;\n req: PayloadRequest;\n sourceLocaleMap?: Record<string, string>;\n targetLocaleMap?: Record<string, string>;\n};\n\nconst language = (locale: string) => locale.toLowerCase().split('-')[0];\n\nconst requireAccess = async ({ glossary, req }: Options, write = false) => {\n if (\n (await glossary.access.read({ req })) !== true ||\n (write && (await glossary.access.update({ req })) !== true)\n ) {\n throw new APIError(translatorT(req.t, 'glossary_accessDenied'), 403, undefined, true);\n }\n};\n\n// An omitted target translation does not require a DeepL dictionary.\nexport const getDeepLGlossaryId = async (options: { targetLocale: string } & Options) => {\n await requireAccess(options);\n const { glossary, glossaryId, req, targetLocale } = options;\n\n const result = await req.payload.find({\n collection: getGlossaryEntriesSlug(glossary) as CollectionSlug,\n depth: 0,\n limit: 1,\n overrideAccess: false,\n req,\n select: { [targetLocale]: true },\n where: {\n and: [{ [targetLocale]: { exists: true } }, { [targetLocale]: { not_equals: '' } }],\n },\n });\n\n if (!result.docs.length) return undefined;\n if (!glossaryId)\n throw new APIError(translatorT(req.t, 'glossary_missingID'), 400, undefined, true);\n\n return glossaryId;\n};\n\n// Entry saves merge one item. Only the manual action reads and replaces full dictionaries.\nexport const syncDeepLGlossary = async (\n options: { client: DeepLClient; entry?: Record<string, string> } & Options,\n): Promise<void> => {\n await requireAccess(options, true);\n const { client, entry, glossary, glossaryId, req } = options;\n\n if (!glossaryId)\n throw new APIError(translatorT(req.t, 'glossary_missingID'), 400, undefined, true);\n\n const sourceLangCode = language(\n options.sourceLocaleMap?.[glossary.sourceLocale] ?? glossary.sourceLocale,\n );\n\n const dictionaries = glossary.targetLocales.map((locale) => ({\n entries: new GlossaryEntries(),\n locale,\n sourceLangCode,\n targetLangCode: language(options.targetLocaleMap?.[locale] ?? locale),\n }));\n\n if (new Set(dictionaries.map((item) => item.targetLangCode)).size !== dictionaries.length) {\n throw new APIError(translatorT(req.t, 'glossary_distinctLanguages'), 400, undefined, true);\n }\n let bytes = 0;\n\n const add = (doc: Record<string, string>) => {\n const validation = validateGlossaryEntries([doc], glossary, req.t);\n\n if (validation !== true) throw new APIError(validation, 400, undefined, true);\n const source = doc[glossary.sourceLocale].trim();\n\n for (const dictionary of dictionaries) {\n const target = doc[dictionary.locale]?.trim();\n\n if (!target) continue;\n bytes += Buffer.byteLength(`${source}\\t${target}\\n`, 'utf8');\n if (bytes > 10 * 1024 * 1024)\n throw new APIError(translatorT(req.t, 'glossary_tooLarge'), 400, undefined, true);\n dictionary.entries.add(source, target);\n }\n };\n\n if (entry) {\n add(entry);\n for (const dictionary of dictionaries) {\n if (Object.keys(dictionary.entries.entries()).length) {\n await client.updateMultilingualGlossaryDictionary(glossaryId, dictionary);\n }\n }\n\n return;\n }\n\n for (let page = 1; ; page++) {\n const result = await req.payload.find({\n collection: getGlossaryEntriesSlug(glossary) as CollectionSlug,\n depth: 0,\n limit: 1000,\n overrideAccess: false,\n page,\n req,\n select: Object.fromEntries(\n [glossary.sourceLocale, ...glossary.targetLocales].map((locale) => [locale, true]),\n ),\n sort: 'sourceKey',\n });\n\n for (const doc of result.docs) add(doc as unknown as Record<string, string>);\n if (!result.hasNextPage) break;\n }\n\n const remote = await client.getMultilingualGlossary(glossaryId);\n\n for (const dictionary of dictionaries) {\n if (Object.keys(dictionary.entries.entries()).length) {\n await client.replaceMultilingualGlossaryDictionary(glossaryId, dictionary);\n } else if (\n remote.dictionaries.some(\n (item) =>\n language(item.sourceLangCode) === sourceLangCode &&\n language(item.targetLangCode) === dictionary.targetLangCode,\n )\n ) {\n await client.deleteMultilingualGlossaryDictionary(\n glossaryId,\n sourceLangCode,\n dictionary.targetLangCode,\n );\n }\n }\n};\n"],"names":["GlossaryEntries","APIError","validateGlossaryEntries","getGlossaryEntriesSlug","translatorT","language","locale","toLowerCase","split","requireAccess","glossary","req","write","access","read","update","t","undefined","getDeepLGlossaryId","options","glossaryId","targetLocale","result","payload","find","collection","depth","limit","overrideAccess","select","where","and","exists","not_equals","docs","length","syncDeepLGlossary","client","entry","sourceLangCode","sourceLocaleMap","sourceLocale","dictionaries","targetLocales","map","entries","targetLangCode","targetLocaleMap","Set","item","size","bytes","add","doc","validation","source","trim","dictionary","target","Buffer","byteLength","Object","keys","updateMultilingualGlossaryDictionary","page","fromEntries","sort","hasNextPage","remote","getMultilingualGlossary","replaceMultilingualGlossaryDictionary","some","deleteMultilingualGlossaryDictionary"],"mappings":"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"}
|
|
@@ -14,6 +14,9 @@ export type TranslateResolverResponse = {
|
|
|
14
14
|
translatedTexts: string[];
|
|
15
15
|
};
|
|
16
16
|
export type TranslateResolver = {
|
|
17
|
+
glossary?: {
|
|
18
|
+
sync: (req: PayloadRequest, entry?: Record<string, string>) => Promise<void>;
|
|
19
|
+
};
|
|
17
20
|
key: string;
|
|
18
21
|
resolve: (args: TranslateResolverArgs) => Promise<TranslateResolverResponse> | TranslateResolverResponse;
|
|
19
22
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/resolvers/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C,MAAM,MAAM,qBAAqB,GAAG;IAClC,+BAA+B;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,6BAA6B;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,cAAc,CAAC;IACpB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,yBAAyB,GACjC;IACE,OAAO,EAAE,KAAK,CAAC;CAChB,GACD;IACE,OAAO,EAAE,IAAI,CAAC;IACd,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B,CAAC;AAEN,MAAM,MAAM,iBAAiB,GAAG;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,CACP,IAAI,EAAE,qBAAqB,KACxB,OAAO,CAAC,yBAAyB,CAAC,GAAG,yBAAyB,CAAC;CACrE,CAAC"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/resolvers/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C,MAAM,MAAM,qBAAqB,GAAG;IAClC,+BAA+B;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,6BAA6B;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,cAAc,CAAC;IACpB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,yBAAyB,GACjC;IACE,OAAO,EAAE,KAAK,CAAC;CAChB,GACD;IACE,OAAO,EAAE,IAAI,CAAC;IACd,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B,CAAC;AAEN,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,CAAC,EAAE;QACT,IAAI,EAAE,CAAC,GAAG,EAAE,cAAc,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;KAC9E,CAAC;IACF,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,CACP,IAAI,EAAE,qBAAqB,KACxB,OAAO,CAAC,yBAAyB,CAAC,GAAG,yBAAyB,CAAC;CACrE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/resolvers/types.ts"],"sourcesContent":["import type { PayloadRequest } from 'payload';\n\nexport type TranslateResolverArgs = {\n /** Locale to translate from */\n localeFrom: string;\n /** Locale to translate to */\n localeTo: string;\n req: PayloadRequest;\n texts: string[];\n};\n\nexport type TranslateResolverResponse =\n | {\n success: false;\n }\n | {\n success: true;\n translatedTexts: string[];\n };\n\nexport type TranslateResolver = {\n key: string;\n resolve: (\n args: TranslateResolverArgs,\n ) => Promise<TranslateResolverResponse> | TranslateResolverResponse;\n};\n"],"names":[],"mappings":"AAoBA,
|
|
1
|
+
{"version":3,"sources":["../../src/resolvers/types.ts"],"sourcesContent":["import type { PayloadRequest } from 'payload';\n\nexport type TranslateResolverArgs = {\n /** Locale to translate from */\n localeFrom: string;\n /** Locale to translate to */\n localeTo: string;\n req: PayloadRequest;\n texts: string[];\n};\n\nexport type TranslateResolverResponse =\n | {\n success: false;\n }\n | {\n success: true;\n translatedTexts: string[];\n };\n\nexport type TranslateResolver = {\n glossary?: {\n sync: (req: PayloadRequest, entry?: Record<string, string>) => Promise<void>;\n };\n key: string;\n resolve: (\n args: TranslateResolverArgs,\n ) => Promise<TranslateResolverResponse> | TranslateResolverResponse;\n};\n"],"names":[],"mappings":"AAoBA,WAQE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"endpoint.d.ts","sourceRoot":"","sources":["../../src/translate/endpoint.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"endpoint.d.ts","sourceRoot":"","sources":["../../src/translate/endpoint.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAO9C,eAAO,MAAM,iBAAiB,EAAE,cAsB/B,CAAC"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { APIError } from 'payload';
|
|
2
|
+
import { translatorT } from '../i18n-translations';
|
|
2
3
|
import { translateOperation } from './operation';
|
|
3
4
|
export const translateEndpoint = async (req)=>{
|
|
4
|
-
if (!req.json) throw new APIError(
|
|
5
|
+
if (!req.json) throw new APIError(translatorT(req.t, 'error_jsonRequired'));
|
|
5
6
|
const args = await req.json();
|
|
6
7
|
const { collectionSlug, data, emptyOnly, globalSlug, id, locale, localeFrom, resolver } = args;
|
|
7
8
|
const result = await translateOperation({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/translate/endpoint.ts"],"sourcesContent":["import type { PayloadHandler } from 'payload';\nimport { APIError } from 'payload';\n\nimport { translateOperation } from './operation';\nimport type { TranslateEndpointArgs } from './types';\n\nexport const translateEndpoint: PayloadHandler = async (req) => {\n if (!req.json) throw new APIError(
|
|
1
|
+
{"version":3,"sources":["../../src/translate/endpoint.ts"],"sourcesContent":["import type { PayloadHandler } from 'payload';\nimport { APIError } from 'payload';\n\nimport { translatorT } from '../i18n-translations';\nimport { translateOperation } from './operation';\nimport type { TranslateEndpointArgs } from './types';\n\nexport const translateEndpoint: PayloadHandler = async (req) => {\n if (!req.json) throw new APIError(translatorT(req.t, 'error_jsonRequired'));\n\n const args: TranslateEndpointArgs = await req.json();\n\n const { collectionSlug, data, emptyOnly, globalSlug, id, locale, localeFrom, resolver } = args;\n\n const result = await translateOperation({\n collectionSlug,\n data,\n emptyOnly,\n globalSlug,\n id,\n locale,\n localeFrom,\n overrideAccess: false,\n req,\n resolver,\n update: false,\n });\n\n return Response.json(result);\n};\n"],"names":["APIError","translatorT","translateOperation","translateEndpoint","req","json","t","args","collectionSlug","data","emptyOnly","globalSlug","id","locale","localeFrom","resolver","result","overrideAccess","update","Response"],"mappings":"AACA,SAASA,QAAQ,QAAQ,UAAU;AAEnC,SAASC,WAAW,QAAQ,uBAAuB;AACnD,SAASC,kBAAkB,QAAQ,cAAc;AAGjD,OAAO,MAAMC,oBAAoC,OAAOC;IACtD,IAAI,CAACA,IAAIC,IAAI,EAAE,MAAM,IAAIL,SAASC,YAAYG,IAAIE,CAAC,EAAE;IAErD,MAAMC,OAA8B,MAAMH,IAAIC,IAAI;IAElD,MAAM,EAAEG,cAAc,EAAEC,IAAI,EAAEC,SAAS,EAAEC,UAAU,EAAEC,EAAE,EAAEC,MAAM,EAAEC,UAAU,EAAEC,QAAQ,EAAE,GAAGR;IAE1F,MAAMS,SAAS,MAAMd,mBAAmB;QACtCM;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAG,gBAAgB;QAChBb;QACAW;QACAG,QAAQ;IACV;IAEA,OAAOC,SAASd,IAAI,CAACW;AACvB,EAAE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"findEntityWithConfig.d.ts","sourceRoot":"","sources":["../../src/translate/findEntityWithConfig.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"findEntityWithConfig.d.ts","sourceRoot":"","sources":["../../src/translate/findEntityWithConfig.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAGV,cAAc,EACd,yBAAyB,EACzB,qBAAqB,EACrB,UAAU,EACX,MAAM,SAAS,CAAC;AAGjB,KAAK,IAAI,GAAG;IACV,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,GAAG,EAAE,cAAc,CAAC;CACrB,CAAC;AAOF,eAAO,MAAM,oBAAoB,SACzB,IAAI,KACT,OAAO,CAAC;IACT,MAAM,EAAE,yBAAyB,GAAG,qBAAqB,CAAC;IAC1D,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,UAAU,CAAC;CAC3C,CA4CA,CAAC"}
|
|
@@ -1,14 +1,15 @@
|
|
|
1
|
+
import { translatorT } from '../i18n-translations';
|
|
1
2
|
import { APIError } from 'payload';
|
|
2
3
|
const findConfigBySlug = (slug, enities)=>enities.find((entity)=>entity.slug === slug);
|
|
3
4
|
export const findEntityWithConfig = async (args)=>{
|
|
4
5
|
const { collectionSlug, globalSlug, id, locale, overrideAccess, req } = args;
|
|
5
|
-
if (!collectionSlug && !globalSlug) throw new APIError(
|
|
6
|
+
if (!collectionSlug && !globalSlug) throw new APIError(translatorT(req.t, 'error_badRequest'), 400);
|
|
6
7
|
const { payload } = req;
|
|
7
8
|
const { config } = payload;
|
|
8
9
|
const isGlobal = !!globalSlug;
|
|
9
|
-
if (!isGlobal && !id) throw new APIError(
|
|
10
|
+
if (!isGlobal && !id) throw new APIError(translatorT(req.t, 'error_badRequest'), 400);
|
|
10
11
|
const entityConfig = isGlobal ? findConfigBySlug(globalSlug, config.globals) : findConfigBySlug(collectionSlug, config.collections);
|
|
11
|
-
if (!entityConfig) throw new APIError(
|
|
12
|
+
if (!entityConfig) throw new APIError(translatorT(req.t, 'error_badRequest'), 400);
|
|
12
13
|
const docPromise = isGlobal ? payload.findGlobal({
|
|
13
14
|
depth: 0,
|
|
14
15
|
fallbackLocale: undefined,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/translate/findEntityWithConfig.ts"],"sourcesContent":["import type {\n CollectionSlug,\n GlobalSlug,\n PayloadRequest,\n SanitizedCollectionConfig,\n SanitizedGlobalConfig,\n TypeWithID,\n} from 'payload';\nimport { APIError } from 'payload';\n\ntype Args = {\n collectionSlug?: string;\n globalSlug?: string;\n id?: number | string;\n locale: string;\n overrideAccess?: boolean;\n req: PayloadRequest;\n};\n\nconst findConfigBySlug = (\n slug: string,\n enities: SanitizedCollectionConfig[] | SanitizedGlobalConfig[],\n) => enities.find((entity) => entity.slug === slug);\n\nexport const findEntityWithConfig = async (\n args: Args,\n): Promise<{\n config: SanitizedCollectionConfig | SanitizedGlobalConfig;\n doc: Record<string, unknown> & TypeWithID;\n}> => {\n const { collectionSlug, globalSlug, id, locale, overrideAccess, req } = args;\n\n if (!collectionSlug && !globalSlug)
|
|
1
|
+
{"version":3,"sources":["../../src/translate/findEntityWithConfig.ts"],"sourcesContent":["import { translatorT } from '../i18n-translations';\nimport type {\n CollectionSlug,\n GlobalSlug,\n PayloadRequest,\n SanitizedCollectionConfig,\n SanitizedGlobalConfig,\n TypeWithID,\n} from 'payload';\nimport { APIError } from 'payload';\n\ntype Args = {\n collectionSlug?: string;\n globalSlug?: string;\n id?: number | string;\n locale: string;\n overrideAccess?: boolean;\n req: PayloadRequest;\n};\n\nconst findConfigBySlug = (\n slug: string,\n enities: SanitizedCollectionConfig[] | SanitizedGlobalConfig[],\n) => enities.find((entity) => entity.slug === slug);\n\nexport const findEntityWithConfig = async (\n args: Args,\n): Promise<{\n config: SanitizedCollectionConfig | SanitizedGlobalConfig;\n doc: Record<string, unknown> & TypeWithID;\n}> => {\n const { collectionSlug, globalSlug, id, locale, overrideAccess, req } = args;\n\n if (!collectionSlug && !globalSlug)\n throw new APIError(translatorT(req.t, 'error_badRequest'), 400);\n\n const { payload } = req;\n\n const { config } = payload;\n\n const isGlobal = !!globalSlug;\n\n if (!isGlobal && !id) throw new APIError(translatorT(req.t, 'error_badRequest'), 400);\n\n const entityConfig = isGlobal\n ? findConfigBySlug(globalSlug, config.globals)\n : findConfigBySlug(collectionSlug as string, config.collections);\n\n if (!entityConfig) throw new APIError(translatorT(req.t, 'error_badRequest'), 400);\n\n const docPromise = isGlobal\n ? payload.findGlobal({\n depth: 0,\n fallbackLocale: undefined,\n locale: locale as any,\n overrideAccess,\n req,\n slug: args.globalSlug as GlobalSlug,\n })\n : payload.findByID({\n collection: collectionSlug as CollectionSlug,\n depth: 0,\n fallbackLocale: undefined,\n id: id as number | string,\n locale: locale as any,\n overrideAccess,\n req,\n draft: true,\n });\n\n return {\n config: entityConfig,\n doc: (await docPromise) as any,\n };\n};\n"],"names":["translatorT","APIError","findConfigBySlug","slug","enities","find","entity","findEntityWithConfig","args","collectionSlug","globalSlug","id","locale","overrideAccess","req","t","payload","config","isGlobal","entityConfig","globals","collections","docPromise","findGlobal","depth","fallbackLocale","undefined","findByID","collection","draft","doc"],"mappings":"AAAA,SAASA,WAAW,QAAQ,uBAAuB;AASnD,SAASC,QAAQ,QAAQ,UAAU;AAWnC,MAAMC,mBAAmB,CACvBC,MACAC,UACGA,QAAQC,IAAI,CAAC,CAACC,SAAWA,OAAOH,IAAI,KAAKA;AAE9C,OAAO,MAAMI,uBAAuB,OAClCC;IAKA,MAAM,EAAEC,cAAc,EAAEC,UAAU,EAAEC,EAAE,EAAEC,MAAM,EAAEC,cAAc,EAAEC,GAAG,EAAE,GAAGN;IAExE,IAAI,CAACC,kBAAkB,CAACC,YACtB,MAAM,IAAIT,SAASD,YAAYc,IAAIC,CAAC,EAAE,qBAAqB;IAE7D,MAAM,EAAEC,OAAO,EAAE,GAAGF;IAEpB,MAAM,EAAEG,MAAM,EAAE,GAAGD;IAEnB,MAAME,WAAW,CAAC,CAACR;IAEnB,IAAI,CAACQ,YAAY,CAACP,IAAI,MAAM,IAAIV,SAASD,YAAYc,IAAIC,CAAC,EAAE,qBAAqB;IAEjF,MAAMI,eAAeD,WACjBhB,iBAAiBQ,YAAYO,OAAOG,OAAO,IAC3ClB,iBAAiBO,gBAA0BQ,OAAOI,WAAW;IAEjE,IAAI,CAACF,cAAc,MAAM,IAAIlB,SAASD,YAAYc,IAAIC,CAAC,EAAE,qBAAqB;IAE9E,MAAMO,aAAaJ,WACfF,QAAQO,UAAU,CAAC;QACjBC,OAAO;QACPC,gBAAgBC;QAChBd,QAAQA;QACRC;QACAC;QACAX,MAAMK,KAAKE,UAAU;IACvB,KACAM,QAAQW,QAAQ,CAAC;QACfC,YAAYnB;QACZe,OAAO;QACPC,gBAAgBC;QAChBf,IAAIA;QACJC,QAAQA;QACRC;QACAC;QACAe,OAAO;IACT;IAEJ,OAAO;QACLZ,QAAQE;QACRW,KAAM,MAAMR;IACd;AACF,EAAE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"operation.d.ts","sourceRoot":"","sources":["../../src/translate/operation.ts"],"names":[],"mappings":"AACA,OAAO,EAAY,KAAK,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"operation.d.ts","sourceRoot":"","sources":["../../src/translate/operation.ts"],"names":[],"mappings":"AACA,OAAO,EAAY,KAAK,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,SAAS,CAAC;AAMtE,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAoB,MAAM,SAAS,CAAC;AAGhF,MAAM,MAAM,sBAAsB,GAAG,CACjC;IACE,OAAO,EAAE,OAAO,CAAC;CAClB,GACD;IACE,GAAG,EAAE,cAAc,CAAC;CACrB,CACJ,GACC,aAAa,CAAC;AAEhB,eAAO,MAAM,kBAAkB,SAAgB,sBAAsB,6BA0FpE,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import he from 'he';
|
|
2
2
|
import { APIError } from 'payload';
|
|
3
|
+
import { translatorT } from '../i18n-translations';
|
|
3
4
|
import { findEntityWithConfig } from './findEntityWithConfig';
|
|
4
5
|
import { traverseFields } from './traverseFields';
|
|
5
6
|
import { updateEntity } from './updateEntity';
|
|
@@ -16,7 +17,9 @@ export const translateOperation = async (args)=>{
|
|
|
16
17
|
req
|
|
17
18
|
});
|
|
18
19
|
const resolver = (req.payload.config.custom?.translator?.resolvers ?? []).find((each)=>each.key === args.resolver);
|
|
19
|
-
if (!resolver) throw new APIError(
|
|
20
|
+
if (!resolver) throw new APIError(translatorT(req.t, 'error_missingResolver', {
|
|
21
|
+
resolver: args.resolver
|
|
22
|
+
}));
|
|
20
23
|
const valuesToTranslate = [];
|
|
21
24
|
let translatedData = args.data;
|
|
22
25
|
if (!translatedData) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/translate/operation.ts"],"sourcesContent":["import he from 'he';\nimport { APIError, type Payload, type PayloadRequest } from 'payload';\n\nimport type { TranslateResolver } from '../resolvers/types';\nimport { findEntityWithConfig } from './findEntityWithConfig';\nimport { traverseFields } from './traverseFields';\nimport type { TranslateArgs, TranslateResult, ValueToTranslate } from './types';\nimport { updateEntity } from './updateEntity';\n\nexport type TranslateOperationArgs = (\n | {\n payload: Payload;\n }\n | {\n req: PayloadRequest;\n }\n) &\n TranslateArgs;\n\nexport const translateOperation = async (args: TranslateOperationArgs) => {\n const req: PayloadRequest =\n 'req' in args\n ? args.req\n : ({\n payload: args.payload,\n } as PayloadRequest);\n\n const { collectionSlug, globalSlug, id, locale, localeFrom, overrideAccess } = args;\n\n const { config, doc: dataFrom } = await findEntityWithConfig({\n collectionSlug,\n globalSlug,\n id,\n locale: localeFrom,\n req,\n });\n\n const resolver = (\n (req.payload.config.custom?.translator?.resolvers as TranslateResolver[]) ?? []\n ).find((each) => each.key === args.resolver);\n\n if (!resolver)
|
|
1
|
+
{"version":3,"sources":["../../src/translate/operation.ts"],"sourcesContent":["import he from 'he';\nimport { APIError, type Payload, type PayloadRequest } from 'payload';\n\nimport { translatorT } from '../i18n-translations';\nimport type { TranslateResolver } from '../resolvers/types';\nimport { findEntityWithConfig } from './findEntityWithConfig';\nimport { traverseFields } from './traverseFields';\nimport type { TranslateArgs, TranslateResult, ValueToTranslate } from './types';\nimport { updateEntity } from './updateEntity';\n\nexport type TranslateOperationArgs = (\n | {\n payload: Payload;\n }\n | {\n req: PayloadRequest;\n }\n) &\n TranslateArgs;\n\nexport const translateOperation = async (args: TranslateOperationArgs) => {\n const req: PayloadRequest =\n 'req' in args\n ? args.req\n : ({\n payload: args.payload,\n } as PayloadRequest);\n\n const { collectionSlug, globalSlug, id, locale, localeFrom, overrideAccess } = args;\n\n const { config, doc: dataFrom } = await findEntityWithConfig({\n collectionSlug,\n globalSlug,\n id,\n locale: localeFrom,\n req,\n });\n\n const resolver = (\n (req.payload.config.custom?.translator?.resolvers as TranslateResolver[]) ?? []\n ).find((each) => each.key === args.resolver);\n\n if (!resolver)\n throw new APIError(translatorT(req.t, 'error_missingResolver', { resolver: args.resolver }));\n\n const valuesToTranslate: ValueToTranslate[] = [];\n\n let translatedData = args.data;\n\n if (!translatedData) {\n const { doc } = await findEntityWithConfig({\n collectionSlug,\n globalSlug,\n id,\n locale,\n overrideAccess,\n req,\n });\n\n translatedData = doc;\n }\n\n traverseFields({\n dataFrom,\n emptyOnly: args.emptyOnly,\n fields: config.fields,\n translatedData,\n valuesToTranslate,\n });\n\n const resolveResult = await resolver.resolve({\n localeFrom: args.localeFrom,\n localeTo: args.locale,\n req,\n texts: valuesToTranslate.map((each) => each.value),\n });\n\n let result: TranslateResult;\n\n if (!resolveResult.success) {\n result = {\n success: false,\n };\n } else {\n resolveResult.translatedTexts.forEach((translated, index) => {\n const formattedValue = he.decode(translated);\n\n valuesToTranslate[index].onTranslate(formattedValue);\n });\n\n if (args.update) {\n await updateEntity({\n collectionSlug,\n data: translatedData,\n depth: 0,\n globalSlug,\n id,\n locale,\n overrideAccess,\n req,\n });\n }\n\n result = {\n success: true,\n translatedData,\n };\n }\n\n return result;\n};\n"],"names":["he","APIError","translatorT","findEntityWithConfig","traverseFields","updateEntity","translateOperation","args","req","payload","collectionSlug","globalSlug","id","locale","localeFrom","overrideAccess","config","doc","dataFrom","resolver","custom","translator","resolvers","find","each","key","t","valuesToTranslate","translatedData","data","emptyOnly","fields","resolveResult","resolve","localeTo","texts","map","value","result","success","translatedTexts","forEach","translated","index","formattedValue","decode","onTranslate","update","depth"],"mappings":"AAAA,OAAOA,QAAQ,KAAK;AACpB,SAASC,QAAQ,QAA2C,UAAU;AAEtE,SAASC,WAAW,QAAQ,uBAAuB;AAEnD,SAASC,oBAAoB,QAAQ,yBAAyB;AAC9D,SAASC,cAAc,QAAQ,mBAAmB;AAElD,SAASC,YAAY,QAAQ,iBAAiB;AAY9C,OAAO,MAAMC,qBAAqB,OAAOC;IACvC,MAAMC,MACJ,SAASD,OACLA,KAAKC,GAAG,GACP;QACCC,SAASF,KAAKE,OAAO;IACvB;IAEN,MAAM,EAAEC,cAAc,EAAEC,UAAU,EAAEC,EAAE,EAAEC,MAAM,EAAEC,UAAU,EAAEC,cAAc,EAAE,GAAGR;IAE/E,MAAM,EAAES,MAAM,EAAEC,KAAKC,QAAQ,EAAE,GAAG,MAAMf,qBAAqB;QAC3DO;QACAC;QACAC;QACAC,QAAQC;QACRN;IACF;IAEA,MAAMW,WAAW,AACf,CAAA,AAACX,IAAIC,OAAO,CAACO,MAAM,CAACI,MAAM,EAAEC,YAAYC,aAAqC,EAAE,AAAD,EAC9EC,IAAI,CAAC,CAACC,OAASA,KAAKC,GAAG,KAAKlB,KAAKY,QAAQ;IAE3C,IAAI,CAACA,UACH,MAAM,IAAIlB,SAASC,YAAYM,IAAIkB,CAAC,EAAE,yBAAyB;QAAEP,UAAUZ,KAAKY,QAAQ;IAAC;IAE3F,MAAMQ,oBAAwC,EAAE;IAEhD,IAAIC,iBAAiBrB,KAAKsB,IAAI;IAE9B,IAAI,CAACD,gBAAgB;QACnB,MAAM,EAAEX,GAAG,EAAE,GAAG,MAAMd,qBAAqB;YACzCO;YACAC;YACAC;YACAC;YACAE;YACAP;QACF;QAEAoB,iBAAiBX;IACnB;IAEAb,eAAe;QACbc;QACAY,WAAWvB,KAAKuB,SAAS;QACzBC,QAAQf,OAAOe,MAAM;QACrBH;QACAD;IACF;IAEA,MAAMK,gBAAgB,MAAMb,SAASc,OAAO,CAAC;QAC3CnB,YAAYP,KAAKO,UAAU;QAC3BoB,UAAU3B,KAAKM,MAAM;QACrBL;QACA2B,OAAOR,kBAAkBS,GAAG,CAAC,CAACZ,OAASA,KAAKa,KAAK;IACnD;IAEA,IAAIC;IAEJ,IAAI,CAACN,cAAcO,OAAO,EAAE;QAC1BD,SAAS;YACPC,SAAS;QACX;IACF,OAAO;QACLP,cAAcQ,eAAe,CAACC,OAAO,CAAC,CAACC,YAAYC;YACjD,MAAMC,iBAAiB5C,GAAG6C,MAAM,CAACH;YAEjCf,iBAAiB,CAACgB,MAAM,CAACG,WAAW,CAACF;QACvC;QAEA,IAAIrC,KAAKwC,MAAM,EAAE;YACf,MAAM1C,aAAa;gBACjBK;gBACAmB,MAAMD;gBACNoB,OAAO;gBACPrC;gBACAC;gBACAC;gBACAE;gBACAP;YACF;QACF;QAEA8B,SAAS;YACPC,SAAS;YACTX;QACF;IACF;IAEA,OAAOU;AACT,EAAE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"traverseFields.d.ts","sourceRoot":"","sources":["../../src/translate/traverseFields.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAKrC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAEhD,eAAO,MAAM,cAAc,iIASxB;IACD,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,qBAAqB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChD,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,iBAAiB,EAAE,gBAAgB,EAAE,CAAC;CACvC,
|
|
1
|
+
{"version":3,"file":"traverseFields.d.ts","sourceRoot":"","sources":["../../src/translate/traverseFields.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAKrC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAEhD,eAAO,MAAM,cAAc,iIASxB;IACD,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,qBAAqB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChD,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,iBAAiB,EAAE,gBAAgB,EAAE,CAAC;CACvC,SA8SA,CAAC"}
|
|
@@ -27,6 +27,19 @@ export const traverseFields = ({ dataFrom, emptyOnly, fields, localizedParent, s
|
|
|
27
27
|
break;
|
|
28
28
|
case 'group':
|
|
29
29
|
{
|
|
30
|
+
if (!('name' in field)) {
|
|
31
|
+
traverseFields({
|
|
32
|
+
dataFrom,
|
|
33
|
+
emptyOnly,
|
|
34
|
+
fields: field.fields,
|
|
35
|
+
localizedParent,
|
|
36
|
+
siblingDataFrom,
|
|
37
|
+
siblingDataTranslated,
|
|
38
|
+
translatedData,
|
|
39
|
+
valuesToTranslate
|
|
40
|
+
});
|
|
41
|
+
break;
|
|
42
|
+
}
|
|
30
43
|
const groupDataFrom = siblingDataFrom[field.name];
|
|
31
44
|
if (!groupDataFrom) break;
|
|
32
45
|
let groupDataTranslated = siblingDataTranslated[field.name];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/translate/traverseFields.ts"],"sourcesContent":["import ObjectID from 'bson-objectid';\nimport type { Field } from 'payload';\nimport { tabHasName } from 'payload/shared';\n\nimport { isEmpty } from '../utils/isEmpty';\nimport { traverseRichText } from './traverseRichText';\nimport type { ValueToTranslate } from './types';\n\nexport const traverseFields = ({\n dataFrom,\n emptyOnly,\n fields,\n localizedParent,\n siblingDataFrom,\n siblingDataTranslated,\n translatedData,\n valuesToTranslate,\n}: {\n dataFrom: Record<string, unknown>;\n emptyOnly?: boolean;\n fields: Field[];\n localizedParent?: boolean;\n siblingDataFrom?: Record<string, unknown>;\n siblingDataTranslated?: Record<string, unknown>;\n translatedData: Record<string, unknown>;\n valuesToTranslate: ValueToTranslate[];\n}) => {\n siblingDataFrom = siblingDataFrom ?? dataFrom;\n siblingDataTranslated = siblingDataTranslated ?? translatedData;\n\n for (const field of fields) {\n switch (field.type) {\n case 'tabs':\n for (const tab of field.tabs) {\n const hasName = tabHasName(tab);\n\n const tabDataFrom = hasName\n ? (siblingDataFrom[tab.name] as Record<string, unknown>)\n : siblingDataFrom;\n\n if (!tabDataFrom) return;\n\n const tabDataTranslated = hasName\n ? ((siblingDataTranslated[tab.name] as Record<string, unknown>) ?? {})\n : siblingDataTranslated;\n\n traverseFields({\n dataFrom,\n emptyOnly,\n fields: tab.fields,\n localizedParent: tab.localized,\n siblingDataFrom: tabDataFrom,\n siblingDataTranslated: tabDataTranslated,\n translatedData,\n valuesToTranslate,\n });\n }\n\n break;\n\n case 'group': {\n const groupDataFrom = siblingDataFrom[field.name] as Record<string, unknown>;\n\n if (!groupDataFrom) break;\n\n let groupDataTranslated =\n (siblingDataTranslated[field.name] as Record<string, unknown>);\n\n if (!groupDataTranslated) {\n groupDataTranslated = {id: ObjectID().toHexString()};\n siblingDataTranslated[field.name] = groupDataTranslated;\n }\n traverseFields({\n dataFrom,\n emptyOnly,\n fields: field.fields,\n localizedParent: localizedParent ?? field.localized,\n siblingDataFrom: groupDataFrom,\n siblingDataTranslated: groupDataTranslated,\n translatedData,\n valuesToTranslate,\n });\n\n break;\n }\n\n case 'array': {\n const arrayDataFrom = siblingDataFrom[field.name] as {\n id: string;\n }[];\n\n if (isEmpty(arrayDataFrom)) break;\n\n let arrayDataTranslated =\n (siblingDataTranslated[field.name] as { id: string }[] | undefined) ?? [];\n\n if (field.localized || localizedParent) {\n if (arrayDataTranslated.length > 0 && emptyOnly) break;\n\n arrayDataTranslated = arrayDataFrom.map(() => ({\n id: ObjectID().toHexString(),\n }));\n }\n\n if (!Array.isArray(arrayDataTranslated)) {\n break;\n }\n arrayDataTranslated.forEach((item, index) => {\n traverseFields({\n dataFrom,\n emptyOnly,\n fields: field.fields,\n localizedParent: localizedParent ?? field.localized,\n siblingDataFrom: arrayDataFrom[index],\n siblingDataTranslated: item,\n translatedData,\n valuesToTranslate,\n });\n });\n\n siblingDataTranslated[field.name] = arrayDataTranslated;\n\n break;\n }\n\n case 'blocks': {\n const blocksDataFrom = siblingDataFrom[field.name] as {\n blockType: string;\n id: string;\n }[];\n\n if (isEmpty(blocksDataFrom)) break;\n\n let blocksDataTranslated =\n (siblingDataTranslated[field.name] as { blockType: string; id: string }[] | undefined) ??\n [];\n\n if (field.localized || localizedParent) {\n if (blocksDataTranslated.length > 0 && emptyOnly) break;\n\n blocksDataTranslated = blocksDataFrom.map(({ blockType }) => ({\n blockType,\n id: ObjectID().toHexString(),\n }));\n }\n\n blocksDataTranslated.forEach((item, index) => {\n const block = field.blocks.find((each: Record<string, unknown>) => each.slug === item.blockType);\n\n if (!block) return;\n\n traverseFields({\n dataFrom,\n emptyOnly,\n fields: block.fields,\n localizedParent: localizedParent ?? field.localized,\n siblingDataFrom: blocksDataFrom[index],\n siblingDataTranslated: item,\n translatedData,\n valuesToTranslate,\n });\n });\n\n siblingDataTranslated[field.name] = blocksDataTranslated;\n\n break;\n }\n\n case 'collapsible':\n case 'row':\n traverseFields({\n dataFrom,\n emptyOnly,\n fields: field.fields,\n localizedParent,\n siblingDataFrom,\n siblingDataTranslated,\n translatedData,\n valuesToTranslate,\n });\n break;\n\n // long ass cases here we have\n case 'date':\n case 'checkbox':\n case 'json':\n case 'code':\n case 'email':\n case 'number':\n case 'point':\n case 'radio':\n case 'relationship':\n case 'select':\n case 'upload':\n siblingDataTranslated[field.name] = siblingDataFrom[field.name];\n\n break;\n\n case 'text':\n case 'textarea':\n if (field.custom && typeof field.custom === 'object' && field.custom.translatorSkip) break;\n\n if (!(field.localized || localizedParent) || isEmpty(siblingDataFrom[field.name])) break;\n if (emptyOnly && siblingDataTranslated[field.name]) break;\n\n // do not translate the block ID or admin-facing label\n if (field.name === 'id') {\n break;\n }\n\n valuesToTranslate.push({\n onTranslate: (translated: string) => {\n siblingDataTranslated[field.name] = translated;\n },\n value: siblingDataFrom[field.name],\n });\n break;\n\n case 'richText': {\n if (!(field.localized || localizedParent) || isEmpty(siblingDataFrom[field.name])) break;\n if (emptyOnly && siblingDataTranslated[field.name]) break;\n\n const richTextDataFrom = siblingDataFrom[field.name] as object;\n\n siblingDataTranslated[field.name] = richTextDataFrom;\n\n if (!richTextDataFrom) break;\n\n const isSlate = Array.isArray(richTextDataFrom);\n\n const isLexical = 'root' in richTextDataFrom;\n\n if (!isSlate && !isLexical) break;\n\n if (isLexical) {\n const root = (siblingDataTranslated[field.name] as Record<string, unknown>)\n ?.root as Record<string, unknown>;\n\n if (root) {\n traverseRichText({\n onText: (siblingData)=>{\n valuesToTranslate.push({\n onTranslate: (translated: string)=>{\n siblingData.text = translated;\n },\n value: siblingData.text\n });\n },\n root\n });\n\n const richTextBlocksGetSubFields = (field.editor as any)?.editorConfig?.features?.getSubFields?.get('block');\n if (typeof richTextBlocksGetSubFields !== 'function') break;\n const richTextBlocks = richTextBlocksGetSubFields('block');\n const richTextBlockDataFrom = (richTextDataFrom.root as Record<string, unknown>)?.children;\n if (isEmpty(richTextBlockDataFrom) || !Array.isArray(richTextBlockDataFrom) || isEmpty(richTextBlocks)) break;\n let richTextBlocksDataTranslated = ((siblingDataTranslated[field.name] as Record<string, unknown>)?.root as Record<string, unknown>)?.children as Record<string, unknown>[] ?? [];\n\n if (field.localized || localizedParent) {\n if (richTextBlocksDataTranslated.length > 0 && emptyOnly) break;\n richTextBlocksDataTranslated = richTextBlockDataFrom.map((blockData)=>{\n if (blockData?.fields?.blockType) {\n return {\n ...blockData,\n fields: {\n blockType: blockData?.fields?.blockType,\n id: ObjectID().toHexString()\n }\n }\n }\n return blockData;\n });\n }\n\n richTextBlocksDataTranslated.forEach((item, index)=>{\n const block = richTextBlocks[0].blocks.find((each: Record<string, unknown>)=>each.slug && each.slug === (item.fields as Record<string, unknown>)?.blockType);\n if (!block) return;\n traverseFields({\n dataFrom,\n emptyOnly,\n fields: block.fields,\n localizedParent: localizedParent ?? field.localized,\n siblingDataFrom: richTextBlockDataFrom[index].fields,\n siblingDataTranslated: item.fields as Record<string, unknown>,\n translatedData,\n valuesToTranslate\n });\n });\n ((siblingDataTranslated[field.name] as Record<string, unknown>).root as Record<string, unknown>).children = richTextBlocksDataTranslated;\n }\n } else {\n for (const root of siblingDataTranslated[field.name] as unknown[]) {\n traverseRichText({\n onText: (siblingData) => {\n valuesToTranslate.push({\n onTranslate: (translated: string) => {\n siblingData.text = translated;\n },\n value: siblingData.text,\n });\n },\n root: root as Record<string, unknown>,\n });\n }\n }\n\n break;\n }\n\n default:\n break;\n }\n }\n};\n"],"names":["ObjectID","tabHasName","isEmpty","traverseRichText","traverseFields","dataFrom","emptyOnly","fields","localizedParent","siblingDataFrom","siblingDataTranslated","translatedData","valuesToTranslate","field","type","tab","tabs","hasName","tabDataFrom","name","tabDataTranslated","localized","groupDataFrom","groupDataTranslated","id","toHexString","arrayDataFrom","arrayDataTranslated","length","map","Array","isArray","forEach","item","index","blocksDataFrom","blocksDataTranslated","blockType","block","blocks","find","each","slug","custom","translatorSkip","push","onTranslate","translated","value","richTextDataFrom","isSlate","isLexical","root","onText","siblingData","text","richTextBlocksGetSubFields","editor","editorConfig","features","getSubFields","get","richTextBlocks","richTextBlockDataFrom","children","richTextBlocksDataTranslated","blockData"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/translate/traverseFields.ts"],"sourcesContent":["import ObjectID from 'bson-objectid';\nimport type { Field } from 'payload';\nimport { tabHasName } from 'payload/shared';\n\nimport { isEmpty } from '../utils/isEmpty';\nimport { traverseRichText } from './traverseRichText';\nimport type { ValueToTranslate } from './types';\n\nexport const traverseFields = ({\n dataFrom,\n emptyOnly,\n fields,\n localizedParent,\n siblingDataFrom,\n siblingDataTranslated,\n translatedData,\n valuesToTranslate,\n}: {\n dataFrom: Record<string, unknown>;\n emptyOnly?: boolean;\n fields: Field[];\n localizedParent?: boolean;\n siblingDataFrom?: Record<string, unknown>;\n siblingDataTranslated?: Record<string, unknown>;\n translatedData: Record<string, unknown>;\n valuesToTranslate: ValueToTranslate[];\n}) => {\n siblingDataFrom = siblingDataFrom ?? dataFrom;\n siblingDataTranslated = siblingDataTranslated ?? translatedData;\n\n for (const field of fields) {\n switch (field.type) {\n case 'tabs':\n for (const tab of field.tabs) {\n const hasName = tabHasName(tab);\n\n const tabDataFrom = hasName\n ? (siblingDataFrom[tab.name] as Record<string, unknown>)\n : siblingDataFrom;\n\n if (!tabDataFrom) return;\n\n const tabDataTranslated = hasName\n ? ((siblingDataTranslated[tab.name] as Record<string, unknown>) ?? {})\n : siblingDataTranslated;\n\n traverseFields({\n dataFrom,\n emptyOnly,\n fields: tab.fields,\n localizedParent: tab.localized,\n siblingDataFrom: tabDataFrom,\n siblingDataTranslated: tabDataTranslated,\n translatedData,\n valuesToTranslate,\n });\n }\n\n break;\n\n case 'group': {\n if (!('name' in field)) {\n traverseFields({\n dataFrom,\n emptyOnly,\n fields: field.fields,\n localizedParent,\n siblingDataFrom,\n siblingDataTranslated,\n translatedData,\n valuesToTranslate,\n });\n\n break;\n }\n\n const groupDataFrom = siblingDataFrom[field.name] as Record<string, unknown>;\n\n if (!groupDataFrom) break;\n\n let groupDataTranslated =\n (siblingDataTranslated[field.name] as Record<string, unknown>);\n\n if (!groupDataTranslated) {\n groupDataTranslated = {id: ObjectID().toHexString()};\n siblingDataTranslated[field.name] = groupDataTranslated;\n }\n traverseFields({\n dataFrom,\n emptyOnly,\n fields: field.fields,\n localizedParent: localizedParent ?? field.localized,\n siblingDataFrom: groupDataFrom,\n siblingDataTranslated: groupDataTranslated,\n translatedData,\n valuesToTranslate,\n });\n\n break;\n }\n\n case 'array': {\n const arrayDataFrom = siblingDataFrom[field.name] as {\n id: string;\n }[];\n\n if (isEmpty(arrayDataFrom)) break;\n\n let arrayDataTranslated =\n (siblingDataTranslated[field.name] as { id: string }[] | undefined) ?? [];\n\n if (field.localized || localizedParent) {\n if (arrayDataTranslated.length > 0 && emptyOnly) break;\n\n arrayDataTranslated = arrayDataFrom.map(() => ({\n id: ObjectID().toHexString(),\n }));\n }\n\n if (!Array.isArray(arrayDataTranslated)) {\n break;\n }\n arrayDataTranslated.forEach((item, index) => {\n traverseFields({\n dataFrom,\n emptyOnly,\n fields: field.fields,\n localizedParent: localizedParent ?? field.localized,\n siblingDataFrom: arrayDataFrom[index],\n siblingDataTranslated: item,\n translatedData,\n valuesToTranslate,\n });\n });\n\n siblingDataTranslated[field.name] = arrayDataTranslated;\n\n break;\n }\n\n case 'blocks': {\n const blocksDataFrom = siblingDataFrom[field.name] as {\n blockType: string;\n id: string;\n }[];\n\n if (isEmpty(blocksDataFrom)) break;\n\n let blocksDataTranslated =\n (siblingDataTranslated[field.name] as { blockType: string; id: string }[] | undefined) ??\n [];\n\n if (field.localized || localizedParent) {\n if (blocksDataTranslated.length > 0 && emptyOnly) break;\n\n blocksDataTranslated = blocksDataFrom.map(({ blockType }) => ({\n blockType,\n id: ObjectID().toHexString(),\n }));\n }\n\n blocksDataTranslated.forEach((item, index) => {\n const block = field.blocks.find((each: Record<string, unknown>) => each.slug === item.blockType);\n\n if (!block) return;\n\n traverseFields({\n dataFrom,\n emptyOnly,\n fields: block.fields,\n localizedParent: localizedParent ?? field.localized,\n siblingDataFrom: blocksDataFrom[index],\n siblingDataTranslated: item,\n translatedData,\n valuesToTranslate,\n });\n });\n\n siblingDataTranslated[field.name] = blocksDataTranslated;\n\n break;\n }\n\n case 'collapsible':\n case 'row':\n traverseFields({\n dataFrom,\n emptyOnly,\n fields: field.fields,\n localizedParent,\n siblingDataFrom,\n siblingDataTranslated,\n translatedData,\n valuesToTranslate,\n });\n break;\n\n // long ass cases here we have\n case 'date':\n case 'checkbox':\n case 'json':\n case 'code':\n case 'email':\n case 'number':\n case 'point':\n case 'radio':\n case 'relationship':\n case 'select':\n case 'upload':\n siblingDataTranslated[field.name] = siblingDataFrom[field.name];\n\n break;\n\n case 'text':\n case 'textarea':\n if (field.custom && typeof field.custom === 'object' && field.custom.translatorSkip) break;\n\n if (!(field.localized || localizedParent) || isEmpty(siblingDataFrom[field.name])) break;\n if (emptyOnly && siblingDataTranslated[field.name]) break;\n\n // do not translate the block ID or admin-facing label\n if (field.name === 'id') {\n break;\n }\n\n valuesToTranslate.push({\n onTranslate: (translated: string) => {\n siblingDataTranslated[field.name] = translated;\n },\n value: siblingDataFrom[field.name],\n });\n break;\n\n case 'richText': {\n if (!(field.localized || localizedParent) || isEmpty(siblingDataFrom[field.name])) break;\n if (emptyOnly && siblingDataTranslated[field.name]) break;\n\n const richTextDataFrom = siblingDataFrom[field.name] as object;\n\n siblingDataTranslated[field.name] = richTextDataFrom;\n\n if (!richTextDataFrom) break;\n\n const isSlate = Array.isArray(richTextDataFrom);\n\n const isLexical = 'root' in richTextDataFrom;\n\n if (!isSlate && !isLexical) break;\n\n if (isLexical) {\n const root = (siblingDataTranslated[field.name] as Record<string, unknown>)\n ?.root as Record<string, unknown>;\n\n if (root) {\n traverseRichText({\n onText: (siblingData)=>{\n valuesToTranslate.push({\n onTranslate: (translated: string)=>{\n siblingData.text = translated;\n },\n value: siblingData.text\n });\n },\n root\n });\n\n const richTextBlocksGetSubFields = (field.editor as any)?.editorConfig?.features?.getSubFields?.get('block');\n if (typeof richTextBlocksGetSubFields !== 'function') break;\n const richTextBlocks = richTextBlocksGetSubFields('block');\n const richTextBlockDataFrom = (richTextDataFrom.root as Record<string, unknown>)?.children;\n if (isEmpty(richTextBlockDataFrom) || !Array.isArray(richTextBlockDataFrom) || isEmpty(richTextBlocks)) break;\n let richTextBlocksDataTranslated = ((siblingDataTranslated[field.name] as Record<string, unknown>)?.root as Record<string, unknown>)?.children as Record<string, unknown>[] ?? [];\n\n if (field.localized || localizedParent) {\n if (richTextBlocksDataTranslated.length > 0 && emptyOnly) break;\n richTextBlocksDataTranslated = richTextBlockDataFrom.map((blockData)=>{\n if (blockData?.fields?.blockType) {\n return {\n ...blockData,\n fields: {\n blockType: blockData?.fields?.blockType,\n id: ObjectID().toHexString()\n }\n }\n }\n return blockData;\n });\n }\n\n richTextBlocksDataTranslated.forEach((item, index)=>{\n const block = richTextBlocks[0].blocks.find((each: Record<string, unknown>)=>each.slug && each.slug === (item.fields as Record<string, unknown>)?.blockType);\n if (!block) return;\n traverseFields({\n dataFrom,\n emptyOnly,\n fields: block.fields,\n localizedParent: localizedParent ?? field.localized,\n siblingDataFrom: richTextBlockDataFrom[index].fields,\n siblingDataTranslated: item.fields as Record<string, unknown>,\n translatedData,\n valuesToTranslate\n });\n });\n ((siblingDataTranslated[field.name] as Record<string, unknown>).root as Record<string, unknown>).children = richTextBlocksDataTranslated;\n }\n } else {\n for (const root of siblingDataTranslated[field.name] as unknown[]) {\n traverseRichText({\n onText: (siblingData) => {\n valuesToTranslate.push({\n onTranslate: (translated: string) => {\n siblingData.text = translated;\n },\n value: siblingData.text,\n });\n },\n root: root as Record<string, unknown>,\n });\n }\n }\n\n break;\n }\n\n default:\n break;\n }\n }\n};\n"],"names":["ObjectID","tabHasName","isEmpty","traverseRichText","traverseFields","dataFrom","emptyOnly","fields","localizedParent","siblingDataFrom","siblingDataTranslated","translatedData","valuesToTranslate","field","type","tab","tabs","hasName","tabDataFrom","name","tabDataTranslated","localized","groupDataFrom","groupDataTranslated","id","toHexString","arrayDataFrom","arrayDataTranslated","length","map","Array","isArray","forEach","item","index","blocksDataFrom","blocksDataTranslated","blockType","block","blocks","find","each","slug","custom","translatorSkip","push","onTranslate","translated","value","richTextDataFrom","isSlate","isLexical","root","onText","siblingData","text","richTextBlocksGetSubFields","editor","editorConfig","features","getSubFields","get","richTextBlocks","richTextBlockDataFrom","children","richTextBlocksDataTranslated","blockData"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"updateEntity.d.ts","sourceRoot":"","sources":["../../src/translate/updateEntity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA8B,cAAc,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"updateEntity.d.ts","sourceRoot":"","sources":["../../src/translate/updateEntity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA8B,cAAc,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAKtF,KAAK,IAAI,GAAG;IACV,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,GAAG,EAAE,cAAc,CAAC;CACrB,CAAC;AAEF,eAAO,MAAM,YAAY,iGAStB,IAAI,KAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,UAAU,CA8BrD,CAAC"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { APIError } from 'payload';
|
|
2
|
+
import { translatorT } from '../i18n-translations';
|
|
2
3
|
export const updateEntity = ({ collectionSlug, data, depth: incomingDepth, globalSlug, id, locale, overrideAccess, req })=>{
|
|
3
|
-
if (!collectionSlug && !globalSlug) throw new APIError(
|
|
4
|
+
if (!collectionSlug && !globalSlug) throw new APIError(translatorT(req.t, 'error_badRequest'), 400);
|
|
4
5
|
const isGlobal = !!globalSlug;
|
|
5
|
-
if (!isGlobal && !id) throw new APIError(
|
|
6
|
+
if (!isGlobal && !id) throw new APIError(translatorT(req.t, 'error_badRequest'), 400);
|
|
6
7
|
const depth = incomingDepth ?? req.payload.config.defaultDepth;
|
|
7
8
|
const promise = isGlobal ? req.payload.updateGlobal({
|
|
8
9
|
data,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/translate/updateEntity.ts"],"sourcesContent":["import type { CollectionSlug, GlobalSlug, PayloadRequest, TypeWithID } from 'payload';\nimport { APIError } from 'payload';\n\ntype Args = {\n collectionSlug?: string;\n data: Record<string, any>;\n depth?: number;\n globalSlug?: string;\n id?: number | string;\n locale: string;\n overrideAccess?: boolean;\n req: PayloadRequest;\n};\n\nexport const updateEntity = ({\n collectionSlug,\n data,\n depth: incomingDepth,\n globalSlug,\n id,\n locale,\n overrideAccess,\n req,\n}: Args): Promise<Record<string, unknown> & TypeWithID> => {\n if (!collectionSlug && !globalSlug)
|
|
1
|
+
{"version":3,"sources":["../../src/translate/updateEntity.ts"],"sourcesContent":["import type { CollectionSlug, GlobalSlug, PayloadRequest, TypeWithID } from 'payload';\nimport { APIError } from 'payload';\n\nimport { translatorT } from '../i18n-translations';\n\ntype Args = {\n collectionSlug?: string;\n data: Record<string, any>;\n depth?: number;\n globalSlug?: string;\n id?: number | string;\n locale: string;\n overrideAccess?: boolean;\n req: PayloadRequest;\n};\n\nexport const updateEntity = ({\n collectionSlug,\n data,\n depth: incomingDepth,\n globalSlug,\n id,\n locale,\n overrideAccess,\n req,\n}: Args): Promise<Record<string, unknown> & TypeWithID> => {\n if (!collectionSlug && !globalSlug)\n throw new APIError(translatorT(req.t, 'error_badRequest'), 400);\n\n const isGlobal = !!globalSlug;\n\n if (!isGlobal && !id) throw new APIError(translatorT(req.t, 'error_badRequest'), 400);\n\n const depth = incomingDepth ?? req.payload.config.defaultDepth;\n\n const promise = isGlobal\n ? req.payload.updateGlobal({\n data,\n depth,\n locale: locale as any,\n overrideAccess,\n req,\n slug: globalSlug as GlobalSlug,\n })\n : req.payload.update({\n collection: collectionSlug as CollectionSlug,\n data,\n depth,\n id: id as number | string,\n locale: locale as any,\n overrideAccess,\n req,\n });\n\n return promise as any;\n};\n"],"names":["APIError","translatorT","updateEntity","collectionSlug","data","depth","incomingDepth","globalSlug","id","locale","overrideAccess","req","t","isGlobal","payload","config","defaultDepth","promise","updateGlobal","slug","update","collection"],"mappings":"AACA,SAASA,QAAQ,QAAQ,UAAU;AAEnC,SAASC,WAAW,QAAQ,uBAAuB;AAanD,OAAO,MAAMC,eAAe,CAAC,EAC3BC,cAAc,EACdC,IAAI,EACJC,OAAOC,aAAa,EACpBC,UAAU,EACVC,EAAE,EACFC,MAAM,EACNC,cAAc,EACdC,GAAG,EACE;IACL,IAAI,CAACR,kBAAkB,CAACI,YACtB,MAAM,IAAIP,SAASC,YAAYU,IAAIC,CAAC,EAAE,qBAAqB;IAE7D,MAAMC,WAAW,CAAC,CAACN;IAEnB,IAAI,CAACM,YAAY,CAACL,IAAI,MAAM,IAAIR,SAASC,YAAYU,IAAIC,CAAC,EAAE,qBAAqB;IAEjF,MAAMP,QAAQC,iBAAiBK,IAAIG,OAAO,CAACC,MAAM,CAACC,YAAY;IAE9D,MAAMC,UAAUJ,WACZF,IAAIG,OAAO,CAACI,YAAY,CAAC;QACvBd;QACAC;QACAI,QAAQA;QACRC;QACAC;QACAQ,MAAMZ;IACR,KACAI,IAAIG,OAAO,CAACM,MAAM,CAAC;QACjBC,YAAYlB;QACZC;QACAC;QACAG,IAAIA;QACJC,QAAQA;QACRC;QACAC;IACF;IAEJ,OAAOM;AACT,EAAE"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
import type { CollectionSlug, GlobalSlug } from 'payload';
|
|
2
|
+
import type { GlossaryConfig } from './glossary';
|
|
2
3
|
import type { TranslateResolver } from './resolvers/types';
|
|
3
4
|
export type TranslatorConfig = {
|
|
5
|
+
/**
|
|
6
|
+
* Optional base path for the translator API endpoint
|
|
7
|
+
*/
|
|
8
|
+
basePath?: string;
|
|
4
9
|
/**
|
|
5
10
|
* Collections with the enabled translator in the admin UI
|
|
6
11
|
*/
|
|
@@ -9,21 +14,18 @@ export type TranslatorConfig = {
|
|
|
9
14
|
* Disable the plugin
|
|
10
15
|
*/
|
|
11
16
|
disabled?: boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Locales that should be excluded from translation (source and target)
|
|
19
|
+
*/
|
|
20
|
+
disabledLocales?: string[];
|
|
12
21
|
/**
|
|
13
22
|
* Globals with the enabled translator in the admin UI
|
|
14
23
|
*/
|
|
15
24
|
globals: GlobalSlug[];
|
|
25
|
+
glossary?: GlossaryConfig;
|
|
16
26
|
/**
|
|
17
27
|
* Add resolvers that you want to include, examples on how to write your own in ./plugin/src/resolvers
|
|
18
28
|
*/
|
|
19
29
|
resolvers: TranslateResolver[];
|
|
20
|
-
/**
|
|
21
|
-
* Locales that should be excluded from translation (source and target)
|
|
22
|
-
*/
|
|
23
|
-
disabledLocales?: string[];
|
|
24
|
-
/**
|
|
25
|
-
* Optional base path for the translator API endpoint
|
|
26
|
-
*/
|
|
27
|
-
basePath?: string;
|
|
28
30
|
};
|
|
29
31
|
//# sourceMappingURL=types.d.ts.map
|