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
« 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
5from __future__ import annotations
7from typing import TYPE_CHECKING
9from requests.exceptions import HTTPError
11from .base import MachineTranslation
12from .forms import URLMachineryForm
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
19class TMServerTranslation(MachineTranslation):
20 """tmserver machine translation support."""
22 name = "tmserver"
23 settings_form: type[BaseMachineryForm] | None = URLMachineryForm
25 def map_language_code(self, code):
26 """Convert language to service specific code."""
27 return super().map_language_code(code).replace("-", "_").lower()
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 ]
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
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()
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 }