summaryrefslogtreecommitdiff
path: root/global/.local/share/qutebrowser/userscripts/translate
diff options
context:
space:
mode:
Diffstat (limited to 'global/.local/share/qutebrowser/userscripts/translate')
-rwxr-xr-xglobal/.local/share/qutebrowser/userscripts/translate116
1 files changed, 116 insertions, 0 deletions
diff --git a/global/.local/share/qutebrowser/userscripts/translate b/global/.local/share/qutebrowser/userscripts/translate
new file mode 100755
index 0000000..25c66dd
--- /dev/null
+++ b/global/.local/share/qutebrowser/userscripts/translate
@@ -0,0 +1,116 @@
+#! /usr/bin/env python3
+
+import argparse
+import json
+import os
+import sys
+import urllib.parse
+
+import requests
+
+
+def js(message):
+ return f"""
+ (function() {{
+ var box = document.createElement('div');
+ box.style.position = 'fixed';
+ box.style.bottom = '10px';
+ box.style.right = '10px';
+ box.style.backgroundColor = 'white';
+ box.style.color = 'black';
+ box.style.borderRadius = '8px';
+ box.style.padding = '10px';
+ box.style.boxShadow = '0 2px 10px rgba(0,0,0,0.2)';
+ box.style.zIndex = '10000';
+ box.innerText = decodeURIComponent("{message}");
+ document.body.appendChild(box);
+
+ function removeBox(event) {{
+ if (!box.contains(event.target)) {{
+ box.remove();
+ document.removeEventListener('click', removeBox);
+ }}
+ }}
+ document.addEventListener('click', removeBox);
+ }})();
+ """
+
+
+def translate_google(text, target_lang):
+ encoded_text = urllib.parse.quote(text)
+ response = requests.get(
+ f"https://translate.googleapis.com/translate_a/single?client=gtx&sl=auto&tl={target_lang}&dt=t&q={encoded_text}"
+ )
+ response_json = json.loads(response.text)
+ translated_text = ""
+ for i in response_json[0]:
+ translated_text += i[0]
+ return translated_text
+
+
+def translate_libretranslate(text, url, key, target_lang):
+ response = requests.post(
+ f"{url}/translate",
+ data={"q": text, "source": "auto", "target": target_lang, "api_key": key},
+ )
+ return response.json()["translatedText"]
+
+
+def main():
+ parser = argparse.ArgumentParser(
+ description="Translate text using different providers."
+ )
+ parser.add_argument(
+ "--provider",
+ choices=["google", "libretranslate"],
+ required=False,
+ default="google",
+ help="Translation provider to use",
+ )
+ parser.add_argument(
+ "--libretranslate_url",
+ required=False,
+ default="https://libretranslate.com",
+ help="URL for LibreTranslate API",
+ )
+ parser.add_argument(
+ "--libretranslate_key",
+ required=False,
+ default="",
+ help="API key for LibreTranslate",
+ )
+ parser.add_argument(
+ "--target_lang",
+ required=False,
+ default="en",
+ help="Target language for translation",
+ )
+ args = parser.parse_args()
+
+ qute_fifo = os.getenv("QUTE_FIFO")
+ if not qute_fifo:
+ sys.stderr.write(
+ f"Error: {sys.argv[0]} can not be run as a standalone script.\n"
+ )
+ sys.stderr.write(
+ "It is a qutebrowser userscript. In order to use it, call it using 'spawn --userscript' as described in qute://help/userscripts.html\n"
+ )
+ sys.exit(1)
+
+ text = os.getenv("QUTE_SELECTED_TEXT", "")
+
+ if args.provider == "google":
+ translated_text = translate_google(text, args.target_lang)
+ elif args.provider == "libretranslate":
+ translated_text = translate_libretranslate(
+ text, args.libretranslate_url, args.libretranslate_key, args.target_lang
+ )
+
+ js_code = js(urllib.parse.quote(translated_text)).replace("\n", " ")
+
+ with open(qute_fifo, "a") as fifo:
+ fifo.write(f"jseval -q {js_code}\n")
+
+
+if __name__ == "__main__":
+ main()