-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathtranslate.js
executable file
·54 lines (45 loc) · 2.2 KB
/
translate.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#!/usr/bin/env node
const program = require('commander');
const puppeteer = require('puppeteer-core');
program
.name('./translate.js')
.usage('[-p <path>] [-f <from_lang] [-t <to_lang>] [-s <service>] <text>')
.option('-p, --path <binary_path>', 'path to chrome/chromium binary\ndefault "/usr/bin/chromium"')
.option('-f, --from <lang_iso>', 'language ISO code of text to translate\ndefault "en"')
.option('-t, --to <lang_iso>', 'language ISO code of target language\ndefault "en"')
.option('-s, --service <service>', 'supported service: google, deepl\ndefault "google"');
program.parse(process.argv);
const options = program.opts();
const cPath = (options.path === undefined) ? '/usr/bin/chromium' : options.path;
const tLang = (options.to === undefined) ? 'en' : options.to;
const sName = (options.service === undefined) ? 'google' : options.service;
const fLang = (options.from === undefined) ? 'auto' : options.from;
(async() => {
const text = program.args.join(' ');
const chrome = cPath;
const isheadless = true;
if (sName == "deepl") {
var url = 'https://www.deepl.com/translator#' + fLang + '/' + tLang + '/' + text.replaceAll('\\', '\\\\').replaceAll('/', '\\%2F');
var inputSource = '.lmt__source_textarea';
var outputTranslation = 'd-textarea[name="target"]';
var outputReady = 'button[aria-label="Like translation"]';
} else {
var url = 'https://translate.google.com/?op=translate&sl=' + fLang + '&tl=' + tLang;
var inputSource = 'div > textarea';
var outputTranslation = 'span[lang="' + tLang + '"]';
var outputReady = 'button[aria-label="Copy translation"]';
var rejectButton = 'button[aria-label="Reject all"]';
}
const browser = await puppeteer.launch({executablePath: chrome, headless: isheadless});
const page = await browser.newPage();
await page.goto(url, {timeout: 30000, waitUntil: 'domcontentloaded'});
if (sName == 'google') {
await page.click(rejectButton);
await page.waitForTimeout(1000);
await page.type(inputSource, text);
}
await page.waitForSelector(outputReady);
const out = await page.evaluate((el) => { return document.querySelector(el).innerText; }, outputTranslation);
console.log(out);
await browser.close();
})();