about summary refs log tree commit diff stats
path: root/src/assets/javascripts/translate
diff options
context:
space:
mode:
Diffstat (limited to 'src/assets/javascripts/translate')
-rw-r--r--src/assets/javascripts/translate/get_lingva_preferences.js10
-rw-r--r--src/assets/javascripts/translate/set_lingva_preferences.js19
-rw-r--r--src/assets/javascripts/translate/translate.js295
3 files changed, 324 insertions, 0 deletions
diff --git a/src/assets/javascripts/translate/get_lingva_preferences.js b/src/assets/javascripts/translate/get_lingva_preferences.js
new file mode 100644
index 00000000..f04ea3dc
--- /dev/null
+++ b/src/assets/javascripts/translate/get_lingva_preferences.js
@@ -0,0 +1,10 @@
+window.browser = window.browser || window.chrome;
+
+browser.storage.local.set(
+    {
+        ['lingva_lingva_chakra-ui-color-mode']: localStorage.getItem('chakra-ui-color-mode'),
+        lingva_lingva_isauto: localStorage.getItem('isauto'),
+        lingva_lingva_source: localStorage.getItem('source'),
+        lingva_lingva_target: localStorage.getItem('target'),
+    }
+)
diff --git a/src/assets/javascripts/translate/set_lingva_preferences.js b/src/assets/javascripts/translate/set_lingva_preferences.js
new file mode 100644
index 00000000..01a3b85e
--- /dev/null
+++ b/src/assets/javascripts/translate/set_lingva_preferences.js
@@ -0,0 +1,19 @@
+window.browser = window.browser || window.chrome;
+
+browser.storage.local.get(
+    [
+        "lingva_chakra-ui-color-mode",
+        "lingva_isauto",
+        "lingva_source",
+        "lingva_target",
+    ],
+    r => {
+        if (r['lingva_chakra-ui-color-mode'] !== undefined) localStorage.setItem('chakra-ui-color-mode', r['lingva_chakra-ui-color-mode']);
+        if (r.lingva_isauto !== undefined) localStorage.setItem('isauto', r.lingva_isauto);
+        console.log('r.lingva_isauto', r.lingva_isauto, localStorage.getItem('isauto'))
+        if (r.lingva_source !== undefined) localStorage.setItem('source', r.lingva_source);
+        if (r.lingva_target !== undefined) localStorage.setItem('target', r.lingva_target);
+
+        window.close();
+    }
+)
diff --git a/src/assets/javascripts/translate/translate.js b/src/assets/javascripts/translate/translate.js
new file mode 100644
index 00000000..3c8f9222
--- /dev/null
+++ b/src/assets/javascripts/translate/translate.js
@@ -0,0 +1,295 @@
+window.browser = window.browser || window.chrome;
+
+import utils from '../utils.js'
+
+const targets = [
+  /^https?:\/{2}translate\.google(\.[a-z]{2,3}){1,2}\//,
+];
+
+let redirects = {
+  "simplyTranslate": {
+    "normal": [],
+    "tor": []
+  },
+  "lingva": {
+    "normal": [],
+    "tor": []
+  }
+};
+
+let
+  translateDisable,
+  translateFrontend,
+  translateProtocol,
+  translateRedirects,
+  simplyTranslateNormalRedirectsChecks,
+  simplyTranslateNormalCustomRedirects,
+  simplyTranslateTorRedirectsChecks,
+  simplyTranslateTorCustomRedirects,
+  lingvaNormalRedirectsChecks,
+  lingvaNormalCustomRedirects,
+  lingvaTorRedirectsChecks,
+  lingvaTorCustomRedirects;
+
+function init() {
+  return new Promise(resolve => {
+    browser.storage.local.get(
+      [
+        "translateDisable",
+        "translateFrontend",
+        "translateProtocol",
+        "translateRedirects",
+
+        "simplyTranslateNormalRedirectsChecks",
+        "simplyTranslateNormalCustomRedirects",
+        "simplyTranslateTorRedirectsChecks",
+        "simplyTranslateTorCustomRedirects",
+
+        "lingvaNormalRedirectsChecks",
+        "lingvaNormalCustomRedirects",
+        "lingvaTorRedirectsChecks",
+        "lingvaTorCustomRedirects",
+      ],
+      r => {
+        translateDisable = r.translateDisable;
+        translateFrontend = r.translateFrontend;
+        translateProtocol = r.translateProtocol;
+        translateRedirects = r.translateRedirects;
+        simplyTranslateNormalRedirectsChecks = r.simplyTranslateNormalRedirectsChecks;
+        simplyTranslateNormalCustomRedirects = r.simplyTranslateNormalCustomRedirects;
+        simplyTranslateTorRedirectsChecks = r.simplyTranslateTorRedirectsChecks;
+        simplyTranslateTorCustomRedirects = r.simplyTranslateTorCustomRedirects;
+        lingvaNormalRedirectsChecks = r.lingvaNormalRedirectsChecks;
+        lingvaNormalCustomRedirects = r.lingvaNormalCustomRedirects;
+        lingvaTorRedirectsChecks = r.lingvaTorRedirectsChecks;
+        lingvaTorCustomRedirects = r.lingvaTorCustomRedirects;
+        resolve();
+      }
+    )
+  })
+}
+
+init();
+browser.storage.onChanged.addListener(init)
+
+function setRedirects(val) {
+  browser.storage.local.get('cloudflareList', r => {
+    redirects = val;
+    simplyTranslateNormalRedirectsChecks = [...redirects.simplyTranslate.normal];
+    lingvaNormalRedirectsChecks = [...redirects.lingva.normal]
+    for (const instance of r.cloudflareList) {
+      const a = simplyTranslateNormalRedirectsChecks.indexOf(instance);
+      if (a > -1) simplyTranslateNormalRedirectsChecks.splice(a, 1);
+
+      const b = lingvaNormalRedirectsChecks.indexOf(instance);
+      if (b > -1) lingvaNormalRedirectsChecks.splice(b, 1);
+    }
+    browser.storage.local.set({
+      translateRedirects: redirects,
+      simplyTranslateNormalRedirectsChecks,
+      simplyTranslateTorRedirectsChecks: redirects.simplyTranslate.tor,
+      lingvaNormalRedirectsChecks,
+      lingvaTorRedirectsChecks: redirects.lingva.tor,
+    })
+  })
+}
+
+function initLingvaLocalStorage(test, url, tabId) {
+  return new Promise(async resolve => {
+    await init();
+    if (translateDisable || translateFrontend != 'lingva') { resolve(); return; }
+    const protocolHost = utils.protocolHost(url);
+    if (![
+      ...lingvaNormalRedirectsChecks,
+      ...lingvaNormalCustomRedirects,
+      ...lingvaTorRedirectsChecks,
+      ...lingvaTorCustomRedirects,
+    ].includes(protocolHost)) { resolve(); return; }
+
+    if (!test) {
+      browser.tabs.executeScript(
+        tabId,
+        { file: "/assets/javascripts/translate/get_lingva_preferences.js", runAt: "document_start" }
+      );
+
+      let checkedInstances;
+      if (translateProtocol == 'normal') checkedInstances = [...lingvaNormalRedirectsChecks, ...lingvaNormalCustomRedirects];
+      if (translateProtocol == 'tor') checkedInstances = [...lingvaTorRedirectsChecks, ...lingvaTorCustomRedirects];
+      const i = checkedInstances.indexOf(protocolHost);
+      if (i !== -1) checkedInstances.splice(i, 1);
+      if (checkedInstances.length === 0) { resolve(); return; }
+      for (const to of checkedInstances)
+        browser.tabs.create(
+          { url: to },
+          tab => browser.tabs.executeScript(tab.id, { file: "/assets/javascripts/translate/set_lingva_preferences.js", runAt: "document_start" })
+        );
+    }
+    resolve(true);
+  }
+  )
+}
+
+function initSimplyTranslateCookies(test, from) {
+  return new Promise(async resolve => {
+    await init();
+    const protocolHost = utils.protocolHost(from);
+    if (![
+      ...simplyTranslateNormalRedirectsChecks,
+      ...simplyTranslateNormalCustomRedirects,
+      ...simplyTranslateTorRedirectsChecks,
+      ...simplyTranslateTorCustomRedirects,
+    ].includes(protocolHost)) { resolve(); return; }
+    if (!test) {
+      let checkedInstances;
+      if (translateProtocol == 'normal') checkedInstances = [...simplyTranslateNormalRedirectsChecks, ...simplyTranslateNormalCustomRedirects]
+      else if (translateProtocol == 'tor') checkedInstances = [...simplyTranslateTorRedirectsChecks, ...simplyTranslateTorCustomRedirects]
+      for (const to of checkedInstances) {
+        utils.copyCookie('simplyTranslate', from, to, 'from_lang');
+        utils.copyCookie('simplyTranslate', from, to, 'to_lang');
+        utils.copyCookie('simplyTranslate', from, to, 'tts_enabled');
+        utils.copyCookie('simplyTranslate', from, to, 'use_text_fields');
+      }
+    }
+    resolve(true);
+  }
+  )
+}
+
+function setSimplyTranslateCookies() {
+  return new Promise(async resolve => {
+    await init();
+    if (translateDisable || translateFrontend != 'simplyTranslate') { resolve(); return; }
+    let checkedInstances;
+    if (translateProtocol == 'normal') checkedInstances = [...simplyTranslateNormalRedirectsChecks, ...simplyTranslateNormalCustomRedirects]
+    else if (translateProtocol == 'tor') checkedInstances = [...simplyTranslateTorRedirectsChecks, ...simplyTranslateTorCustomRedirects]
+    for (const to of checkedInstances) {
+      utils.getCookiesFromStorage('simplyTranslate', to, 'from_lang');
+      utils.getCookiesFromStorage('simplyTranslate', to, 'to_lang');
+      utils.getCookiesFromStorage('simplyTranslate', to, 'tts_enabled');
+      utils.getCookiesFromStorage('simplyTranslate', to, 'use_text_fields');
+    }
+    resolve();
+  }
+  )
+}
+
+function redirect(url) {
+  if (translateDisable) return;
+  if (!targets.some(rx => rx.test(url.href))) return;
+
+  if (translateFrontend == 'simplyTranslate') {
+    let instancesList;
+    if (translateProtocol == 'normal') instancesList = [...simplyTranslateNormalRedirectsChecks, ...simplyTranslateNormalCustomRedirects];
+    if (translateProtocol == 'tor') instancesList = [...simplyTranslateTorRedirectsChecks, ...simplyTranslateTorCustomRedirects];
+    if (instancesList.length === 0) return;
+
+    const randomInstance = utils.getRandomInstance(instancesList)
+    return `${randomInstance}/${url.search}`;
+  }
+  else if (translateFrontend == 'lingva') {
+    let params_arr = url.search.split('&');
+    params_arr[0] = params_arr[0].substring(1);
+    let params = {};
+    for (let i = 0; i < params_arr.length; i++) {
+      let pair = params_arr[i].split('=');
+      params[pair[0]] = pair[1];
+    }
+    let instancesList;
+    if (translateProtocol == 'normal') instancesList = [...lingvaNormalRedirectsChecks, ...lingvaNormalCustomRedirects];
+    if (translateProtocol == 'tor') instancesList = [...lingvaTorRedirectsChecks, ...lingvaTorCustomRedirects];
+    if (instancesList.length === 0) return;
+
+    const randomInstance = utils.getRandomInstance(instancesList)
+    if (params.sl && params.tl && params.text) {
+      return `${randomInstance}/${params.sl}/${params.tl}/${params.text}`
+    }
+    return randomInstance;
+  }
+}
+
+function switchInstance(url) {
+  return new Promise(async resolve => {
+    await init();
+    if (translateDisable) { resolve(); return; }
+    const protocolHost = utils.protocolHost(url);
+    if (![
+      ...translateRedirects.simplyTranslate.normal,
+      ...translateRedirects.simplyTranslate.tor,
+
+      ...simplyTranslateNormalCustomRedirects,
+      ...simplyTranslateTorCustomRedirects,
+
+      ...translateRedirects.lingva.normal,
+      ...translateRedirects.lingva.tor,
+
+      ...lingvaNormalCustomRedirects,
+      ...lingvaTorCustomRedirects,
+    ].includes(protocolHost)) { resolve(); return; }
+
+    let instancesList;
+    if (translateProtocol == 'normal') {
+      if (translateFrontend == 'simplyTranslate') instancesList = [...simplyTranslateNormalRedirectsChecks, ...simplyTranslateNormalCustomRedirects];
+      else if (translateFrontend == 'lingva') instancesList = [...lingvaNormalRedirectsChecks, ...lingvaNormalCustomRedirects];
+    }
+    else if (translateProtocol == 'tor') {
+      if (translateFrontend == 'simplyTranslate') instancesList = [...simplyTranslateTorRedirectsChecks, ...simplyTranslateTorCustomRedirects];
+      else if (translateFrontend == 'lingva') instancesList = [...lingvaTorRedirectsChecks, ...lingvaTorCustomRedirects];
+    }
+
+    const i = instancesList.indexOf(protocolHost);
+    if (i > -1) instancesList.splice(i, 1);
+    if (instancesList.length === 0) { resolve(); return; }
+
+    const randomInstance = utils.getRandomInstance(instancesList);
+    resolve(`${randomInstance}${url.pathname}${url.search}`);
+  })
+}
+
+function initDefaults() {
+  return new Promise(async resolve => {
+    fetch('/instances/data.json').then(response => response.text()).then(data => {
+      let dataJson = JSON.parse(data);
+      redirects.simplyTranslate = dataJson.simplyTranslate;
+      redirects.lingva = dataJson.lingva;
+      browser.storage.local.get('cloudflareList',
+        async r => {
+          simplyTranslateNormalRedirectsChecks = [...redirects.simplyTranslate.normal];
+          lingvaNormalRedirectsChecks = [...redirects.lingva.normal]
+          for (const instance of r.cloudflareList) {
+            const a = simplyTranslateNormalRedirectsChecks.indexOf(instance);
+            if (a > -1) simplyTranslateNormalRedirectsChecks.splice(a, 1);
+
+            const b = lingvaNormalRedirectsChecks.indexOf(instance);
+            if (b > -1) lingvaNormalRedirectsChecks.splice(b, 1);
+          }
+          await browser.storage.local.set({
+            translateDisable: false,
+            translateFrontend: "simplyTranslate",
+            translateProtocol: 'normal',
+            translateRedirects: redirects,
+
+            simplyTranslateNormalRedirectsChecks: simplyTranslateNormalRedirectsChecks,
+            simplyTranslateNormalCustomRedirects: [],
+            simplyTranslateTorRedirectsChecks: [...redirects.simplyTranslate.tor],
+            simplyTranslateTorCustomRedirects: [],
+
+            lingvaNormalRedirectsChecks: lingvaNormalRedirectsChecks,
+            lingvaNormalCustomRedirects: [],
+            lingvaTorRedirectsChecks: [...redirects.lingva.tor],
+            lingvaTorCustomRedirects: [],
+          })
+          resolve();
+        })
+    })
+  })
+}
+
+export default {
+  initSimplyTranslateCookies,
+  setSimplyTranslateCookies,
+  initLingvaLocalStorage,
+  setRedirects,
+  redirect,
+  initDefaults,
+  switchInstance,
+};