Coverage for app/venv/lib/python3.14/site-packages/weblate/machinery/systran.py: 37%

23 statements  

« 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 

4 

5from .base import MachineTranslation, MachineTranslationError 

6from .forms import KeyMachineryForm 

7 

8 

9class SystranTranslation(MachineTranslation): 

10 """Systran machine translation support.""" 

11 

12 name = "Systran" 

13 max_score = 90 

14 settings_form = KeyMachineryForm 

15 

16 def check_failure(self, response) -> None: 

17 if "error" not in response: 

18 return 

19 raise MachineTranslationError(response["error"]["message"]) 

20 

21 def download_languages(self): 

22 """Download list of supported languages from a service.""" 

23 response = self.request( 

24 "get", 

25 "https://api-translate.systran.net/translation/supportedLanguages", 

26 params={"key": self.settings["key"]}, 

27 ) 

28 payload = response.json() 

29 self.check_failure(payload) 

30 return [(item["source"], item["target"]) for item in payload["languagePairs"]] 

31 

32 def is_supported(self, source_language, target_language): 

33 """Check whether given language combination is supported.""" 

34 return (source_language, target_language) in self.supported_languages 

35 

36 def download_translations( 

37 self, 

38 source_language, 

39 target_language, 

40 text: str, 

41 unit, 

42 user, 

43 threshold: int = 75, 

44 ): 

45 """Download list of possible translations from a service.""" 

46 response = self.request( 

47 "post", 

48 "https://api-translate.systran.net/translation/text/translate", 

49 params={ 

50 "key": self.settings["key"], 

51 "source": source_language, 

52 "target": target_language, 

53 "input": text, 

54 }, 

55 ) 

56 payload = response.json() 

57 

58 self.check_failure(payload) 

59 

60 for translation in payload["outputs"]: 

61 yield { 

62 "text": translation["output"], 

63 "quality": self.max_score, 

64 "service": self.name, 

65 "source": text, 

66 }