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

35 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 __future__ import annotations 

6 

7from typing import TYPE_CHECKING 

8 

9from requests.exceptions import HTTPError 

10 

11from .base import MachineTranslation 

12from .forms import URLMachineryForm 

13 

14if TYPE_CHECKING: 14 ↛ 15line 14 didn't jump to line 15 because the condition on line 14 was never true

15 from .base import DownloadTranslations 

16 from .forms import BaseMachineryForm 

17 

18 

19class TMServerTranslation(MachineTranslation): 

20 """tmserver machine translation support.""" 

21 

22 name = "tmserver" 

23 settings_form: type[BaseMachineryForm] | None = URLMachineryForm 

24 

25 def map_language_code(self, code): 

26 """Convert language to service specific code.""" 

27 return super().map_language_code(code).replace("-", "_").lower() 

28 

29 def download_languages(self): 

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

31 try: 

32 # This URL needs trailing slash, that's why blank string is included 

33 response = self.request("get", self.get_api_url("languages", "")) 

34 data = response.json() 

35 except HTTPError as error: 

36 if error.response.status_code == 404: 

37 return [] 

38 raise 

39 return [ 

40 (src, tgt) 

41 for src in data["sourceLanguages"] 

42 for tgt in data["targetLanguages"] 

43 ] 

44 

45 def is_supported(self, source_language, target_language): 

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

47 if not self.supported_languages: 

48 # Fallback for old tmserver which does not export list of 

49 # supported languages 

50 return True 

51 return (source_language, target_language) in self.supported_languages 

52 

53 def download_translations( 

54 self, 

55 source_language, 

56 target_language, 

57 text: str, 

58 unit, 

59 user, 

60 threshold: int = 75, 

61 ) -> DownloadTranslations: 

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

63 url = self.get_api_url( 

64 source_language, 

65 target_language, 

66 "unit", 

67 text[:500].replace("\r", " ").encode(), 

68 ) 

69 response = self.request("get", url) 

70 payload = response.json() 

71 

72 for line in payload: 

73 quality = int(line["quality"]) 

74 if quality < threshold: 

75 continue 

76 yield { 

77 "text": line["target"], 

78 "quality": quality, 

79 "service": self.name, 

80 "source": line["source"], 

81 }