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

1# Copyright © AlexEbenrode <alexebenrode@gmail.com> 

2# 

3# SPDX-License-Identifier: GPL-3.0-or-later 

4from __future__ import annotations 

5 

6import json 

7from typing import TYPE_CHECKING 

8from urllib.parse import unquote_plus 

9 

10from .base import MachineTranslation, MachineTranslationError 

11from .forms import KeyMachineryForm 

12 

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 

15 

16 

17class YandexV2Translation(MachineTranslation): 

18 """Yandex machine translation support.""" 

19 

20 name = "Yandex v2" 

21 max_score = 90 

22 settings_form = KeyMachineryForm 

23 

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) 

32 

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() 

42 

43 return [x["code"] for x in payload["languages"]] 

44 

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)) 

67 

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 } 

75 

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)