@chayns-components/translation 5.0.0-beta.1134 → 5.0.0-beta.1137
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/lib/cjs/components/AdaptiveTranslation.js +7 -3
- package/lib/cjs/components/AdaptiveTranslation.js.map +1 -1
- package/lib/cjs/types/translation.js.map +1 -1
- package/lib/cjs/utils/translationHandler.js +4 -1
- package/lib/cjs/utils/translationHandler.js.map +1 -1
- package/lib/esm/components/AdaptiveTranslation.js +7 -3
- package/lib/esm/components/AdaptiveTranslation.js.map +1 -1
- package/lib/esm/types/translation.js.map +1 -1
- package/lib/esm/utils/translationHandler.js +4 -1
- package/lib/esm/utils/translationHandler.js.map +1 -1
- package/lib/types/components/AdaptiveTranslation.d.ts +1 -1
- package/lib/types/types/translation.d.ts +3 -0
- package/package.json +3 -2
|
@@ -5,13 +5,16 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
7
|
var _react = _interopRequireDefault(require("react"));
|
|
8
|
+
var _clsx = _interopRequireDefault(require("clsx"));
|
|
8
9
|
var _useAdaptiveTranslation = require("../hooks/useAdaptiveTranslation");
|
|
9
10
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
10
11
|
const AdaptiveTranslation = ({
|
|
11
12
|
children,
|
|
12
13
|
to,
|
|
13
14
|
from,
|
|
14
|
-
tagName: TagName = 'span'
|
|
15
|
+
tagName: TagName = 'span',
|
|
16
|
+
style,
|
|
17
|
+
className
|
|
15
18
|
}) => {
|
|
16
19
|
const {
|
|
17
20
|
text,
|
|
@@ -22,11 +25,12 @@ const AdaptiveTranslation = ({
|
|
|
22
25
|
to
|
|
23
26
|
});
|
|
24
27
|
return /*#__PURE__*/_react.default.createElement(TagName, {
|
|
25
|
-
className:
|
|
28
|
+
className: (0, _clsx.default)('notranslate', className),
|
|
26
29
|
style: {
|
|
27
30
|
// eslint-disable-next-line no-nested-ternary
|
|
28
31
|
opacity: isLoading ? 0 : isFetching ? 0.5 : 1,
|
|
29
|
-
transition: 'opacity 0.5s ease'
|
|
32
|
+
transition: 'opacity 0.5s ease',
|
|
33
|
+
...style
|
|
30
34
|
}
|
|
31
35
|
}, text);
|
|
32
36
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdaptiveTranslation.js","names":["_react","_interopRequireDefault","require","_useAdaptiveTranslation","e","__esModule","default","AdaptiveTranslation","children","to","from","tagName","TagName","text","isLoading","isFetching","useAdaptiveTranslation","createElement","
|
|
1
|
+
{"version":3,"file":"AdaptiveTranslation.js","names":["_react","_interopRequireDefault","require","_clsx","_useAdaptiveTranslation","e","__esModule","default","AdaptiveTranslation","children","to","from","tagName","TagName","style","className","text","isLoading","isFetching","useAdaptiveTranslation","createElement","clsx","opacity","transition","_default","exports"],"sources":["../../../src/components/AdaptiveTranslation.tsx"],"sourcesContent":["import React from 'react';\nimport clsx from 'clsx';\nimport { useAdaptiveTranslation } from '../hooks/useAdaptiveTranslation';\nimport { TranslationProps } from '../types/translation';\n\nconst AdaptiveTranslation = ({\n children,\n to,\n from,\n tagName: TagName = 'span',\n style,\n className,\n}: TranslationProps) => {\n const { text, isLoading, isFetching } = useAdaptiveTranslation(children, { from, to });\n\n return (\n <TagName\n className={clsx('notranslate', className)}\n style={{\n // eslint-disable-next-line no-nested-ternary\n opacity: isLoading ? 0 : isFetching ? 0.5 : 1,\n transition: 'opacity 0.5s ease',\n ...style,\n }}\n >\n {text}\n </TagName>\n );\n};\nexport default AdaptiveTranslation;\n"],"mappings":";;;;;;AAAC,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACD,IAAAC,KAAA,GAAAF,sBAAA,CAAAC,OAAA;AACA,IAAAE,uBAAA,GAAAF,OAAA;AAAyE,SAAAD,uBAAAI,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAGzE,MAAMG,mBAAmB,GAAGA,CAAC;EACzBC,QAAQ;EACRC,EAAE;EACFC,IAAI;EACJC,OAAO,EAAEC,OAAO,GAAG,MAAM;EACzBC,KAAK;EACLC;AACc,CAAC,KAAK;EACpB,MAAM;IAAEC,IAAI;IAAEC,SAAS;IAAEC;EAAW,CAAC,GAAG,IAAAC,8CAAsB,EAACV,QAAQ,EAAE;IAAEE,IAAI;IAAED;EAAG,CAAC,CAAC;EAEtF,oBACIV,MAAA,CAAAO,OAAA,CAAAa,aAAA,CAACP,OAAO;IACJE,SAAS,EAAE,IAAAM,aAAI,EAAC,aAAa,EAAEN,SAAS,CAAE;IAC1CD,KAAK,EAAE;MACH;MACAQ,OAAO,EAAEL,SAAS,GAAG,CAAC,GAAGC,UAAU,GAAG,GAAG,GAAG,CAAC;MAC7CK,UAAU,EAAE,mBAAmB;MAC/B,GAAGT;IACP;EAAE,GAEDE,IACI,CAAC;AAElB,CAAC;AAAC,IAAAQ,QAAA,GAAAC,OAAA,CAAAlB,OAAA,GACaC,mBAAmB","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"translation.js","names":[],"sources":["../../../src/types/translation.ts"],"sourcesContent":["import { Language } from 'chayns-api';\nimport { Deferred } from '../utils/deferred';\n\nexport interface TranslationProps {\n children: string;\n to?: Exclude<Language, Language.Unknown>;\n from?: Exclude<Language, Language.Unknown>;\n tagName?: keyof HTMLElementTagNameMap;\n}\n\ninterface BaseTranslation {\n text: string;\n to: string;\n from: string;\n}\n\nexport interface QueuedItem extends BaseTranslation {\n deferred: Deferred<string>;\n}\n\nexport interface TranslationBatchItem extends TranslationRequest {\n deferred: Deferred<string>;\n}\n\nexport interface TranslationRequest extends BaseTranslation {\n id: number;\n}\n"],"mappings":"","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"translation.js","names":[],"sources":["../../../src/types/translation.ts"],"sourcesContent":["import { Language } from 'chayns-api';\nimport React from 'react';\nimport { Deferred } from '../utils/deferred';\n\nexport interface TranslationProps {\n children: string;\n to?: Exclude<Language, Language.Unknown>;\n from?: Exclude<Language, Language.Unknown>;\n tagName?: keyof HTMLElementTagNameMap;\n style?: React.CSSProperties;\n className?: string;\n}\n\ninterface BaseTranslation {\n text: string;\n to: string;\n from: string;\n}\n\nexport interface QueuedItem extends BaseTranslation {\n deferred: Deferred<string>;\n}\n\nexport interface TranslationBatchItem extends TranslationRequest {\n deferred: Deferred<string>;\n}\n\nexport interface TranslationRequest extends BaseTranslation {\n id: number;\n}\n"],"mappings":"","ignoreList":[]}
|
|
@@ -68,7 +68,7 @@ class TranslationHandler {
|
|
|
68
68
|
await this.#handleTranslation(batch);
|
|
69
69
|
}
|
|
70
70
|
};
|
|
71
|
-
#throttledProcessTranslationQueue = (0, _lodash.default)(this.#processedTranslationQueue,
|
|
71
|
+
#throttledProcessTranslationQueue = (0, _lodash.default)(this.#processedTranslationQueue, 200, {
|
|
72
72
|
leading: false
|
|
73
73
|
});
|
|
74
74
|
translateText = (original, from, to) => {
|
|
@@ -89,6 +89,9 @@ class TranslationHandler {
|
|
|
89
89
|
from
|
|
90
90
|
});
|
|
91
91
|
void this.#throttledProcessTranslationQueue();
|
|
92
|
+
if (this.translationQueue.length >= _constants.MAX_ITEMS_PER_BATCH) {
|
|
93
|
+
void this.#throttledProcessTranslationQueue.flush();
|
|
94
|
+
}
|
|
92
95
|
return deferred.promise;
|
|
93
96
|
};
|
|
94
97
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"translationHandler.js","names":["_constants","require","_lodash","_interopRequireDefault","_deferred","_translation","e","__esModule","default","TranslationHandler","translationQueue","cachedTranslations","handleTranslation","batch","result","fetchTranslations","map","deferred","d","item","forEach","index","batchItem","from","to","text","resolve","ex","reject","processedTranslationQueue","#processedTranslationQueue","totalLength","length","shift","push","id","BATCH_SIZE_LIMIT","MAX_ITEMS_PER_BATCH","throttledProcessTranslationQueue","throttle","leading","translateText","original","_this$cachedTranslati","cachedTranslation","Promise","existingItem","find","promise","Deferred","translationHandler","_default","exports"],"sources":["../../../src/utils/translationHandler.ts"],"sourcesContent":["import { QueuedItem, TranslationBatchItem } from '../types/translation';\nimport { BATCH_SIZE_LIMIT, MAX_ITEMS_PER_BATCH } from '../constants/constants';\nimport throttle from 'lodash.throttle';\nimport { Deferred } from './deferred';\nimport { fetchTranslations } from '../api/translation';\n\nclass TranslationHandler {\n translationQueue: QueuedItem[] = [];\n\n cachedTranslations: Record<string, Record<string, Record<string, string>>> = {};\n\n #handleTranslation = async (batch: TranslationBatchItem[]) => {\n try {\n const result = await fetchTranslations(batch.map(({ deferred: d, ...item }) => item));\n\n result.forEach((item, index) => {\n const batchItem = batch[index];\n\n if (!batchItem) {\n return;\n }\n\n const { from, to, text } = batchItem;\n\n batchItem.deferred.resolve(item);\n this.cachedTranslations[from] ??= {};\n this.cachedTranslations[from][to] ??= {};\n this.cachedTranslations[from][to][text] = item;\n });\n } catch (ex) {\n batch.forEach((item) => {\n item.deferred.reject(ex);\n });\n }\n };\n\n #processedTranslationQueue = async () => {\n let totalLength = 0;\n let batch: TranslationBatchItem[] = [];\n\n while (this.translationQueue.length) {\n const { text, deferred, to, from } = this.translationQueue.shift() as QueuedItem;\n totalLength += text.length;\n batch.push({\n text,\n to,\n from,\n id: batch.length,\n deferred,\n });\n\n if (totalLength > BATCH_SIZE_LIMIT || batch.length >= MAX_ITEMS_PER_BATCH) {\n // eslint-disable-next-line no-await-in-loop\n await this.#handleTranslation(batch);\n batch = [];\n totalLength = 0;\n }\n }\n\n if (batch.length > 0) {\n await this.#handleTranslation(batch);\n }\n };\n\n #throttledProcessTranslationQueue = throttle(this.#processedTranslationQueue,
|
|
1
|
+
{"version":3,"file":"translationHandler.js","names":["_constants","require","_lodash","_interopRequireDefault","_deferred","_translation","e","__esModule","default","TranslationHandler","translationQueue","cachedTranslations","handleTranslation","batch","result","fetchTranslations","map","deferred","d","item","forEach","index","batchItem","from","to","text","resolve","ex","reject","processedTranslationQueue","#processedTranslationQueue","totalLength","length","shift","push","id","BATCH_SIZE_LIMIT","MAX_ITEMS_PER_BATCH","throttledProcessTranslationQueue","throttle","leading","translateText","original","_this$cachedTranslati","cachedTranslation","Promise","existingItem","find","promise","Deferred","flush","translationHandler","_default","exports"],"sources":["../../../src/utils/translationHandler.ts"],"sourcesContent":["import { QueuedItem, TranslationBatchItem } from '../types/translation';\nimport { BATCH_SIZE_LIMIT, MAX_ITEMS_PER_BATCH } from '../constants/constants';\nimport throttle from 'lodash.throttle';\nimport { Deferred } from './deferred';\nimport { fetchTranslations } from '../api/translation';\n\nclass TranslationHandler {\n translationQueue: QueuedItem[] = [];\n\n cachedTranslations: Record<string, Record<string, Record<string, string>>> = {};\n\n #handleTranslation = async (batch: TranslationBatchItem[]) => {\n try {\n const result = await fetchTranslations(batch.map(({ deferred: d, ...item }) => item));\n\n result.forEach((item, index) => {\n const batchItem = batch[index];\n\n if (!batchItem) {\n return;\n }\n\n const { from, to, text } = batchItem;\n\n batchItem.deferred.resolve(item);\n this.cachedTranslations[from] ??= {};\n this.cachedTranslations[from][to] ??= {};\n this.cachedTranslations[from][to][text] = item;\n });\n } catch (ex) {\n batch.forEach((item) => {\n item.deferred.reject(ex);\n });\n }\n };\n\n #processedTranslationQueue = async () => {\n let totalLength = 0;\n let batch: TranslationBatchItem[] = [];\n\n while (this.translationQueue.length) {\n const { text, deferred, to, from } = this.translationQueue.shift() as QueuedItem;\n totalLength += text.length;\n batch.push({\n text,\n to,\n from,\n id: batch.length,\n deferred,\n });\n\n if (totalLength > BATCH_SIZE_LIMIT || batch.length >= MAX_ITEMS_PER_BATCH) {\n // eslint-disable-next-line no-await-in-loop\n await this.#handleTranslation(batch);\n batch = [];\n totalLength = 0;\n }\n }\n\n if (batch.length > 0) {\n await this.#handleTranslation(batch);\n }\n };\n\n #throttledProcessTranslationQueue = throttle(this.#processedTranslationQueue, 200, {\n leading: false,\n });\n\n translateText = (original: string, from: string, to: string) => {\n const cachedTranslation = this.cachedTranslations[from]?.[to]?.[original];\n if (typeof cachedTranslation === 'string') {\n return Promise.resolve(cachedTranslation);\n }\n\n const existingItem = this.translationQueue.find(\n (item) => item.text === original && item.to === to && item.from === from,\n );\n if (existingItem) {\n return existingItem.deferred.promise;\n }\n const deferred = new Deferred<string>();\n this.translationQueue.push({ text: original, deferred, to, from });\n void this.#throttledProcessTranslationQueue();\n if (this.translationQueue.length >= MAX_ITEMS_PER_BATCH) {\n void this.#throttledProcessTranslationQueue.flush();\n }\n return deferred.promise;\n };\n}\n\nconst translationHandler = new TranslationHandler();\n\nexport default translationHandler;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
+
import clsx from 'clsx';
|
|
2
3
|
import { useAdaptiveTranslation } from '../hooks/useAdaptiveTranslation';
|
|
3
4
|
const AdaptiveTranslation = _ref => {
|
|
4
5
|
let {
|
|
5
6
|
children,
|
|
6
7
|
to,
|
|
7
8
|
from,
|
|
8
|
-
tagName: TagName = 'span'
|
|
9
|
+
tagName: TagName = 'span',
|
|
10
|
+
style,
|
|
11
|
+
className
|
|
9
12
|
} = _ref;
|
|
10
13
|
const {
|
|
11
14
|
text,
|
|
@@ -16,11 +19,12 @@ const AdaptiveTranslation = _ref => {
|
|
|
16
19
|
to
|
|
17
20
|
});
|
|
18
21
|
return /*#__PURE__*/React.createElement(TagName, {
|
|
19
|
-
className:
|
|
22
|
+
className: clsx('notranslate', className),
|
|
20
23
|
style: {
|
|
21
24
|
// eslint-disable-next-line no-nested-ternary
|
|
22
25
|
opacity: isLoading ? 0 : isFetching ? 0.5 : 1,
|
|
23
|
-
transition: 'opacity 0.5s ease'
|
|
26
|
+
transition: 'opacity 0.5s ease',
|
|
27
|
+
...style
|
|
24
28
|
}
|
|
25
29
|
}, text);
|
|
26
30
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdaptiveTranslation.js","names":["React","useAdaptiveTranslation","AdaptiveTranslation","_ref","children","to","from","tagName","TagName","
|
|
1
|
+
{"version":3,"file":"AdaptiveTranslation.js","names":["React","clsx","useAdaptiveTranslation","AdaptiveTranslation","_ref","children","to","from","tagName","TagName","style","className","text","isLoading","isFetching","createElement","opacity","transition"],"sources":["../../../src/components/AdaptiveTranslation.tsx"],"sourcesContent":["import React from 'react';\nimport clsx from 'clsx';\nimport { useAdaptiveTranslation } from '../hooks/useAdaptiveTranslation';\nimport { TranslationProps } from '../types/translation';\n\nconst AdaptiveTranslation = ({\n children,\n to,\n from,\n tagName: TagName = 'span',\n style,\n className,\n}: TranslationProps) => {\n const { text, isLoading, isFetching } = useAdaptiveTranslation(children, { from, to });\n\n return (\n <TagName\n className={clsx('notranslate', className)}\n style={{\n // eslint-disable-next-line no-nested-ternary\n opacity: isLoading ? 0 : isFetching ? 0.5 : 1,\n transition: 'opacity 0.5s ease',\n ...style,\n }}\n >\n {text}\n </TagName>\n );\n};\nexport default AdaptiveTranslation;\n"],"mappings":"AAAC,OAAOA,KAAK,MAAM,OAAO;AAC1B,OAAOC,IAAI,MAAM,MAAM;AACvB,SAASC,sBAAsB,QAAQ,iCAAiC;AAGxE,MAAMC,mBAAmB,GAAGC,IAAA,IAOJ;EAAA,IAPK;IACzBC,QAAQ;IACRC,EAAE;IACFC,IAAI;IACJC,OAAO,EAAEC,OAAO,GAAG,MAAM;IACzBC,KAAK;IACLC;EACc,CAAC,GAAAP,IAAA;EACf,MAAM;IAAEQ,IAAI;IAAEC,SAAS;IAAEC;EAAW,CAAC,GAAGZ,sBAAsB,CAACG,QAAQ,EAAE;IAAEE,IAAI;IAAED;EAAG,CAAC,CAAC;EAEtF,oBACIN,KAAA,CAAAe,aAAA,CAACN,OAAO;IACJE,SAAS,EAAEV,IAAI,CAAC,aAAa,EAAEU,SAAS,CAAE;IAC1CD,KAAK,EAAE;MACH;MACAM,OAAO,EAAEH,SAAS,GAAG,CAAC,GAAGC,UAAU,GAAG,GAAG,GAAG,CAAC;MAC7CG,UAAU,EAAE,mBAAmB;MAC/B,GAAGP;IACP;EAAE,GAEDE,IACI,CAAC;AAElB,CAAC;AACD,eAAeT,mBAAmB","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"translation.js","names":[],"sources":["../../../src/types/translation.ts"],"sourcesContent":["import { Language } from 'chayns-api';\nimport { Deferred } from '../utils/deferred';\n\nexport interface TranslationProps {\n children: string;\n to?: Exclude<Language, Language.Unknown>;\n from?: Exclude<Language, Language.Unknown>;\n tagName?: keyof HTMLElementTagNameMap;\n}\n\ninterface BaseTranslation {\n text: string;\n to: string;\n from: string;\n}\n\nexport interface QueuedItem extends BaseTranslation {\n deferred: Deferred<string>;\n}\n\nexport interface TranslationBatchItem extends TranslationRequest {\n deferred: Deferred<string>;\n}\n\nexport interface TranslationRequest extends BaseTranslation {\n id: number;\n}\n"],"mappings":"","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"translation.js","names":[],"sources":["../../../src/types/translation.ts"],"sourcesContent":["import { Language } from 'chayns-api';\nimport React from 'react';\nimport { Deferred } from '../utils/deferred';\n\nexport interface TranslationProps {\n children: string;\n to?: Exclude<Language, Language.Unknown>;\n from?: Exclude<Language, Language.Unknown>;\n tagName?: keyof HTMLElementTagNameMap;\n style?: React.CSSProperties;\n className?: string;\n}\n\ninterface BaseTranslation {\n text: string;\n to: string;\n from: string;\n}\n\nexport interface QueuedItem extends BaseTranslation {\n deferred: Deferred<string>;\n}\n\nexport interface TranslationBatchItem extends TranslationRequest {\n deferred: Deferred<string>;\n}\n\nexport interface TranslationRequest extends BaseTranslation {\n id: number;\n}\n"],"mappings":"","ignoreList":[]}
|
|
@@ -64,7 +64,7 @@ class TranslationHandler {
|
|
|
64
64
|
await this.#handleTranslation(batch);
|
|
65
65
|
}
|
|
66
66
|
};
|
|
67
|
-
#throttledProcessTranslationQueue = (() => throttle(this.#processedTranslationQueue,
|
|
67
|
+
#throttledProcessTranslationQueue = (() => throttle(this.#processedTranslationQueue, 200, {
|
|
68
68
|
leading: false
|
|
69
69
|
}))();
|
|
70
70
|
translateText = (original, from, to) => {
|
|
@@ -84,6 +84,9 @@ class TranslationHandler {
|
|
|
84
84
|
from
|
|
85
85
|
});
|
|
86
86
|
void this.#throttledProcessTranslationQueue();
|
|
87
|
+
if (this.translationQueue.length >= MAX_ITEMS_PER_BATCH) {
|
|
88
|
+
void this.#throttledProcessTranslationQueue.flush();
|
|
89
|
+
}
|
|
87
90
|
return deferred.promise;
|
|
88
91
|
};
|
|
89
92
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"translationHandler.js","names":["BATCH_SIZE_LIMIT","MAX_ITEMS_PER_BATCH","throttle","Deferred","fetchTranslations","TranslationHandler","translationQueue","cachedTranslations","handleTranslation","batch","result","map","_ref","deferred","d","item","forEach","index","batchItem","from","to","text","resolve","ex","reject","processedTranslationQueue","#processedTranslationQueue","totalLength","length","shift","push","id","throttledProcessTranslationQueue","leading","translateText","original","cachedTranslation","Promise","existingItem","find","promise","translationHandler"],"sources":["../../../src/utils/translationHandler.ts"],"sourcesContent":["import { QueuedItem, TranslationBatchItem } from '../types/translation';\nimport { BATCH_SIZE_LIMIT, MAX_ITEMS_PER_BATCH } from '../constants/constants';\nimport throttle from 'lodash.throttle';\nimport { Deferred } from './deferred';\nimport { fetchTranslations } from '../api/translation';\n\nclass TranslationHandler {\n translationQueue: QueuedItem[] = [];\n\n cachedTranslations: Record<string, Record<string, Record<string, string>>> = {};\n\n #handleTranslation = async (batch: TranslationBatchItem[]) => {\n try {\n const result = await fetchTranslations(batch.map(({ deferred: d, ...item }) => item));\n\n result.forEach((item, index) => {\n const batchItem = batch[index];\n\n if (!batchItem) {\n return;\n }\n\n const { from, to, text } = batchItem;\n\n batchItem.deferred.resolve(item);\n this.cachedTranslations[from] ??= {};\n this.cachedTranslations[from][to] ??= {};\n this.cachedTranslations[from][to][text] = item;\n });\n } catch (ex) {\n batch.forEach((item) => {\n item.deferred.reject(ex);\n });\n }\n };\n\n #processedTranslationQueue = async () => {\n let totalLength = 0;\n let batch: TranslationBatchItem[] = [];\n\n while (this.translationQueue.length) {\n const { text, deferred, to, from } = this.translationQueue.shift() as QueuedItem;\n totalLength += text.length;\n batch.push({\n text,\n to,\n from,\n id: batch.length,\n deferred,\n });\n\n if (totalLength > BATCH_SIZE_LIMIT || batch.length >= MAX_ITEMS_PER_BATCH) {\n // eslint-disable-next-line no-await-in-loop\n await this.#handleTranslation(batch);\n batch = [];\n totalLength = 0;\n }\n }\n\n if (batch.length > 0) {\n await this.#handleTranslation(batch);\n }\n };\n\n #throttledProcessTranslationQueue = throttle(this.#processedTranslationQueue,
|
|
1
|
+
{"version":3,"file":"translationHandler.js","names":["BATCH_SIZE_LIMIT","MAX_ITEMS_PER_BATCH","throttle","Deferred","fetchTranslations","TranslationHandler","translationQueue","cachedTranslations","handleTranslation","batch","result","map","_ref","deferred","d","item","forEach","index","batchItem","from","to","text","resolve","ex","reject","processedTranslationQueue","#processedTranslationQueue","totalLength","length","shift","push","id","throttledProcessTranslationQueue","leading","translateText","original","cachedTranslation","Promise","existingItem","find","promise","flush","translationHandler"],"sources":["../../../src/utils/translationHandler.ts"],"sourcesContent":["import { QueuedItem, TranslationBatchItem } from '../types/translation';\nimport { BATCH_SIZE_LIMIT, MAX_ITEMS_PER_BATCH } from '../constants/constants';\nimport throttle from 'lodash.throttle';\nimport { Deferred } from './deferred';\nimport { fetchTranslations } from '../api/translation';\n\nclass TranslationHandler {\n translationQueue: QueuedItem[] = [];\n\n cachedTranslations: Record<string, Record<string, Record<string, string>>> = {};\n\n #handleTranslation = async (batch: TranslationBatchItem[]) => {\n try {\n const result = await fetchTranslations(batch.map(({ deferred: d, ...item }) => item));\n\n result.forEach((item, index) => {\n const batchItem = batch[index];\n\n if (!batchItem) {\n return;\n }\n\n const { from, to, text } = batchItem;\n\n batchItem.deferred.resolve(item);\n this.cachedTranslations[from] ??= {};\n this.cachedTranslations[from][to] ??= {};\n this.cachedTranslations[from][to][text] = item;\n });\n } catch (ex) {\n batch.forEach((item) => {\n item.deferred.reject(ex);\n });\n }\n };\n\n #processedTranslationQueue = async () => {\n let totalLength = 0;\n let batch: TranslationBatchItem[] = [];\n\n while (this.translationQueue.length) {\n const { text, deferred, to, from } = this.translationQueue.shift() as QueuedItem;\n totalLength += text.length;\n batch.push({\n text,\n to,\n from,\n id: batch.length,\n deferred,\n });\n\n if (totalLength > BATCH_SIZE_LIMIT || batch.length >= MAX_ITEMS_PER_BATCH) {\n // eslint-disable-next-line no-await-in-loop\n await this.#handleTranslation(batch);\n batch = [];\n totalLength = 0;\n }\n }\n\n if (batch.length > 0) {\n await this.#handleTranslation(batch);\n }\n };\n\n #throttledProcessTranslationQueue = throttle(this.#processedTranslationQueue, 200, {\n leading: false,\n });\n\n translateText = (original: string, from: string, to: string) => {\n const cachedTranslation = this.cachedTranslations[from]?.[to]?.[original];\n if (typeof cachedTranslation === 'string') {\n return Promise.resolve(cachedTranslation);\n }\n\n const existingItem = this.translationQueue.find(\n (item) => item.text === original && item.to === to && item.from === from,\n );\n if (existingItem) {\n return existingItem.deferred.promise;\n }\n const deferred = new Deferred<string>();\n this.translationQueue.push({ text: original, deferred, to, from });\n void this.#throttledProcessTranslationQueue();\n if (this.translationQueue.length >= MAX_ITEMS_PER_BATCH) {\n void this.#throttledProcessTranslationQueue.flush();\n }\n return deferred.promise;\n };\n}\n\nconst translationHandler = new TranslationHandler();\n\nexport default translationHandler;\n"],"mappings":"AACA,SAASA,gBAAgB,EAAEC,mBAAmB,QAAQ,wBAAwB;AAC9E,OAAOC,QAAQ,MAAM,iBAAiB;AACtC,SAASC,QAAQ,QAAQ,YAAY;AACrC,SAASC,iBAAiB,QAAQ,oBAAoB;AAEtD,MAAMC,kBAAkB,CAAC;EACrBC,gBAAgB,GAAiB,EAAE;EAEnCC,kBAAkB,GAA2D,CAAC,CAAC;EAE/E,CAACC,iBAAiB,GAAG,MAAOC,KAA6B,IAAK;IAC1D,IAAI;MACA,MAAMC,MAAM,GAAG,MAAMN,iBAAiB,CAACK,KAAK,CAACE,GAAG,CAACC,IAAA;QAAA,IAAC;UAAEC,QAAQ,EAAEC,CAAC;UAAE,GAAGC;QAAK,CAAC,GAAAH,IAAA;QAAA,OAAKG,IAAI;MAAA,EAAC,CAAC;MAErFL,MAAM,CAACM,OAAO,CAAC,CAACD,IAAI,EAAEE,KAAK,KAAK;QAC5B,MAAMC,SAAS,GAAGT,KAAK,CAACQ,KAAK,CAAC;QAE9B,IAAI,CAACC,SAAS,EAAE;UACZ;QACJ;QAEA,MAAM;UAAEC,IAAI;UAAEC,EAAE;UAAEC;QAAK,CAAC,GAAGH,SAAS;QAEpCA,SAAS,CAACL,QAAQ,CAACS,OAAO,CAACP,IAAI,CAAC;QAChC,IAAI,CAACR,kBAAkB,CAACY,IAAI,CAAC,KAAK,CAAC,CAAC;QACpC,IAAI,CAACZ,kBAAkB,CAACY,IAAI,CAAC,CAACC,EAAE,CAAC,KAAK,CAAC,CAAC;QACxC,IAAI,CAACb,kBAAkB,CAACY,IAAI,CAAC,CAACC,EAAE,CAAC,CAACC,IAAI,CAAC,GAAGN,IAAI;MAClD,CAAC,CAAC;IACN,CAAC,CAAC,OAAOQ,EAAE,EAAE;MACTd,KAAK,CAACO,OAAO,CAAED,IAAI,IAAK;QACpBA,IAAI,CAACF,QAAQ,CAACW,MAAM,CAACD,EAAE,CAAC;MAC5B,CAAC,CAAC;IACN;EACJ,CAAC;EAED,CAACE,yBAAyB,GAAG,MAAAC,CAAA,KAAY;IACrC,IAAIC,WAAW,GAAG,CAAC;IACnB,IAAIlB,KAA6B,GAAG,EAAE;IAEtC,OAAO,IAAI,CAACH,gBAAgB,CAACsB,MAAM,EAAE;MACjC,MAAM;QAAEP,IAAI;QAAER,QAAQ;QAAEO,EAAE;QAAED;MAAK,CAAC,GAAG,IAAI,CAACb,gBAAgB,CAACuB,KAAK,CAAC,CAAe;MAChFF,WAAW,IAAIN,IAAI,CAACO,MAAM;MAC1BnB,KAAK,CAACqB,IAAI,CAAC;QACPT,IAAI;QACJD,EAAE;QACFD,IAAI;QACJY,EAAE,EAAEtB,KAAK,CAACmB,MAAM;QAChBf;MACJ,CAAC,CAAC;MAEF,IAAIc,WAAW,GAAG3B,gBAAgB,IAAIS,KAAK,CAACmB,MAAM,IAAI3B,mBAAmB,EAAE;QACvE;QACA,MAAM,IAAI,CAAC,CAACO,iBAAiB,CAACC,KAAK,CAAC;QACpCA,KAAK,GAAG,EAAE;QACVkB,WAAW,GAAG,CAAC;MACnB;IACJ;IAEA,IAAIlB,KAAK,CAACmB,MAAM,GAAG,CAAC,EAAE;MAClB,MAAM,IAAI,CAAC,CAACpB,iBAAiB,CAACC,KAAK,CAAC;IACxC;EACJ,CAAC;EAED,CAACuB,gCAAgC,UAAG9B,QAAQ,CAAC,IAAI,CAAC,CAACuB,yBAAyB,EAAE,GAAG,EAAE;IAC/EQ,OAAO,EAAE;EACb,CAAC,CAAC;EAEFC,aAAa,GAAGA,CAACC,QAAgB,EAAEhB,IAAY,EAAEC,EAAU,KAAK;IAC5D,MAAMgB,iBAAiB,GAAG,IAAI,CAAC7B,kBAAkB,CAACY,IAAI,CAAC,GAAGC,EAAE,CAAC,GAAGe,QAAQ,CAAC;IACzE,IAAI,OAAOC,iBAAiB,KAAK,QAAQ,EAAE;MACvC,OAAOC,OAAO,CAACf,OAAO,CAACc,iBAAiB,CAAC;IAC7C;IAEA,MAAME,YAAY,GAAG,IAAI,CAAChC,gBAAgB,CAACiC,IAAI,CAC1CxB,IAAI,IAAKA,IAAI,CAACM,IAAI,KAAKc,QAAQ,IAAIpB,IAAI,CAACK,EAAE,KAAKA,EAAE,IAAIL,IAAI,CAACI,IAAI,KAAKA,IACxE,CAAC;IACD,IAAImB,YAAY,EAAE;MACd,OAAOA,YAAY,CAACzB,QAAQ,CAAC2B,OAAO;IACxC;IACA,MAAM3B,QAAQ,GAAG,IAAIV,QAAQ,CAAS,CAAC;IACvC,IAAI,CAACG,gBAAgB,CAACwB,IAAI,CAAC;MAAET,IAAI,EAAEc,QAAQ;MAAEtB,QAAQ;MAAEO,EAAE;MAAED;IAAK,CAAC,CAAC;IAClE,KAAK,IAAI,CAAC,CAACa,gCAAgC,CAAC,CAAC;IAC7C,IAAI,IAAI,CAAC1B,gBAAgB,CAACsB,MAAM,IAAI3B,mBAAmB,EAAE;MACrD,KAAK,IAAI,CAAC,CAAC+B,gCAAgC,CAACS,KAAK,CAAC,CAAC;IACvD;IACA,OAAO5B,QAAQ,CAAC2B,OAAO;EAC3B,CAAC;AACL;AAEA,MAAME,kBAAkB,GAAG,IAAIrC,kBAAkB,CAAC,CAAC;AAEnD,eAAeqC,kBAAkB","ignoreList":[]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { TranslationProps } from '../types/translation';
|
|
3
|
-
declare const AdaptiveTranslation: ({ children, to, from, tagName: TagName, }: TranslationProps) => React.JSX.Element;
|
|
3
|
+
declare const AdaptiveTranslation: ({ children, to, from, tagName: TagName, style, className, }: TranslationProps) => React.JSX.Element;
|
|
4
4
|
export default AdaptiveTranslation;
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import { Language } from 'chayns-api';
|
|
2
|
+
import React from 'react';
|
|
2
3
|
import { Deferred } from '../utils/deferred';
|
|
3
4
|
export interface TranslationProps {
|
|
4
5
|
children: string;
|
|
5
6
|
to?: Exclude<Language, Language.Unknown>;
|
|
6
7
|
from?: Exclude<Language, Language.Unknown>;
|
|
7
8
|
tagName?: keyof HTMLElementTagNameMap;
|
|
9
|
+
style?: React.CSSProperties;
|
|
10
|
+
className?: string;
|
|
8
11
|
}
|
|
9
12
|
interface BaseTranslation {
|
|
10
13
|
text: string;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@chayns-components/translation",
|
|
3
|
-
"version": "5.0.0-beta.
|
|
3
|
+
"version": "5.0.0-beta.1137",
|
|
4
4
|
"description": "A set of beautiful React components for developing your own applications with chayns.",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"browserslist": [
|
|
@@ -67,6 +67,7 @@
|
|
|
67
67
|
"typescript": "^5.8.3"
|
|
68
68
|
},
|
|
69
69
|
"dependencies": {
|
|
70
|
+
"clsx": "^2.1.1",
|
|
70
71
|
"lodash.throttle": "^4.1.1"
|
|
71
72
|
},
|
|
72
73
|
"peerDependencies": {
|
|
@@ -77,5 +78,5 @@
|
|
|
77
78
|
"publishConfig": {
|
|
78
79
|
"access": "public"
|
|
79
80
|
},
|
|
80
|
-
"gitHead": "
|
|
81
|
+
"gitHead": "64ec29f2750c1ee25e1c01c5ab1446d4594f403d"
|
|
81
82
|
}
|