Coverage for app/venv/lib/python3.14/site-packages/weblate/machinery/alibaba.py: 51%
33 statements
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-07 07:15 +0000
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-07 07:15 +0000
1# Copyright © Michal Čihař <michal@weblate.org>
2#
3# SPDX-License-Identifier: GPL-3.0-or-later
4from __future__ import annotations
6import json
7from typing import TYPE_CHECKING, ClassVar
9from aliyunsdkalimt.request.v20181012 import TranslateGeneralRequest
10from aliyunsdkcore.client import AcsClient
11from django.utils.functional import cached_property
13from .base import MachineTranslation, MachineTranslationError
14from .forms import AlibabaMachineryForm
16if TYPE_CHECKING: 16 ↛ 17line 16 didn't jump to line 17 because the condition on line 16 was never true
17 from .base import DownloadTranslations
20class AlibabaTranslation(MachineTranslation):
21 """Alibaba API machine translation support."""
23 name = "Alibaba"
24 max_score = 80
26 language_map: ClassVar[dict[str, str]] = {
27 "zh_Hans": "zh",
28 "zh_Hant": "zh-tw",
29 }
31 settings_form = AlibabaMachineryForm
33 @cached_property
34 def client(self):
35 return AcsClient(
36 ak=self.settings["key"],
37 secret=self.settings["secret"],
38 region_id=self.settings["region"],
39 )
41 def download_languages(self):
42 """List of supported languages."""
43 return [
44 "ab",
45 "sq",
46 "ak",
47 "ar",
48 "an",
49 "am",
50 "as",
51 "az",
52 "ast",
53 "nch",
54 "ee",
55 "ay",
56 "ga",
57 "et",
58 "oj",
59 "oc",
60 "or",
61 "om",
62 "os",
63 "tpi",
64 "ba", # codespell:ignore
65 "eu",
66 "be",
67 "ber",
68 "bm",
69 "pag",
70 "bg",
71 "se",
72 "bem",
73 "byn",
74 "bi",
75 "bal",
76 "is",
77 "pl",
78 "bs",
79 "fa",
80 "bho",
81 "br",
82 "ch",
83 "cbk",
84 "cv",
85 "ts",
86 "tt",
87 "da",
88 "shn",
89 "tet",
90 "de",
91 "nds",
92 "sco",
93 "dv",
94 "kdx",
95 "dtp",
96 "ru",
97 "fo", # codespell:ignore fo
98 "fr",
99 "sa",
100 "fil",
101 "fj",
102 "fi",
103 "fur",
104 "fvr",
105 "kg",
106 "km",
107 "ngu",
108 "kl",
109 "ka",
110 "gos",
111 "gu",
112 "gn",
113 "kk",
114 "ht",
115 "ko",
116 "ha",
117 "nl",
118 "cnr",
119 "hup",
120 "gil",
121 "rn",
122 "quc",
123 "ky",
124 "gl",
125 "ca",
126 "cs",
127 "kab",
128 "kn",
129 "kr",
130 "csb",
131 "kha",
132 "kw",
133 "xh",
134 "co",
135 "mus",
136 "crh",
137 "tlh",
138 "hbs",
139 "qu",
140 "ks",
141 "ku",
142 "la",
143 "ltg",
144 "lv",
145 "lo",
146 "lt",
147 "li",
148 "ln",
149 "lg",
150 "lb",
151 "rue",
152 "rw",
153 "ro",
154 "rm",
155 "rom",
156 "jbo",
157 "mg",
158 "gv",
159 "mt",
160 "mr",
161 "ml",
162 "ms",
163 "chm",
164 "mk",
165 "mh",
166 "kek",
167 "mai",
168 "mfe",
169 "mi",
170 "mn",
171 "bn",
172 "my",
173 "hmn",
174 "umb",
175 "nv",
176 "af",
177 "ne",
178 "niu",
179 "no",
180 "pmn",
181 "pap",
182 "pa",
183 "pt",
184 "ps",
185 "ny",
186 "tw",
187 "chr",
188 "ja",
189 "sv",
190 "sm",
191 "sg",
192 "si",
193 "hsb",
194 "eo",
195 "sl",
196 "sw",
197 "so",
198 "sk",
199 "tl",
200 "tg",
201 "ty",
202 "te", # codespell:ignore te
203 "ta",
204 "th",
205 "to",
206 "toi", # codespell:ignore toi
207 "ti",
208 "tvl",
209 "tyv",
210 "tr",
211 "tk",
212 "wa",
213 "war",
214 "cy",
215 "ve",
216 "vo",
217 "wo",
218 "udm",
219 "ur",
220 "uz",
221 "es",
222 "ie",
223 "fy",
224 "szl",
225 "he",
226 "hil",
227 "haw",
228 "el",
229 "lfn",
230 "sd",
231 "hu",
232 "sn",
233 "ceb",
234 "syr",
235 "su",
236 "hy",
237 "ace",
238 "iba",
239 "ig",
240 "io",
241 "ilo",
242 "iu",
243 "it",
244 "yi",
245 "ia",
246 "hi",
247 "id",
248 "inh", # codespell:ignore inh
249 "en",
250 "yo",
251 "vi",
252 "zza",
253 "jv",
254 "zh",
255 "zh-tw",
256 "yue",
257 "zu",
258 ]
260 def download_translations(
261 self,
262 source_language,
263 target_language,
264 text: str,
265 unit,
266 user,
267 threshold: int = 75,
268 ) -> DownloadTranslations:
269 """Download list of possible translations from a service."""
270 # Create an API request and set the request parameters.
271 request = TranslateGeneralRequest.TranslateGeneralRequest()
272 request.set_SourceLanguage(source_language) # source language
273 request.set_SourceText(text) # original
274 request.set_TargetLanguage(target_language)
275 request.set_FormatType("text")
276 request.set_method("POST")
278 # Initiate the API request and obtain the response.
279 response = self.client.do_action_with_exception(request)
280 payload = json.loads(response)
281 if "Message" in payload:
282 msg = f"Error {payload['Code']}: {payload['Message']}"
283 raise MachineTranslationError(msg)
285 yield {
286 "text": payload["Data"]["Translated"],
287 "quality": self.max_score,
288 "service": self.name,
289 "source": text,
290 }