import { GoogleTranslator } from '@translate-tools/core/translators/GoogleTranslator';
import { langCode, langCodeWithAuto } from '@translate-tools/core/types/Translator';
import { Page } from 'puppeteer-extra-plugin/dist/puppeteer';
import { Browcore } from './Browcore';
export class HybridTranslate {
protected googleTranslator: GoogleTranslator = new GoogleTranslator();
protected transGooglePage!: Page;
protected transGooglePageDeFa!: Page;
protected deelPage!: Page;
protected redeeplPage!: Page;
public static browCoreStatic: Browcore;
public browCore!: Browcore;
async init(){
this.browCore = await this.getBrowCore();
}
public newPage(){
return this.browCore.browser.newPage();
}
public async getBrowCore(): Promise<Browcore> {
if(HybridTranslate.browCoreStatic){
return HybridTranslate.browCoreStatic;
}
else {
HybridTranslate.browCoreStatic = new Browcore();
await HybridTranslate.browCoreStatic.init();
return HybridTranslate.browCoreStatic;
}
}
async prepare(){
await this.init();
this.browCore.headless = true;
this.transGooglePage = await this.browCore.browser.newPage();
this.deelPage = await this.browCore.browser.newPage();
await this.browCore.loadCookiesForPage(this.transGooglePage, "google-trans-cookie.json");
await this.transGooglePage.goto("https://translate.google.com/", {waitUntil: 'networkidle0'})
await this.deelPage.goto("https://www.deepl.com/translator", {waitUntil: 'networkidle0'})
await this.transGooglePage.waitForTimeout(2000)
}
async translate(text: string, sourceLang: langCodeWithAuto, targetLang: langCode): Promise<string> {
await this.resetTranslation();
let result = await this.translateViaGoogle(text, sourceLang, targetLang);
result = await this.translateViaDeepl(result, "en", "de-DE");
return result;
}
async setTextInputValue (page: Page, selector: string, value: string | number) {
await page.waitForSelector(selector);
await page.evaluate((data: { selector: any; value: any; }) => {
return document.querySelector(data.selector).value = data.value
}, {selector, value})
}
async translateViaGoogle(text: string, sourceLang: string, targetLang: string): Promise<string> {
const textArea = await this.transGooglePage.$(".er8xn")
// await textArea?.type(text);
await this.setTextInputValue(this.transGooglePage, ".er8xn", text)
await textArea?.type(" ");
await this.transGooglePage.waitForTimeout(1000)
let value: string = await this.transGooglePage.evaluate(()=>{
const elements = document.querySelectorAll(".VIiyi span > span")
value = "";
elements.forEach(el=>{
value+=el.textContent
})
return value
})
return value
}
async resetTranslation() {
await this.resetGoogleTranslate();
}
async resetGoogleTranslate() {
await this.transGooglePage.focus(".er8xn");
await this.transGooglePage.keyboard.down('Control');
await this.transGooglePage.keyboard.press('A');
await this.transGooglePage.keyboard.up('Control');
await this.transGooglePage.keyboard.press('Backspace');
}
async resetDeeplByPage(page: Page){
// const textArea = await this.page.$(".lmt__source_textarea")
// console.log("text area", textArea)
// await textArea?.evaluate((el)=>{
// el.nodeValue = "";
// })
await page.focus(".lmt__source_textarea");
await page.keyboard.down('Control');
await page.keyboard.press('A');
await page.keyboard.up('Control');
await page.keyboard.press('Backspace');
// const gtextArea = await this.transGooglePage.$(".er8xn")
}
async resetDeepl(){
this.resetDeeplByPage(this.deelPage)
}
async translateViaDeepl(text: string, sourceLang: string, targetLang: string): Promise<string>{
// return new Promise(async (resolve, reject)=>{
await this.resetDeepl();
return await this.translateViaDeeplByPage(text, this.deelPage);
}
async translateViaDeeplByPage(text: string, page: Page): Promise<string>{
// return new Promise(async (resolve, reject)=>{
await this.resetDeeplByPage(page);
// await textArea?.type(text);
// await textArea?.click();
// await textArea?.focus();
await this.setTextInputValue(page, ".lmt__source_textarea", text)
await page.bringToFront();
const textArea = await page.$(".lmt__source_textarea")
await textArea?.focus();
await textArea?.click();
await textArea?.type(" ");
await page.waitForTimeout(1000)
const resElement = await page.$("#target-dummydiv")
let value = await page.evaluate((el: { textContent: any; }) => el.textContent, resElement)
// resolve(value)
return value;
// })
}
async translateToImprove(text: string, sourceLang: string, targetLang: string): Promise<string>{
// return new Promise(async (resolve, reject)=>{
await this.resetDeepl();
const textArea = await this.deelPage.$(".lmt__source_textarea")
// await textArea?.type(text);
await this.setTextInputValue(this.deelPage, ".lmt__source_textarea", text);
await textArea?.type(" ");
await this.deelPage.waitForTimeout(1000);
const switchBtn = await this.deelPage.$("div.lmt__language_container_switch");
await this.deelPage.screenshot({path:"what.jpg"});
await switchBtn?.click();
await this.deelPage.hover('div.lmt__language_container_switch');
await this.deelPage.waitForTimeout(1000);
const resElement = await this.deelPage.$("#target-dummydiv");
let value = await this.deelPage.evaluate((el: { textContent: any; }) => el.textContent, resElement)
await this.deelPage.hover('.lmt__language_container_switch');
const switchBtn2 = await this.deelPage.$("div.lmt__language_container_switch");
// await switchBtn2?.click();
// resolve(value)
return value;
// })
}
}