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
« 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
7from __future__ import annotations
9from typing import TYPE_CHECKING
11from .base import BatchMachineTranslation
12from .forms import LibreTranslateMachineryForm
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
17 from .base import DownloadMultipleTranslations
20class LibreTranslateTranslation(BatchMachineTranslation):
21 """LibreTranslate machine translation support."""
23 name = "LibreTranslate"
24 max_score = 89
25 settings_form = LibreTranslateMachineryForm
26 request_timeout = 20
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()]
35 def map_language_code(self, code):
36 """Convert language to service specific code."""
37 return super().map_language_code(code).replace("_", "-")
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"]
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 }