summaryrefslogtreecommitdiff
path: root/mac/.qutebrowser/userscripts/translate
blob: 25c66ddb5175ccabbe059ae7f6dab6bbedb4e460 (plain)
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()