@deeplx/core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +124 -0
- package/index.d.cts +3 -0
- package/lib/api.d.ts +2 -0
- package/lib/api.js +9 -0
- package/lib/api.js.map +1 -0
- package/lib/constants.d.ts +98 -0
- package/lib/constants.js +56 -0
- package/lib/constants.js.map +1 -0
- package/lib/index.cjs +328 -0
- package/lib/index.d.ts +5 -0
- package/lib/index.js +5 -0
- package/lib/index.js.map +1 -0
- package/lib/translate.d.ts +3 -0
- package/lib/translate.js +148 -0
- package/lib/translate.js.map +1 -0
- package/lib/types.d.ts +80 -0
- package/lib/types.js +2 -0
- package/lib/types.js.map +1 -0
- package/lib/utils.d.ts +7 -0
- package/lib/utils.js +33 -0
- package/lib/utils.js.map +1 -0
- package/package.json +58 -0
package/README.md
ADDED
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
# @deeplx/core
|
|
2
|
+
|
|
3
|
+
[](https://github.com/un-ts/deeplx/actions/workflows/ci.yml?query=branch%3Amaster)
|
|
4
|
+
[](https://codecov.io/gh/un-ts/deeplx)
|
|
5
|
+
[](https://app.codacy.com/gh/un-ts/deeplx)
|
|
6
|
+
[](https://github.com/plantain-00/type-coverage)
|
|
7
|
+
[](https://coderabbit.ai)
|
|
8
|
+
[](https://www.npmjs.com/package/@deeplx/core)
|
|
9
|
+
[](https://github.com/un-ts/deeplx/releases)
|
|
10
|
+
|
|
11
|
+
[](https://conventionalcommits.org)
|
|
12
|
+
[](https://renovatebot.com)
|
|
13
|
+
[](https://standardjs.com)
|
|
14
|
+
[](https://github.com/prettier/prettier)
|
|
15
|
+
[](https://github.com/atlassian/changesets)
|
|
16
|
+
|
|
17
|
+
An unofficial Node package to translate text using [DeepL](https://www.deepl.com) by porting [OwO-Network/DeepLX](https://github.com/OwO-Network/DeepLX).
|
|
18
|
+
|
|
19
|
+
## Online Service
|
|
20
|
+
|
|
21
|
+
<https://deeplx.vercel.app/translate>
|
|
22
|
+
|
|
23
|
+
## Installation
|
|
24
|
+
|
|
25
|
+
```sh
|
|
26
|
+
# npm
|
|
27
|
+
npm i @deeplx/core
|
|
28
|
+
|
|
29
|
+
# pnpm
|
|
30
|
+
pnpm add @deeplx/core
|
|
31
|
+
|
|
32
|
+
# yarn
|
|
33
|
+
yarn add @deeplx/core
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## Usage
|
|
37
|
+
|
|
38
|
+
### Supported languages
|
|
39
|
+
|
|
40
|
+
Currently the following languages are supported:
|
|
41
|
+
|
|
42
|
+
| Abbreviation | Language | Writing in own language |
|
|
43
|
+
| ------------ | ---------- | ----------------------- |
|
|
44
|
+
| BG | Bulgarian | Български |
|
|
45
|
+
| ZH | Chinese | 中文 |
|
|
46
|
+
| CS | Czech | Česky |
|
|
47
|
+
| DA | Danish | Dansk |
|
|
48
|
+
| NL | Dutch | Nederlands |
|
|
49
|
+
| EN | English | English |
|
|
50
|
+
| ET | Estonian | Eesti |
|
|
51
|
+
| FI | Finnish | Suomi |
|
|
52
|
+
| FR | French | Français |
|
|
53
|
+
| DE | German | Deutsch |
|
|
54
|
+
| EL | Greek | Ελληνικά |
|
|
55
|
+
| HU | Hungarian | Magyar |
|
|
56
|
+
| IT | Italian | Italiano |
|
|
57
|
+
| JA | Japanese | 日本語 |
|
|
58
|
+
| LV | Latvian | Latviešu |
|
|
59
|
+
| LT | Lithuanian | Lietuvių |
|
|
60
|
+
| PL | Polish | Polski |
|
|
61
|
+
| PT | Portuguese | Português |
|
|
62
|
+
| RO | Romanian | Română |
|
|
63
|
+
| RU | Russian | Русский |
|
|
64
|
+
| SK | Slovak | Slovenčina |
|
|
65
|
+
| SL | Slovenian | Slovenščina |
|
|
66
|
+
| ES | Spanish | Español |
|
|
67
|
+
| SV | Swedish | Svenska |
|
|
68
|
+
| UK | Ukrainian | Українська Мова |
|
|
69
|
+
|
|
70
|
+
You can either input the abbreviation or the language written in english.
|
|
71
|
+
|
|
72
|
+
### Example 1
|
|
73
|
+
|
|
74
|
+
This will translate a Chinese (`ZH`) text into Dutch (`NL`):
|
|
75
|
+
|
|
76
|
+
```js
|
|
77
|
+
import { translate } from '@deeplx/core'
|
|
78
|
+
|
|
79
|
+
await translate('你好', 'NL')
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
```log
|
|
83
|
+
'Hallo'
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### Example 2
|
|
87
|
+
|
|
88
|
+
This will translate a `danish` text into `german` in informal tone:
|
|
89
|
+
|
|
90
|
+
```js
|
|
91
|
+
import { translate } from '@deeplx/core'
|
|
92
|
+
|
|
93
|
+
await translate('Ring til mig!', 'german', 'danish', false)
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
```log
|
|
97
|
+
'Ruf mich an!'
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
[](https://github.com/sponsors/JounQin)
|
|
101
|
+
|
|
102
|
+
## Sponsors
|
|
103
|
+
|
|
104
|
+
| 1stG | RxTS | UnTS |
|
|
105
|
+
| ---------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- |
|
|
106
|
+
| [](https://opencollective.com/1stG) | [](https://opencollective.com/rxts) | [](https://opencollective.com/unts) |
|
|
107
|
+
|
|
108
|
+
## Backers
|
|
109
|
+
|
|
110
|
+
| 1stG | RxTS | UnTS |
|
|
111
|
+
| ------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------- |
|
|
112
|
+
| [](https://opencollective.com/1stG) | [](https://opencollective.com/rxts) | [](https://opencollective.com/unts) |
|
|
113
|
+
|
|
114
|
+
## Changelog
|
|
115
|
+
|
|
116
|
+
Detailed changes for each release are documented in [CHANGELOG.md](./CHANGELOG.md).
|
|
117
|
+
|
|
118
|
+
## License
|
|
119
|
+
|
|
120
|
+
[MIT][] © [JounQin][]@[1stG.me][]
|
|
121
|
+
|
|
122
|
+
[1stG.me]: https://www.1stG.me
|
|
123
|
+
[JounQin]: https://github.com/JounQin
|
|
124
|
+
[MIT]: http://opensource.org/licenses/MIT
|
package/index.d.cts
ADDED
package/lib/api.d.ts
ADDED
package/lib/api.js
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { translateByDeepLX } from "./translate.js";
|
|
2
|
+
export const translate = async (text, targetLang, sourceLang, formal) => {
|
|
3
|
+
const result = await translateByDeepLX(sourceLang, targetLang, text, formal);
|
|
4
|
+
if ('message' in result) {
|
|
5
|
+
throw new Error(result.message, { cause: result });
|
|
6
|
+
}
|
|
7
|
+
return result.data;
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=api.js.map
|
package/lib/api.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAElD,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,EAC5B,IAAY,EACZ,UAA0B,EAC1B,UAA2B,EAC3B,MAAgB,EAChB,EAAE;IACF,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,CAAC,CAAA;IAC5E,IAAI,SAAS,IAAI,MAAM,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;IACpD,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAA;AACpB,CAAC,CAAA"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import type { ValueOf } from './types.ts';
|
|
2
|
+
export declare const SUPPORTED_LANGUAGES: readonly [{
|
|
3
|
+
readonly code: "BG";
|
|
4
|
+
readonly language: "Bulgarian";
|
|
5
|
+
}, {
|
|
6
|
+
readonly code: "ZH";
|
|
7
|
+
readonly language: "Chinese";
|
|
8
|
+
}, {
|
|
9
|
+
readonly code: "CS";
|
|
10
|
+
readonly language: "Czech";
|
|
11
|
+
}, {
|
|
12
|
+
readonly code: "DA";
|
|
13
|
+
readonly language: "Danish";
|
|
14
|
+
}, {
|
|
15
|
+
readonly code: "NL";
|
|
16
|
+
readonly language: "Dutch";
|
|
17
|
+
}, {
|
|
18
|
+
readonly code: "EN";
|
|
19
|
+
readonly language: "English";
|
|
20
|
+
}, {
|
|
21
|
+
readonly code: "ET";
|
|
22
|
+
readonly language: "Estonian";
|
|
23
|
+
}, {
|
|
24
|
+
readonly code: "FI";
|
|
25
|
+
readonly language: "Finnish";
|
|
26
|
+
}, {
|
|
27
|
+
readonly code: "FR";
|
|
28
|
+
readonly language: "French";
|
|
29
|
+
}, {
|
|
30
|
+
readonly code: "DE";
|
|
31
|
+
readonly language: "German";
|
|
32
|
+
}, {
|
|
33
|
+
readonly code: "EL";
|
|
34
|
+
readonly language: "Greek";
|
|
35
|
+
}, {
|
|
36
|
+
readonly code: "HU";
|
|
37
|
+
readonly language: "Hungarian";
|
|
38
|
+
}, {
|
|
39
|
+
readonly code: "IT";
|
|
40
|
+
readonly language: "Italian";
|
|
41
|
+
}, {
|
|
42
|
+
readonly code: "JA";
|
|
43
|
+
readonly language: "Japanese";
|
|
44
|
+
}, {
|
|
45
|
+
readonly code: "LV";
|
|
46
|
+
readonly language: "Latvian";
|
|
47
|
+
}, {
|
|
48
|
+
readonly code: "LT";
|
|
49
|
+
readonly language: "Lithuanian";
|
|
50
|
+
}, {
|
|
51
|
+
readonly code: "PL";
|
|
52
|
+
readonly language: "Polish";
|
|
53
|
+
}, {
|
|
54
|
+
readonly code: "PT";
|
|
55
|
+
readonly language: "Portuguese";
|
|
56
|
+
}, {
|
|
57
|
+
readonly code: "RO";
|
|
58
|
+
readonly language: "Romanian";
|
|
59
|
+
}, {
|
|
60
|
+
readonly code: "RU";
|
|
61
|
+
readonly language: "Russian";
|
|
62
|
+
}, {
|
|
63
|
+
readonly code: "SK";
|
|
64
|
+
readonly language: "Slovak";
|
|
65
|
+
}, {
|
|
66
|
+
readonly code: "SL";
|
|
67
|
+
readonly language: "Slovenian";
|
|
68
|
+
}, {
|
|
69
|
+
readonly code: "ES";
|
|
70
|
+
readonly language: "Spanish";
|
|
71
|
+
}, {
|
|
72
|
+
readonly code: "SV";
|
|
73
|
+
readonly language: "Swedish";
|
|
74
|
+
}, {
|
|
75
|
+
readonly code: "TR";
|
|
76
|
+
readonly language: "Turkish";
|
|
77
|
+
}, {
|
|
78
|
+
readonly code: "ID";
|
|
79
|
+
readonly language: "Indonesian";
|
|
80
|
+
}, {
|
|
81
|
+
readonly code: "UK";
|
|
82
|
+
readonly language: "Ukrainian";
|
|
83
|
+
}];
|
|
84
|
+
export type SupportedLanguage = ValueOf<typeof SUPPORTED_LANGUAGES>;
|
|
85
|
+
export type SupportedCode = SupportedLanguage['code'];
|
|
86
|
+
export type Language = SupportedCode | SupportedLanguage['language'] | `${SupportedCode}-${string}`;
|
|
87
|
+
export type TargetLanguage = Language | Lowercase<Language> | Uppercase<Language>;
|
|
88
|
+
export type SourceLanguage = TargetLanguage | 'auto';
|
|
89
|
+
export declare const FORMALITY_TONES: Set<"undefined" | "formal" | "informal">;
|
|
90
|
+
export type FormalityTone = ValueOf<typeof FORMALITY_TONES>;
|
|
91
|
+
export declare const API_URL = "https://www2.deepl.com/jsonrpc";
|
|
92
|
+
export declare const HTTP_STATUS_OK = 200;
|
|
93
|
+
export declare const HTTP_STATUS_BAD_REQUEST = 400;
|
|
94
|
+
export declare const HTTP_STATUS_NOT_FOUND = 404;
|
|
95
|
+
export declare const HTTP_STATUS_NOT_ALLOWED = 405;
|
|
96
|
+
export declare const HTTP_STATUS_INTERNAL_ERROR = 500;
|
|
97
|
+
export declare const HTTP_STATUS_SERVICE_UNAVAILABLE = 503;
|
|
98
|
+
export declare const COMMON_HEADERS: HeadersInit;
|
package/lib/constants.js
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
export const SUPPORTED_LANGUAGES = [
|
|
2
|
+
{ code: 'BG', language: 'Bulgarian' },
|
|
3
|
+
{ code: 'ZH', language: 'Chinese' },
|
|
4
|
+
{ code: 'CS', language: 'Czech' },
|
|
5
|
+
{ code: 'DA', language: 'Danish' },
|
|
6
|
+
{ code: 'NL', language: 'Dutch' },
|
|
7
|
+
{ code: 'EN', language: 'English' },
|
|
8
|
+
{ code: 'ET', language: 'Estonian' },
|
|
9
|
+
{ code: 'FI', language: 'Finnish' },
|
|
10
|
+
{ code: 'FR', language: 'French' },
|
|
11
|
+
{ code: 'DE', language: 'German' },
|
|
12
|
+
{ code: 'EL', language: 'Greek' },
|
|
13
|
+
{ code: 'HU', language: 'Hungarian' },
|
|
14
|
+
{ code: 'IT', language: 'Italian' },
|
|
15
|
+
{ code: 'JA', language: 'Japanese' },
|
|
16
|
+
{ code: 'LV', language: 'Latvian' },
|
|
17
|
+
{ code: 'LT', language: 'Lithuanian' },
|
|
18
|
+
{ code: 'PL', language: 'Polish' },
|
|
19
|
+
{ code: 'PT', language: 'Portuguese' },
|
|
20
|
+
{ code: 'RO', language: 'Romanian' },
|
|
21
|
+
{ code: 'RU', language: 'Russian' },
|
|
22
|
+
{ code: 'SK', language: 'Slovak' },
|
|
23
|
+
{ code: 'SL', language: 'Slovenian' },
|
|
24
|
+
{ code: 'ES', language: 'Spanish' },
|
|
25
|
+
{ code: 'SV', language: 'Swedish' },
|
|
26
|
+
{ code: 'TR', language: 'Turkish' },
|
|
27
|
+
{ code: 'ID', language: 'Indonesian' },
|
|
28
|
+
{ code: 'UK', language: 'Ukrainian' },
|
|
29
|
+
];
|
|
30
|
+
export const FORMALITY_TONES = new Set([
|
|
31
|
+
'formal',
|
|
32
|
+
'informal',
|
|
33
|
+
'undefined',
|
|
34
|
+
]);
|
|
35
|
+
export const API_URL = 'https://www2.deepl.com/jsonrpc';
|
|
36
|
+
export const HTTP_STATUS_OK = 200;
|
|
37
|
+
export const HTTP_STATUS_BAD_REQUEST = 400;
|
|
38
|
+
export const HTTP_STATUS_NOT_FOUND = 404;
|
|
39
|
+
export const HTTP_STATUS_NOT_ALLOWED = 405;
|
|
40
|
+
export const HTTP_STATUS_INTERNAL_ERROR = 500;
|
|
41
|
+
export const HTTP_STATUS_SERVICE_UNAVAILABLE = 503;
|
|
42
|
+
export const COMMON_HEADERS = {
|
|
43
|
+
'Content-Type': 'application/json',
|
|
44
|
+
'User-Agent': 'DeepL/1627620 CFNetwork/3826.500.62.2.1 Darwin/24.4.0',
|
|
45
|
+
Accept: '*/*',
|
|
46
|
+
'X-App-Os-Name': 'iOS',
|
|
47
|
+
'X-App-Os-Version': '18.4.0',
|
|
48
|
+
'Accept-Language': 'en-US,en;q=0.9',
|
|
49
|
+
'Accept-Encoding': 'gzip, deflate, br',
|
|
50
|
+
'X-App-Device': 'iPhone16,2',
|
|
51
|
+
Referer: 'https://www.deepl.com/',
|
|
52
|
+
'X-Product': 'translator',
|
|
53
|
+
'X-App-Build': '1627620',
|
|
54
|
+
'X-App-Version': '25.1',
|
|
55
|
+
};
|
|
56
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"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"}
|
package/lib/index.cjs
ADDED
|
@@ -0,0 +1,328 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var whatlangNode = require('whatlang-node');
|
|
4
|
+
var xFetch = require('x-fetch');
|
|
5
|
+
|
|
6
|
+
const SUPPORTED_LANGUAGES = [
|
|
7
|
+
{ code: "BG", language: "Bulgarian" },
|
|
8
|
+
{ code: "ZH", language: "Chinese" },
|
|
9
|
+
{ code: "CS", language: "Czech" },
|
|
10
|
+
{ code: "DA", language: "Danish" },
|
|
11
|
+
{ code: "NL", language: "Dutch" },
|
|
12
|
+
{ code: "EN", language: "English" },
|
|
13
|
+
{ code: "ET", language: "Estonian" },
|
|
14
|
+
{ code: "FI", language: "Finnish" },
|
|
15
|
+
{ code: "FR", language: "French" },
|
|
16
|
+
{ code: "DE", language: "German" },
|
|
17
|
+
{ code: "EL", language: "Greek" },
|
|
18
|
+
{ code: "HU", language: "Hungarian" },
|
|
19
|
+
{ code: "IT", language: "Italian" },
|
|
20
|
+
{ code: "JA", language: "Japanese" },
|
|
21
|
+
{ code: "LV", language: "Latvian" },
|
|
22
|
+
{ code: "LT", language: "Lithuanian" },
|
|
23
|
+
{ code: "PL", language: "Polish" },
|
|
24
|
+
{ code: "PT", language: "Portuguese" },
|
|
25
|
+
{ code: "RO", language: "Romanian" },
|
|
26
|
+
{ code: "RU", language: "Russian" },
|
|
27
|
+
{ code: "SK", language: "Slovak" },
|
|
28
|
+
{ code: "SL", language: "Slovenian" },
|
|
29
|
+
{ code: "ES", language: "Spanish" },
|
|
30
|
+
{ code: "SV", language: "Swedish" },
|
|
31
|
+
{ code: "TR", language: "Turkish" },
|
|
32
|
+
{ code: "ID", language: "Indonesian" },
|
|
33
|
+
{ code: "UK", language: "Ukrainian" }
|
|
34
|
+
];
|
|
35
|
+
const FORMALITY_TONES = /* @__PURE__ */ new Set([
|
|
36
|
+
"formal",
|
|
37
|
+
"informal",
|
|
38
|
+
"undefined"
|
|
39
|
+
]);
|
|
40
|
+
const API_URL = "https://www2.deepl.com/jsonrpc";
|
|
41
|
+
const HTTP_STATUS_OK = 200;
|
|
42
|
+
const HTTP_STATUS_BAD_REQUEST = 400;
|
|
43
|
+
const HTTP_STATUS_NOT_FOUND = 404;
|
|
44
|
+
const HTTP_STATUS_NOT_ALLOWED = 405;
|
|
45
|
+
const HTTP_STATUS_INTERNAL_ERROR = 500;
|
|
46
|
+
const HTTP_STATUS_SERVICE_UNAVAILABLE = 503;
|
|
47
|
+
const COMMON_HEADERS = {
|
|
48
|
+
"Content-Type": "application/json",
|
|
49
|
+
"User-Agent": "DeepL/1627620 CFNetwork/3826.500.62.2.1 Darwin/24.4.0",
|
|
50
|
+
Accept: "*/*",
|
|
51
|
+
"X-App-Os-Name": "iOS",
|
|
52
|
+
"X-App-Os-Version": "18.4.0",
|
|
53
|
+
"Accept-Language": "en-US,en;q=0.9",
|
|
54
|
+
"Accept-Encoding": "gzip, deflate, br",
|
|
55
|
+
// Keep this!
|
|
56
|
+
"X-App-Device": "iPhone16,2",
|
|
57
|
+
Referer: "https://www.deepl.com/",
|
|
58
|
+
"X-Product": "translator",
|
|
59
|
+
"X-App-Build": "1627620",
|
|
60
|
+
"X-App-Version": "25.1"
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
const getICount = (translateText) => {
|
|
64
|
+
return (translateText.match(/i/g) || []).length;
|
|
65
|
+
};
|
|
66
|
+
const getRandomNumber = () => {
|
|
67
|
+
const base = Math.floor(Math.random() * 99999) + 83e5;
|
|
68
|
+
return base * 1e3;
|
|
69
|
+
};
|
|
70
|
+
const getTimeStamp = (iCount) => {
|
|
71
|
+
const ts = Date.now();
|
|
72
|
+
if (iCount !== 0) {
|
|
73
|
+
const adjustedCount = iCount + 1;
|
|
74
|
+
return ts - ts % adjustedCount + adjustedCount;
|
|
75
|
+
}
|
|
76
|
+
return ts;
|
|
77
|
+
};
|
|
78
|
+
const formatPostString = (postData) => {
|
|
79
|
+
const postStr = JSON.stringify(postData);
|
|
80
|
+
const shouldAddSpace = (
|
|
81
|
+
// eslint-disable-next-line @typescript-eslint/no-magic-numbers
|
|
82
|
+
(postData.id + 5) % 29 === 0 || (postData.id + 3) % 13 === 0
|
|
83
|
+
);
|
|
84
|
+
return postStr.replaceAll(
|
|
85
|
+
'"method":"',
|
|
86
|
+
shouldAddSpace ? `"method" : "` : `"method": "`
|
|
87
|
+
);
|
|
88
|
+
};
|
|
89
|
+
let abbreviateLanguageDictionary;
|
|
90
|
+
function getAbbreviateLanguages() {
|
|
91
|
+
return abbreviateLanguageDictionary != null ? abbreviateLanguageDictionary : abbreviateLanguageDictionary = SUPPORTED_LANGUAGES.reduce(
|
|
92
|
+
(acc, lang) => {
|
|
93
|
+
acc[lang.code.toLowerCase()] = lang.code;
|
|
94
|
+
acc[lang.language.toLowerCase()] = lang.code;
|
|
95
|
+
return acc;
|
|
96
|
+
},
|
|
97
|
+
{}
|
|
98
|
+
);
|
|
99
|
+
}
|
|
100
|
+
function abbreviateLanguage(language) {
|
|
101
|
+
return getAbbreviateLanguages()[language.split("-")[0].toLowerCase()];
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
var __defProp = Object.defineProperty;
|
|
105
|
+
var __defProps = Object.defineProperties;
|
|
106
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
107
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
108
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
109
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
110
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
111
|
+
var __spreadValues = (a, b) => {
|
|
112
|
+
for (var prop in b || (b = {}))
|
|
113
|
+
if (__hasOwnProp.call(b, prop))
|
|
114
|
+
__defNormalProp(a, prop, b[prop]);
|
|
115
|
+
if (__getOwnPropSymbols)
|
|
116
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
117
|
+
if (__propIsEnum.call(b, prop))
|
|
118
|
+
__defNormalProp(a, prop, b[prop]);
|
|
119
|
+
}
|
|
120
|
+
return a;
|
|
121
|
+
};
|
|
122
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
123
|
+
var __async$1 = (__this, __arguments, generator) => {
|
|
124
|
+
return new Promise((resolve, reject) => {
|
|
125
|
+
var fulfilled = (value) => {
|
|
126
|
+
try {
|
|
127
|
+
step(generator.next(value));
|
|
128
|
+
} catch (e) {
|
|
129
|
+
reject(e);
|
|
130
|
+
}
|
|
131
|
+
};
|
|
132
|
+
var rejected = (value) => {
|
|
133
|
+
try {
|
|
134
|
+
step(generator.throw(value));
|
|
135
|
+
} catch (e) {
|
|
136
|
+
reject(e);
|
|
137
|
+
}
|
|
138
|
+
};
|
|
139
|
+
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
|
|
140
|
+
step((generator = generator.apply(__this, __arguments)).next());
|
|
141
|
+
});
|
|
142
|
+
};
|
|
143
|
+
const makeRequest = (postData, _proxyUrl, dlSession) => __async$1(void 0, null, function* () {
|
|
144
|
+
return xFetch.fetchApi(API_URL, {
|
|
145
|
+
method: "POST",
|
|
146
|
+
body: formatPostString(postData),
|
|
147
|
+
headers: dlSession ? __spreadProps(__spreadValues({}, COMMON_HEADERS), { Cookie: `dl_session=${dlSession}` }) : COMMON_HEADERS
|
|
148
|
+
});
|
|
149
|
+
});
|
|
150
|
+
const splitAndProcess = (text) => text.split("\n").map((line) => line.trim() === "" ? "\n" : line);
|
|
151
|
+
const translateByDeepLX = (sourceLang, targetLang, text, formal, tagHandling = "plaintext", proxyUrl, dlSession) => __async$1(void 0, null, function* () {
|
|
152
|
+
var _a, _b;
|
|
153
|
+
if (!text) {
|
|
154
|
+
return { code: HTTP_STATUS_NOT_FOUND, message: "No text to translate" };
|
|
155
|
+
}
|
|
156
|
+
const textParts = splitAndProcess(text);
|
|
157
|
+
const translatedParts = [];
|
|
158
|
+
const allAlternatives = [];
|
|
159
|
+
for (const part of textParts) {
|
|
160
|
+
if (!part.trim()) {
|
|
161
|
+
translatedParts.push("");
|
|
162
|
+
allAlternatives.push([""]);
|
|
163
|
+
continue;
|
|
164
|
+
}
|
|
165
|
+
if (!sourceLang || sourceLang === "auto") {
|
|
166
|
+
sourceLang = whatlangNode.detectLang(part, true);
|
|
167
|
+
}
|
|
168
|
+
const sourceLangCode = (_a = abbreviateLanguage(sourceLang)) != null ? _a : sourceLang.toUpperCase();
|
|
169
|
+
const jobs = [
|
|
170
|
+
{
|
|
171
|
+
kind: "default",
|
|
172
|
+
preferred_num_beams: 4,
|
|
173
|
+
raw_en_context_before: [],
|
|
174
|
+
raw_en_context_after: [],
|
|
175
|
+
sentences: [{ prefix: "", text: part, id: 0 }]
|
|
176
|
+
}
|
|
177
|
+
];
|
|
178
|
+
let hasRegionalVariant = false;
|
|
179
|
+
let targetLangCode = (_b = abbreviateLanguage(targetLang)) != null ? _b : targetLang.toUpperCase();
|
|
180
|
+
const targetLangParts = targetLang.split("-");
|
|
181
|
+
if (targetLangParts.length > 1) {
|
|
182
|
+
targetLangCode = targetLangParts[0];
|
|
183
|
+
hasRegionalVariant = true;
|
|
184
|
+
}
|
|
185
|
+
const id = getRandomNumber();
|
|
186
|
+
const postData = {
|
|
187
|
+
jsonrpc: "2.0",
|
|
188
|
+
method: "LMT_handle_jobs",
|
|
189
|
+
id,
|
|
190
|
+
params: {
|
|
191
|
+
commonJobParams: __spreadValues({
|
|
192
|
+
mode: "translate",
|
|
193
|
+
formality: (
|
|
194
|
+
// eslint-disable-next-line sonarjs/no-nested-conditional
|
|
195
|
+
formal == null ? "undefined" : formal ? "formal" : "informal"
|
|
196
|
+
),
|
|
197
|
+
transcribe_as: "romanize",
|
|
198
|
+
advancedMode: false,
|
|
199
|
+
textType: tagHandling,
|
|
200
|
+
wasSpoken: false
|
|
201
|
+
}, hasRegionalVariant && { regionalVariant: targetLang }),
|
|
202
|
+
lang: {
|
|
203
|
+
source_lang_user_selected: "auto",
|
|
204
|
+
target_lang: targetLangCode,
|
|
205
|
+
source_lang_computed: sourceLangCode
|
|
206
|
+
},
|
|
207
|
+
jobs,
|
|
208
|
+
timestamp: getTimeStamp(getICount(part))
|
|
209
|
+
}
|
|
210
|
+
};
|
|
211
|
+
let translations;
|
|
212
|
+
try {
|
|
213
|
+
const { result } = yield makeRequest(postData, proxyUrl, dlSession);
|
|
214
|
+
translations = result.translations;
|
|
215
|
+
} catch (error) {
|
|
216
|
+
return {
|
|
217
|
+
code: HTTP_STATUS_SERVICE_UNAVAILABLE,
|
|
218
|
+
message: String(error)
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
let partTranslation = "";
|
|
222
|
+
const partAlternatives = [];
|
|
223
|
+
if (translations.length > 0) {
|
|
224
|
+
for (const translation of translations) {
|
|
225
|
+
partTranslation += translation.beams[0].sentences[0].text + " ";
|
|
226
|
+
}
|
|
227
|
+
partTranslation = partTranslation.trim();
|
|
228
|
+
const numBeams = translations[0].beams.length;
|
|
229
|
+
for (let i = 1; i < numBeams; i++) {
|
|
230
|
+
let altText = "";
|
|
231
|
+
for (const translation of translations) {
|
|
232
|
+
const beams = translation.beams;
|
|
233
|
+
if (i < beams.length) {
|
|
234
|
+
altText += beams[i].sentences[0].text + " ";
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
if (altText) {
|
|
238
|
+
partAlternatives.push(altText.trim());
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
if (!partTranslation) {
|
|
243
|
+
return {
|
|
244
|
+
code: HTTP_STATUS_SERVICE_UNAVAILABLE,
|
|
245
|
+
message: "Translation failed"
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
translatedParts.push(partTranslation);
|
|
249
|
+
allAlternatives.push(partAlternatives);
|
|
250
|
+
}
|
|
251
|
+
const translatedText = translatedParts.join("\n");
|
|
252
|
+
const combinedAlternatives = [];
|
|
253
|
+
let maxAlts = 0;
|
|
254
|
+
for (const alts of allAlternatives) {
|
|
255
|
+
if (alts.length > maxAlts) {
|
|
256
|
+
maxAlts = alts.length;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
for (let i = 0; i < maxAlts; i++) {
|
|
260
|
+
const altParts = [];
|
|
261
|
+
for (const [j, alts] of allAlternatives.entries()) {
|
|
262
|
+
if (i < alts.length) {
|
|
263
|
+
altParts.push(alts[i]);
|
|
264
|
+
} else if (translatedParts[j].length === 0) {
|
|
265
|
+
altParts.push("");
|
|
266
|
+
} else {
|
|
267
|
+
altParts.push(translatedParts[j]);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
combinedAlternatives.push(altParts.join("\n"));
|
|
271
|
+
}
|
|
272
|
+
return {
|
|
273
|
+
code: HTTP_STATUS_OK,
|
|
274
|
+
id: getRandomNumber(),
|
|
275
|
+
// Using new ID for the complete translation
|
|
276
|
+
data: translatedText,
|
|
277
|
+
alternatives: combinedAlternatives,
|
|
278
|
+
sourceLang,
|
|
279
|
+
targetLang,
|
|
280
|
+
method: dlSession ? "Pro" : "Free"
|
|
281
|
+
};
|
|
282
|
+
});
|
|
283
|
+
|
|
284
|
+
var __async = (__this, __arguments, generator) => {
|
|
285
|
+
return new Promise((resolve, reject) => {
|
|
286
|
+
var fulfilled = (value) => {
|
|
287
|
+
try {
|
|
288
|
+
step(generator.next(value));
|
|
289
|
+
} catch (e) {
|
|
290
|
+
reject(e);
|
|
291
|
+
}
|
|
292
|
+
};
|
|
293
|
+
var rejected = (value) => {
|
|
294
|
+
try {
|
|
295
|
+
step(generator.throw(value));
|
|
296
|
+
} catch (e) {
|
|
297
|
+
reject(e);
|
|
298
|
+
}
|
|
299
|
+
};
|
|
300
|
+
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
|
|
301
|
+
step((generator = generator.apply(__this, __arguments)).next());
|
|
302
|
+
});
|
|
303
|
+
};
|
|
304
|
+
const translate = (text, targetLang, sourceLang, formal) => __async(void 0, null, function* () {
|
|
305
|
+
const result = yield translateByDeepLX(sourceLang, targetLang, text, formal);
|
|
306
|
+
if ("message" in result) {
|
|
307
|
+
throw new Error(result.message, { cause: result });
|
|
308
|
+
}
|
|
309
|
+
return result.data;
|
|
310
|
+
});
|
|
311
|
+
|
|
312
|
+
exports.API_URL = API_URL;
|
|
313
|
+
exports.COMMON_HEADERS = COMMON_HEADERS;
|
|
314
|
+
exports.FORMALITY_TONES = FORMALITY_TONES;
|
|
315
|
+
exports.HTTP_STATUS_BAD_REQUEST = HTTP_STATUS_BAD_REQUEST;
|
|
316
|
+
exports.HTTP_STATUS_INTERNAL_ERROR = HTTP_STATUS_INTERNAL_ERROR;
|
|
317
|
+
exports.HTTP_STATUS_NOT_ALLOWED = HTTP_STATUS_NOT_ALLOWED;
|
|
318
|
+
exports.HTTP_STATUS_NOT_FOUND = HTTP_STATUS_NOT_FOUND;
|
|
319
|
+
exports.HTTP_STATUS_OK = HTTP_STATUS_OK;
|
|
320
|
+
exports.HTTP_STATUS_SERVICE_UNAVAILABLE = HTTP_STATUS_SERVICE_UNAVAILABLE;
|
|
321
|
+
exports.SUPPORTED_LANGUAGES = SUPPORTED_LANGUAGES;
|
|
322
|
+
exports.abbreviateLanguage = abbreviateLanguage;
|
|
323
|
+
exports.formatPostString = formatPostString;
|
|
324
|
+
exports.getICount = getICount;
|
|
325
|
+
exports.getRandomNumber = getRandomNumber;
|
|
326
|
+
exports.getTimeStamp = getTimeStamp;
|
|
327
|
+
exports.translate = translate;
|
|
328
|
+
exports.translateByDeepLX = translateByDeepLX;
|
package/lib/index.d.ts
ADDED
package/lib/index.js
ADDED
package/lib/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAA;AACxB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,gBAAgB,CAAA;AAE9B,cAAc,YAAY,CAAA"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { type SourceLanguage, type TargetLanguage } from './constants.ts';
|
|
2
|
+
import type { DeepLXTranslationResult } from './types.ts';
|
|
3
|
+
export declare const translateByDeepLX: (sourceLang: SourceLanguage | undefined, targetLang: TargetLanguage, text: string, formal?: boolean, tagHandling?: string, proxyUrl?: string, dlSession?: string) => Promise<DeepLXTranslationResult>;
|
package/lib/translate.js
ADDED
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { detectLang } from 'whatlang-node';
|
|
2
|
+
import { fetchApi } from 'x-fetch';
|
|
3
|
+
import { API_URL, COMMON_HEADERS, HTTP_STATUS_NOT_FOUND, HTTP_STATUS_OK, HTTP_STATUS_SERVICE_UNAVAILABLE, } from "./constants.js";
|
|
4
|
+
import { abbreviateLanguage, formatPostString, getICount, getRandomNumber, getTimeStamp, } from "./utils.js";
|
|
5
|
+
const makeRequest = async (postData, _proxyUrl, dlSession) => {
|
|
6
|
+
return fetchApi(API_URL, {
|
|
7
|
+
method: 'POST',
|
|
8
|
+
body: formatPostString(postData),
|
|
9
|
+
headers: dlSession
|
|
10
|
+
? { ...COMMON_HEADERS, Cookie: `dl_session=${dlSession}` }
|
|
11
|
+
: COMMON_HEADERS,
|
|
12
|
+
});
|
|
13
|
+
};
|
|
14
|
+
const splitAndProcess = (text) => text.split('\n').map(line => (line.trim() === '' ? '\n' : line));
|
|
15
|
+
export const translateByDeepLX = async (sourceLang, targetLang, text, formal, tagHandling = 'plaintext', proxyUrl, dlSession) => {
|
|
16
|
+
if (!text) {
|
|
17
|
+
return { code: HTTP_STATUS_NOT_FOUND, message: 'No text to translate' };
|
|
18
|
+
}
|
|
19
|
+
const textParts = splitAndProcess(text);
|
|
20
|
+
const translatedParts = [];
|
|
21
|
+
const allAlternatives = [];
|
|
22
|
+
for (const part of textParts) {
|
|
23
|
+
if (!part.trim()) {
|
|
24
|
+
translatedParts.push('');
|
|
25
|
+
allAlternatives.push(['']);
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
if (!sourceLang || sourceLang === 'auto') {
|
|
29
|
+
sourceLang = detectLang(part, true);
|
|
30
|
+
}
|
|
31
|
+
const sourceLangCode = abbreviateLanguage(sourceLang) ??
|
|
32
|
+
sourceLang.toUpperCase();
|
|
33
|
+
const jobs = [
|
|
34
|
+
{
|
|
35
|
+
kind: 'default',
|
|
36
|
+
preferred_num_beams: 4,
|
|
37
|
+
raw_en_context_before: [],
|
|
38
|
+
raw_en_context_after: [],
|
|
39
|
+
sentences: [{ prefix: '', text: part, id: 0 }],
|
|
40
|
+
},
|
|
41
|
+
];
|
|
42
|
+
let hasRegionalVariant = false;
|
|
43
|
+
let targetLangCode = abbreviateLanguage(targetLang) ??
|
|
44
|
+
targetLang.toUpperCase();
|
|
45
|
+
const targetLangParts = targetLang.split('-');
|
|
46
|
+
if (targetLangParts.length > 1) {
|
|
47
|
+
targetLangCode = targetLangParts[0];
|
|
48
|
+
hasRegionalVariant = true;
|
|
49
|
+
}
|
|
50
|
+
const id = getRandomNumber();
|
|
51
|
+
const postData = {
|
|
52
|
+
jsonrpc: '2.0',
|
|
53
|
+
method: 'LMT_handle_jobs',
|
|
54
|
+
id,
|
|
55
|
+
params: {
|
|
56
|
+
commonJobParams: {
|
|
57
|
+
mode: 'translate',
|
|
58
|
+
formality: formal == null ? 'undefined' : formal ? 'formal' : 'informal',
|
|
59
|
+
transcribe_as: 'romanize',
|
|
60
|
+
advancedMode: false,
|
|
61
|
+
textType: tagHandling,
|
|
62
|
+
wasSpoken: false,
|
|
63
|
+
...(hasRegionalVariant && { regionalVariant: targetLang }),
|
|
64
|
+
},
|
|
65
|
+
lang: {
|
|
66
|
+
source_lang_user_selected: 'auto',
|
|
67
|
+
target_lang: targetLangCode,
|
|
68
|
+
source_lang_computed: sourceLangCode,
|
|
69
|
+
},
|
|
70
|
+
jobs,
|
|
71
|
+
timestamp: getTimeStamp(getICount(part)),
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
let translations;
|
|
75
|
+
try {
|
|
76
|
+
const { result } = await makeRequest(postData, proxyUrl, dlSession);
|
|
77
|
+
translations = result.translations;
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
return {
|
|
81
|
+
code: HTTP_STATUS_SERVICE_UNAVAILABLE,
|
|
82
|
+
message: String(error),
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
let partTranslation = '';
|
|
86
|
+
const partAlternatives = [];
|
|
87
|
+
if (translations.length > 0) {
|
|
88
|
+
for (const translation of translations) {
|
|
89
|
+
partTranslation += translation.beams[0].sentences[0].text + ' ';
|
|
90
|
+
}
|
|
91
|
+
partTranslation = partTranslation.trim();
|
|
92
|
+
const numBeams = translations[0].beams.length;
|
|
93
|
+
for (let i = 1; i < numBeams; i++) {
|
|
94
|
+
let altText = '';
|
|
95
|
+
for (const translation of translations) {
|
|
96
|
+
const beams = translation.beams;
|
|
97
|
+
if (i < beams.length) {
|
|
98
|
+
altText += beams[i].sentences[0].text + ' ';
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
if (altText) {
|
|
102
|
+
partAlternatives.push(altText.trim());
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
if (!partTranslation) {
|
|
107
|
+
return {
|
|
108
|
+
code: HTTP_STATUS_SERVICE_UNAVAILABLE,
|
|
109
|
+
message: 'Translation failed',
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
translatedParts.push(partTranslation);
|
|
113
|
+
allAlternatives.push(partAlternatives);
|
|
114
|
+
}
|
|
115
|
+
const translatedText = translatedParts.join('\n');
|
|
116
|
+
const combinedAlternatives = [];
|
|
117
|
+
let maxAlts = 0;
|
|
118
|
+
for (const alts of allAlternatives) {
|
|
119
|
+
if (alts.length > maxAlts) {
|
|
120
|
+
maxAlts = alts.length;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
for (let i = 0; i < maxAlts; i++) {
|
|
124
|
+
const altParts = [];
|
|
125
|
+
for (const [j, alts] of allAlternatives.entries()) {
|
|
126
|
+
if (i < alts.length) {
|
|
127
|
+
altParts.push(alts[i]);
|
|
128
|
+
}
|
|
129
|
+
else if (translatedParts[j].length === 0) {
|
|
130
|
+
altParts.push('');
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
altParts.push(translatedParts[j]);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
combinedAlternatives.push(altParts.join('\n'));
|
|
137
|
+
}
|
|
138
|
+
return {
|
|
139
|
+
code: HTTP_STATUS_OK,
|
|
140
|
+
id: getRandomNumber(),
|
|
141
|
+
data: translatedText,
|
|
142
|
+
alternatives: combinedAlternatives,
|
|
143
|
+
sourceLang: sourceLang,
|
|
144
|
+
targetLang,
|
|
145
|
+
method: dlSession ? 'Pro' : 'Free',
|
|
146
|
+
};
|
|
147
|
+
};
|
|
148
|
+
//# sourceMappingURL=translate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"translate.js","sourceRoot":"","sources":["../src/translate.ts"],"names":[],"mappings":"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"}
|
package/lib/types.d.ts
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import type { FormalityTone, SourceLanguage, TargetLanguage } from './constants.ts';
|
|
2
|
+
export type ValueOf<T> = T extends ReadonlyArray<infer R> ? R : T extends Set<infer R> ? R : T[keyof T];
|
|
3
|
+
export interface Lang {
|
|
4
|
+
source_lang_user_selected: string;
|
|
5
|
+
target_lang: string;
|
|
6
|
+
source_lang_computed?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface CommonJobParams {
|
|
9
|
+
formality: FormalityTone;
|
|
10
|
+
transcribe_as: string;
|
|
11
|
+
mode: string;
|
|
12
|
+
wasSpoken: boolean;
|
|
13
|
+
advancedMode: boolean;
|
|
14
|
+
textType: string;
|
|
15
|
+
regionalVariant?: string;
|
|
16
|
+
}
|
|
17
|
+
export interface Sentence {
|
|
18
|
+
prefix: string;
|
|
19
|
+
text: string;
|
|
20
|
+
id: number;
|
|
21
|
+
}
|
|
22
|
+
export interface Job {
|
|
23
|
+
kind: string;
|
|
24
|
+
preferred_num_beams: number;
|
|
25
|
+
raw_en_context_before: string[];
|
|
26
|
+
raw_en_context_after: string[];
|
|
27
|
+
sentences: Sentence[];
|
|
28
|
+
}
|
|
29
|
+
export interface Params {
|
|
30
|
+
commonJobParams: CommonJobParams;
|
|
31
|
+
lang: Lang;
|
|
32
|
+
jobs: Job[];
|
|
33
|
+
timestamp: number;
|
|
34
|
+
}
|
|
35
|
+
export interface PostData {
|
|
36
|
+
jsonrpc: string;
|
|
37
|
+
method: string;
|
|
38
|
+
id: number;
|
|
39
|
+
params: Params;
|
|
40
|
+
}
|
|
41
|
+
export interface TranslationBeam {
|
|
42
|
+
sentences: SentenceResponse[];
|
|
43
|
+
num_symbols: number;
|
|
44
|
+
rephrase_variant: {
|
|
45
|
+
name: string;
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
export interface Translation {
|
|
49
|
+
beams: TranslationBeam[];
|
|
50
|
+
quality: string;
|
|
51
|
+
}
|
|
52
|
+
export interface TranslationResponse {
|
|
53
|
+
jsonrpc: string;
|
|
54
|
+
id: number;
|
|
55
|
+
result: {
|
|
56
|
+
translations: Translation[];
|
|
57
|
+
target_lang: string;
|
|
58
|
+
source_lang: string;
|
|
59
|
+
source_lang_is_confident: boolean;
|
|
60
|
+
detectedLanguages: Record<string, string>;
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
export interface SentenceResponse {
|
|
64
|
+
text: string;
|
|
65
|
+
ids: number[];
|
|
66
|
+
}
|
|
67
|
+
export interface DeepLXTranslationErrorResult {
|
|
68
|
+
code: number;
|
|
69
|
+
message: string;
|
|
70
|
+
}
|
|
71
|
+
export interface DeepLXTranslationSuccessResult {
|
|
72
|
+
code: number;
|
|
73
|
+
id: number;
|
|
74
|
+
data: string;
|
|
75
|
+
alternatives: string[];
|
|
76
|
+
sourceLang: SourceLanguage;
|
|
77
|
+
targetLang: TargetLanguage;
|
|
78
|
+
method: 'Free' | 'Pro';
|
|
79
|
+
}
|
|
80
|
+
export type DeepLXTranslationResult = DeepLXTranslationErrorResult | DeepLXTranslationSuccessResult;
|
package/lib/types.js
ADDED
package/lib/types.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/lib/utils.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type SupportedCode } from './constants.ts';
|
|
2
|
+
import type { PostData } from './types.ts';
|
|
3
|
+
export declare const getICount: (translateText: string) => number;
|
|
4
|
+
export declare const getRandomNumber: () => number;
|
|
5
|
+
export declare const getTimeStamp: (iCount: number) => number;
|
|
6
|
+
export declare const formatPostString: (postData: PostData) => string;
|
|
7
|
+
export declare function abbreviateLanguage(language: string): SupportedCode | undefined;
|
package/lib/utils.js
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { SUPPORTED_LANGUAGES, } from "./constants.js";
|
|
2
|
+
export const getICount = (translateText) => {
|
|
3
|
+
return (translateText.match(/i/g) || []).length;
|
|
4
|
+
};
|
|
5
|
+
export const getRandomNumber = () => {
|
|
6
|
+
const base = Math.floor(Math.random() * 99_999) + 8_300_000;
|
|
7
|
+
return base * 1000;
|
|
8
|
+
};
|
|
9
|
+
export const getTimeStamp = (iCount) => {
|
|
10
|
+
const ts = Date.now();
|
|
11
|
+
if (iCount !== 0) {
|
|
12
|
+
const adjustedCount = iCount + 1;
|
|
13
|
+
return ts - (ts % adjustedCount) + adjustedCount;
|
|
14
|
+
}
|
|
15
|
+
return ts;
|
|
16
|
+
};
|
|
17
|
+
export const formatPostString = (postData) => {
|
|
18
|
+
const postStr = JSON.stringify(postData);
|
|
19
|
+
const shouldAddSpace = (postData.id + 5) % 29 === 0 || (postData.id + 3) % 13 === 0;
|
|
20
|
+
return postStr.replaceAll('"method":"', shouldAddSpace ? `"method" : "` : `"method": "`);
|
|
21
|
+
};
|
|
22
|
+
let abbreviateLanguageDictionary;
|
|
23
|
+
function getAbbreviateLanguages() {
|
|
24
|
+
return (abbreviateLanguageDictionary ??= SUPPORTED_LANGUAGES.reduce((acc, lang) => {
|
|
25
|
+
acc[lang.code.toLowerCase()] = lang.code;
|
|
26
|
+
acc[lang.language.toLowerCase()] = lang.code;
|
|
27
|
+
return acc;
|
|
28
|
+
}, {}));
|
|
29
|
+
}
|
|
30
|
+
export function abbreviateLanguage(language) {
|
|
31
|
+
return getAbbreviateLanguages()[language.split('-')[0].toLowerCase()];
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=utils.js.map
|
package/lib/utils.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,GAGpB,MAAM,gBAAgB,CAAA;AAIvB,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,aAAqB,EAAU,EAAE;IACzD,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAA;AACjD,CAAC,CAAA;AAGD,MAAM,CAAC,MAAM,eAAe,GAAG,GAAW,EAAE;IAE1C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,SAAS,CAAA;IAC3D,OAAO,IAAI,GAAG,IAAI,CAAA;AACpB,CAAC,CAAA;AAGD,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,MAAc,EAAU,EAAE;IACrD,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IACrB,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;QACjB,MAAM,aAAa,GAAG,MAAM,GAAG,CAAC,CAAA;QAChC,OAAO,EAAE,GAAG,CAAC,EAAE,GAAG,aAAa,CAAC,GAAG,aAAa,CAAA;IAClD,CAAC;IACD,OAAO,EAAE,CAAA;AACX,CAAC,CAAA;AAGD,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,QAAkB,EAAU,EAAE;IAC7D,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAA;IACxC,MAAM,cAAc,GAElB,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;IAC9D,OAAO,OAAO,CAAC,UAAU,CACvB,YAAY,EACZ,cAAc,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,aAAa,CAChD,CAAA;AACH,CAAC,CAAA;AAED,IAAI,4BAES,CAAA;AAEb,SAAS,sBAAsB;IAE7B,OAAO,CAAC,4BAA4B,KAAK,mBAAmB,CAAC,MAAM,CACjE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;QACZ,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAyB,CAAC,GAAG,IAAI,CAAC,IAAI,CAAA;QAC/D,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAyB,CAAC,GAAG,IAAI,CAAC,IAAI,CAAA;QACnE,OAAO,GAAG,CAAA;IACZ,CAAC,EACD,EAAgD,CACjD,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,QAAgB;IAEhB,OAAO,sBAAsB,EAAE,CAC7B,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAyB,CAC5D,CAAA;AACH,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@deeplx/core",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "An unofficial Node package to translate text using [DeepL](https://www.deepl.com) by porting [OwO-Network/DeepLX](https://github.com/OwO-Network/DeepLX).",
|
|
6
|
+
"repository": "git+https://github.com/un-ts/deeplx.git",
|
|
7
|
+
"homepage": "https://github.com/un-ts/deeplx/blob/master/packages/@deeplx/core",
|
|
8
|
+
"author": "JounQin <admin@1stg.me> (https://www.1stG.me)",
|
|
9
|
+
"funding": "https://opencollective.com/deeplx",
|
|
10
|
+
"license": "MIT",
|
|
11
|
+
"engines": {
|
|
12
|
+
"node": "^12.20 || ^14.18.0 || >=16.0.0"
|
|
13
|
+
},
|
|
14
|
+
"bin": "./lib/cli.js",
|
|
15
|
+
"main": "./lib/index.cjs",
|
|
16
|
+
"types": "./index.d.cts",
|
|
17
|
+
"module": "./lib/index.js",
|
|
18
|
+
"exports": {
|
|
19
|
+
".": {
|
|
20
|
+
"import": {
|
|
21
|
+
"types": "./lib/index.d.ts",
|
|
22
|
+
"default": "./lib/index.js"
|
|
23
|
+
},
|
|
24
|
+
"module-sync": {
|
|
25
|
+
"types": "./lib/index.d.ts",
|
|
26
|
+
"default": "./lib/index.js"
|
|
27
|
+
},
|
|
28
|
+
"require": {
|
|
29
|
+
"types": "./index.d.cts",
|
|
30
|
+
"default": "./lib/index.cjs"
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
"./package.json": "./package.json"
|
|
34
|
+
},
|
|
35
|
+
"files": [
|
|
36
|
+
"index.d.cts",
|
|
37
|
+
"lib"
|
|
38
|
+
],
|
|
39
|
+
"keywords": [
|
|
40
|
+
"deepl",
|
|
41
|
+
"deepl-api",
|
|
42
|
+
"deepl-free",
|
|
43
|
+
"deeplx",
|
|
44
|
+
"deepl-translate",
|
|
45
|
+
"deepl-translation",
|
|
46
|
+
"deepl-translator",
|
|
47
|
+
"translate",
|
|
48
|
+
"translate-api",
|
|
49
|
+
"translator"
|
|
50
|
+
],
|
|
51
|
+
"dependencies": {
|
|
52
|
+
"whatlang-node": "^0.1.0",
|
|
53
|
+
"x-fetch": "^0.2.5"
|
|
54
|
+
},
|
|
55
|
+
"publishConfig": {
|
|
56
|
+
"access": "public"
|
|
57
|
+
}
|
|
58
|
+
}
|