@theia/localization-manager 1.57.1 → 1.58.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/lib/deepl-api.d.ts.map +1 -1
- package/lib/deepl-api.js +26 -5
- package/lib/deepl-api.js.map +1 -1
- package/package.json +4 -3
- package/src/deepl-api.ts +26 -5
package/lib/deepl-api.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deepl-api.d.ts","sourceRoot":"","sources":["../src/deepl-api.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"deepl-api.d.ts","sourceRoot":"","sources":["../src/deepl-api.ts"],"names":[],"mappings":"AA4BA,wBAAsB,KAAK,CACvB,UAAU,EAAE,eAAe,GAC5B,OAAO,CAAC,aAAa,CAAC,CAsBxB;AA4DD,MAAM,MAAM,aAAa,GACnB,IAAI,GACJ,IAAI,GACJ,IAAI,GACJ,IAAI,GACJ,IAAI,GACJ,OAAO,GACP,OAAO,GACP,IAAI,GACJ,IAAI,GACJ,IAAI,GACJ,IAAI,GACJ,IAAI,GACJ,IAAI,GACJ,IAAI,GACJ,IAAI,GACJ,IAAI,GACJ,IAAI,GACJ,IAAI,GACJ,IAAI,GACJ,IAAI,GACJ,IAAI,GACJ,IAAI,GACJ,OAAO,GACP,OAAO,GACP,IAAI,GACJ,IAAI,GACJ,IAAI,GACJ,IAAI,GACJ,IAAI,GACJ,IAAI,GACJ,IAAI,GACJ,IAAI,GACJ,OAAO,GACP,OAAO,GACP,SAAS,GACT,SAAS,GACT,IAAI,CAAC;AAEX,eAAO,MAAM,kBAAkB,UAG9B,CAAC;AAGF,eAAO,MAAM,gBAAgB,wGAEnB,CAAC;AAEX,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,IAAI,aAAa,CAE/E;AAED,MAAM,WAAW,eAAe;IAC5B,QAAQ,EAAE,OAAO,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,EAAE,CAAA;IACd,WAAW,CAAC,EAAE,aAAa,CAAA;IAC3B,WAAW,EAAE,aAAa,CAAA;IAC1B,eAAe,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,YAAY,CAAA;IAC1C,mBAAmB,CAAC,EAAE,GAAG,GAAG,GAAG,CAAA;IAC/B,SAAS,CAAC,EAAE,SAAS,GAAG,MAAM,GAAG,MAAM,CAAA;IACvC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IACvB,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC7B,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAA;IACzB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;CACzB;AAED,MAAM,WAAW,aAAa;IAC1B,YAAY,EAAE,gBAAgB,EAAE,CAAA;CACnC;AAED,MAAM,WAAW,gBAAgB;IAC7B,wBAAwB,EAAE,MAAM,CAAA;IAChC,IAAI,EAAE,MAAM,CAAA;CACf"}
|
package/lib/deepl-api.js
CHANGED
|
@@ -17,9 +17,15 @@
|
|
|
17
17
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
18
|
exports.isSupportedLanguage = exports.defaultLanguages = exports.supportedLanguages = exports.deepl = void 0;
|
|
19
19
|
const bent = require("bent");
|
|
20
|
+
const limiter_1 = require("limiter");
|
|
20
21
|
const post = bent('POST', 'json', 200);
|
|
21
22
|
// 50 is the maximum amount of translations per request
|
|
22
23
|
const deeplLimit = 50;
|
|
24
|
+
const rateLimiter = new limiter_1.RateLimiter({
|
|
25
|
+
tokensPerInterval: 10,
|
|
26
|
+
interval: 'second',
|
|
27
|
+
fireImmediately: true
|
|
28
|
+
});
|
|
23
29
|
async function deepl(parameters) {
|
|
24
30
|
coerceLanguage(parameters);
|
|
25
31
|
const sub_domain = parameters.free_api ? 'api-free' : 'api';
|
|
@@ -28,12 +34,11 @@ async function deepl(parameters) {
|
|
|
28
34
|
while (textArray.length > 0) {
|
|
29
35
|
textChunks.push(textArray.splice(0, deeplLimit));
|
|
30
36
|
}
|
|
31
|
-
const responses = await Promise.all(textChunks.map(chunk => {
|
|
37
|
+
const responses = await Promise.all(textChunks.map(async (chunk) => {
|
|
32
38
|
const parameterCopy = { ...parameters, text: chunk };
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
});
|
|
39
|
+
const url = `https://${sub_domain}.deepl.com/v2/translate`;
|
|
40
|
+
const buffer = Buffer.from(toFormData(parameterCopy));
|
|
41
|
+
return postWithRetry(url, buffer, 1);
|
|
37
42
|
}));
|
|
38
43
|
const mergedResponse = { translations: [] };
|
|
39
44
|
for (const response of responses) {
|
|
@@ -45,6 +50,22 @@ async function deepl(parameters) {
|
|
|
45
50
|
return mergedResponse;
|
|
46
51
|
}
|
|
47
52
|
exports.deepl = deepl;
|
|
53
|
+
async function postWithRetry(url, buffer, attempt) {
|
|
54
|
+
try {
|
|
55
|
+
await rateLimiter.removeTokens(Math.min(attempt, 10));
|
|
56
|
+
const response = await post(url, buffer, {
|
|
57
|
+
'Content-Type': 'application/x-www-form-urlencoded',
|
|
58
|
+
'User-Agent': 'Theia-Localization-Manager'
|
|
59
|
+
});
|
|
60
|
+
return response;
|
|
61
|
+
}
|
|
62
|
+
catch (e) {
|
|
63
|
+
if ('message' in e && typeof e.message === 'string' && e.message.includes('Too Many Requests')) {
|
|
64
|
+
return postWithRetry(url, buffer, attempt + 1);
|
|
65
|
+
}
|
|
66
|
+
throw e;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
48
69
|
/**
|
|
49
70
|
* Coerces the target language into a form expected by Deepl.
|
|
50
71
|
*
|
package/lib/deepl-api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deepl-api.js","sourceRoot":"","sources":["../src/deepl-api.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,yCAAyC;AACzC,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;;;AAEhF,6BAA6B;
|
|
1
|
+
{"version":3,"file":"deepl-api.js","sourceRoot":"","sources":["../src/deepl-api.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@theia/localization-manager",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.58.0",
|
|
4
4
|
"description": "Theia localization manager API.",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
@@ -36,14 +36,15 @@
|
|
|
36
36
|
"deepmerge": "^4.2.2",
|
|
37
37
|
"fs-extra": "^4.0.2",
|
|
38
38
|
"glob": "^7.2.0",
|
|
39
|
+
"limiter": "^2.1.0",
|
|
39
40
|
"tslib": "^2.6.2",
|
|
40
41
|
"typescript": "~5.4.5"
|
|
41
42
|
},
|
|
42
43
|
"devDependencies": {
|
|
43
|
-
"@theia/ext-scripts": "1.
|
|
44
|
+
"@theia/ext-scripts": "1.58.0"
|
|
44
45
|
},
|
|
45
46
|
"nyc": {
|
|
46
47
|
"extends": "../../configs/nyc.json"
|
|
47
48
|
},
|
|
48
|
-
"gitHead": "
|
|
49
|
+
"gitHead": "6594f32b9727aea20d88934bf386dee06d08fa5e"
|
|
49
50
|
}
|
package/src/deepl-api.ts
CHANGED
|
@@ -15,10 +15,16 @@
|
|
|
15
15
|
// *****************************************************************************
|
|
16
16
|
|
|
17
17
|
import * as bent from 'bent';
|
|
18
|
+
import { RateLimiter } from 'limiter';
|
|
18
19
|
|
|
19
20
|
const post = bent('POST', 'json', 200);
|
|
20
21
|
// 50 is the maximum amount of translations per request
|
|
21
22
|
const deeplLimit = 50;
|
|
23
|
+
const rateLimiter = new RateLimiter({
|
|
24
|
+
tokensPerInterval: 10,
|
|
25
|
+
interval: 'second',
|
|
26
|
+
fireImmediately: true
|
|
27
|
+
});
|
|
22
28
|
|
|
23
29
|
export async function deepl(
|
|
24
30
|
parameters: DeeplParameters
|
|
@@ -30,12 +36,11 @@ export async function deepl(
|
|
|
30
36
|
while (textArray.length > 0) {
|
|
31
37
|
textChunks.push(textArray.splice(0, deeplLimit));
|
|
32
38
|
}
|
|
33
|
-
const responses: DeeplResponse[] = await Promise.all(textChunks.map(chunk => {
|
|
39
|
+
const responses: DeeplResponse[] = await Promise.all(textChunks.map(async chunk => {
|
|
34
40
|
const parameterCopy: DeeplParameters = { ...parameters, text: chunk };
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
});
|
|
41
|
+
const url = `https://${sub_domain}.deepl.com/v2/translate`;
|
|
42
|
+
const buffer = Buffer.from(toFormData(parameterCopy));
|
|
43
|
+
return postWithRetry(url, buffer, 1);
|
|
39
44
|
}));
|
|
40
45
|
const mergedResponse: DeeplResponse = { translations: [] };
|
|
41
46
|
for (const response of responses) {
|
|
@@ -47,6 +52,22 @@ export async function deepl(
|
|
|
47
52
|
return mergedResponse;
|
|
48
53
|
}
|
|
49
54
|
|
|
55
|
+
async function postWithRetry(url: string, buffer: Buffer, attempt: number): Promise<DeeplResponse> {
|
|
56
|
+
try {
|
|
57
|
+
await rateLimiter.removeTokens(Math.min(attempt, 10));
|
|
58
|
+
const response = await post(url, buffer, {
|
|
59
|
+
'Content-Type': 'application/x-www-form-urlencoded',
|
|
60
|
+
'User-Agent': 'Theia-Localization-Manager'
|
|
61
|
+
});
|
|
62
|
+
return response;
|
|
63
|
+
} catch (e) {
|
|
64
|
+
if ('message' in e && typeof e.message === 'string' && e.message.includes('Too Many Requests')) {
|
|
65
|
+
return postWithRetry(url, buffer, attempt + 1);
|
|
66
|
+
}
|
|
67
|
+
throw e;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
50
71
|
/**
|
|
51
72
|
* Coerces the target language into a form expected by Deepl.
|
|
52
73
|
*
|