generaltranslation 1.2.9 → 1.2.11
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 +20 -24
- package/index.js +38 -15
- package/package.json +1 -1
- package/translate/html.js +6 -4
- package/translate/{prompts.js → translate.js} +80 -11
package/README.md
CHANGED
|
@@ -54,18 +54,7 @@ const codes = getLanguageCodes(['French', 'Spanish'])
|
|
|
54
54
|
console.log(codes) // ['fr', 'es']
|
|
55
55
|
```
|
|
56
56
|
|
|
57
|
-
##
|
|
58
|
-
|
|
59
|
-
### getUserLanguage()
|
|
60
|
-
|
|
61
|
-
Returns a user's default browser language. Meant for use in a web browser (i.e. on the client side).
|
|
62
|
-
|
|
63
|
-
```
|
|
64
|
-
const userLanguage = getUserLanguage();
|
|
65
|
-
console.log(userLanguage) // 'en'
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
## Prompt Internationalization API
|
|
57
|
+
## Translation API
|
|
69
58
|
|
|
70
59
|
For this function, you need to sign up for an API key at <a href='https://generaltranslation.com' target='_blank'>generaltranslation.com</a>.
|
|
71
60
|
|
|
@@ -81,23 +70,21 @@ const gt = new GT({
|
|
|
81
70
|
});
|
|
82
71
|
```
|
|
83
72
|
|
|
84
|
-
### async
|
|
73
|
+
### async translate(content, language)
|
|
85
74
|
|
|
86
|
-
Translates
|
|
87
|
-
|
|
88
|
-
Just wrap `translatePrompt` around your prompt and go.
|
|
75
|
+
Translates content into the language represented by an ISO-639 language code. Caches by default. Just wrap `translate` around your content and go.
|
|
89
76
|
|
|
90
77
|
All of the following are valid:
|
|
91
78
|
|
|
92
79
|
```
|
|
93
|
-
const
|
|
80
|
+
const translation = await gt.translate('Tell me a story', 'es'); // returns a string
|
|
94
81
|
```
|
|
95
82
|
|
|
96
83
|
```
|
|
97
|
-
const first = 'Tell me a story
|
|
98
|
-
const second = 'about a cat'
|
|
84
|
+
const first = 'Tell me a story';
|
|
85
|
+
const second = ' about a cat'
|
|
99
86
|
|
|
100
|
-
const
|
|
87
|
+
const translated = await gt.translate([
|
|
101
88
|
first, second
|
|
102
89
|
], 'es');
|
|
103
90
|
```
|
|
@@ -108,18 +95,18 @@ To mark text that shouldn't be translated, wrap it in `{ text: "", translate: fa
|
|
|
108
95
|
const prompt = 'Tell me a story about ';
|
|
109
96
|
const input = 'gatos con espadas'
|
|
110
97
|
|
|
111
|
-
const translatedPrompt = await gt.
|
|
98
|
+
const translatedPrompt = await gt.translate([
|
|
112
99
|
prompt, { text: input, translate: false }
|
|
113
100
|
], 'es');
|
|
114
101
|
```
|
|
115
102
|
|
|
116
|
-
For type consistency, you can also make everything in the
|
|
103
|
+
For type consistency, you can also make everything in the content parameter an object:
|
|
117
104
|
|
|
118
105
|
```
|
|
119
106
|
const prompt = 'Tell me a story about ';
|
|
120
107
|
const input = 'gatos con espadas'
|
|
121
108
|
|
|
122
|
-
const translatedPrompt = await gt.
|
|
109
|
+
const translatedPrompt = await gt.translate([
|
|
123
110
|
{ text: prompt },
|
|
124
111
|
{ text: input, translate: false }
|
|
125
112
|
], 'es');
|
|
@@ -128,5 +115,14 @@ const translatedPrompt = await gt.translatePrompt([
|
|
|
128
115
|
This also works:
|
|
129
116
|
|
|
130
117
|
```
|
|
131
|
-
const translatedPrompt = await gt.
|
|
118
|
+
const translatedPrompt = await gt.translate({ text: 'Tell me a story' }, 'es');
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### async translateMany(contentArray, language)
|
|
122
|
+
|
|
123
|
+
Translates multiple items of content into the language represented by an ISO-639 language code. Caches by default. Just wrap `translateMany` around an array of what you want to translate and specify a language. For example:
|
|
124
|
+
|
|
125
|
+
```
|
|
126
|
+
const contentArray = ['You say goodbye', 'And I say hello'];
|
|
127
|
+
const translationArray = await gt.translateMany(contentArray, 'es') // returns an array
|
|
132
128
|
```
|
package/index.js
CHANGED
|
@@ -4,39 +4,62 @@
|
|
|
4
4
|
// ----- IMPORTS ----- //
|
|
5
5
|
|
|
6
6
|
const { _getLanguageCode, _getLanguageName } = require('./codes/codes.js');
|
|
7
|
-
const
|
|
7
|
+
const { _translate, _translateMany } = require('./translate/translate.js');
|
|
8
8
|
const _translateHTML = require('./translate/html.js');
|
|
9
9
|
|
|
10
|
+
// TO DO
|
|
11
|
+
// - Times/dates?
|
|
12
|
+
// - Currency conversion?
|
|
13
|
+
// - Regions (e.g. en-GB)
|
|
14
|
+
|
|
10
15
|
// ----- CORE CLASS ----- //
|
|
11
16
|
|
|
17
|
+
const getDefaultFromEnv = (VARIABLE) => {
|
|
18
|
+
if (typeof process !== 'undefined') {
|
|
19
|
+
if (process?.env?.[VARIABLE]) {
|
|
20
|
+
return process.env[VARIABLE];
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return '';
|
|
24
|
+
}
|
|
25
|
+
|
|
12
26
|
class GT {
|
|
13
27
|
|
|
14
28
|
constructor({
|
|
15
29
|
apiKey = '',
|
|
16
30
|
defaultLanguage = 'en',
|
|
31
|
+
projectID = '',
|
|
17
32
|
baseURL = 'https://translate.gtx.dev'
|
|
18
33
|
} = {}) {
|
|
19
|
-
this.apiKey = apiKey || (
|
|
34
|
+
this.apiKey = apiKey || getDefaultFromEnv('GT_API_KEY');
|
|
35
|
+
this.projectID = projectID || getDefaultFromEnv('GT_PROJECT_ID');
|
|
20
36
|
this.defaultLanguage = defaultLanguage?.toLowerCase();
|
|
21
37
|
this.baseURL = baseURL;
|
|
22
38
|
}
|
|
23
39
|
|
|
24
|
-
//
|
|
25
|
-
async
|
|
26
|
-
return await
|
|
27
|
-
|
|
40
|
+
// Site I18N
|
|
41
|
+
async translateHTML({ page, userLanguage, defaultLanguage, content, ...metadata }) {
|
|
42
|
+
return await _translateHTML({
|
|
43
|
+
page: page,
|
|
44
|
+
userLanguage: userLanguage,
|
|
45
|
+
defaultLanguage: defaultLanguage,
|
|
46
|
+
content: content,
|
|
47
|
+
config: this,
|
|
48
|
+
...metadata
|
|
28
49
|
});
|
|
29
50
|
}
|
|
30
51
|
|
|
31
|
-
//
|
|
32
|
-
async
|
|
33
|
-
return await
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
52
|
+
// String translation
|
|
53
|
+
async translate(content, language, { ... options }) {
|
|
54
|
+
return await _translate({
|
|
55
|
+
content: content, language: language, config: this, ...options,
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// String translation, of an array of strings
|
|
60
|
+
async translateMany(contentArray, language, { ... options }) {
|
|
61
|
+
return await _translateMany({
|
|
62
|
+
contentArray: contentArray, language: language, config: this, ...options,
|
|
40
63
|
});
|
|
41
64
|
}
|
|
42
65
|
|
package/package.json
CHANGED
package/translate/html.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
const _translateHTML = async ({
|
|
2
|
-
projectID,
|
|
3
2
|
page,
|
|
4
3
|
userLanguage,
|
|
5
4
|
defaultLanguage,
|
|
6
5
|
content,
|
|
7
|
-
config
|
|
6
|
+
config,
|
|
7
|
+
...metadata
|
|
8
8
|
}) => {
|
|
9
9
|
|
|
10
10
|
const apiKey = config?.apiKey;
|
|
@@ -12,8 +12,9 @@ const _translateHTML = async ({
|
|
|
12
12
|
throw new Error('Missing API Key!')
|
|
13
13
|
};
|
|
14
14
|
|
|
15
|
+
const projectID = config?.projectID;
|
|
15
16
|
if (!projectID) {
|
|
16
|
-
throw new Error('Missing
|
|
17
|
+
throw new Error('Missing Project ID!')
|
|
17
18
|
};
|
|
18
19
|
|
|
19
20
|
try {
|
|
@@ -28,7 +29,8 @@ const _translateHTML = async ({
|
|
|
28
29
|
page: page,
|
|
29
30
|
userLanguage: userLanguage,
|
|
30
31
|
defaultLanguage: defaultLanguage,
|
|
31
|
-
content: content
|
|
32
|
+
content: content,
|
|
33
|
+
metadata: { ...metadata }
|
|
32
34
|
})
|
|
33
35
|
});
|
|
34
36
|
if (!response.ok) {
|
|
@@ -5,7 +5,7 @@ const _shouldTranslate = item => typeof item?.translate === 'boolean' ? item.tra
|
|
|
5
5
|
|
|
6
6
|
// Pre-processes content to send to the API
|
|
7
7
|
// Separates out text that shouldn't be translated.
|
|
8
|
-
const
|
|
8
|
+
const _processContent = ({ content }) => {
|
|
9
9
|
const processed = [];
|
|
10
10
|
const untranslated = [];
|
|
11
11
|
if (Array.isArray(content)) {
|
|
@@ -40,7 +40,7 @@ const _processPrompt = ({ content }) => {
|
|
|
40
40
|
}
|
|
41
41
|
|
|
42
42
|
// Build content string from array or single item
|
|
43
|
-
const
|
|
43
|
+
const _constructContent = ({ content, untranslated = null}) => {
|
|
44
44
|
if (Array.isArray(content)) {
|
|
45
45
|
let final = '';
|
|
46
46
|
for (const item of content) {
|
|
@@ -64,8 +64,8 @@ const _constructPrompt = ({ content, untranslated = null}) => {
|
|
|
64
64
|
|
|
65
65
|
// Get a translation via General Translation API
|
|
66
66
|
// Returns string
|
|
67
|
-
const
|
|
68
|
-
content, language, config
|
|
67
|
+
const _translate = async ({
|
|
68
|
+
content, language, config, ...options
|
|
69
69
|
}) => {
|
|
70
70
|
|
|
71
71
|
const apiKey = config?.apiKey;
|
|
@@ -75,13 +75,13 @@ const _translatePrompt = async ({
|
|
|
75
75
|
|
|
76
76
|
const defaultLanguage = config?.defaultLanguage;
|
|
77
77
|
if (language === defaultLanguage) {
|
|
78
|
-
return
|
|
78
|
+
return _constructContent({ content: content });
|
|
79
79
|
};
|
|
80
80
|
|
|
81
|
-
const { processed, untranslated } =
|
|
81
|
+
const { processed, untranslated } = _processContent({ content });
|
|
82
82
|
|
|
83
83
|
try {
|
|
84
|
-
const response = await fetch(`${config?.baseURL}
|
|
84
|
+
const response = await fetch(`${config?.baseURL}`, {
|
|
85
85
|
method: 'POST',
|
|
86
86
|
headers: {
|
|
87
87
|
'Content-Type': 'application/json',
|
|
@@ -90,7 +90,8 @@ const _translatePrompt = async ({
|
|
|
90
90
|
body: JSON.stringify({
|
|
91
91
|
content: processed,
|
|
92
92
|
targetLanguage: language,
|
|
93
|
-
defaultLanguage: defaultLanguage
|
|
93
|
+
defaultLanguage: defaultLanguage,
|
|
94
|
+
options: { ...options }
|
|
94
95
|
})
|
|
95
96
|
})
|
|
96
97
|
if (!response.ok) {
|
|
@@ -98,13 +99,81 @@ const _translatePrompt = async ({
|
|
|
98
99
|
throw new Error(`${result || response.status}`);
|
|
99
100
|
} else {
|
|
100
101
|
const result = await response.json();
|
|
101
|
-
return
|
|
102
|
+
return _constructContent({content: result, untranslated: untranslated });
|
|
102
103
|
}
|
|
103
104
|
} catch (error) {
|
|
104
105
|
console.error(error)
|
|
105
|
-
return
|
|
106
|
+
return _constructContent({ content: content })
|
|
106
107
|
}
|
|
107
108
|
|
|
108
109
|
}
|
|
109
110
|
|
|
110
|
-
|
|
111
|
+
const constructAll = (contentArray) => {
|
|
112
|
+
const returnArray = [];
|
|
113
|
+
for (const item of contentArray) {
|
|
114
|
+
returnArray.push(_constructContent({ content: item }))
|
|
115
|
+
}
|
|
116
|
+
return returnArray;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// Get a translation of multiple strings via General Translation API
|
|
120
|
+
// Returns array of strings
|
|
121
|
+
const _translateMany = async ({
|
|
122
|
+
contentArray, language, config, ...options
|
|
123
|
+
}) => {
|
|
124
|
+
|
|
125
|
+
const apiKey = config?.apiKey;
|
|
126
|
+
if (!apiKey) {
|
|
127
|
+
throw new Error('Missing API Key!')
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
const defaultLanguage = config?.defaultLanguage;
|
|
131
|
+
if (language === defaultLanguage) {
|
|
132
|
+
return constructAll(contentArray);
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
const processedArray = [];
|
|
136
|
+
const untranslatedArray = [];
|
|
137
|
+
|
|
138
|
+
for (const item of contentArray) {
|
|
139
|
+
const { processed, untranslated } = _processContent({ content: item });
|
|
140
|
+
processedArray.push(processed);
|
|
141
|
+
untranslatedArray.push(untranslated);
|
|
142
|
+
};
|
|
143
|
+
|
|
144
|
+
try {
|
|
145
|
+
const response = await fetch(`${config?.baseURL}/many`, {
|
|
146
|
+
method: 'POST',
|
|
147
|
+
headers: {
|
|
148
|
+
'Content-Type': 'application/json',
|
|
149
|
+
'gtx-api-key': apiKey,
|
|
150
|
+
},
|
|
151
|
+
body: JSON.stringify({
|
|
152
|
+
content: processedArray,
|
|
153
|
+
targetLanguage: language,
|
|
154
|
+
defaultLanguage: defaultLanguage,
|
|
155
|
+
options: { ...options }
|
|
156
|
+
})
|
|
157
|
+
})
|
|
158
|
+
if (!response.ok) {
|
|
159
|
+
const result = await response.text();
|
|
160
|
+
throw new Error(`${result || response.status}`);
|
|
161
|
+
} else {
|
|
162
|
+
const result = await response.json();
|
|
163
|
+
if (!Array.isArray(result)) {
|
|
164
|
+
throw new Error(`${result || response.status}`);
|
|
165
|
+
}
|
|
166
|
+
const returnArray = []
|
|
167
|
+
for (const [index, item] of result.entries()) {
|
|
168
|
+
returnArray.push(_constructContent({content: item, untranslated: untranslatedArray[index] }));
|
|
169
|
+
}
|
|
170
|
+
return returnArray;
|
|
171
|
+
}
|
|
172
|
+
} catch (error) {
|
|
173
|
+
console.error(error)
|
|
174
|
+
return constructAll(contentArray);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
module.exports = { _translate, _translateMany };
|