Coverage for app/venv/lib/python3.14/site-packages/weblate/machinery/yandexv2.py: 36%
36 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 © AlexEbenrode <alexebenrode@gmail.com>
2#
3# SPDX-License-Identifier: GPL-3.0-or-later
4from __future__ import annotations
6import json
7from typing import TYPE_CHECKING
8from urllib.parse import unquote_plus
10from .base import MachineTranslation, MachineTranslationError
11from .forms import KeyMachineryForm
13if TYPE_CHECKING: 13 ↛ 14line 13 didn't jump to line 14 because the condition on line 13 was never true
14 from .base import DownloadTranslations
17class YandexV2Translation(MachineTranslation):
18 """Yandex machine translation support."""
20 name = "Yandex v2"
21 max_score = 90
22 settings_form = KeyMachineryForm
24 def check_failure(self, response) -> None:
25 super().check_failure(response)
26 payload = response.json()
27 if "message" in payload:
28 raise MachineTranslationError(payload["message"])
29 if "code" in payload and payload["code"] != 200:
30 msg = "Error: {}".format(payload["code"])
31 raise MachineTranslationError(msg)
33 def download_languages(self):
34 """Download list of supported languages from a service."""
35 key = self.settings["key"]
36 response = self.request(
37 "post",
38 "https://translate.api.cloud.yandex.net/translate/v2/languages",
39 headers={"Authorization": f"Api-Key {key}"},
40 )
41 payload = response.json()
43 return [x["code"] for x in payload["languages"]]
45 def download_translations(
46 self,
47 source_language,
48 target_language,
49 text: str,
50 unit,
51 user,
52 threshold: int = 75,
53 ) -> DownloadTranslations:
54 """Download list of possible translations from a service."""
55 key = self.settings["key"]
56 response = self.request(
57 "post",
58 "https://translate.api.cloud.yandex.net/translate/v2/translate",
59 params={
60 "texts": text,
61 "sourceLanguageCode": source_language,
62 "targetLanguageCode": target_language,
63 },
64 headers={"Authorization": f"Api-Key {key}"},
65 )
66 payload = json.loads(unquote_plus(response.text))
68 for translation in payload["translations"]:
69 yield {
70 "text": translation["text"],
71 "quality": self.max_score,
72 "service": self.name,
73 "source": text,
74 }
76 def get_error_message(self, exc):
77 try:
78 return exc.response.json()["message"]
79 except Exception:
80 return super().get_error_message(exc)