File size: 4,002 Bytes
1d42175
 
 
fa90b1d
1d42175
0d89ff1
7a05cd7
 
1d42175
7a05cd7
78d0ff1
0d89ff1
 
 
 
 
78d0ff1
0d89ff1
7a05cd7
78d0ff1
 
 
3aa1058
1d42175
 
 
 
 
 
 
7ade3be
 
71d8e8b
 
0d89ff1
71d8e8b
283a7d3
7ade3be
 
1d42175
71d8e8b
1d42175
cb15d3a
 
5a8d2be
1d42175
cb15d3a
 
71d8e8b
1d42175
0d89ff1
 
 
5a8d2be
283a7d3
cb15d3a
 
 
283a7d3
78d0ff1
71d8e8b
78d0ff1
 
 
 
0d1a764
7ade3be
1d42175
 
 
 
 
76aa3b2
70f6ed6
 
9a69d6b
78d0ff1
70f6ed6
 
 
 
78d0ff1
70f6ed6
 
 
 
 
 
78d0ff1
 
 
70f6ed6
 
 
0d1a764
70f6ed6
 
3aa1058
70f6ed6
 
 
 
 
 
78d0ff1
50c16a8
7ade3be
50c16a8
 
 
 
 
 
 
2bbc526
50c16a8
7ade3be
50c16a8
 
 
 
 
2bbc526
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
117
118
119
120
121
122
123
124
"""
LibreTranslate API
"""
__copyright__ = "Copyright (C) 2020 Nidhal Baccouri"

import os
from typing import List, Optional

import requests

from deep_translator.base import BaseTranslator
from deep_translator.constants import (
    BASE_URLS,
    LIBRE_ENV_VAR,
    LIBRE_LANGUAGES_TO_CODES,
)
from deep_translator.exceptions import (
    ApiKeyException,
    AuthorizationException,
    ServerException,
    TranslationNotFound,
)
from deep_translator.validate import is_empty, is_input_valid, request_failed


class LibreTranslator(BaseTranslator):
    """
    class that wraps functions, which use libre translator under the hood to translate text(s)
    """

    def __init__(
        self,
        source: str = "en",
        target: str = "es",
        api_key: Optional[str] = os.getenv(LIBRE_ENV_VAR, None),
        use_free_api: bool = True,
        custom_url: Optional[str] = None,
        **kwargs
    ):
        """
        @param api_key: your api key
        @param source: source language to translate from
        List of LibreTranslate endpoint can be found at :
        https://github.com/LibreTranslate/LibreTranslate#mirrors
        Some require an API key
        @param target: target language to translate to
        @param use_free_api: set True if you want to use the free api.
        This means a url that does not require and api key would be used
        @param custom_url: you can use a custom endpoint
        """
        if not api_key:
            raise ApiKeyException(env_var=LIBRE_ENV_VAR)

        self.api_key = api_key
        url = (
            BASE_URLS.get("LIBRE")
            if not use_free_api
            else BASE_URLS.get("LIBRE_FREE")
        )
        super().__init__(
            base_url=url if not custom_url else custom_url,
            source=source,
            target=target,
            languages=LIBRE_LANGUAGES_TO_CODES,
        )

    def translate(self, text: str, **kwargs) -> str:
        """
        function that uses microsoft translate to translate a text
        @param text: desired text to translate
        @return: str: translated text
        """
        if is_input_valid(text):
            if self._same_source_target() or is_empty(text):
                return text

            translate_endpoint = "translate"
            params = {
                "q": text,
                "source": self._source,
                "target": self._target,
                "format": "text",
            }
            # Add API Key if required
            if self.api_key:
                params["api_key"] = self.api_key
            # Do the request and check the connection.
            try:
                response = requests.post(
                    self._base_url + translate_endpoint, params=params
                )
            except ConnectionError:
                raise ServerException(503)
            # If the answer is not success, raise server exception.

            if response.status_code == 403:
                raise AuthorizationException(self.api_key)
            elif request_failed(status_code=response.status_code):
                raise ServerException(response.status_code)
            # Get the response and check is not empty.
            res = response.json()
            if not res:
                raise TranslationNotFound(text)
            # Process and return the response.
            return res["translatedText"]

    def translate_file(self, path: str, **kwargs) -> str:
        """
        translate directly from file
        @param path: path to the target file
        @type path: str
        @param kwargs: additional args
        @return: str
        """
        return self._translate_file(path, **kwargs)

    def translate_batch(self, batch: List[str], **kwargs) -> List[str]:
        """
        translate a list of texts
        @param batch: list of texts you want to translate
        @return: list of translations
        """
        return self._translate_batch(batch, **kwargs)