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

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# Copyright © Seth Falco <seth@falco.fun> 

3# 

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

5 

6 

7from __future__ import annotations 

8 

9from typing import TYPE_CHECKING 

10 

11from .base import BatchMachineTranslation 

12from .forms import LibreTranslateMachineryForm 

13 

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

15 from weblate.trans.models import Unit 

16 

17 from .base import DownloadMultipleTranslations 

18 

19 

20class LibreTranslateTranslation(BatchMachineTranslation): 

21 """LibreTranslate machine translation support.""" 

22 

23 name = "LibreTranslate" 

24 max_score = 89 

25 settings_form = LibreTranslateMachineryForm 

26 request_timeout = 20 

27 

28 def download_languages(self): 

29 response = self.request( 

30 "get", 

31 self.get_api_url("languages"), 

32 ) 

33 return [x["code"] for x in response.json()] 

34 

35 def map_language_code(self, code): 

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

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

38 

39 def download_multiple_translations( 

40 self, 

41 source_language, 

42 target_language, 

43 sources: list[tuple[str, Unit | None]], 

44 user=None, 

45 threshold: int = 75, 

46 ) -> DownloadMultipleTranslations: 

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

48 texts = [text for text, _unit in sources] 

49 response = self.request( 

50 "post", 

51 self.get_api_url("translate"), 

52 json={ 

53 "api_key": self.settings["key"], 

54 "q": texts, 

55 "source": source_language, 

56 "target": target_language, 

57 }, 

58 ) 

59 payload = response.json() 

60 translated_texts = payload["translatedText"] 

61 

62 return { 

63 text: [ 

64 { 

65 "text": translated_texts[index], 

66 "quality": self.max_score, 

67 "service": self.name, 

68 "source": text, 

69 } 

70 ] 

71 for index, text in enumerate(texts) 

72 }