@extravirgin/payload-enchants-translator 1.0.8 → 1.1.1
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 +231 -21
- package/dist/client/components/CustomButton/CustomButtonWithTranslator.d.ts +2 -2
- package/dist/client/components/CustomButton/CustomButtonWithTranslator.d.ts.map +1 -1
- package/dist/client/components/CustomButton/CustomButtonWithTranslator.js +1 -1
- package/dist/client/components/CustomButton/CustomButtonWithTranslator.js.map +1 -1
- package/dist/client/components/CustomButton/index.js +2 -2
- package/dist/client/components/CustomButton/index.js.map +1 -1
- 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 +42 -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 +53 -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 +6 -5
- package/dist/translate/findEntityWithConfig.js.map +1 -1
- package/dist/translate/operation.d.ts.map +1 -1
- package/dist/translate/operation.js +5 -1
- package/dist/translate/operation.js.map +1 -1
- package/dist/translate/traverseFields.d.ts.map +1 -1
- package/dist/translate/traverseFields.js +16 -1
- 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 +53 -22
package/dist/glossary.js
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { translatorT } from './i18n-translations';
|
|
2
|
+
export const getGlossarySlug = (config)=>config.slug ?? 'translation-glossary';
|
|
3
|
+
export const validateGlossaryEntries = (value, config, t)=>{
|
|
4
|
+
if (!Array.isArray(value) || !value.length) return translatorT(t, 'glossary_empty');
|
|
5
|
+
const locales = [
|
|
6
|
+
config.sourceLocale,
|
|
7
|
+
...config.targetLocales
|
|
8
|
+
];
|
|
9
|
+
const sources = new Set();
|
|
10
|
+
for (const entry of value){
|
|
11
|
+
for (const locale of locales){
|
|
12
|
+
const term = entry?.[locale];
|
|
13
|
+
if (locale !== config.sourceLocale && (term == null || typeof term === 'string' && !term.trim())) {
|
|
14
|
+
continue;
|
|
15
|
+
}
|
|
16
|
+
if (typeof term !== 'string' || !term.trim() || /[\t\r\n]/.test(term)) {
|
|
17
|
+
return translatorT(t, 'glossary_invalidTerm', {
|
|
18
|
+
locale: config.sourceLocale.toUpperCase()
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
if (Buffer.byteLength(term.trim(), 'utf8') > 1024) {
|
|
22
|
+
return translatorT(t, 'glossary_termTooLong');
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
const source = entry[config.sourceLocale].trim().normalize('NFC').toLowerCase();
|
|
26
|
+
if (sources.has(source)) return translatorT(t, 'glossary_duplicateSource');
|
|
27
|
+
sources.add(source);
|
|
28
|
+
}
|
|
29
|
+
return true;
|
|
30
|
+
};
|
|
31
|
+
export const validateGlossaryConfig = (config)=>{
|
|
32
|
+
const locales = [
|
|
33
|
+
config.sourceLocale,
|
|
34
|
+
...config.targetLocales
|
|
35
|
+
];
|
|
36
|
+
if (!config.targetLocales.length || new Set(locales).size !== locales.length) {
|
|
37
|
+
throw new Error('The glossary requires distinct source and target locales.');
|
|
38
|
+
}
|
|
39
|
+
if (locales.some((locale)=>!/^[a-zA-Z][a-zA-Z0-9_]*$/.test(locale) || [
|
|
40
|
+
'__proto__',
|
|
41
|
+
'constructor',
|
|
42
|
+
'createdAt',
|
|
43
|
+
'id',
|
|
44
|
+
'prototype',
|
|
45
|
+
'sourceKey',
|
|
46
|
+
'updatedAt'
|
|
47
|
+
].includes(locale))) {
|
|
48
|
+
throw new Error('Use valid Payload field names for glossary locales and map provider language codes in the resolver.');
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
//# sourceMappingURL=glossary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/glossary.ts"],"sourcesContent":["import type { TFunction } from '@payloadcms/translations';\nimport type { Access, CollectionConfig } from 'payload';\n\nimport { translatorT } from './i18n-translations';\n\nexport type GlossaryConfig = {\n access: { read: Access; update: Access };\n label?: NonNullable<CollectionConfig['labels']>['plural'];\n localeLabels?: Record<string, Record<string, string> | string>;\n slug?: string;\n sourceLocale: string;\n targetLocales: string[];\n};\n\nexport const getGlossarySlug = (config: GlossaryConfig) => config.slug ?? 'translation-glossary';\n\nexport const validateGlossaryEntries = (\n value: unknown,\n config: GlossaryConfig,\n t?: TFunction,\n): string | true => {\n if (!Array.isArray(value) || !value.length) return translatorT(t, 'glossary_empty');\n\n const locales = [config.sourceLocale, ...config.targetLocales];\n\n const sources = new Set<string>();\n\n for (const entry of value) {\n for (const locale of locales) {\n const term = entry?.[locale];\n\n if (\n locale !== config.sourceLocale &&\n (term == null || (typeof term === 'string' && !term.trim()))\n ) {\n continue;\n }\n if (typeof term !== 'string' || !term.trim() || /[\\t\\r\\n]/.test(term)) {\n return translatorT(t, 'glossary_invalidTerm', {\n locale: config.sourceLocale.toUpperCase(),\n });\n }\n if (Buffer.byteLength(term.trim(), 'utf8') > 1024) {\n return translatorT(t, 'glossary_termTooLong');\n }\n }\n\n const source = entry[config.sourceLocale].trim().normalize('NFC').toLowerCase();\n\n if (sources.has(source)) return translatorT(t, 'glossary_duplicateSource');\n sources.add(source);\n }\n\n return true;\n};\n\nexport const validateGlossaryConfig = (config: GlossaryConfig): void => {\n const locales = [config.sourceLocale, ...config.targetLocales];\n\n if (!config.targetLocales.length || new Set(locales).size !== locales.length) {\n throw new Error('The glossary requires distinct source and target locales.');\n }\n if (\n locales.some(\n (locale) =>\n !/^[a-zA-Z][a-zA-Z0-9_]*$/.test(locale) ||\n [\n '__proto__',\n 'constructor',\n 'createdAt',\n 'id',\n 'prototype',\n 'sourceKey',\n 'updatedAt',\n ].includes(locale),\n )\n ) {\n throw new Error(\n 'Use valid Payload field names for glossary locales and map provider language codes in the resolver.',\n );\n }\n};\n"],"names":["translatorT","getGlossarySlug","config","slug","validateGlossaryEntries","value","t","Array","isArray","length","locales","sourceLocale","targetLocales","sources","Set","entry","locale","term","trim","test","toUpperCase","Buffer","byteLength","source","normalize","toLowerCase","has","add","validateGlossaryConfig","size","Error","some","includes"],"mappings":"AAGA,SAASA,WAAW,QAAQ,sBAAsB;AAWlD,OAAO,MAAMC,kBAAkB,CAACC,SAA2BA,OAAOC,IAAI,IAAI,uBAAuB;AAEjG,OAAO,MAAMC,0BAA0B,CACrCC,OACAH,QACAI;IAEA,IAAI,CAACC,MAAMC,OAAO,CAACH,UAAU,CAACA,MAAMI,MAAM,EAAE,OAAOT,YAAYM,GAAG;IAElE,MAAMI,UAAU;QAACR,OAAOS,YAAY;WAAKT,OAAOU,aAAa;KAAC;IAE9D,MAAMC,UAAU,IAAIC;IAEpB,KAAK,MAAMC,SAASV,MAAO;QACzB,KAAK,MAAMW,UAAUN,QAAS;YAC5B,MAAMO,OAAOF,OAAO,CAACC,OAAO;YAE5B,IACEA,WAAWd,OAAOS,YAAY,IAC7BM,CAAAA,QAAQ,QAAS,OAAOA,SAAS,YAAY,CAACA,KAAKC,IAAI,EAAE,GAC1D;gBACA;YACF;YACA,IAAI,OAAOD,SAAS,YAAY,CAACA,KAAKC,IAAI,MAAM,WAAWC,IAAI,CAACF,OAAO;gBACrE,OAAOjB,YAAYM,GAAG,wBAAwB;oBAC5CU,QAAQd,OAAOS,YAAY,CAACS,WAAW;gBACzC;YACF;YACA,IAAIC,OAAOC,UAAU,CAACL,KAAKC,IAAI,IAAI,UAAU,MAAM;gBACjD,OAAOlB,YAAYM,GAAG;YACxB;QACF;QAEA,MAAMiB,SAASR,KAAK,CAACb,OAAOS,YAAY,CAAC,CAACO,IAAI,GAAGM,SAAS,CAAC,OAAOC,WAAW;QAE7E,IAAIZ,QAAQa,GAAG,CAACH,SAAS,OAAOvB,YAAYM,GAAG;QAC/CO,QAAQc,GAAG,CAACJ;IACd;IAEA,OAAO;AACT,EAAE;AAEF,OAAO,MAAMK,yBAAyB,CAAC1B;IACrC,MAAMQ,UAAU;QAACR,OAAOS,YAAY;WAAKT,OAAOU,aAAa;KAAC;IAE9D,IAAI,CAACV,OAAOU,aAAa,CAACH,MAAM,IAAI,IAAIK,IAAIJ,SAASmB,IAAI,KAAKnB,QAAQD,MAAM,EAAE;QAC5E,MAAM,IAAIqB,MAAM;IAClB;IACA,IACEpB,QAAQqB,IAAI,CACV,CAACf,SACC,CAAC,0BAA0BG,IAAI,CAACH,WAChC;YACE;YACA;YACA;YACA;YACA;YACA;YACA;SACD,CAACgB,QAAQ,CAAChB,UAEf;QACA,MAAM,IAAIc,MACR;IAEJ;AACF,EAAE"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { CollectionConfig, PayloadRequest } from 'payload';
|
|
2
|
+
import type { GlossaryConfig } from './glossary';
|
|
3
|
+
export declare const getGlossaryEntriesSlug: (config: GlossaryConfig) => string;
|
|
4
|
+
export declare const createGlossaryEntriesCollection: (config: GlossaryConfig, basePath: string, sync: (req: PayloadRequest, entry: Record<string, string>) => Promise<void>) => CollectionConfig;
|
|
5
|
+
//# sourceMappingURL=glossaryCollection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glossaryCollection.d.ts","sourceRoot":"","sources":["../src/glossaryCollection.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAGhE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAKjD,eAAO,MAAM,sBAAsB,WAAY,cAAc,WACvB,CAAC;AAKvC,eAAO,MAAM,+BAA+B,WAClC,cAAc,YACZ,MAAM,QACV,CAAC,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,KAC1E,gBAkFF,CAAC"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { APIError } from 'payload';
|
|
3
|
+
import { getGlossarySlug, validateGlossaryConfig, validateGlossaryEntries } from './glossary';
|
|
4
|
+
import { translations, translatorT } from './i18n-translations';
|
|
5
|
+
// Keep the collection slug distinct from the legacy global's entries array table.
|
|
6
|
+
export const getGlossaryEntriesSlug = (config)=>`${getGlossarySlug(config)}-records`;
|
|
7
|
+
const sourceKey = (source)=>createHash('sha256').update(source.trim().normalize('NFC').toLowerCase()).digest('hex');
|
|
8
|
+
export const createGlossaryEntriesCollection = (config, basePath, sync)=>{
|
|
9
|
+
validateGlossaryConfig(config);
|
|
10
|
+
const locales = [
|
|
11
|
+
config.sourceLocale,
|
|
12
|
+
...config.targetLocales
|
|
13
|
+
];
|
|
14
|
+
return {
|
|
15
|
+
access: {
|
|
16
|
+
create: config.access.update,
|
|
17
|
+
delete: config.access.update,
|
|
18
|
+
read: config.access.read,
|
|
19
|
+
update: config.access.update
|
|
20
|
+
},
|
|
21
|
+
admin: {
|
|
22
|
+
components: {
|
|
23
|
+
views: {
|
|
24
|
+
list: {
|
|
25
|
+
actions: [
|
|
26
|
+
{
|
|
27
|
+
clientProps: {
|
|
28
|
+
basePath
|
|
29
|
+
},
|
|
30
|
+
path: '@extravirgin/payload-enchants-translator/client#GlossaryControls'
|
|
31
|
+
}
|
|
32
|
+
]
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
defaultColumns: locales,
|
|
37
|
+
useAsTitle: config.sourceLocale
|
|
38
|
+
},
|
|
39
|
+
fields: [
|
|
40
|
+
...Array.from({
|
|
41
|
+
length: Math.ceil(locales.length / 2)
|
|
42
|
+
}, (_, index)=>({
|
|
43
|
+
fields: locales.slice(index * 2, index * 2 + 2).map((locale)=>({
|
|
44
|
+
admin: {
|
|
45
|
+
width: '50%'
|
|
46
|
+
},
|
|
47
|
+
label: config.localeLabels?.[locale] ?? locale.toUpperCase(),
|
|
48
|
+
name: locale,
|
|
49
|
+
required: locale === config.sourceLocale,
|
|
50
|
+
type: 'text'
|
|
51
|
+
})),
|
|
52
|
+
type: 'row'
|
|
53
|
+
})),
|
|
54
|
+
{
|
|
55
|
+
admin: {
|
|
56
|
+
hidden: true
|
|
57
|
+
},
|
|
58
|
+
name: 'sourceKey',
|
|
59
|
+
required: true,
|
|
60
|
+
type: 'text',
|
|
61
|
+
unique: true
|
|
62
|
+
}
|
|
63
|
+
],
|
|
64
|
+
hooks: {
|
|
65
|
+
afterChange: [
|
|
66
|
+
async ({ doc, req })=>{
|
|
67
|
+
try {
|
|
68
|
+
await sync(req, doc);
|
|
69
|
+
} catch (error) {
|
|
70
|
+
req.payload.logger.error(error);
|
|
71
|
+
throw new APIError(translatorT(req.t, 'glossary_saveError'), 502, undefined, true);
|
|
72
|
+
}
|
|
73
|
+
return doc;
|
|
74
|
+
}
|
|
75
|
+
],
|
|
76
|
+
beforeValidate: [
|
|
77
|
+
({ data, originalDoc, req })=>{
|
|
78
|
+
const entry = {
|
|
79
|
+
...originalDoc,
|
|
80
|
+
...data
|
|
81
|
+
};
|
|
82
|
+
const validation = validateGlossaryEntries([
|
|
83
|
+
entry
|
|
84
|
+
], config, req.t);
|
|
85
|
+
if (validation !== true) throw new APIError(validation, 400, undefined, true);
|
|
86
|
+
return {
|
|
87
|
+
...data,
|
|
88
|
+
...Object.fromEntries(locales.map((locale)=>[
|
|
89
|
+
locale,
|
|
90
|
+
entry[locale]?.trim() ?? ''
|
|
91
|
+
])),
|
|
92
|
+
sourceKey: sourceKey(entry[config.sourceLocale])
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
]
|
|
96
|
+
},
|
|
97
|
+
labels: {
|
|
98
|
+
plural: config.label ?? {
|
|
99
|
+
de: translations.de['plugin-translator'].glossary_plural,
|
|
100
|
+
en: translations.en['plugin-translator'].glossary_plural
|
|
101
|
+
},
|
|
102
|
+
singular: {
|
|
103
|
+
de: translations.de['plugin-translator'].glossary_singular,
|
|
104
|
+
en: translations.en['plugin-translator'].glossary_singular
|
|
105
|
+
}
|
|
106
|
+
},
|
|
107
|
+
slug: getGlossaryEntriesSlug(config),
|
|
108
|
+
versions: {
|
|
109
|
+
maxPerDoc: 10
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
//# sourceMappingURL=glossaryCollection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/glossaryCollection.ts"],"sourcesContent":["import { createHash } from 'node:crypto';\n\nimport type { CollectionConfig, PayloadRequest } from 'payload';\nimport { APIError } from 'payload';\n\nimport type { GlossaryConfig } from './glossary';\nimport { getGlossarySlug, validateGlossaryConfig, validateGlossaryEntries } from './glossary';\nimport { translations, translatorT } from './i18n-translations';\n\n// Keep the collection slug distinct from the legacy global's entries array table.\nexport const getGlossaryEntriesSlug = (config: GlossaryConfig) =>\n `${getGlossarySlug(config)}-records`;\n\nconst sourceKey = (source: string) =>\n createHash('sha256').update(source.trim().normalize('NFC').toLowerCase()).digest('hex');\n\nexport const createGlossaryEntriesCollection = (\n config: GlossaryConfig,\n basePath: string,\n sync: (req: PayloadRequest, entry: Record<string, string>) => Promise<void>,\n): CollectionConfig => {\n validateGlossaryConfig(config);\n const locales = [config.sourceLocale, ...config.targetLocales];\n\n return {\n access: {\n create: config.access.update,\n delete: config.access.update,\n read: config.access.read,\n update: config.access.update,\n },\n admin: {\n components: {\n views: {\n list: {\n actions: [\n {\n clientProps: { basePath },\n path: '@extravirgin/payload-enchants-translator/client#GlossaryControls',\n },\n ],\n },\n },\n },\n defaultColumns: locales,\n useAsTitle: config.sourceLocale,\n },\n fields: [\n ...Array.from({ length: Math.ceil(locales.length / 2) }, (_, index) => ({\n fields: locales.slice(index * 2, index * 2 + 2).map((locale) => ({\n admin: { width: '50%' },\n label: config.localeLabels?.[locale] ?? locale.toUpperCase(),\n name: locale,\n required: locale === config.sourceLocale,\n type: 'text' as const,\n })),\n type: 'row' as const,\n })),\n { admin: { hidden: true }, name: 'sourceKey', required: true, type: 'text', unique: true },\n ],\n hooks: {\n afterChange: [\n async ({ doc, req }) => {\n try {\n await sync(req, doc);\n } catch (error) {\n req.payload.logger.error(error);\n throw new APIError(translatorT(req.t, 'glossary_saveError'), 502, undefined, true);\n }\n\n return doc;\n },\n ],\n beforeValidate: [\n ({ data, originalDoc, req }) => {\n const entry = { ...originalDoc, ...data };\n\n const validation = validateGlossaryEntries([entry], config, req.t);\n\n if (validation !== true) throw new APIError(validation, 400, undefined, true);\n\n return {\n ...data,\n ...Object.fromEntries(locales.map((locale) => [locale, entry[locale]?.trim() ?? ''])),\n sourceKey: sourceKey(entry[config.sourceLocale]),\n };\n },\n ],\n },\n labels: {\n plural: config.label ?? {\n de: translations.de['plugin-translator'].glossary_plural,\n en: translations.en['plugin-translator'].glossary_plural,\n },\n singular: {\n de: translations.de['plugin-translator'].glossary_singular,\n en: translations.en['plugin-translator'].glossary_singular,\n },\n },\n slug: getGlossaryEntriesSlug(config),\n versions: { maxPerDoc: 10 },\n };\n};\n"],"names":["createHash","APIError","getGlossarySlug","validateGlossaryConfig","validateGlossaryEntries","translations","translatorT","getGlossaryEntriesSlug","config","sourceKey","source","update","trim","normalize","toLowerCase","digest","createGlossaryEntriesCollection","basePath","sync","locales","sourceLocale","targetLocales","access","create","delete","read","admin","components","views","list","actions","clientProps","path","defaultColumns","useAsTitle","fields","Array","from","length","Math","ceil","_","index","slice","map","locale","width","label","localeLabels","toUpperCase","name","required","type","hidden","unique","hooks","afterChange","doc","req","error","payload","logger","t","undefined","beforeValidate","data","originalDoc","entry","validation","Object","fromEntries","labels","plural","de","glossary_plural","en","singular","glossary_singular","slug","versions","maxPerDoc"],"mappings":"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"}
|
|
@@ -1,12 +1,95 @@
|
|
|
1
|
+
import type { TFunction } from '@payloadcms/translations';
|
|
1
2
|
export declare const translations: {
|
|
3
|
+
de: {
|
|
4
|
+
'plugin-translator': {
|
|
5
|
+
error_badRequest: string;
|
|
6
|
+
error_jsonRequired: string;
|
|
7
|
+
error_missingLocalization: string;
|
|
8
|
+
error_missingResolver: string;
|
|
9
|
+
glossary_accessDenied: string;
|
|
10
|
+
glossary_distinctLanguages: string;
|
|
11
|
+
glossary_duplicateSource: string;
|
|
12
|
+
glossary_empty: string;
|
|
13
|
+
glossary_invalidTerm: string;
|
|
14
|
+
glossary_missingID: string;
|
|
15
|
+
glossary_missingResolver: string;
|
|
16
|
+
glossary_plural: string;
|
|
17
|
+
glossary_saveError: string;
|
|
18
|
+
glossary_singular: string;
|
|
19
|
+
glossary_syncAll: string;
|
|
20
|
+
glossary_syncError: string;
|
|
21
|
+
glossary_syncHint: string;
|
|
22
|
+
glossary_syncSuccess: string;
|
|
23
|
+
glossary_syncing: string;
|
|
24
|
+
glossary_termTooLong: string;
|
|
25
|
+
glossary_tooLarge: string;
|
|
26
|
+
resolver_copy_buttonLabel: string;
|
|
27
|
+
resolver_copy_errorMessage: string;
|
|
28
|
+
resolver_copy_modalTitle: string;
|
|
29
|
+
resolver_copy_submitButtonLabelEmpty: string;
|
|
30
|
+
resolver_copy_submitButtonLabelFull: string;
|
|
31
|
+
resolver_copy_successMessage: string;
|
|
32
|
+
resolver_deepl_buttonLabel: string;
|
|
33
|
+
resolver_deepl_errorMessage: string;
|
|
34
|
+
resolver_deepl_modalTitle: string;
|
|
35
|
+
resolver_deepl_submitButtonLabelEmpty: string;
|
|
36
|
+
resolver_deepl_submitButtonLabelFull: string;
|
|
37
|
+
resolver_deepl_successMessage: string;
|
|
38
|
+
resolver_google_buttonLabel: string;
|
|
39
|
+
resolver_google_errorMessage: string;
|
|
40
|
+
resolver_google_modalTitle: string;
|
|
41
|
+
resolver_google_submitButtonLabelEmpty: string;
|
|
42
|
+
resolver_google_submitButtonLabelFull: string;
|
|
43
|
+
resolver_google_successMessage: string;
|
|
44
|
+
resolver_libre_buttonLabel: string;
|
|
45
|
+
resolver_libre_errorMessage: string;
|
|
46
|
+
resolver_libre_modalTitle: string;
|
|
47
|
+
resolver_libre_submitButtonLabelEmpty: string;
|
|
48
|
+
resolver_libre_submitButtonLabelFull: string;
|
|
49
|
+
resolver_libre_successMessage: string;
|
|
50
|
+
resolver_openai_buttonLabel: string;
|
|
51
|
+
resolver_openai_errorMessage: string;
|
|
52
|
+
resolver_openai_modalTitle: string;
|
|
53
|
+
resolver_openai_submitButtonLabelEmpty: string;
|
|
54
|
+
resolver_openai_submitButtonLabelFull: string;
|
|
55
|
+
resolver_openai_successMessage: string;
|
|
56
|
+
};
|
|
57
|
+
};
|
|
2
58
|
en: {
|
|
3
59
|
'plugin-translator': {
|
|
60
|
+
error_badRequest: string;
|
|
61
|
+
error_jsonRequired: string;
|
|
62
|
+
error_missingLocalization: string;
|
|
63
|
+
error_missingResolver: string;
|
|
64
|
+
glossary_accessDenied: string;
|
|
65
|
+
glossary_distinctLanguages: string;
|
|
66
|
+
glossary_duplicateSource: string;
|
|
67
|
+
glossary_empty: string;
|
|
68
|
+
glossary_invalidTerm: string;
|
|
69
|
+
glossary_missingID: string;
|
|
70
|
+
glossary_missingResolver: string;
|
|
71
|
+
glossary_plural: string;
|
|
72
|
+
glossary_saveError: string;
|
|
73
|
+
glossary_singular: string;
|
|
74
|
+
glossary_syncAll: string;
|
|
75
|
+
glossary_syncError: string;
|
|
76
|
+
glossary_syncHint: string;
|
|
77
|
+
glossary_syncSuccess: string;
|
|
78
|
+
glossary_syncing: string;
|
|
79
|
+
glossary_termTooLong: string;
|
|
80
|
+
glossary_tooLarge: string;
|
|
4
81
|
resolver_copy_buttonLabel: string;
|
|
5
82
|
resolver_copy_errorMessage: string;
|
|
6
83
|
resolver_copy_modalTitle: string;
|
|
7
84
|
resolver_copy_submitButtonLabelEmpty: string;
|
|
8
85
|
resolver_copy_submitButtonLabelFull: string;
|
|
9
86
|
resolver_copy_successMessage: string;
|
|
87
|
+
resolver_deepl_buttonLabel: string;
|
|
88
|
+
resolver_deepl_errorMessage: string;
|
|
89
|
+
resolver_deepl_modalTitle: string;
|
|
90
|
+
resolver_deepl_submitButtonLabelEmpty: string;
|
|
91
|
+
resolver_deepl_submitButtonLabelFull: string;
|
|
92
|
+
resolver_deepl_successMessage: string;
|
|
10
93
|
resolver_google_buttonLabel: string;
|
|
11
94
|
resolver_google_errorMessage: string;
|
|
12
95
|
resolver_google_modalTitle: string;
|
|
@@ -84,4 +167,5 @@ export declare const translations: {
|
|
|
84
167
|
};
|
|
85
168
|
};
|
|
86
169
|
};
|
|
170
|
+
export declare const translatorT: <TKey extends string>(t: TFunction<TKey> | undefined, key: keyof (typeof translations.en)["plugin-translator"], options?: Record<string, string>) => string;
|
|
87
171
|
//# sourceMappingURL=i18n-translations.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"i18n-translations.d.ts","sourceRoot":"","sources":["../src/i18n-translations.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY
|
|
1
|
+
{"version":3,"file":"i18n-translations.d.ts","sourceRoot":"","sources":["../src/i18n-translations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAE1D,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiMxB,CAAC;AAEF,eAAO,MAAM,WAAW,GAAI,IAAI,SAAS,MAAM,KAC1C,SAAS,CAAC,IAAI,CAAC,GAAG,SAAS,OACzB,MAAM,CAAC,OAAO,YAAY,CAAC,EAAE,EAAE,mBAAmB,CAAC,YAC9C,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAC/B,MAMI,CAAC"}
|
|
@@ -1,12 +1,94 @@
|
|
|
1
1
|
export const translations = {
|
|
2
|
+
de: {
|
|
3
|
+
'plugin-translator': {
|
|
4
|
+
error_badRequest: 'Ungültige Übersetzungsanfrage.',
|
|
5
|
+
error_jsonRequired: 'Die Anfrage muss JSON enthalten.',
|
|
6
|
+
error_missingLocalization: 'Die Lokalisierung muss konfiguriert sein, um den Übersetzer zu verwenden.',
|
|
7
|
+
error_missingResolver: 'Der Übersetzungsanbieter {{resolver}} wurde nicht gefunden.',
|
|
8
|
+
glossary_accessDenied: 'Vollständiger Zugriff auf das Glossar ist erforderlich.',
|
|
9
|
+
glossary_distinctLanguages: 'Jede Zielsprache des Glossars muss einer eigenen DeepL-Sprache zugeordnet sein.',
|
|
10
|
+
glossary_duplicateSource: 'Ausgangsbegriffe im Glossar müssen eindeutig sein.',
|
|
11
|
+
glossary_empty: 'Fügen Sie mindestens einen Glossareintrag hinzu.',
|
|
12
|
+
glossary_invalidTerm: 'Jeder ausgefüllte Begriff muss einzeilig sein. {{locale}} ist erforderlich.',
|
|
13
|
+
glossary_missingID: 'Konfigurieren Sie die DeepL-Glossar-ID vor dem Synchronisieren oder Übersetzen.',
|
|
14
|
+
glossary_missingResolver: 'Der DeepL-Glossaranbieter ist nicht konfiguriert.',
|
|
15
|
+
glossary_plural: 'Übersetzungsglossar',
|
|
16
|
+
glossary_saveError: 'Die DeepL-Synchronisierung ist fehlgeschlagen. Speichern Sie erneut oder synchronisieren Sie das gesamte Glossar.',
|
|
17
|
+
glossary_singular: 'Glossareintrag',
|
|
18
|
+
glossary_syncAll: 'Alles mit DeepL synchronisieren',
|
|
19
|
+
glossary_syncError: 'Die Synchronisierung des Glossars ist fehlgeschlagen. Bitte versuchen Sie es erneut.',
|
|
20
|
+
glossary_syncHint: 'Synchronisieren Sie alles, nachdem Sie Ausgangsbegriffe umbenannt, Übersetzungen geleert oder Einträge gelöscht haben.',
|
|
21
|
+
glossary_syncSuccess: 'Das Glossar wurde mit DeepL synchronisiert.',
|
|
22
|
+
glossary_syncing: 'Wird synchronisiert…',
|
|
23
|
+
glossary_termTooLong: 'Jeder Glossarbegriff darf höchstens 1024 UTF-8-Bytes umfassen.',
|
|
24
|
+
glossary_tooLarge: 'Das Glossar überschreitet die DeepL-Grenze von 10 MiB.',
|
|
25
|
+
resolver_copy_buttonLabel: 'Aus anderer Sprache kopieren',
|
|
26
|
+
resolver_copy_errorMessage: 'Beim Verarbeiten der Daten ist ein Fehler aufgetreten.',
|
|
27
|
+
resolver_copy_modalTitle: 'Wählen Sie die Sprache aus, aus der kopiert werden soll.',
|
|
28
|
+
resolver_copy_submitButtonLabelEmpty: 'Nur leere Felder kopieren',
|
|
29
|
+
resolver_copy_submitButtonLabelFull: 'Alles kopieren',
|
|
30
|
+
resolver_copy_successMessage: 'Erfolgreich kopiert. Klicken Sie auf „Speichern“, um die Änderungen zu übernehmen.',
|
|
31
|
+
resolver_deepl_buttonLabel: 'Mit DeepL übersetzen',
|
|
32
|
+
resolver_deepl_errorMessage: 'Beim Verarbeiten der Daten ist ein Fehler aufgetreten.',
|
|
33
|
+
resolver_deepl_modalTitle: 'Wählen Sie die Sprache aus, aus der übersetzt werden soll.',
|
|
34
|
+
resolver_deepl_submitButtonLabelEmpty: 'Nur leere Felder übersetzen',
|
|
35
|
+
resolver_deepl_submitButtonLabelFull: 'Alles übersetzen',
|
|
36
|
+
resolver_deepl_successMessage: 'Erfolgreich übersetzt. Klicken Sie auf „Speichern“, um die Änderungen zu übernehmen.',
|
|
37
|
+
resolver_google_buttonLabel: 'Google Translate',
|
|
38
|
+
resolver_google_errorMessage: 'Beim Verarbeiten der Daten ist ein Fehler aufgetreten.',
|
|
39
|
+
resolver_google_modalTitle: 'Wählen Sie die Sprache aus, aus der übersetzt werden soll.',
|
|
40
|
+
resolver_google_submitButtonLabelEmpty: 'Nur leere Felder übersetzen',
|
|
41
|
+
resolver_google_submitButtonLabelFull: 'Alles übersetzen',
|
|
42
|
+
resolver_google_successMessage: 'Erfolgreich übersetzt. Klicken Sie auf „Speichern“, um die Änderungen zu übernehmen.',
|
|
43
|
+
resolver_libre_buttonLabel: 'Libre Translate',
|
|
44
|
+
resolver_libre_errorMessage: 'Beim Verarbeiten der Daten ist ein Fehler aufgetreten.',
|
|
45
|
+
resolver_libre_modalTitle: 'Wählen Sie die Sprache aus, aus der übersetzt werden soll.',
|
|
46
|
+
resolver_libre_submitButtonLabelEmpty: 'Nur leere Felder übersetzen',
|
|
47
|
+
resolver_libre_submitButtonLabelFull: 'Alles übersetzen',
|
|
48
|
+
resolver_libre_successMessage: 'Erfolgreich übersetzt. Klicken Sie auf „Speichern“, um die Änderungen zu übernehmen.',
|
|
49
|
+
resolver_openai_buttonLabel: 'KI-Übersetzung',
|
|
50
|
+
resolver_openai_errorMessage: 'Beim Verarbeiten der Daten ist ein Fehler aufgetreten.',
|
|
51
|
+
resolver_openai_modalTitle: 'Wählen Sie die Sprache aus, aus der übersetzt werden soll.',
|
|
52
|
+
resolver_openai_submitButtonLabelEmpty: 'Nur leere Felder übersetzen',
|
|
53
|
+
resolver_openai_submitButtonLabelFull: 'Alles übersetzen',
|
|
54
|
+
resolver_openai_successMessage: 'Erfolgreich übersetzt. Klicken Sie auf „Speichern“, um die Änderungen zu übernehmen.'
|
|
55
|
+
}
|
|
56
|
+
},
|
|
2
57
|
en: {
|
|
3
58
|
'plugin-translator': {
|
|
59
|
+
error_badRequest: 'Invalid translation request.',
|
|
60
|
+
error_jsonRequired: 'The request must contain JSON.',
|
|
61
|
+
error_missingLocalization: 'Localization must be configured to use the translator.',
|
|
62
|
+
error_missingResolver: 'The translation provider {{resolver}} was not found.',
|
|
63
|
+
glossary_accessDenied: 'Full glossary access is required.',
|
|
64
|
+
glossary_distinctLanguages: 'Each glossary target must map to a distinct DeepL language.',
|
|
65
|
+
glossary_duplicateSource: 'Source glossary terms must be unique.',
|
|
66
|
+
glossary_empty: 'Add at least one glossary entry.',
|
|
67
|
+
glossary_invalidTerm: 'Each supplied term must be single-line, and {{locale}} is required.',
|
|
68
|
+
glossary_missingID: 'Configure the DeepL glossary ID before syncing or translating.',
|
|
69
|
+
glossary_missingResolver: 'The DeepL glossary resolver is not configured.',
|
|
70
|
+
glossary_plural: 'Translation Glossary',
|
|
71
|
+
glossary_saveError: 'DeepL synchronization failed. Please retry saving or use Sync all.',
|
|
72
|
+
glossary_singular: 'Glossary Entry',
|
|
73
|
+
glossary_syncAll: 'Sync all to DeepL',
|
|
74
|
+
glossary_syncError: 'Glossary synchronization failed. Please try again.',
|
|
75
|
+
glossary_syncHint: 'Use Sync all after renaming source terms, clearing translations, or deleting entries.',
|
|
76
|
+
glossary_syncSuccess: 'Glossary synchronized to DeepL.',
|
|
77
|
+
glossary_syncing: 'Syncing…',
|
|
78
|
+
glossary_termTooLong: 'Each glossary term must fit within 1024 UTF-8 bytes.',
|
|
79
|
+
glossary_tooLarge: 'The glossary exceeds the DeepL 10 MiB limit.',
|
|
4
80
|
resolver_copy_buttonLabel: 'Copy from other locale',
|
|
5
81
|
resolver_copy_errorMessage: 'An error occurred when trying to translate the data',
|
|
6
82
|
resolver_copy_modalTitle: 'Choose the locale to copy from',
|
|
7
83
|
resolver_copy_submitButtonLabelEmpty: 'Copy only empty fields',
|
|
8
84
|
resolver_copy_submitButtonLabelFull: 'Copy all',
|
|
9
85
|
resolver_copy_successMessage: 'Successfully copied. Press "Save" to apply the changes.',
|
|
86
|
+
resolver_deepl_buttonLabel: 'Translate with DeepL',
|
|
87
|
+
resolver_deepl_errorMessage: 'An error occurred when trying to translate the data',
|
|
88
|
+
resolver_deepl_modalTitle: 'Choose the locale to translate from',
|
|
89
|
+
resolver_deepl_submitButtonLabelEmpty: 'Translate only empty fields',
|
|
90
|
+
resolver_deepl_submitButtonLabelFull: 'Translate all',
|
|
91
|
+
resolver_deepl_successMessage: 'Successfully translated. Press "Save" to apply the changes.',
|
|
10
92
|
resolver_google_buttonLabel: 'Google Translate',
|
|
11
93
|
resolver_google_errorMessage: 'An error occurred when trying to translate the data',
|
|
12
94
|
resolver_google_modalTitle: 'Choose the locale to translate from',
|
|
@@ -84,5 +166,6 @@ export const translations = {
|
|
|
84
166
|
}
|
|
85
167
|
}
|
|
86
168
|
};
|
|
169
|
+
export const translatorT = (t, key, options)=>t ? t(`plugin-translator:${key}`, options) : translations.en['plugin-translator'][key].replace(/{{(\w+)}}/g, (_, name)=>options?.[name] ?? '');
|
|
87
170
|
|
|
88
171
|
//# sourceMappingURL=i18n-translations.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/i18n-translations.ts"],"sourcesContent":["export const translations = {\n en: {\n 'plugin-translator': {\n resolver_copy_buttonLabel: 'Copy from other locale',\n resolver_copy_errorMessage: 'An error occurred when trying to translate the data',\n resolver_copy_modalTitle: 'Choose the locale to copy from',\n resolver_copy_submitButtonLabelEmpty: 'Copy only empty fields',\n resolver_copy_submitButtonLabelFull: 'Copy all',\n resolver_copy_successMessage: 'Successfully copied. Press \"Save\" to apply the changes.',\n\n resolver_google_buttonLabel: 'Google Translate',\n resolver_google_errorMessage: 'An error occurred when trying to translate the data',\n resolver_google_modalTitle: 'Choose the locale to translate from',\n resolver_google_submitButtonLabelEmpty: 'Translate only empty fields',\n resolver_google_submitButtonLabelFull: 'Translate all',\n resolver_google_successMessage: 'Successfully translated. Press \"Save\" to apply the changes.',\n\n resolver_libre_buttonLabel: 'Libre Translate',\n resolver_libre_errorMessage: 'An error occurred when trying to translate the data',\n resolver_libre_modalTitle: 'Choose the locale to translate from',\n resolver_libre_submitButtonLabelEmpty: 'Translate only empty fields',\n resolver_libre_submitButtonLabelFull: 'Translate all',\n resolver_libre_successMessage: 'Successfully translated. Press \"Save\" to apply the changes.',\n\n resolver_openai_buttonLabel: 'AI Translate',\n resolver_openai_errorMessage: 'An error occurred when trying to translate the data',\n resolver_openai_modalTitle: 'Choose the locale to translate from',\n resolver_openai_submitButtonLabelEmpty: 'Translate only empty fields',\n resolver_openai_submitButtonLabelFull: 'Translate all',\n resolver_openai_successMessage: 'Successfully translated. Press \"Save\" to apply the changes.',\n },\n },\n uk: {\n 'plugin-translator': {\n resolver_copy_buttonLabel: 'Копіювати з іншої локалі',\n resolver_copy_errorMessage: 'Сталася помилка під час спроби перекладу даних',\n resolver_copy_modalTitle: 'Виберіть локаль для копіювання',\n resolver_copy_submitButtonLabelEmpty: 'Копіювати лише порожні поля',\n resolver_copy_submitButtonLabelFull: 'Копіювати все',\n resolver_copy_successMessage:\n 'Успішно скопійовано. Натисніть \"Зберегти\", щоб застосувати зміни.',\n\n resolver_google_buttonLabel: 'Переклад Google',\n resolver_google_errorMessage: 'Сталася помилка під час спроби перекладу даних',\n resolver_google_modalTitle: 'Виберіть локаль для перекладу',\n resolver_google_submitButtonLabelEmpty: 'Перекласти лише порожні поля',\n resolver_google_submitButtonLabelFull: 'Перекласти все',\n resolver_google_successMessage:\n 'Успішно перекладено. Натисніть \"Зберегти\", щоб застосувати зміни.',\n\n resolver_libre_buttonLabel: 'Переклад Libre',\n resolver_libre_errorMessage: 'Сталася помилка під час спроби перекладу даних',\n resolver_libre_modalTitle: 'Виберіть локаль для перекладу',\n resolver_libre_submitButtonLabelEmpty: 'Перекласти лише порожні поля',\n resolver_libre_submitButtonLabelFull: 'Перекласти все',\n resolver_libre_successMessage:\n 'Успішно перекладено. Натисніть \"Зберегти\", щоб застосувати зміни.',\n\n resolver_openai_buttonLabel: 'Переклад AI',\n resolver_openai_errorMessage: 'Сталася помилка під час спроби перекладу даних',\n resolver_openai_modalTitle: 'Виберіть локаль для перекладу',\n resolver_openai_submitButtonLabelEmpty: 'Перекласти лише порожні поля',\n resolver_openai_submitButtonLabelFull: 'Перекласти все',\n resolver_openai_successMessage:\n 'Успішно перекладено. Натисніть \"Зберегти\", щоб застосувати зміни.',\n },\n },\n zh: {\n 'plugin-translator': {\n resolver_copy_buttonLabel: '从其他语言复制',\n resolver_copy_errorMessage: '尝试翻译数据时发生错误',\n resolver_copy_modalTitle: '选择要复制的语言',\n resolver_copy_submitButtonLabelEmpty: '仅复制空字段',\n resolver_copy_submitButtonLabelFull: '复制全部',\n resolver_copy_successMessage: '复制成功。按下“保存”以应用更改。',\n\n resolver_google_buttonLabel: '谷歌翻译',\n resolver_google_errorMessage: '尝试翻译数据时发生错误',\n resolver_google_modalTitle: '选择要翻译的语言',\n resolver_google_submitButtonLabelEmpty: '仅翻译空字段',\n resolver_google_submitButtonLabelFull: '翻译全部',\n resolver_google_successMessage: '翻译成功。按下“保存”以应用更改。',\n\n resolver_libre_buttonLabel: '自由翻译',\n resolver_libre_errorMessage: '尝试翻译数据时发生错误',\n resolver_libre_modalTitle: '选择要翻译的语言',\n resolver_libre_submitButtonLabelEmpty: '仅翻译空字段',\n resolver_libre_submitButtonLabelFull: '翻译全部',\n resolver_libre_successMessage: '翻译成功。按下“保存”以应用更改。',\n\n resolver_openai_buttonLabel: 'AI翻译',\n resolver_openai_errorMessage: '尝试翻译数据时发生错误',\n resolver_openai_modalTitle: '选择要翻译的语言',\n resolver_openai_submitButtonLabelEmpty: '仅翻译空字段',\n resolver_openai_submitButtonLabelFull: '翻译全部',\n resolver_openai_successMessage: '翻译成功。按下“保存”以应用更改。',\n },\n },\n};\n"],"names":["translations","en","resolver_copy_buttonLabel","resolver_copy_errorMessage","resolver_copy_modalTitle","resolver_copy_submitButtonLabelEmpty","resolver_copy_submitButtonLabelFull","resolver_copy_successMessage","resolver_google_buttonLabel","resolver_google_errorMessage","resolver_google_modalTitle","resolver_google_submitButtonLabelEmpty","resolver_google_submitButtonLabelFull","resolver_google_successMessage","resolver_libre_buttonLabel","resolver_libre_errorMessage","resolver_libre_modalTitle","resolver_libre_submitButtonLabelEmpty","resolver_libre_submitButtonLabelFull","resolver_libre_successMessage","resolver_openai_buttonLabel","resolver_openai_errorMessage","resolver_openai_modalTitle","resolver_openai_submitButtonLabelEmpty","resolver_openai_submitButtonLabelFull","resolver_openai_successMessage","uk","zh"],"mappings":"AAAA,OAAO,MAAMA,eAAe;IAC1BC,IAAI;QACF,qBAAqB;YACnBC,2BAA2B;YAC3BC,4BAA4B;YAC5BC,0BAA0B;YAC1BC,sCAAsC;YACtCC,qCAAqC;YACrCC,8BAA8B;YAE9BC,6BAA6B;YAC7BC,8BAA8B;YAC9BC,4BAA4B;YAC5BC,wCAAwC;YACxCC,uCAAuC;YACvCC,gCAAgC;YAEhCC,4BAA4B;YAC5BC,6BAA6B;YAC7BC,2BAA2B;YAC3BC,uCAAuC;YACvCC,sCAAsC;YACtCC,+BAA+B;YAE/BC,6BAA6B;YAC7BC,8BAA8B;YAC9BC,4BAA4B;YAC5BC,wCAAwC;YACxCC,uCAAuC;YACvCC,gCAAgC;QAClC;IACF;IACAC,IAAI;QACF,qBAAqB;YACnBxB,2BAA2B;YAC3BC,4BAA4B;YAC5BC,0BAA0B;YAC1BC,sCAAsC;YACtCC,qCAAqC;YACrCC,8BACE;YAEFC,6BAA6B;YAC7BC,8BAA8B;YAC9BC,4BAA4B;YAC5BC,wCAAwC;YACxCC,uCAAuC;YACvCC,gCACE;YAEFC,4BAA4B;YAC5BC,6BAA6B;YAC7BC,2BAA2B;YAC3BC,uCAAuC;YACvCC,sCAAsC;YACtCC,+BACE;YAEFC,6BAA6B;YAC7BC,8BAA8B;YAC9BC,4BAA4B;YAC5BC,wCAAwC;YACxCC,uCAAuC;YACvCC,gCACE;QACJ;IACF;IACAE,IAAI;QACF,qBAAqB;YACnBzB,2BAA2B;YAC3BC,4BAA4B;YAC5BC,0BAA0B;YAC1BC,sCAAsC;YACtCC,qCAAqC;YACrCC,8BAA8B;YAE9BC,6BAA6B;YAC7BC,8BAA8B;YAC9BC,4BAA4B;YAC5BC,wCAAwC;YACxCC,uCAAuC;YACvCC,gCAAgC;YAEhCC,4BAA4B;YAC5BC,6BAA6B;YAC7BC,2BAA2B;YAC3BC,uCAAuC;YACvCC,sCAAsC;YACtCC,+BAA+B;YAE/BC,6BAA6B;YAC7BC,8BAA8B;YAC9BC,4BAA4B;YAC5BC,wCAAwC;YACxCC,uCAAuC;YACvCC,gCAAgC;QAClC;IACF;AACF,EAAE"}
|
|
1
|
+
{"version":3,"sources":["../src/i18n-translations.ts"],"sourcesContent":["import type { TFunction } from '@payloadcms/translations';\n\nexport const translations = {\n de: {\n 'plugin-translator': {\n error_badRequest: 'Ungültige Übersetzungsanfrage.',\n error_jsonRequired: 'Die Anfrage muss JSON enthalten.',\n error_missingLocalization:\n 'Die Lokalisierung muss konfiguriert sein, um den Übersetzer zu verwenden.',\n error_missingResolver: 'Der Übersetzungsanbieter {{resolver}} wurde nicht gefunden.',\n glossary_accessDenied: 'Vollständiger Zugriff auf das Glossar ist erforderlich.',\n glossary_distinctLanguages:\n 'Jede Zielsprache des Glossars muss einer eigenen DeepL-Sprache zugeordnet sein.',\n glossary_duplicateSource: 'Ausgangsbegriffe im Glossar müssen eindeutig sein.',\n glossary_empty: 'Fügen Sie mindestens einen Glossareintrag hinzu.',\n glossary_invalidTerm:\n 'Jeder ausgefüllte Begriff muss einzeilig sein. {{locale}} ist erforderlich.',\n glossary_missingID:\n 'Konfigurieren Sie die DeepL-Glossar-ID vor dem Synchronisieren oder Übersetzen.',\n glossary_missingResolver: 'Der DeepL-Glossaranbieter ist nicht konfiguriert.',\n glossary_plural: 'Übersetzungsglossar',\n glossary_saveError:\n 'Die DeepL-Synchronisierung ist fehlgeschlagen. Speichern Sie erneut oder synchronisieren Sie das gesamte Glossar.',\n glossary_singular: 'Glossareintrag',\n glossary_syncAll: 'Alles mit DeepL synchronisieren',\n glossary_syncError:\n 'Die Synchronisierung des Glossars ist fehlgeschlagen. Bitte versuchen Sie es erneut.',\n glossary_syncHint:\n 'Synchronisieren Sie alles, nachdem Sie Ausgangsbegriffe umbenannt, Übersetzungen geleert oder Einträge gelöscht haben.',\n glossary_syncSuccess: 'Das Glossar wurde mit DeepL synchronisiert.',\n glossary_syncing: 'Wird synchronisiert…',\n glossary_termTooLong: 'Jeder Glossarbegriff darf höchstens 1024 UTF-8-Bytes umfassen.',\n glossary_tooLarge: 'Das Glossar überschreitet die DeepL-Grenze von 10 MiB.',\n resolver_copy_buttonLabel: 'Aus anderer Sprache kopieren',\n resolver_copy_errorMessage: 'Beim Verarbeiten der Daten ist ein Fehler aufgetreten.',\n resolver_copy_modalTitle: 'Wählen Sie die Sprache aus, aus der kopiert werden soll.',\n resolver_copy_submitButtonLabelEmpty: 'Nur leere Felder kopieren',\n resolver_copy_submitButtonLabelFull: 'Alles kopieren',\n resolver_copy_successMessage:\n 'Erfolgreich kopiert. Klicken Sie auf „Speichern“, um die Änderungen zu übernehmen.',\n resolver_deepl_buttonLabel: 'Mit DeepL übersetzen',\n resolver_deepl_errorMessage: 'Beim Verarbeiten der Daten ist ein Fehler aufgetreten.',\n resolver_deepl_modalTitle: 'Wählen Sie die Sprache aus, aus der übersetzt werden soll.',\n resolver_deepl_submitButtonLabelEmpty: 'Nur leere Felder übersetzen',\n resolver_deepl_submitButtonLabelFull: 'Alles übersetzen',\n resolver_deepl_successMessage:\n 'Erfolgreich übersetzt. Klicken Sie auf „Speichern“, um die Änderungen zu übernehmen.',\n resolver_google_buttonLabel: 'Google Translate',\n resolver_google_errorMessage: 'Beim Verarbeiten der Daten ist ein Fehler aufgetreten.',\n resolver_google_modalTitle: 'Wählen Sie die Sprache aus, aus der übersetzt werden soll.',\n resolver_google_submitButtonLabelEmpty: 'Nur leere Felder übersetzen',\n resolver_google_submitButtonLabelFull: 'Alles übersetzen',\n resolver_google_successMessage:\n 'Erfolgreich übersetzt. Klicken Sie auf „Speichern“, um die Änderungen zu übernehmen.',\n resolver_libre_buttonLabel: 'Libre Translate',\n resolver_libre_errorMessage: 'Beim Verarbeiten der Daten ist ein Fehler aufgetreten.',\n resolver_libre_modalTitle: 'Wählen Sie die Sprache aus, aus der übersetzt werden soll.',\n resolver_libre_submitButtonLabelEmpty: 'Nur leere Felder übersetzen',\n resolver_libre_submitButtonLabelFull: 'Alles übersetzen',\n resolver_libre_successMessage:\n 'Erfolgreich übersetzt. Klicken Sie auf „Speichern“, um die Änderungen zu übernehmen.',\n resolver_openai_buttonLabel: 'KI-Übersetzung',\n resolver_openai_errorMessage: 'Beim Verarbeiten der Daten ist ein Fehler aufgetreten.',\n resolver_openai_modalTitle: 'Wählen Sie die Sprache aus, aus der übersetzt werden soll.',\n resolver_openai_submitButtonLabelEmpty: 'Nur leere Felder übersetzen',\n resolver_openai_submitButtonLabelFull: 'Alles übersetzen',\n resolver_openai_successMessage:\n 'Erfolgreich übersetzt. Klicken Sie auf „Speichern“, um die Änderungen zu übernehmen.',\n },\n },\n en: {\n 'plugin-translator': {\n error_badRequest: 'Invalid translation request.',\n error_jsonRequired: 'The request must contain JSON.',\n error_missingLocalization: 'Localization must be configured to use the translator.',\n error_missingResolver: 'The translation provider {{resolver}} was not found.',\n glossary_accessDenied: 'Full glossary access is required.',\n glossary_distinctLanguages: 'Each glossary target must map to a distinct DeepL language.',\n glossary_duplicateSource: 'Source glossary terms must be unique.',\n glossary_empty: 'Add at least one glossary entry.',\n glossary_invalidTerm: 'Each supplied term must be single-line, and {{locale}} is required.',\n glossary_missingID: 'Configure the DeepL glossary ID before syncing or translating.',\n glossary_missingResolver: 'The DeepL glossary resolver is not configured.',\n glossary_plural: 'Translation Glossary',\n glossary_saveError: 'DeepL synchronization failed. Please retry saving or use Sync all.',\n glossary_singular: 'Glossary Entry',\n glossary_syncAll: 'Sync all to DeepL',\n glossary_syncError: 'Glossary synchronization failed. Please try again.',\n glossary_syncHint:\n 'Use Sync all after renaming source terms, clearing translations, or deleting entries.',\n glossary_syncSuccess: 'Glossary synchronized to DeepL.',\n glossary_syncing: 'Syncing…',\n glossary_termTooLong: 'Each glossary term must fit within 1024 UTF-8 bytes.',\n glossary_tooLarge: 'The glossary exceeds the DeepL 10 MiB limit.',\n resolver_copy_buttonLabel: 'Copy from other locale',\n resolver_copy_errorMessage: 'An error occurred when trying to translate the data',\n resolver_copy_modalTitle: 'Choose the locale to copy from',\n resolver_copy_submitButtonLabelEmpty: 'Copy only empty fields',\n resolver_copy_submitButtonLabelFull: 'Copy all',\n resolver_copy_successMessage: 'Successfully copied. Press \"Save\" to apply the changes.',\n resolver_deepl_buttonLabel: 'Translate with DeepL',\n resolver_deepl_errorMessage: 'An error occurred when trying to translate the data',\n resolver_deepl_modalTitle: 'Choose the locale to translate from',\n resolver_deepl_submitButtonLabelEmpty: 'Translate only empty fields',\n resolver_deepl_submitButtonLabelFull: 'Translate all',\n resolver_deepl_successMessage: 'Successfully translated. Press \"Save\" to apply the changes.',\n\n resolver_google_buttonLabel: 'Google Translate',\n resolver_google_errorMessage: 'An error occurred when trying to translate the data',\n resolver_google_modalTitle: 'Choose the locale to translate from',\n resolver_google_submitButtonLabelEmpty: 'Translate only empty fields',\n resolver_google_submitButtonLabelFull: 'Translate all',\n resolver_google_successMessage: 'Successfully translated. Press \"Save\" to apply the changes.',\n\n resolver_libre_buttonLabel: 'Libre Translate',\n resolver_libre_errorMessage: 'An error occurred when trying to translate the data',\n resolver_libre_modalTitle: 'Choose the locale to translate from',\n resolver_libre_submitButtonLabelEmpty: 'Translate only empty fields',\n resolver_libre_submitButtonLabelFull: 'Translate all',\n resolver_libre_successMessage: 'Successfully translated. Press \"Save\" to apply the changes.',\n\n resolver_openai_buttonLabel: 'AI Translate',\n resolver_openai_errorMessage: 'An error occurred when trying to translate the data',\n resolver_openai_modalTitle: 'Choose the locale to translate from',\n resolver_openai_submitButtonLabelEmpty: 'Translate only empty fields',\n resolver_openai_submitButtonLabelFull: 'Translate all',\n resolver_openai_successMessage: 'Successfully translated. Press \"Save\" to apply the changes.',\n },\n },\n uk: {\n 'plugin-translator': {\n resolver_copy_buttonLabel: 'Копіювати з іншої локалі',\n resolver_copy_errorMessage: 'Сталася помилка під час спроби перекладу даних',\n resolver_copy_modalTitle: 'Виберіть локаль для копіювання',\n resolver_copy_submitButtonLabelEmpty: 'Копіювати лише порожні поля',\n resolver_copy_submitButtonLabelFull: 'Копіювати все',\n resolver_copy_successMessage:\n 'Успішно скопійовано. Натисніть \"Зберегти\", щоб застосувати зміни.',\n\n resolver_google_buttonLabel: 'Переклад Google',\n resolver_google_errorMessage: 'Сталася помилка під час спроби перекладу даних',\n resolver_google_modalTitle: 'Виберіть локаль для перекладу',\n resolver_google_submitButtonLabelEmpty: 'Перекласти лише порожні поля',\n resolver_google_submitButtonLabelFull: 'Перекласти все',\n resolver_google_successMessage:\n 'Успішно перекладено. Натисніть \"Зберегти\", щоб застосувати зміни.',\n\n resolver_libre_buttonLabel: 'Переклад Libre',\n resolver_libre_errorMessage: 'Сталася помилка під час спроби перекладу даних',\n resolver_libre_modalTitle: 'Виберіть локаль для перекладу',\n resolver_libre_submitButtonLabelEmpty: 'Перекласти лише порожні поля',\n resolver_libre_submitButtonLabelFull: 'Перекласти все',\n resolver_libre_successMessage:\n 'Успішно перекладено. Натисніть \"Зберегти\", щоб застосувати зміни.',\n\n resolver_openai_buttonLabel: 'Переклад AI',\n resolver_openai_errorMessage: 'Сталася помилка під час спроби перекладу даних',\n resolver_openai_modalTitle: 'Виберіть локаль для перекладу',\n resolver_openai_submitButtonLabelEmpty: 'Перекласти лише порожні поля',\n resolver_openai_submitButtonLabelFull: 'Перекласти все',\n resolver_openai_successMessage:\n 'Успішно перекладено. Натисніть \"Зберегти\", щоб застосувати зміни.',\n },\n },\n zh: {\n 'plugin-translator': {\n resolver_copy_buttonLabel: '从其他语言复制',\n resolver_copy_errorMessage: '尝试翻译数据时发生错误',\n resolver_copy_modalTitle: '选择要复制的语言',\n resolver_copy_submitButtonLabelEmpty: '仅复制空字段',\n resolver_copy_submitButtonLabelFull: '复制全部',\n resolver_copy_successMessage: '复制成功。按下“保存”以应用更改。',\n\n resolver_google_buttonLabel: '谷歌翻译',\n resolver_google_errorMessage: '尝试翻译数据时发生错误',\n resolver_google_modalTitle: '选择要翻译的语言',\n resolver_google_submitButtonLabelEmpty: '仅翻译空字段',\n resolver_google_submitButtonLabelFull: '翻译全部',\n resolver_google_successMessage: '翻译成功。按下“保存”以应用更改。',\n\n resolver_libre_buttonLabel: '自由翻译',\n resolver_libre_errorMessage: '尝试翻译数据时发生错误',\n resolver_libre_modalTitle: '选择要翻译的语言',\n resolver_libre_submitButtonLabelEmpty: '仅翻译空字段',\n resolver_libre_submitButtonLabelFull: '翻译全部',\n resolver_libre_successMessage: '翻译成功。按下“保存”以应用更改。',\n\n resolver_openai_buttonLabel: 'AI翻译',\n resolver_openai_errorMessage: '尝试翻译数据时发生错误',\n resolver_openai_modalTitle: '选择要翻译的语言',\n resolver_openai_submitButtonLabelEmpty: '仅翻译空字段',\n resolver_openai_submitButtonLabelFull: '翻译全部',\n resolver_openai_successMessage: '翻译成功。按下“保存”以应用更改。',\n },\n },\n};\n\nexport const translatorT = <TKey extends string>(\n t: TFunction<TKey> | undefined,\n key: keyof (typeof translations.en)['plugin-translator'],\n options?: Record<string, string>,\n): string =>\n t\n ? t(`plugin-translator:${key}` as TKey, options)\n : translations.en['plugin-translator'][key].replace(\n /{{(\\w+)}}/g,\n (_, name: string) => options?.[name] ?? '',\n );\n"],"names":["translations","de","error_badRequest","error_jsonRequired","error_missingLocalization","error_missingResolver","glossary_accessDenied","glossary_distinctLanguages","glossary_duplicateSource","glossary_empty","glossary_invalidTerm","glossary_missingID","glossary_missingResolver","glossary_plural","glossary_saveError","glossary_singular","glossary_syncAll","glossary_syncError","glossary_syncHint","glossary_syncSuccess","glossary_syncing","glossary_termTooLong","glossary_tooLarge","resolver_copy_buttonLabel","resolver_copy_errorMessage","resolver_copy_modalTitle","resolver_copy_submitButtonLabelEmpty","resolver_copy_submitButtonLabelFull","resolver_copy_successMessage","resolver_deepl_buttonLabel","resolver_deepl_errorMessage","resolver_deepl_modalTitle","resolver_deepl_submitButtonLabelEmpty","resolver_deepl_submitButtonLabelFull","resolver_deepl_successMessage","resolver_google_buttonLabel","resolver_google_errorMessage","resolver_google_modalTitle","resolver_google_submitButtonLabelEmpty","resolver_google_submitButtonLabelFull","resolver_google_successMessage","resolver_libre_buttonLabel","resolver_libre_errorMessage","resolver_libre_modalTitle","resolver_libre_submitButtonLabelEmpty","resolver_libre_submitButtonLabelFull","resolver_libre_successMessage","resolver_openai_buttonLabel","resolver_openai_errorMessage","resolver_openai_modalTitle","resolver_openai_submitButtonLabelEmpty","resolver_openai_submitButtonLabelFull","resolver_openai_successMessage","en","uk","zh","translatorT","t","key","options","replace","_","name"],"mappings":"AAEA,OAAO,MAAMA,eAAe;IAC1BC,IAAI;QACF,qBAAqB;YACnBC,kBAAkB;YAClBC,oBAAoB;YACpBC,2BACE;YACFC,uBAAuB;YACvBC,uBAAuB;YACvBC,4BACE;YACFC,0BAA0B;YAC1BC,gBAAgB;YAChBC,sBACE;YACFC,oBACE;YACFC,0BAA0B;YAC1BC,iBAAiB;YACjBC,oBACE;YACFC,mBAAmB;YACnBC,kBAAkB;YAClBC,oBACE;YACFC,mBACE;YACFC,sBAAsB;YACtBC,kBAAkB;YAClBC,sBAAsB;YACtBC,mBAAmB;YACnBC,2BAA2B;YAC3BC,4BAA4B;YAC5BC,0BAA0B;YAC1BC,sCAAsC;YACtCC,qCAAqC;YACrCC,8BACE;YACFC,4BAA4B;YAC5BC,6BAA6B;YAC7BC,2BAA2B;YAC3BC,uCAAuC;YACvCC,sCAAsC;YACtCC,+BACE;YACFC,6BAA6B;YAC7BC,8BAA8B;YAC9BC,4BAA4B;YAC5BC,wCAAwC;YACxCC,uCAAuC;YACvCC,gCACE;YACFC,4BAA4B;YAC5BC,6BAA6B;YAC7BC,2BAA2B;YAC3BC,uCAAuC;YACvCC,sCAAsC;YACtCC,+BACE;YACFC,6BAA6B;YAC7BC,8BAA8B;YAC9BC,4BAA4B;YAC5BC,wCAAwC;YACxCC,uCAAuC;YACvCC,gCACE;QACJ;IACF;IACAC,IAAI;QACF,qBAAqB;YACnBnD,kBAAkB;YAClBC,oBAAoB;YACpBC,2BAA2B;YAC3BC,uBAAuB;YACvBC,uBAAuB;YACvBC,4BAA4B;YAC5BC,0BAA0B;YAC1BC,gBAAgB;YAChBC,sBAAsB;YACtBC,oBAAoB;YACpBC,0BAA0B;YAC1BC,iBAAiB;YACjBC,oBAAoB;YACpBC,mBAAmB;YACnBC,kBAAkB;YAClBC,oBAAoB;YACpBC,mBACE;YACFC,sBAAsB;YACtBC,kBAAkB;YAClBC,sBAAsB;YACtBC,mBAAmB;YACnBC,2BAA2B;YAC3BC,4BAA4B;YAC5BC,0BAA0B;YAC1BC,sCAAsC;YACtCC,qCAAqC;YACrCC,8BAA8B;YAC9BC,4BAA4B;YAC5BC,6BAA6B;YAC7BC,2BAA2B;YAC3BC,uCAAuC;YACvCC,sCAAsC;YACtCC,+BAA+B;YAE/BC,6BAA6B;YAC7BC,8BAA8B;YAC9BC,4BAA4B;YAC5BC,wCAAwC;YACxCC,uCAAuC;YACvCC,gCAAgC;YAEhCC,4BAA4B;YAC5BC,6BAA6B;YAC7BC,2BAA2B;YAC3BC,uCAAuC;YACvCC,sCAAsC;YACtCC,+BAA+B;YAE/BC,6BAA6B;YAC7BC,8BAA8B;YAC9BC,4BAA4B;YAC5BC,wCAAwC;YACxCC,uCAAuC;YACvCC,gCAAgC;QAClC;IACF;IACAE,IAAI;QACF,qBAAqB;YACnB/B,2BAA2B;YAC3BC,4BAA4B;YAC5BC,0BAA0B;YAC1BC,sCAAsC;YACtCC,qCAAqC;YACrCC,8BACE;YAEFO,6BAA6B;YAC7BC,8BAA8B;YAC9BC,4BAA4B;YAC5BC,wCAAwC;YACxCC,uCAAuC;YACvCC,gCACE;YAEFC,4BAA4B;YAC5BC,6BAA6B;YAC7BC,2BAA2B;YAC3BC,uCAAuC;YACvCC,sCAAsC;YACtCC,+BACE;YAEFC,6BAA6B;YAC7BC,8BAA8B;YAC9BC,4BAA4B;YAC5BC,wCAAwC;YACxCC,uCAAuC;YACvCC,gCACE;QACJ;IACF;IACAG,IAAI;QACF,qBAAqB;YACnBhC,2BAA2B;YAC3BC,4BAA4B;YAC5BC,0BAA0B;YAC1BC,sCAAsC;YACtCC,qCAAqC;YACrCC,8BAA8B;YAE9BO,6BAA6B;YAC7BC,8BAA8B;YAC9BC,4BAA4B;YAC5BC,wCAAwC;YACxCC,uCAAuC;YACvCC,gCAAgC;YAEhCC,4BAA4B;YAC5BC,6BAA6B;YAC7BC,2BAA2B;YAC3BC,uCAAuC;YACvCC,sCAAsC;YACtCC,+BAA+B;YAE/BC,6BAA6B;YAC7BC,8BAA8B;YAC9BC,4BAA4B;YAC5BC,wCAAwC;YACxCC,uCAAuC;YACvCC,gCAAgC;QAClC;IACF;AACF,EAAE;AAEF,OAAO,MAAMI,cAAc,CACzBC,GACAC,KACAC,UAEAF,IACIA,EAAE,CAAC,kBAAkB,EAAEC,KAAK,EAAUC,WACtC3D,aAAaqD,EAAE,CAAC,oBAAoB,CAACK,IAAI,CAACE,OAAO,CAC/C,cACA,CAACC,GAAGC,OAAiBH,SAAS,CAACG,KAAK,IAAI,IACxC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import type { Plugin } from 'payload';
|
|
2
2
|
import { translateOperation } from './translate/operation';
|
|
3
3
|
import type { TranslatorConfig } from './types';
|
|
4
|
+
export type { GlossaryConfig } from './glossary';
|
|
4
5
|
export { copyResolver } from './resolvers/copy';
|
|
6
|
+
export type { DeepLResolverConfig } from './resolvers/deepl';
|
|
7
|
+
export { deeplResolver } from './resolvers/deepl';
|
|
5
8
|
export { googleResolver } from './resolvers/google';
|
|
6
9
|
export { libreResolver } from './resolvers/libreTranslate';
|
|
7
10
|
export { openAIResolver } from './resolvers/openAI';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAsD,MAAM,EAAE,MAAM,SAAS,CAAC;AAQ1F,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAEhD,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,YAAY,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAE7D,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAE3D,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,cAAc,mBAAmB,CAAC;AAElC,OAAO,EAAE,kBAAkB,EAAE,CAAC;AAE9B,eAAO,MAAM,UAAU,EAAE,CAAC,YAAY,EAAE,gBAAgB,KAAK,MAoI5D,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
|
+
import { APIError } from 'payload';
|
|
1
2
|
import { deepMerge } from 'payload/shared';
|
|
2
3
|
import { CustomButton } from './client/components/CustomButton';
|
|
3
|
-
import {
|
|
4
|
+
import { createGlossaryEntriesCollection } from './glossaryCollection';
|
|
5
|
+
import { translations, translatorT } from './i18n-translations';
|
|
4
6
|
import { translateEndpoint } from './translate/endpoint';
|
|
5
7
|
import { translateOperation } from './translate/operation';
|
|
6
8
|
export { copyResolver } from './resolvers/copy';
|
|
9
|
+
export { deeplResolver } from './resolvers/deepl';
|
|
7
10
|
export { googleResolver } from './resolvers/google';
|
|
8
11
|
export { libreResolver } from './resolvers/libreTranslate';
|
|
9
12
|
export { openAIResolver } from './resolvers/openAI';
|
|
@@ -11,6 +14,54 @@ export * from './resolvers/types';
|
|
|
11
14
|
export { translateOperation };
|
|
12
15
|
export const translator = (pluginConfig)=>{
|
|
13
16
|
return (config)=>{
|
|
17
|
+
config = {
|
|
18
|
+
...config,
|
|
19
|
+
i18n: {
|
|
20
|
+
...config.i18n,
|
|
21
|
+
translations: deepMerge(translations, config.i18n?.translations ?? {})
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
// Keep the opt-in glossary schema available even when translation is disabled.
|
|
25
|
+
if (pluginConfig.glossary) {
|
|
26
|
+
const sync = async (req, entry)=>{
|
|
27
|
+
const resolver = pluginConfig.resolvers.find((item)=>item.key === 'deepl');
|
|
28
|
+
if (!resolver?.glossary) throw new APIError(translatorT(req.t, 'glossary_missingResolver'), 400, undefined, true);
|
|
29
|
+
await resolver.glossary.sync(req, entry);
|
|
30
|
+
};
|
|
31
|
+
const entries = createGlossaryEntriesCollection(pluginConfig.glossary, pluginConfig.basePath ?? '', sync);
|
|
32
|
+
if (config.collections?.some((collection)=>collection.slug === entries.slug)) {
|
|
33
|
+
throw new Error(`A collection with the glossary slug "${entries.slug}" already exists.`);
|
|
34
|
+
}
|
|
35
|
+
config = {
|
|
36
|
+
...config,
|
|
37
|
+
collections: [
|
|
38
|
+
...config.collections ?? [],
|
|
39
|
+
entries
|
|
40
|
+
],
|
|
41
|
+
endpoints: [
|
|
42
|
+
...config.endpoints ?? [],
|
|
43
|
+
{
|
|
44
|
+
handler: async (req)=>{
|
|
45
|
+
try {
|
|
46
|
+
await sync(req);
|
|
47
|
+
return Response.json({
|
|
48
|
+
success: true
|
|
49
|
+
});
|
|
50
|
+
} catch (error) {
|
|
51
|
+
req.payload.logger.error(error);
|
|
52
|
+
return Response.json({
|
|
53
|
+
error: error instanceof APIError && error.isPublic ? error.message : translatorT(req.t, 'glossary_syncError')
|
|
54
|
+
}, {
|
|
55
|
+
status: 400
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
method: 'post',
|
|
60
|
+
path: '/translator/glossary/sync'
|
|
61
|
+
}
|
|
62
|
+
]
|
|
63
|
+
};
|
|
64
|
+
}
|
|
14
65
|
if (pluginConfig.disabled || !config.localization || config.localization.locales.length < 2) return config;
|
|
15
66
|
const updatedConfig = {
|
|
16
67
|
...config,
|
|
@@ -74,13 +125,7 @@ export const translator = (pluginConfig)=>{
|
|
|
74
125
|
}
|
|
75
126
|
}
|
|
76
127
|
};
|
|
77
|
-
}) ?? []
|
|
78
|
-
i18n: {
|
|
79
|
-
...config.i18n,
|
|
80
|
-
translations: {
|
|
81
|
-
...deepMerge(config.i18n?.translations ?? {}, translations)
|
|
82
|
-
}
|
|
83
|
-
}
|
|
128
|
+
}) ?? []
|
|
84
129
|
};
|
|
85
130
|
return updatedConfig;
|
|
86
131
|
};
|