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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
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()
|